@agent-relay/dashboard 2.0.82 → 2.0.84
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/out/404.html +1 -1
- package/out/_next/static/chunks/1028-da5d75e35d1420f1.js +1 -0
- package/out/_next/static/chunks/1528-78b17000a7e10bc6.js +2 -0
- package/out/_next/static/chunks/1695-4a5d33ba715e09b4.js +1 -0
- package/out/_next/static/chunks/1705-36c2180d00a4a569.js +1 -0
- package/out/_next/static/chunks/1dd3208c-e1f87c7b3dc1a820.js +1 -0
- package/out/_next/static/chunks/3663-47290254b8f6f5dd.js +1 -0
- package/out/_next/static/chunks/3677-4b225baf4801d9b9.js +73 -0
- package/out/_next/static/chunks/5118-7e8ada2df38eef07.js +1 -0
- package/out/_next/static/chunks/5888-15cbe97c90ed5fae.js +1 -0
- package/out/_next/static/chunks/6773-a45343a98df3abb5.js +1 -0
- package/out/_next/static/chunks/6940-b824612b605e79b3.js +9 -0
- package/out/_next/static/chunks/7894-f4a15249082a680d.js +1 -0
- package/out/_next/static/chunks/9175-b3617c1e5cbfed0e.js +1 -0
- package/out/_next/static/chunks/9372-1a804b8d08c7a236.js +1 -0
- package/out/_next/static/chunks/{ab6c8a12-0a58072fbb505134.js → ab6c8a12-91438a812d94ecf0.js} +1 -1
- package/out/_next/static/chunks/app/_not-found/page-8e8842f82d204726.js +1 -0
- package/out/_next/static/chunks/app/about/page-b78577a7da8fa459.js +1 -0
- package/out/_next/static/chunks/app/app/[[...slug]]/page-3dffd65b6344f53e.js +1 -0
- package/out/_next/static/chunks/app/app/onboarding/page-b89be9aa6264a5e1.js +1 -0
- package/out/_next/static/chunks/app/blog/go-to-bed-wake-up-to-a-finished-product/page-fbd00893ef69e499.js +1 -0
- package/out/_next/static/chunks/app/blog/let-them-cook-multi-agent-orchestration/page-de2ea13649d0b6d3.js +1 -0
- package/out/_next/static/chunks/app/blog/page-a08e263c57a156fa.js +1 -0
- package/out/_next/static/chunks/app/careers/page-02228e1d6969b232.js +1 -0
- package/out/_next/static/chunks/app/changelog/page-1b5c1d79efc6e53a.js +1 -0
- package/out/_next/static/chunks/app/cloud/link/page-99654edffffb3af2.js +1 -0
- package/out/_next/static/chunks/app/complete-profile/page-59d146e5ddeafc5c.js +1 -0
- package/out/_next/static/chunks/app/connect-repos/page-995e16a976a6632c.js +1 -0
- package/out/_next/static/chunks/app/contact/page-273396a5ad57bcee.js +1 -0
- package/out/_next/static/chunks/app/dev/cli-tools/page-a71b80dcb2d5fc8d.js +1 -0
- package/out/_next/static/chunks/app/dev/log-viewer/page-46a6151ae1be0796.js +1 -0
- package/out/_next/static/chunks/app/docs/page-7c7cb603b24b7c40.js +1 -0
- package/out/_next/static/chunks/app/history/page-0c5cab1dab4e8886.js +1 -0
- package/out/_next/static/chunks/app/layout-96d72ba8ef8a43a0.js +1 -0
- package/out/_next/static/chunks/app/login/page-0ccbab34213df842.js +1 -0
- package/out/_next/static/chunks/app/metrics/page-8616272aeab9c8b0.js +1 -0
- package/out/_next/static/chunks/app/page-09ce10603ad9a251.js +1 -0
- package/out/_next/static/chunks/app/pricing/page-91c975079120c941.js +1 -0
- package/out/_next/static/chunks/app/privacy/{page-c21d51ac2dee3a88.js → page-a49ab271cc686644.js} +1 -1
- package/out/_next/static/chunks/app/providers/{page-59114505f4353512.js → page-d775d6eb5bc29e96.js} +1 -1
- package/out/_next/static/chunks/app/providers/setup/[provider]/page-ec4ef3cd80de807e.js +1 -0
- package/out/_next/static/chunks/app/security/page-d9da9bd9191e8f95.js +1 -0
- package/out/_next/static/chunks/app/signup/page-930eca0bf5fd299d.js +1 -0
- package/out/_next/static/chunks/app/terms/page-3e4827620b98613c.js +1 -0
- package/out/_next/static/chunks/framework-648e1ae7da590300.js +1 -0
- package/out/_next/static/chunks/{main-acb1b24265295d6a.js → main-2b1990080c292d92.js} +1 -1
- package/out/_next/static/chunks/main-app-9f6b7ff9e754a8f5.js +1 -0
- package/out/_next/static/chunks/pages/_app-a077b72e02273ab1.js +1 -0
- package/out/_next/static/chunks/pages/_error-84001666436a04e4.js +1 -0
- package/out/_next/static/chunks/{webpack-dd93b81e2659669c.js → webpack-7586035f1585f2db.js} +1 -1
- package/out/_next/static/css/eb9fc69d1e3d2bed.css +1 -0
- package/out/_next/static/{IxfA6RZu4trcsEMYlkQra → g3G0LMdB7lxcrU5mdM54m}/_buildManifest.js +1 -1
- package/out/about.html +2 -2
- package/out/about.txt +2 -2
- package/out/app/onboarding.html +1 -1
- package/out/app/onboarding.txt +2 -2
- package/out/app.html +1 -1
- package/out/app.txt +2 -2
- package/out/blog/go-to-bed-wake-up-to-a-finished-product.html +3 -3
- package/out/blog/go-to-bed-wake-up-to-a-finished-product.txt +1 -1
- package/out/blog/let-them-cook-multi-agent-orchestration.html +2 -2
- package/out/blog/let-them-cook-multi-agent-orchestration.txt +2 -2
- package/out/blog.html +2 -2
- package/out/blog.txt +1 -1
- package/out/careers.html +2 -2
- package/out/careers.txt +2 -2
- package/out/changelog.html +2 -2
- package/out/changelog.txt +2 -2
- package/out/cloud/link.html +1 -1
- package/out/cloud/link.txt +2 -2
- package/out/complete-profile.html +2 -2
- package/out/complete-profile.txt +2 -2
- package/out/connect-repos.html +1 -1
- package/out/connect-repos.txt +2 -2
- package/out/contact.html +2 -2
- package/out/contact.txt +2 -2
- package/out/dev/cli-tools.html +1 -0
- package/out/dev/cli-tools.txt +7 -0
- package/out/dev/log-viewer.html +23 -0
- package/out/dev/log-viewer.txt +7 -0
- package/out/docs.html +2 -2
- package/out/docs.txt +2 -2
- package/out/history.html +1 -1
- package/out/history.txt +2 -2
- package/out/index.html +1 -1
- package/out/index.txt +2 -2
- package/out/login.html +2 -2
- package/out/login.txt +2 -2
- package/out/metrics.html +1 -1
- package/out/metrics.txt +2 -2
- package/out/pricing.html +2 -2
- package/out/pricing.txt +2 -2
- package/out/privacy.html +2 -2
- package/out/privacy.txt +2 -2
- package/out/providers/setup/claude.html +1 -1
- package/out/providers/setup/claude.txt +2 -2
- package/out/providers/setup/codex.html +1 -1
- package/out/providers/setup/codex.txt +2 -2
- package/out/providers/setup/cursor.html +1 -1
- package/out/providers/setup/cursor.txt +2 -2
- package/out/providers.html +1 -1
- package/out/providers.txt +2 -2
- package/out/security.html +2 -2
- package/out/security.txt +2 -2
- package/out/signup.html +2 -2
- package/out/signup.txt +2 -2
- package/out/terms.html +2 -2
- package/out/terms.txt +2 -2
- package/package.json +5 -1
- package/src/adapters/DashboardConfigProvider.tsx +56 -0
- package/src/adapters/cloudFetchAdapter.ts +278 -0
- package/src/adapters/index.ts +3 -0
- package/src/adapters/types.ts +508 -0
- package/src/app/app/[[...slug]]/DashboardPageClient.tsx +67 -18
- package/src/app/app/onboarding/page.tsx +870 -170
- package/src/app/cloud/link/page.tsx +14 -6
- package/src/app/connect-repos/page.tsx +9 -3
- package/src/app/dev/cli-tools/page.tsx +130 -0
- package/src/app/dev/log-viewer/MockLogViewer.tsx +132 -0
- package/src/app/dev/log-viewer/fixtures.ts +110 -0
- package/src/app/dev/log-viewer/page.tsx +288 -0
- package/src/app/history/page.tsx +28 -12
- package/src/app/page.tsx +1 -1
- package/src/app/providers/setup/[provider]/ProviderSetupClient.tsx +209 -59
- package/src/components/AgentCard.tsx +4 -4
- package/src/components/AgentLogPreview.tsx +2 -38
- package/src/components/App.tsx +441 -2624
- package/src/components/CliToolHarness.test.tsx +83 -0
- package/src/components/CliToolHarness.tsx +292 -0
- package/src/components/CoordinatorPanel.tsx +13 -6
- package/src/components/LogViewer.tsx +2 -42
- package/src/components/ProviderAuthFlow.tsx +201 -81
- package/src/components/ProvisioningProgress.tsx +1 -1
- package/src/components/ReactionChips.tsx +2 -1
- package/src/components/SpawnModal.test.tsx +51 -18
- package/src/components/SpawnModal.tsx +175 -207
- package/src/components/TerminalProviderSetup.tsx +1 -1
- package/src/components/ThreadPanel.tsx +2 -0
- package/src/components/WorkspaceContext.tsx +7 -19
- package/src/components/XTermLogViewer.tsx +190 -27
- package/src/components/channels/ChannelMessageList.tsx +94 -4
- package/src/components/channels/ChannelViewV1.tsx +35 -11
- package/src/components/channels/api.ts +21 -20
- package/src/components/channels/types.ts +16 -0
- package/src/components/hooks/index.ts +0 -19
- package/src/components/hooks/useMessages.test.ts +80 -0
- package/src/components/hooks/useMessages.ts +13 -4
- package/src/components/hooks/useOrchestrator.ts +1 -1
- package/src/components/hooks/usePresence.ts +45 -6
- package/src/components/hooks/useThread.ts +83 -46
- package/src/components/hooks/useTrajectory.ts +62 -5
- package/src/components/hooks/useWebSocket.test.ts +358 -0
- package/src/components/hooks/useWebSocket.ts +243 -5
- package/src/components/index.ts +2 -14
- package/src/components/layout/Header.tsx +9 -15
- package/src/components/layout/Sidebar.tsx +1 -8
- package/src/components/settings/SettingsPage.tsx +108 -47
- package/src/components/settings/index.ts +0 -3
- package/src/landing/blogData.ts +1 -1
- package/src/lib/agent-merge.test.ts +2 -2
- package/src/lib/api.ts +8 -38
- package/src/lib/identity.test.ts +139 -0
- package/src/lib/identity.ts +48 -0
- package/src/lib/relaycastMessageAdapters.test.ts +182 -0
- package/src/lib/relaycastMessageAdapters.ts +105 -0
- package/src/lib/sanitize-logs.test.ts +227 -0
- package/src/lib/sanitize-logs.ts +202 -0
- package/src/providers/AgentProvider.tsx +799 -0
- package/src/providers/ChannelProvider.tsx +528 -0
- package/src/providers/CloudWorkspaceProvider.tsx +402 -0
- package/src/providers/MessageProvider.tsx +875 -0
- package/src/providers/RelayConfigProvider.tsx +94 -0
- package/src/providers/SendProvider.tsx +497 -0
- package/src/providers/SettingsProvider.tsx +247 -0
- package/src/providers/index.ts +26 -0
- package/src/types/index.ts +10 -10
- package/out/_next/static/chunks/11-9a2993a37266dcb3.js +0 -9
- package/out/_next/static/chunks/118-ae2b650136a5a5fc.js +0 -1
- package/out/_next/static/chunks/1dd3208c-40ab0fc0f60392b8.js +0 -1
- package/out/_next/static/chunks/202-fc0763dd7488e58f.js +0 -1
- package/out/_next/static/chunks/259-83b77fa1b91ba5aa.js +0 -1
- package/out/_next/static/chunks/407-0c82986cf79c8ecb.js +0 -1
- package/out/_next/static/chunks/528-f5f676996d613c25.js +0 -2
- package/out/_next/static/chunks/663-ddb04081febc3678.js +0 -1
- package/out/_next/static/chunks/687-88b6b139a6bb0e2e.js +0 -1
- package/out/_next/static/chunks/695-51d25b1988644374.js +0 -1
- package/out/_next/static/chunks/773-54a2641043c81e55.js +0 -1
- package/out/_next/static/chunks/app/_not-found/page-6da9b72091e5b511.js +0 -1
- package/out/_next/static/chunks/app/about/page-fff7c6457683f243.js +0 -1
- package/out/_next/static/chunks/app/app/[[...slug]]/page-f7eca1b66fb4249b.js +0 -1
- package/out/_next/static/chunks/app/app/onboarding/page-129abc5da2e67971.js +0 -1
- package/out/_next/static/chunks/app/blog/go-to-bed-wake-up-to-a-finished-product/page-5d5f28fd126b692f.js +0 -1
- package/out/_next/static/chunks/app/blog/let-them-cook-multi-agent-orchestration/page-b194f207fbd91862.js +0 -1
- package/out/_next/static/chunks/app/blog/page-b9bd9d8703fca76a.js +0 -1
- package/out/_next/static/chunks/app/careers/page-a4bd8d5f4de8f4eb.js +0 -1
- package/out/_next/static/chunks/app/changelog/page-9a1f6ad1743d63c5.js +0 -1
- package/out/_next/static/chunks/app/cloud/link/page-0844c5699b027c3b.js +0 -1
- package/out/_next/static/chunks/app/complete-profile/page-39ed5a67916beb87.js +0 -1
- package/out/_next/static/chunks/app/connect-repos/page-297eddee0c39f2a3.js +0 -1
- package/out/_next/static/chunks/app/contact/page-3c1dd8690217fade.js +0 -1
- package/out/_next/static/chunks/app/docs/page-1875e981f2c3fd13.js +0 -1
- package/out/_next/static/chunks/app/history/page-2d5c5695c9e8b40c.js +0 -1
- package/out/_next/static/chunks/app/layout-0a4b99656da25511.js +0 -1
- package/out/_next/static/chunks/app/login/page-f69c076f5a6fc520.js +0 -1
- package/out/_next/static/chunks/app/metrics/page-bebbee055669a17e.js +0 -1
- package/out/_next/static/chunks/app/page-0ee604f7070d14c0.js +0 -1
- package/out/_next/static/chunks/app/pricing/page-eeae7d594af333b6.js +0 -1
- package/out/_next/static/chunks/app/providers/setup/[provider]/page-daf9b3e05e77ae19.js +0 -1
- package/out/_next/static/chunks/app/security/page-cd562730fe84a0a2.js +0 -1
- package/out/_next/static/chunks/app/signup/page-c242ca08101a84ff.js +0 -1
- package/out/_next/static/chunks/app/terms/page-c7001720e7941dc6.js +0 -1
- package/out/_next/static/chunks/framework-3664cab31236a9fa.js +0 -1
- package/out/_next/static/chunks/main-app-7f73a939a312a228.js +0 -1
- package/out/_next/static/chunks/pages/_app-10a93ab5b7c32eb3.js +0 -1
- package/out/_next/static/chunks/pages/_error-2d792b2a41857be4.js +0 -1
- package/out/_next/static/css/8968d98ed4c4d33f.css +0 -1
- package/src/components/BillingResult.tsx +0 -447
- package/src/components/CloudSessionProvider.tsx +0 -130
- package/src/components/SessionExpiredModal.tsx +0 -128
- package/src/components/WorkspaceStatusIndicator.tsx +0 -396
- package/src/components/hooks/useSession.ts +0 -209
- package/src/components/hooks/useWorkspaceMembers.ts +0 -132
- package/src/components/hooks/useWorkspaceStatus.ts +0 -237
- package/src/components/settings/BillingSettingsPanel.tsx +0 -564
- package/src/components/settings/TeamSettingsPanel.tsx +0 -560
- package/src/components/settings/WorkspaceSettingsPanel.tsx +0 -1368
- package/src/lib/cloudApi.ts +0 -893
- /package/out/_next/static/{IxfA6RZu4trcsEMYlkQra → g3G0LMdB7lxcrU5mdM54m}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared log sanitization utilities.
|
|
3
|
+
*
|
|
4
|
+
* Strips ANSI escape codes (including degraded sequences like "[38;5;216m")
|
|
5
|
+
* and control characters so logs render as clean text in inline mode.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const CLI_SPINNER_GLYPHS = '✳✢✶✻✺✹✸✷⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏⣾⣽⣻⢿⡿⣟⣯⣷◐◓◑◒●○◉◎◉·⎿⎽⎾⎷⏺⏵⏢✢✣';
|
|
9
|
+
const CLI_SPINNER_GLYPH_RE = new RegExp(`[${CLI_SPINNER_GLYPHS}]`, 'g');
|
|
10
|
+
const CLI_SPINNER_GLYPH_TEST_RE = new RegExp(`[${CLI_SPINNER_GLYPHS}]`);
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Strip ANSI escape codes and control characters from log content.
|
|
14
|
+
* Used by inline log viewers that don't have native ANSI support (unlike xterm.js).
|
|
15
|
+
*/
|
|
16
|
+
export function sanitizeLogContent(text: string): string {
|
|
17
|
+
if (!text) return '';
|
|
18
|
+
|
|
19
|
+
let result = text;
|
|
20
|
+
|
|
21
|
+
// Remove OSC sequences (like window title): \x1b]...(\x07|\x1b\\)
|
|
22
|
+
result = result.replace(/\x1b\].*?(?:\x07|\x1b\\)/gs, '');
|
|
23
|
+
|
|
24
|
+
// Remove DCS (Device Control String) sequences: \x1bP...\x1b\\
|
|
25
|
+
result = result.replace(/\x1bP.*?\x1b\\/gs, '');
|
|
26
|
+
|
|
27
|
+
// Remove standard ANSI escape sequences (CSI, SGR, etc.)
|
|
28
|
+
result = result.replace(/\x1b\[[0-9;?]*[ -/]*[@-~]/g, '');
|
|
29
|
+
|
|
30
|
+
// Remove single-character escapes
|
|
31
|
+
result = result.replace(/\x1b[@-Z\\-_]/g, '');
|
|
32
|
+
|
|
33
|
+
// Remove orphaned CSI sequences that lost their escape byte
|
|
34
|
+
result = result.replace(/^\[\??\d+[hlKJHfABCDGPXsu]/gm, '');
|
|
35
|
+
|
|
36
|
+
// Remove literal SGR sequences that show up without ESC (e.g. "[38;5;216m")
|
|
37
|
+
result = result.replace(/\[\d+(?:;\d+)*m/g, '');
|
|
38
|
+
|
|
39
|
+
// Normalize \r\n to \n first (Windows line endings)
|
|
40
|
+
result = result.replace(/\r\n/g, '\n');
|
|
41
|
+
|
|
42
|
+
// Handle carriage returns: \r moves cursor to start of line, so text after
|
|
43
|
+
// \r overwrites text before it. For each line, only keep the last \r segment.
|
|
44
|
+
result = result
|
|
45
|
+
.split('\n')
|
|
46
|
+
.map((line) => {
|
|
47
|
+
if (!line.includes('\r')) return line;
|
|
48
|
+
const parts = line.split('\r');
|
|
49
|
+
// Last non-empty part is what's visible after all overwrites
|
|
50
|
+
return parts[parts.length - 1];
|
|
51
|
+
})
|
|
52
|
+
.join('\n');
|
|
53
|
+
|
|
54
|
+
// Handle backspaces iteratively — each \x08 erases the preceding character.
|
|
55
|
+
// A single pass of /.\x08/g fails for consecutive backspaces (e.g. "Typo\b\b\b\b")
|
|
56
|
+
// because after removing one pair, new pairs may form.
|
|
57
|
+
let prev = '';
|
|
58
|
+
while (prev !== result) {
|
|
59
|
+
prev = result;
|
|
60
|
+
result = result.replace(/[^\x08]\x08/g, '');
|
|
61
|
+
}
|
|
62
|
+
result = result.replace(/\x08+/g, '');
|
|
63
|
+
|
|
64
|
+
// Remove any remaining standalone escape bytes (incomplete sequences).
|
|
65
|
+
result = result.replace(/\x1b/g, '');
|
|
66
|
+
|
|
67
|
+
// Remove other control chars (except newline/tab)
|
|
68
|
+
result = result.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F]/g, '');
|
|
69
|
+
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Spinner characters used by common CLI tools */
|
|
74
|
+
export const SPINNER_PATTERN =
|
|
75
|
+
/^[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏⣾⣽⣻⢿⡿⣟⣯⣷◐◓◑◒●○◉◎✳✢✶✻✺✹✸✷⏢|\\\/\-*.\u2800-\u28FF]+$/;
|
|
76
|
+
|
|
77
|
+
/** Claude Code spinner status words (e.g. "✳ Nebulizing…") */
|
|
78
|
+
const CLAUDE_SPINNER_PATTERN = /^[✳✢✶✻✺✹✸✷⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏●○*]?\s*(?:Nebulizing|Simmering|Percolating|Brewing|Distilling|Crystallizing|Synthesizing|Composing|Weaving|Forging|Manifesting|Conjuring|Materializing|Transmuting|Catalyzing|Combobulating|Orbiting|Bypassing|Bypass|Thinking|Thinking…|Running|Working)\s*…?\s*$/i;
|
|
79
|
+
|
|
80
|
+
const RUST_WARNING_PATTERN =
|
|
81
|
+
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z\s+WARN\b.*\bagent_relay_broker\b/;
|
|
82
|
+
const BROKER_LOG_LEVEL_PATTERN =
|
|
83
|
+
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z\s+(?:TRACE|DEBUG|INFO|WARN|ERROR)\s+.*$/i;
|
|
84
|
+
|
|
85
|
+
const MCP_NOISE_PATTERN = /<system-reminder>|Failed to resolve path|Unknown message|relaycast/i;
|
|
86
|
+
const UI_NOISE_PATTERN = /(?:\bshift\+tab\b|\besc to interrupt\b|to cycle|bypass permissions|shimmying|shimming|combobulat|orbiting|nebuliz|simmer|percolat|distill|forge|materializ|conjur|transmut|cataly|thinking to|working on|running on|connecting to)/i;
|
|
87
|
+
const MCP_HELP_PATTERN = /relay_send\(/i;
|
|
88
|
+
const TELEMETRY_NOISE_PATTERN =
|
|
89
|
+
/agent relay collects anonymous usage data|agent-relay telemetry|`agent-relay telemetry disable`|learn more:\s*https:\/\/agent-relay\.com\/telemetry|\[broker\]\s*run/i;
|
|
90
|
+
const NETWORK_NOISE_PATTERN = /hyper_util::|posthog\.com|pooling idle connection|connected to \[/i;
|
|
91
|
+
const TOOL_CLI_NOISE_PREFIX_PATTERN =
|
|
92
|
+
/\b(?:by|byp|bypass|shift\+tab|esct|esctointerrupt|shim|shimmy|orbit|comb|combob|think|running|working|relaycast|relay_send|to:|text:|send_dm)\b/i;
|
|
93
|
+
const SPINNER_DENSITY_THRESHOLD = 0.4;
|
|
94
|
+
|
|
95
|
+
const NON_ALPHA_NUMERIC_PATTERN = /^[^a-zA-Z0-9]+$/;
|
|
96
|
+
const SYMBOL_ONLY_THRESHOLD = 8;
|
|
97
|
+
|
|
98
|
+
function isLikelySpinnerNoise(trimmedText: string): boolean {
|
|
99
|
+
const hasSpinnerGlyph = CLI_SPINNER_GLYPH_TEST_RE.test(trimmedText);
|
|
100
|
+
if (!hasSpinnerGlyph) return false;
|
|
101
|
+
|
|
102
|
+
const printable = trimmedText.replace(/\s+/g, '');
|
|
103
|
+
if (!printable) return false;
|
|
104
|
+
|
|
105
|
+
const spinGlyphCount = (printable.match(CLI_SPINNER_GLYPH_RE) || []).length;
|
|
106
|
+
const alphaWordCount = /\b[a-zA-Z]{3,}\b/.test(trimmedText) ? 1 : 0;
|
|
107
|
+
const density = spinGlyphCount / printable.length;
|
|
108
|
+
|
|
109
|
+
if (spinGlyphCount >= 1 && (density > SPINNER_DENSITY_THRESHOLD || alphaWordCount === 0)) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function isDecorativeNoise(trimmedText: string): boolean {
|
|
117
|
+
if (!trimmedText) return false;
|
|
118
|
+
|
|
119
|
+
const normalized = trimmedText.replace(/\s/g, '');
|
|
120
|
+
if (!normalized) return false;
|
|
121
|
+
if (!NON_ALPHA_NUMERIC_PATTERN.test(normalized)) return false;
|
|
122
|
+
|
|
123
|
+
const spinGlyphCount = (normalized.match(CLI_SPINNER_GLYPH_RE) || []).length;
|
|
124
|
+
if (spinGlyphCount > 0) return true;
|
|
125
|
+
|
|
126
|
+
// Small lines that are just punctuation/box-art from redraw sequences.
|
|
127
|
+
if (normalized.length <= 2) return true;
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function isCompactToolInstruction(text: string): boolean {
|
|
132
|
+
const compact = text.toLowerCase().replace(/\s+/g, '');
|
|
133
|
+
if (!compact) return false;
|
|
134
|
+
|
|
135
|
+
if (MCP_HELP_PATTERN.test(compact)) return true;
|
|
136
|
+
if (UI_NOISE_PATTERN.test(compact)) return true;
|
|
137
|
+
if (TOOL_CLI_NOISE_PREFIX_PATTERN.test(compact)) return true;
|
|
138
|
+
if (/^(?:b|bi|by|sh|shi|esc|es|to|com|combb|comb|or|ori|orb|ora|th|thi|thin|thi|run|r|re|relo|relay|rel|send|sending|send_dm|text|t:)/.test(compact)) {
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
if (compact.includes('shift+tabtocycle')) return true;
|
|
142
|
+
if (compact.includes('bypasspermissions')) return true;
|
|
143
|
+
if (compact.includes('bypasspermission')) return true;
|
|
144
|
+
if (compact.includes('esctointerrupt')) return true;
|
|
145
|
+
|
|
146
|
+
if (compact.length <= 3 && /^[a-z]+$/.test(compact)) {
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function isSymbolHeavyNoise(trimmedText: string): boolean {
|
|
154
|
+
const compact = trimmedText.replace(/\s/g, '');
|
|
155
|
+
if (!compact) return false;
|
|
156
|
+
|
|
157
|
+
const symbols = compact.replace(/[a-zA-Z0-9]/g, '');
|
|
158
|
+
if (!symbols) return false;
|
|
159
|
+
if (symbols.length >= compact.length) return true;
|
|
160
|
+
if (compact.length <= SYMBOL_ONLY_THRESHOLD && symbols.length / compact.length > 0.35) return true;
|
|
161
|
+
if (/[⏵⏴⏷⏶⎽⎿⎾]/.test(compact) && symbols.length >= 2) return true;
|
|
162
|
+
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Returns true if the given (already-sanitized, trimmed) text looks like a
|
|
168
|
+
* spinner fragment that should be filtered out of inline log displays.
|
|
169
|
+
*/
|
|
170
|
+
export function isSpinnerFragment(trimmedText: string): boolean {
|
|
171
|
+
if (trimmedText.length <= 2 && SPINNER_PATTERN.test(trimmedText)) return true;
|
|
172
|
+
if (CLAUDE_SPINNER_PATTERN.test(trimmedText)) return true;
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export function isRustWarningLine(trimmedText: string): boolean {
|
|
177
|
+
return RUST_WARNING_PATTERN.test(trimmedText);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Returns true when a log line is known UI noise for this project
|
|
182
|
+
* and should not be shown in the compact harness.
|
|
183
|
+
*/
|
|
184
|
+
export function isHarnessNoisyLine(trimmedText: string): boolean {
|
|
185
|
+
const normalized = trimmedText.toLowerCase().replace(/\s+/g, ' ').trim();
|
|
186
|
+
const withoutTag = trimmedText.replace(/^\[[^\]]+\]\s*/g, '').trim().toLowerCase();
|
|
187
|
+
if (isSpinnerFragment(trimmedText)) return true;
|
|
188
|
+
if (isLikelySpinnerNoise(trimmedText)) return true;
|
|
189
|
+
if (isDecorativeNoise(trimmedText)) return true;
|
|
190
|
+
if (BROKER_LOG_LEVEL_PATTERN.test(normalized)) return true;
|
|
191
|
+
if (BROKER_LOG_LEVEL_PATTERN.test(withoutTag)) return true;
|
|
192
|
+
if (isRustWarningLine(trimmedText)) return true;
|
|
193
|
+
if (MCP_NOISE_PATTERN.test(normalized)) return true;
|
|
194
|
+
if (UI_NOISE_PATTERN.test(normalized)) return true;
|
|
195
|
+
if (UI_NOISE_PATTERN.test(trimmedText)) return true;
|
|
196
|
+
if (isCompactToolInstruction(trimmedText)) return true;
|
|
197
|
+
if (NETWORK_NOISE_PATTERN.test(normalized)) return true;
|
|
198
|
+
if (TELEMETRY_NOISE_PATTERN.test(normalized)) return true;
|
|
199
|
+
if (TELEMETRY_NOISE_PATTERN.test(withoutTag)) return true;
|
|
200
|
+
if (isSymbolHeavyNoise(trimmedText)) return true;
|
|
201
|
+
return false;
|
|
202
|
+
}
|