@stackmemoryai/stackmemory 0.3.17 → 0.3.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/skills.js +15 -2
- package/dist/cli/commands/skills.js.map +2 -2
- package/dist/cli/index.js +113 -834
- package/dist/cli/index.js.map +3 -3
- package/dist/core/context/dual-stack-manager.js +1 -1
- package/dist/core/context/dual-stack-manager.js.map +1 -1
- package/dist/core/context/frame-manager.js +3 -0
- package/dist/core/context/frame-manager.js.map +2 -2
- package/dist/integrations/claude-code/subagent-client.js +106 -3
- package/dist/integrations/claude-code/subagent-client.js.map +2 -2
- package/dist/servers/railway/config.js +51 -0
- package/dist/servers/railway/config.js.map +7 -0
- package/dist/servers/railway/index-enhanced.js +156 -0
- package/dist/servers/railway/index-enhanced.js.map +7 -0
- package/dist/servers/railway/minimal.js +48 -3
- package/dist/servers/railway/minimal.js.map +2 -2
- package/dist/servers/railway/storage-test.js +455 -0
- package/dist/servers/railway/storage-test.js.map +7 -0
- package/dist/skills/claude-skills.js +13 -12
- package/dist/skills/claude-skills.js.map +2 -2
- package/dist/skills/recursive-agent-orchestrator.js +27 -18
- package/dist/skills/recursive-agent-orchestrator.js.map +2 -2
- package/dist/skills/unified-rlm-orchestrator.js.map +2 -2
- package/package.json +6 -18
- package/scripts/README-TESTING.md +186 -0
- package/scripts/analyze-cli-security.js +288 -0
- package/scripts/archive/add-phase-tasks-to-linear.js +163 -0
- package/scripts/archive/analyze-linear-duplicates.js +214 -0
- package/scripts/archive/analyze-remaining-duplicates.js +230 -0
- package/scripts/archive/analyze-sta-duplicates.js +292 -0
- package/scripts/archive/analyze-sta-graphql.js +399 -0
- package/scripts/archive/cancel-duplicate-tasks.ts +246 -0
- package/scripts/archive/check-all-duplicates.ts +419 -0
- package/scripts/archive/clean-duplicate-tasks.js +114 -0
- package/scripts/archive/cleanup-duplicate-tasks.ts +286 -0
- package/scripts/archive/create-phase-tasks.js +387 -0
- package/scripts/archive/delete-linear-duplicates.js +182 -0
- package/scripts/archive/delete-remaining-duplicates.js +158 -0
- package/scripts/archive/delete-sta-duplicates.js +201 -0
- package/scripts/archive/delete-sta-oauth.js +201 -0
- package/scripts/archive/export-sta-tasks.js +62 -0
- package/scripts/archive/install-auto-sync.js +266 -0
- package/scripts/archive/install-chromadb-hooks.sh +133 -0
- package/scripts/archive/install-enhanced-clear-hooks.sh +431 -0
- package/scripts/archive/install-post-task-hooks.sh +289 -0
- package/scripts/archive/install-stackmemory-hooks.sh +420 -0
- package/scripts/archive/merge-linear-duplicates-safe.ts +362 -0
- package/scripts/archive/merge-linear-duplicates.ts +180 -0
- package/scripts/archive/remove-sta-tasks.js +70 -0
- package/scripts/archive/setup-background-sync.sh +168 -0
- package/scripts/archive/setup-claude-auto-triggers.sh +181 -0
- package/scripts/archive/setup-claude-autostart.sh +305 -0
- package/scripts/archive/setup-git-hooks.sh +25 -0
- package/scripts/archive/setup-linear-oauth.sh +46 -0
- package/scripts/archive/setup-mcp.sh +113 -0
- package/scripts/archive/setup-railway-deployment.sh +81 -0
- package/scripts/auto-handoff.sh +262 -0
- package/scripts/background-sync-manager.js +416 -0
- package/scripts/benchmark-performance.ts +57 -0
- package/scripts/check-redis.ts +48 -0
- package/scripts/chromadb-auto-loader.sh +128 -0
- package/scripts/chromadb-context-loader.js +479 -0
- package/scripts/claude-chromadb-hook.js +460 -0
- package/scripts/claude-code-wrapper.sh +66 -0
- package/scripts/claude-linear-skill.js +455 -0
- package/scripts/claude-pre-commit.sh +302 -0
- package/scripts/claude-sm-autostart.js +532 -0
- package/scripts/claude-sm-setup.sh +367 -0
- package/scripts/claude-with-chromadb.sh +69 -0
- package/scripts/claude-worktree-manager.sh +323 -0
- package/scripts/claude-worktree-monitor.sh +371 -0
- package/scripts/claude-worktree-setup.sh +327 -0
- package/scripts/clean-linear-backlog.js +273 -0
- package/scripts/cleanup-old-sessions.sh +57 -0
- package/scripts/codex-wrapper.sh +88 -0
- package/scripts/create-sandbox.sh +269 -0
- package/scripts/debug-linear-update.js +174 -0
- package/scripts/delete-linear-tasks.js +167 -0
- package/scripts/deploy.sh +89 -0
- package/scripts/deployment/railway.sh +352 -0
- package/scripts/deployment/test-deployment.js +194 -0
- package/scripts/detect-and-rehydrate.js +162 -0
- package/scripts/detect-and-rehydrate.mjs +165 -0
- package/scripts/development/create-demo-tasks.js +143 -0
- package/scripts/development/debug-frame-test.js +16 -0
- package/scripts/development/demo-auto-sync.js +128 -0
- package/scripts/development/fix-all-imports.js +213 -0
- package/scripts/development/fix-imports.js +229 -0
- package/scripts/development/fix-lint-loop.cjs +103 -0
- package/scripts/development/fix-project-id.ts +161 -0
- package/scripts/development/fix-strict-mode-issues.ts +291 -0
- package/scripts/development/reorganize-structure.sh +228 -0
- package/scripts/development/test-persistence-direct.js +148 -0
- package/scripts/development/test-persistence.js +114 -0
- package/scripts/development/test-tasks.js +93 -0
- package/scripts/development/update-imports.js +212 -0
- package/scripts/fetch-linear-status.js +125 -0
- package/scripts/git-hooks/README.md +310 -0
- package/scripts/git-hooks/branch-context-manager.sh +342 -0
- package/scripts/git-hooks/post-checkout-stackmemory.sh +63 -0
- package/scripts/git-hooks/post-commit-stackmemory.sh +305 -0
- package/scripts/git-hooks/pre-commit-stackmemory.sh +275 -0
- package/scripts/hooks/cleanup-shell.sh +130 -0
- package/scripts/hooks/task-complete.sh +114 -0
- package/scripts/initialize.ts +129 -0
- package/scripts/install-claude-hooks-auto.js +104 -0
- package/scripts/install-claude-hooks.sh +133 -0
- package/scripts/install-global.sh +296 -0
- package/scripts/install.sh +235 -0
- package/scripts/linear-auto-sync.js +262 -0
- package/scripts/linear-auto-sync.sh +161 -0
- package/scripts/linear-sync-daemon.js +150 -0
- package/scripts/linear-task-review.js +237 -0
- package/scripts/list-linear-tasks.ts +178 -0
- package/scripts/mcp-proxy.js +66 -0
- package/scripts/opencode-wrapper.sh +85 -0
- package/scripts/publish-local.js +74 -0
- package/scripts/query-chromadb.ts +201 -0
- package/scripts/railway-env-setup.sh +39 -0
- package/scripts/reconcile-local-tasks.js +170 -0
- package/scripts/recreate-frames-db.js +89 -0
- package/scripts/setup/claude-integration.js +138 -0
- package/scripts/setup/configure-alias.js +125 -0
- package/scripts/setup/configure-codex-alias.js +161 -0
- package/scripts/setup/configure-opencode-alias.js +175 -0
- package/scripts/setup-claude-integration.js +204 -0
- package/scripts/setup-claude-integration.sh +183 -0
- package/scripts/setup.sh +31 -0
- package/scripts/show-linear-summary.ts +172 -0
- package/scripts/stackmemory-auto-handoff.sh +231 -0
- package/scripts/stackmemory-daemon.sh +40 -0
- package/scripts/start-linear-sync-daemon.sh +141 -0
- package/scripts/start-temporal-paradox.sh +214 -0
- package/scripts/status.ts +159 -0
- package/scripts/sync-and-clean-tasks.js +258 -0
- package/scripts/sync-frames-from-railway.js +228 -0
- package/scripts/sync-linear-graphql.js +303 -0
- package/scripts/sync-linear-tasks.js +186 -0
- package/scripts/test-auto-triggers.sh +57 -0
- package/scripts/test-browser-mcp.js +74 -0
- package/scripts/test-chromadb-full.js +115 -0
- package/scripts/test-chromadb-hooks.sh +28 -0
- package/scripts/test-chromadb-sync.ts +245 -0
- package/scripts/test-cli-security.js +293 -0
- package/scripts/test-hooks-persistence.sh +220 -0
- package/scripts/test-installation-scenarios.sh +359 -0
- package/scripts/test-installation.sh +224 -0
- package/scripts/test-mcp.js +163 -0
- package/scripts/test-pre-publish-quick.sh +75 -0
- package/scripts/test-quality-gates.sh +263 -0
- package/scripts/test-railway-db.js +222 -0
- package/scripts/test-redis-storage.ts +490 -0
- package/scripts/test-rlm-basic.sh +122 -0
- package/scripts/test-rlm-comprehensive.sh +260 -0
- package/scripts/test-rlm-e2e.sh +268 -0
- package/scripts/test-rlm-simple.js +90 -0
- package/scripts/test-rlm.js +110 -0
- package/scripts/test-session-handoff.sh +165 -0
- package/scripts/test-shell-integration.sh +275 -0
- package/scripts/testing/ab-test-runner.ts +508 -0
- package/scripts/testing/collect-metrics.ts +457 -0
- package/scripts/testing/quick-effectiveness-demo.js +187 -0
- package/scripts/testing/real-performance-test.js +422 -0
- package/scripts/testing/run-effectiveness-tests.sh +176 -0
- package/scripts/testing/scripts/testing/ab-test-runner.js +363 -0
- package/scripts/testing/scripts/testing/collect-metrics.js +292 -0
- package/scripts/testing/simple-effectiveness-test.js +310 -0
- package/scripts/testing/src/core/context/context-bridge.js +253 -0
- package/scripts/testing/src/core/context/frame-manager.js +746 -0
- package/scripts/testing/src/core/context/shared-context-layer.js +437 -0
- package/scripts/testing/src/core/database/database-adapter.js +54 -0
- package/scripts/testing/src/core/errors/index.js +291 -0
- package/scripts/testing/src/core/errors/recovery.js +268 -0
- package/scripts/testing/src/core/monitoring/logger.js +145 -0
- package/scripts/testing/src/core/retrieval/context-retriever.js +516 -0
- package/scripts/testing/src/core/session/index.js +1 -0
- package/scripts/testing/src/core/session/session-manager.js +323 -0
- package/scripts/testing/src/core/trace/cli-trace-wrapper.js +140 -0
- package/scripts/testing/src/core/trace/db-trace-wrapper.js +251 -0
- package/scripts/testing/src/core/trace/debug-trace.js +398 -0
- package/scripts/testing/src/core/trace/index.js +120 -0
- package/scripts/testing/src/core/trace/linear-api-wrapper.js +204 -0
- package/scripts/update-linear-status.js +268 -0
- package/scripts/update-linear-tasks-fixed.js +284 -0
- package/templates/claude-hooks/hooks.json +5 -0
- package/templates/claude-hooks/on-clear.js +56 -0
- package/templates/claude-hooks/on-startup.js +56 -0
- package/templates/claude-hooks/tool-use-trace.js +67 -0
- package/dist/features/tui/components/analytics-panel.js +0 -157
- package/dist/features/tui/components/analytics-panel.js.map +0 -7
- package/dist/features/tui/components/frame-visualizer.js +0 -377
- package/dist/features/tui/components/frame-visualizer.js.map +0 -7
- package/dist/features/tui/components/pr-tracker.js +0 -135
- package/dist/features/tui/components/pr-tracker.js.map +0 -7
- package/dist/features/tui/components/session-monitor.js +0 -299
- package/dist/features/tui/components/session-monitor.js.map +0 -7
- package/dist/features/tui/components/subagent-fleet.js +0 -395
- package/dist/features/tui/components/subagent-fleet.js.map +0 -7
- package/dist/features/tui/components/task-board.js +0 -1139
- package/dist/features/tui/components/task-board.js.map +0 -7
- package/dist/features/tui/index.js +0 -408
- package/dist/features/tui/index.js.map +0 -7
- package/dist/features/tui/services/data-service.js +0 -641
- package/dist/features/tui/services/data-service.js.map +0 -7
- package/dist/features/tui/services/linear-task-reader.js +0 -102
- package/dist/features/tui/services/linear-task-reader.js.map +0 -7
- package/dist/features/tui/services/websocket-client.js +0 -162
- package/dist/features/tui/services/websocket-client.js.map +0 -7
- package/dist/features/tui/terminal-compat.js +0 -220
- package/dist/features/tui/terminal-compat.js.map +0 -7
- package/dist/features/tui/types.js +0 -1
- package/dist/features/tui/types.js.map +0 -7
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/features/tui/services/data-service.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Data Service\n * Manages data fetching and caching for TUI dashboard\n */\n\nimport { EventEmitter } from 'events';\nimport Database from 'better-sqlite3';\nimport { SessionManager } from '../../../core/session/session-manager.js';\nimport { FrameManager } from '../../../core/context/frame-manager.js';\nimport { LinearTaskReader } from './linear-task-reader.js';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport type {} from './types.js';\n\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nimport {\n SessionData,\n LinearTask,\n FrameData,\n SubagentData,\n PRData,\n IssueData,\n AnalyticsData,\n} from '../types.js';\n\nexport class DataService extends EventEmitter {\n private db: Database.Database | null = null;\n private sessionManager: SessionManager | null = null;\n private frameManager: FrameManager | null = null;\n private taskReader: LinearTaskReader | null = null;\n private linearMappings: Map<string, any> = new Map();\n private cache: Map<string, { data: any; timestamp: number }> = new Map();\n private cacheTimeout = 5000; // 5 seconds\n\n async initialize(): Promise<void> {\n try {\n // Initialize database with error handling\n try {\n const dbPath = process.env['PROJECT_ROOT']\n ? `${process.env['PROJECT_ROOT']}/.stackmemory/context.db`\n : `${process.cwd()}/.stackmemory/context.db`;\n\n if (existsSync(dbPath)) {\n this.db = new Database(dbPath);\n }\n } catch (dbError: unknown) {\n if (process.env['DEBUG']) {\n console.log('Database not accessible, continuing without it');\n }\n }\n\n // Initialize task reader for Linear-synced tasks\n try {\n this.taskReader = new LinearTaskReader(\n process.env['PROJECT_ROOT'] || process.cwd()\n );\n\n // Load Linear mappings\n this.linearMappings = this.taskReader.getMappings();\n\n if (process.env['DEBUG']) {\n const tasks = this.taskReader.getTasks();\n console.log(\n `LinearTaskReader initialized with ${tasks.length} tasks`\n );\n }\n } catch (tsError: unknown) {\n if (process.env['DEBUG']) {\n console.log('Task reader initialization failed:', tsError.message);\n }\n }\n\n // Initialize managers with error handling\n try {\n this.sessionManager = new SessionManager({\n enableMonitoring: true,\n });\n } catch (smError: unknown) {\n if (process.env['DEBUG']) {\n console.log('SessionManager initialization failed:', smError.message);\n }\n // Continue without session manager\n }\n\n if (this.db) {\n try {\n this.frameManager = new FrameManager(this.db, 'tui');\n } catch (fmError: unknown) {\n if (process.env['DEBUG']) {\n console.log('FrameManager initialization failed:', fmError.message);\n }\n // Continue without frame manager\n }\n }\n\n // Note: Linear clients removed - all syncing happens via webhook or scheduled scripts\n // The TUI only displays locally synced tasks from the task store\n if (process.env['DEBUG']) {\n console.log(\n 'TUI: Using local task store only (no direct Linear API calls)'\n );\n }\n\n this.emit('data:ready');\n } catch (error: unknown) {\n if (process.env['DEBUG']) {\n console.error('DataService initialization error:', error);\n }\n // Don't throw, just emit ready with mock data\n this.emit('data:ready');\n }\n }\n\n async getSessions(): Promise<SessionData[]> {\n const cached = this.getFromCache('sessions');\n if (cached) return cached;\n\n try {\n // Get active sessions from manager\n const activeSessions = this.sessionManager?.getActiveSessions() || [];\n\n // Try to get recent sessions from database\n let recentSessions = [];\n if (this.db) {\n try {\n const stmt = this.db.prepare(`\n SELECT * FROM sessions \n WHERE created_at > datetime('now', '-24 hours')\n ORDER BY created_at DESC\n LIMIT 20\n `);\n recentSessions = stmt.all() || [];\n } catch (dbError: unknown) {\n // Database table might not exist, continue with mock data\n if (process.env['DEBUG']) {\n console.log('Sessions table not found, using mock data');\n }\n }\n }\n\n // If no real data, provide mock sessions for demo\n if (activeSessions.length === 0 && recentSessions.length === 0) {\n const mockSessions = this.getMockSessions();\n this.setCache('sessions', mockSessions);\n return mockSessions;\n }\n\n // Combine and format\n const sessions: SessionData[] = [\n ...activeSessions.map(this.formatSession),\n ...recentSessions.map(this.formatDatabaseSession),\n ];\n\n this.setCache('sessions', sessions);\n return sessions;\n } catch (error: unknown) {\n if (process.env['DEBUG']) {\n console.error('Error getting sessions:', error);\n }\n return this.getMockSessions();\n }\n }\n\n async getTasks(): Promise<LinearTask[]> {\n const cached = this.getFromCache('tasks');\n if (cached) return cached;\n\n const tasks: LinearTask[] = [];\n\n // ONLY use locally synced tasks - no direct Linear API calls\n // Tasks should be synced via webhook or scheduled sync scripts\n if (this.taskReader) {\n try {\n // LinearTaskReader already returns tasks in the correct format\n const localTasks = this.taskReader.getTasks();\n tasks.push(...localTasks);\n\n if (process.env['DEBUG']) {\n console.log(\n `Loaded ${tasks.length} tasks from local store (no Linear API calls)`\n );\n }\n } catch (error: unknown) {\n if (process.env['DEBUG']) {\n console.log('Failed to get local tasks:', error.message);\n }\n }\n }\n\n // If no local tasks, show helpful message instead of mock data\n if (tasks.length === 0) {\n console.log(\n '\u2139\uFE0F No local tasks found. Run \"npm run linear:sync\" to sync tasks from Linear.'\n );\n const mockTasks = this.getMockTasks();\n this.setCache('tasks', mockTasks);\n return mockTasks;\n }\n\n this.setCache('tasks', tasks);\n return tasks;\n }\n\n async getFrames(): Promise<FrameData[]> {\n const cached = this.getFromCache('frames');\n if (cached) return cached;\n\n try {\n const frames = this.frameManager?.getAllFrames() || [];\n\n // If no frames, return mock data\n if (frames.length === 0) {\n const mockFrames = this.getMockFrames();\n this.setCache('frames', mockFrames);\n return mockFrames;\n }\n\n const formatted = frames.map(this.formatFrame);\n this.setCache('frames', formatted);\n return formatted;\n } catch (error: unknown) {\n if (process.env['DEBUG']) {\n console.error('Error getting frames:', error);\n }\n // Return mock frames on error\n const mockFrames = this.getMockFrames();\n this.setCache('frames', mockFrames);\n return mockFrames;\n }\n }\n\n async getAgents(): Promise<SubagentData[]> {\n const cached = this.getFromCache('agents');\n if (cached) return cached;\n\n try {\n // Mock data for now - would integrate with actual agent manager\n const agents: SubagentData[] = [\n {\n id: 'agent-1',\n type: 'analyzer',\n status: 'active',\n currentTask: {\n id: 'task-1',\n description: 'Analyzing codebase for performance issues',\n progress: 0.65,\n startTime: Date.now() - 120000,\n },\n tasksCompleted: 42,\n tasksFailed: 3,\n averageTime: 180000,\n successRate: 0.93,\n cpuUsage: 45,\n memoryUsage: 62,\n tokenUsage: 125000,\n },\n {\n id: 'agent-2',\n type: 'builder',\n status: 'idle',\n tasksCompleted: 28,\n tasksFailed: 1,\n averageTime: 240000,\n successRate: 0.96,\n cpuUsage: 12,\n memoryUsage: 38,\n tokenUsage: 85000,\n },\n {\n id: 'agent-3',\n type: 'tester',\n status: 'error',\n tasksCompleted: 15,\n tasksFailed: 5,\n averageTime: 90000,\n successRate: 0.75,\n lastError: {\n message: 'Test suite timeout',\n timestamp: Date.now() - 60000,\n recoverable: true,\n },\n cpuUsage: 0,\n memoryUsage: 25,\n tokenUsage: 45000,\n },\n ];\n\n this.setCache('agents', agents);\n return agents;\n } catch (error: unknown) {\n this.emit('error', error);\n return [];\n }\n }\n\n async getPRs(): Promise<PRData[]> {\n const cached = this.getFromCache('prs');\n if (cached) return cached;\n\n try {\n // Mock data - would integrate with GitHub API\n const prs: PRData[] = [\n {\n id: 'pr-1',\n number: 142,\n title: 'feat: Add TUI monitoring dashboard',\n state: 'open',\n draft: false,\n author: { login: 'stackmemory-bot' },\n reviews: [{ user: 'reviewer1', state: 'approved' }],\n checks: {\n total: 5,\n passed: 3,\n failed: 0,\n pending: 2,\n },\n createdAt: new Date(Date.now() - 3600000).toISOString(),\n updatedAt: new Date().toISOString(),\n additions: 1250,\n deletions: 85,\n changedFiles: 12,\n comments: 3,\n labels: ['enhancement', 'monitoring'],\n linearTask: 'STA-100',\n },\n ];\n\n this.setCache('prs', prs);\n return prs;\n } catch (error: unknown) {\n this.emit('error', error);\n return [];\n }\n }\n\n async getIssues(): Promise<IssueData[]> {\n const cached = this.getFromCache('issues');\n if (cached) return cached;\n\n try {\n // Mock data - would integrate with GitHub API\n const issues: IssueData[] = [\n {\n id: 'issue-1',\n number: 89,\n title: 'Session monitoring improvements needed',\n state: 'open',\n author: { login: 'user1' },\n assignees: ['stackmemory-bot'],\n labels: ['enhancement', 'monitoring'],\n createdAt: new Date(Date.now() - 86400000).toISOString(),\n updatedAt: new Date().toISOString(),\n comments: 5,\n },\n ];\n\n this.setCache('issues', issues);\n return issues;\n } catch (error: unknown) {\n this.emit('error', error);\n return [];\n }\n }\n\n async getAnalytics(): Promise<AnalyticsData> {\n const cached = this.getFromCache('analytics');\n if (cached) return cached;\n\n try {\n // Generate analytics data\n const analytics: AnalyticsData = {\n sessions: {\n labels: ['1h', '2h', '3h', '4h', '5h', '6h'],\n values: [5, 8, 12, 15, 18, 22],\n },\n tokens: {\n labels: ['1h', '2h', '3h', '4h', '5h', '6h'],\n values: [12000, 25000, 45000, 62000, 78000, 95000],\n },\n tasks: {\n completed: 45,\n inProgress: 12,\n todo: 28,\n velocity: [8, 12, 15, 18, 20],\n },\n quality: {\n testsPassed: 142,\n testsFailed: 3,\n coverage: 78,\n lintErrors: 0,\n },\n performance: {\n avgResponseTime: [120, 115, 108, 105, 110],\n errorRate: [0.02, 0.015, 0.01, 0.008, 0.005],\n throughput: [100, 120, 135, 140, 145],\n },\n };\n\n this.setCache('analytics', analytics);\n return analytics;\n } catch (error: unknown) {\n this.emit('error', error);\n return {\n sessions: { labels: [], values: [] },\n tokens: { labels: [], values: [] },\n tasks: { completed: 0, inProgress: 0, todo: 0, velocity: [] },\n quality: { testsPassed: 0, testsFailed: 0, coverage: 0, lintErrors: 0 },\n performance: { avgResponseTime: [], errorRate: [], throughput: [] },\n };\n }\n }\n\n private formatSession(session: any): SessionData {\n return {\n id: session.id,\n startTime: session.startTime,\n lastActivity: session.lastActivity,\n completed: session.completed,\n error: session.error,\n totalTokens: session.totalTokens,\n contextUsage: session.contextUsage || 0,\n filesEdited: session.filesEdited,\n commandsRun: session.commandsRun,\n errors: session.errors,\n primaryFile: session.primaryFile,\n gitBranch: session.gitBranch,\n lastCommit: session.lastCommit,\n linearTask: session.linearTask,\n agentType: session.agentType,\n recentActivities: session.recentActivities,\n };\n }\n\n private formatDatabaseSession(row: any): SessionData {\n return {\n id: row.id,\n startTime: new Date(row.created_at).getTime(),\n lastActivity: row.updated_at\n ? new Date(row.updated_at).getTime()\n : undefined,\n completed: row.status === 'completed',\n totalTokens: row.token_count,\n contextUsage: row.context_usage || 0,\n filesEdited: row.files_edited ? JSON.parse(row.files_edited) : [],\n commandsRun: row.commands_run || 0,\n };\n }\n\n private formatLinearTask(task: any): LinearTask {\n return {\n id: task.id,\n identifier: task.identifier,\n title: task.title,\n description: task.description,\n // Use Linear state.type for stable mapping ('unstarted'|'started'|...)\n state: task.state?.type || task.state?.name,\n priority: task.priority,\n estimate: task.estimate,\n dueDate: task.dueDate,\n assignee: task.assignee\n ? {\n id: task.assignee.id,\n name: task.assignee.name,\n email: task.assignee.email,\n }\n : undefined,\n labels: task.labels?.nodes.map((l: any) => l.name),\n project: task.project\n ? {\n id: task.project.id,\n name: task.project.name,\n key: task.project.key,\n }\n : undefined,\n };\n }\n\n private formatRestLinearTask(task: any): LinearTask {\n // Map Linear state.type to TUI display states\n const stateMap: Record<string, string> = {\n backlog: 'Backlog',\n unstarted: 'To Do',\n started: 'In Progress',\n completed: 'Done',\n canceled: 'Canceled',\n };\n\n return {\n id: task.id,\n identifier: task.identifier,\n title: task.title,\n description: task.description,\n state: stateMap[task.state.type] || task.state.name,\n priority: task.priority,\n estimate: task.estimate,\n assignee: task.assignee ? task.assignee.name : undefined,\n createdAt: task.createdAt,\n updatedAt: task.updatedAt,\n };\n }\n\n private formatFrame(frame: any): FrameData {\n return {\n id: frame.id,\n sessionId: frame.sessionId,\n parentId: frame.parentId,\n type: frame.type || 'leaf',\n inputs: frame.inputs,\n outputs: frame.outputs,\n tools: frame.tools,\n digest: frame.digest,\n timestamp: frame.timestamp,\n tokenCount: frame.tokenCount || 0,\n tier: frame.tier || 'hot',\n compressionRatio: frame.compressionRatio,\n score: frame.score,\n children: frame.children,\n references: frame.references,\n };\n }\n\n private getFromCache(key: string): any {\n const cached = this.cache.get(key);\n if (cached && Date.now() - cached.timestamp < this.cacheTimeout) {\n return cached.data;\n }\n return null;\n }\n\n private setCache(key: string, data: any): void {\n this.cache.set(key, { data, timestamp: Date.now() });\n }\n\n private mapLocalStatusToLinearState(status: string): string {\n const statusMap: Record<string, string> = {\n pending: 'To Do',\n in_progress: 'In Progress',\n completed: 'Done',\n cancelled: 'Canceled',\n blocked: 'To Do',\n };\n return statusMap[status] || 'To Do';\n }\n\n private mapLocalPriorityToLinear(priority: string): number {\n const priorityMap: Record<string, number> = {\n urgent: 0,\n high: 1,\n medium: 2,\n low: 3,\n };\n return priorityMap[priority] || 2;\n }\n\n cleanup(): void {\n if (this.db) {\n this.db.close();\n }\n this.cache.clear();\n }\n\n // Mock data methods for demo/offline mode\n private getMockSessions(): SessionData[] {\n const now = Date.now();\n return [\n {\n id: 'demo-session-1',\n startTime: now - 8100000, // 2h 15m ago\n lastActivity: now - 60000, // 1 minute ago\n completed: false,\n totalTokens: 45000,\n contextUsage: 0.45, // 45%\n filesEdited: ['src/components/Dashboard.tsx', 'src/hooks/useAuth.ts'],\n commandsRun: 23,\n primaryFile: 'src/components/Dashboard.tsx',\n gitBranch: 'feature/tui-dashboard',\n agentType: 'frontend',\n recentActivities: [\n {\n timestamp: now - 120000,\n type: 'file_edit' as const,\n description: 'Modified Dashboard.tsx',\n },\n {\n timestamp: now - 60000,\n type: 'command' as const,\n description: 'npm run test',\n },\n ],\n },\n {\n id: 'demo-session-2',\n startTime: now - 2700000, // 45m ago\n lastActivity: now - 300000, // 5 minutes ago\n completed: false,\n totalTokens: 22000,\n contextUsage: 0.22, // 22%\n filesEdited: ['src/api/endpoints.ts', 'src/middleware/auth.ts'],\n commandsRun: 15,\n primaryFile: 'src/api/endpoints.ts',\n gitBranch: 'main',\n agentType: 'backend',\n recentActivities: [\n {\n timestamp: now - 600000,\n type: 'file_edit' as const,\n description: 'Updated API endpoints',\n },\n ],\n },\n ];\n }\n\n private getMockFrames(): FrameData[] {\n return [\n {\n id: 'frame-1',\n sessionId: 'demo-session-1',\n type: 'root',\n tier: 'hot' as const,\n timestamp: new Date().toISOString(),\n tokenCount: 2500,\n score: 95,\n compressionRatio: 2.3,\n digest: 'Implementing React component with hooks',\n tools: ['Edit', 'Read', 'MultiEdit'],\n inputs: ['Create user dashboard'],\n outputs: ['Dashboard component created'],\n children: [],\n references: [],\n },\n {\n id: 'frame-2',\n sessionId: 'demo-session-1',\n type: 'branch',\n tier: 'warm' as const,\n timestamp: new Date(Date.now() - 3600000).toISOString(),\n tokenCount: 1800,\n score: 78,\n compressionRatio: 1.8,\n digest: 'Setting up API endpoints',\n tools: ['Write', 'Edit'],\n inputs: ['Setup REST API'],\n outputs: ['API routes configured'],\n children: [],\n references: [],\n },\n ];\n }\n\n private getMockTasks(): LinearTask[] {\n return [\n {\n id: 'task-1',\n identifier: 'STA-101',\n title: 'Implement TUI dashboard',\n state: 'In Progress',\n priority: 2,\n assignee: 'demo-user',\n createdAt: new Date(Date.now() - 86400000).toISOString(),\n updatedAt: new Date().toISOString(),\n },\n {\n id: 'task-2',\n identifier: 'STA-102',\n title: 'Add terminal compatibility',\n state: 'Done',\n priority: 1,\n assignee: 'demo-user',\n createdAt: new Date(Date.now() - 172800000).toISOString(),\n updatedAt: new Date().toISOString(),\n },\n ];\n }\n\n private getMockAgents(): SubagentData[] {\n return [\n {\n id: 'agent-1',\n name: 'code-reviewer',\n type: 'reviewer',\n status: 'idle',\n tasksCompleted: 45,\n averageTime: '2.3s',\n successRate: 98.5,\n lastActive: new Date().toISOString(),\n },\n {\n id: 'agent-2',\n name: 'test-runner',\n type: 'qa',\n status: 'active',\n tasksCompleted: 156,\n averageTime: '5.6s',\n successRate: 95.2,\n lastActive: new Date().toISOString(),\n },\n ];\n }\n\n private getMockPRs(): PRData[] {\n return [\n {\n id: 'pr-1',\n number: 123,\n title: 'feat: Add terminal compatibility layer',\n state: 'open',\n author: { login: 'demo-user' },\n assignees: [],\n labels: ['enhancement', 'tui'],\n createdAt: new Date(Date.now() - 86400000).toISOString(),\n updatedAt: new Date().toISOString(),\n comments: 3,\n reviews: 1,\n checks: {\n total: 5,\n passed: 5,\n failed: 0,\n pending: 0,\n },\n },\n ];\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { readFileSync, existsSync } from "fs";
|
|
2
|
-
import { join } from "path";
|
|
3
|
-
class LinearTaskReader {
|
|
4
|
-
tasksFile;
|
|
5
|
-
mappingsFile;
|
|
6
|
-
constructor(projectRoot) {
|
|
7
|
-
const root = projectRoot || process.cwd();
|
|
8
|
-
this.tasksFile = join(root, ".stackmemory", "tasks.jsonl");
|
|
9
|
-
this.mappingsFile = join(root, ".stackmemory", "linear-mappings.json");
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Read tasks from the Linear-synced JSONL file
|
|
13
|
-
*/
|
|
14
|
-
getTasks() {
|
|
15
|
-
if (!existsSync(this.tasksFile)) {
|
|
16
|
-
console.log(
|
|
17
|
-
'No tasks file found. Run "npm run linear:sync" to sync tasks.'
|
|
18
|
-
);
|
|
19
|
-
return [];
|
|
20
|
-
}
|
|
21
|
-
try {
|
|
22
|
-
const content = readFileSync(this.tasksFile, "utf8");
|
|
23
|
-
const lines = content.split("\n").filter(Boolean);
|
|
24
|
-
const tasks = lines.map((line) => {
|
|
25
|
-
const task = JSON.parse(line);
|
|
26
|
-
return {
|
|
27
|
-
id: task.id || task.linearId,
|
|
28
|
-
identifier: task.taskId || task.linearId || task.id,
|
|
29
|
-
title: task.title,
|
|
30
|
-
description: task.description || "",
|
|
31
|
-
state: task.linearState || this.mapStatusToState(task.status),
|
|
32
|
-
priority: task.priority || 4,
|
|
33
|
-
estimate: task.estimate,
|
|
34
|
-
assignee: task.assignee,
|
|
35
|
-
createdAt: task.createdAt,
|
|
36
|
-
updatedAt: task.updatedAt,
|
|
37
|
-
lastSyncedAt: task.updatedAt,
|
|
38
|
-
syncStatus: "synced"
|
|
39
|
-
};
|
|
40
|
-
});
|
|
41
|
-
return tasks;
|
|
42
|
-
} catch (error) {
|
|
43
|
-
console.error("Error reading tasks:", error);
|
|
44
|
-
return [];
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Get task mappings between Linear and local IDs
|
|
49
|
-
*/
|
|
50
|
-
getMappings() {
|
|
51
|
-
if (!existsSync(this.mappingsFile)) {
|
|
52
|
-
return /* @__PURE__ */ new Map();
|
|
53
|
-
}
|
|
54
|
-
try {
|
|
55
|
-
const content = readFileSync(this.mappingsFile, "utf8");
|
|
56
|
-
const mappings = JSON.parse(content);
|
|
57
|
-
return new Map(Object.entries(mappings));
|
|
58
|
-
} catch (error) {
|
|
59
|
-
console.error("Error reading mappings:", error);
|
|
60
|
-
return /* @__PURE__ */ new Map();
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Get active tasks (not completed or canceled)
|
|
65
|
-
*/
|
|
66
|
-
getActiveTasks() {
|
|
67
|
-
const allTasks = this.getTasks();
|
|
68
|
-
return allTasks.filter(
|
|
69
|
-
(task) => task.state !== "Done" && task.state !== "Canceled" && task.state !== "Duplicate"
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Get tasks by state
|
|
74
|
-
*/
|
|
75
|
-
getTasksByState(state) {
|
|
76
|
-
const allTasks = this.getTasks();
|
|
77
|
-
return allTasks.filter((task) => task.state === state);
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Map local status to Linear state name
|
|
81
|
-
*/
|
|
82
|
-
mapStatusToState(status) {
|
|
83
|
-
switch (status) {
|
|
84
|
-
case "completed":
|
|
85
|
-
return "Done";
|
|
86
|
-
case "in_progress":
|
|
87
|
-
return "In Progress";
|
|
88
|
-
case "cancelled":
|
|
89
|
-
return "Canceled";
|
|
90
|
-
case "backlog":
|
|
91
|
-
return "Backlog";
|
|
92
|
-
case "todo":
|
|
93
|
-
return "Todo";
|
|
94
|
-
default:
|
|
95
|
-
return "Backlog";
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
export {
|
|
100
|
-
LinearTaskReader
|
|
101
|
-
};
|
|
102
|
-
//# sourceMappingURL=linear-task-reader.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/features/tui/services/linear-task-reader.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Linear Task Reader for TUI\n * Reads Linear-synced tasks from tasks.jsonl\n */\n\nimport { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport type { LinearTask } from '../types.js';\n\nexport class LinearTaskReader {\n private tasksFile: string;\n private mappingsFile: string;\n\n constructor(projectRoot?: string) {\n const root = projectRoot || process.cwd();\n this.tasksFile = join(root, '.stackmemory', 'tasks.jsonl');\n this.mappingsFile = join(root, '.stackmemory', 'linear-mappings.json');\n }\n\n /**\n * Read tasks from the Linear-synced JSONL file\n */\n getTasks(): LinearTask[] {\n if (!existsSync(this.tasksFile)) {\n console.log(\n 'No tasks file found. Run \"npm run linear:sync\" to sync tasks.'\n );\n return [];\n }\n\n try {\n const content = readFileSync(this.tasksFile, 'utf8');\n const lines = content.split('\\n').filter(Boolean);\n\n const tasks: LinearTask[] = lines.map((line: any) => {\n const task = JSON.parse(line);\n\n // Convert from synced format to TUI LinearTask format\n return {\n id: task.id || task.linearId,\n identifier: task.taskId || task.linearId || task.id,\n title: task.title,\n description: task.description || '',\n state: task.linearState || this.mapStatusToState(task.status),\n priority: task.priority || 4,\n estimate: task.estimate,\n assignee: task.assignee,\n createdAt: task.createdAt,\n updatedAt: task.updatedAt,\n lastSyncedAt: task.updatedAt,\n syncStatus: 'synced',\n };\n });\n\n return tasks;\n } catch (error: unknown) {\n console.error('Error reading tasks:', error);\n return [];\n }\n }\n\n /**\n * Get task mappings between Linear and local IDs\n */\n getMappings(): Map<string, any> {\n if (!existsSync(this.mappingsFile)) {\n return new Map();\n }\n\n try {\n const content = readFileSync(this.mappingsFile, 'utf8');\n const mappings = JSON.parse(content);\n return new Map(Object.entries(mappings));\n } catch (error: unknown) {\n console.error('Error reading mappings:', error);\n return new Map();\n }\n }\n\n /**\n * Get active tasks (not completed or canceled)\n */\n getActiveTasks(): LinearTask[] {\n const allTasks = this.getTasks();\n return allTasks.filter(\n (task: any) =>\n task.state !== 'Done' &&\n task.state !== 'Canceled' &&\n task.state !== 'Duplicate'\n );\n }\n\n /**\n * Get tasks by state\n */\n getTasksByState(state: string): LinearTask[] {\n const allTasks = this.getTasks();\n return allTasks.filter((task: any) => task.state === state);\n }\n\n /**\n * Map local status to Linear state name\n */\n private mapStatusToState(status: string): string {\n switch (status) {\n case 'completed':\n return 'Done';\n case 'in_progress':\n return 'In Progress';\n case 'cancelled':\n return 'Canceled';\n case 'backlog':\n return 'Backlog';\n case 'todo':\n return 'Todo';\n default:\n return 'Backlog';\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "AAKA,SAAS,cAAc,kBAAkB;AACzC,SAAS,YAAY;AAGd,MAAM,iBAAiB;AAAA,EACpB;AAAA,EACA;AAAA,EAER,YAAY,aAAsB;AAChC,UAAM,OAAO,eAAe,QAAQ,IAAI;AACxC,SAAK,YAAY,KAAK,MAAM,gBAAgB,aAAa;AACzD,SAAK,eAAe,KAAK,MAAM,gBAAgB,sBAAsB;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,WAAyB;AACvB,QAAI,CAAC,WAAW,KAAK,SAAS,GAAG;AAC/B,cAAQ;AAAA,QACN;AAAA,MACF;AACA,aAAO,CAAC;AAAA,IACV;AAEA,QAAI;AACF,YAAM,UAAU,aAAa,KAAK,WAAW,MAAM;AACnD,YAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,OAAO,OAAO;AAEhD,YAAM,QAAsB,MAAM,IAAI,CAAC,SAAc;AACnD,cAAM,OAAO,KAAK,MAAM,IAAI;AAG5B,eAAO;AAAA,UACL,IAAI,KAAK,MAAM,KAAK;AAAA,UACpB,YAAY,KAAK,UAAU,KAAK,YAAY,KAAK;AAAA,UACjD,OAAO,KAAK;AAAA,UACZ,aAAa,KAAK,eAAe;AAAA,UACjC,OAAO,KAAK,eAAe,KAAK,iBAAiB,KAAK,MAAM;AAAA,UAC5D,UAAU,KAAK,YAAY;AAAA,UAC3B,UAAU,KAAK;AAAA,UACf,UAAU,KAAK;AAAA,UACf,WAAW,KAAK;AAAA,UAChB,WAAW,KAAK;AAAA,UAChB,cAAc,KAAK;AAAA,UACnB,YAAY;AAAA,QACd;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAgB;AACvB,cAAQ,MAAM,wBAAwB,KAAK;AAC3C,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAgC;AAC9B,QAAI,CAAC,WAAW,KAAK,YAAY,GAAG;AAClC,aAAO,oBAAI,IAAI;AAAA,IACjB;AAEA,QAAI;AACF,YAAM,UAAU,aAAa,KAAK,cAAc,MAAM;AACtD,YAAM,WAAW,KAAK,MAAM,OAAO;AACnC,aAAO,IAAI,IAAI,OAAO,QAAQ,QAAQ,CAAC;AAAA,IACzC,SAAS,OAAgB;AACvB,cAAQ,MAAM,2BAA2B,KAAK;AAC9C,aAAO,oBAAI,IAAI;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAA+B;AAC7B,UAAM,WAAW,KAAK,SAAS;AAC/B,WAAO,SAAS;AAAA,MACd,CAAC,SACC,KAAK,UAAU,UACf,KAAK,UAAU,cACf,KAAK,UAAU;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,OAA6B;AAC3C,UAAM,WAAW,KAAK,SAAS;AAC/B,WAAO,SAAS,OAAO,CAAC,SAAc,KAAK,UAAU,KAAK;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,QAAwB;AAC/C,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from "events";
|
|
2
|
-
import WebSocket from "ws";
|
|
3
|
-
function getEnv(key, defaultValue) {
|
|
4
|
-
const value = process.env[key];
|
|
5
|
-
if (value === void 0) {
|
|
6
|
-
if (defaultValue !== void 0) return defaultValue;
|
|
7
|
-
throw new Error(`Environment variable ${key} is required`);
|
|
8
|
-
}
|
|
9
|
-
return value;
|
|
10
|
-
}
|
|
11
|
-
function getOptionalEnv(key) {
|
|
12
|
-
return process.env[key];
|
|
13
|
-
}
|
|
14
|
-
class WebSocketClient extends EventEmitter {
|
|
15
|
-
ws = null;
|
|
16
|
-
url;
|
|
17
|
-
reconnectTimer = null;
|
|
18
|
-
reconnectAttempts = 0;
|
|
19
|
-
maxReconnectAttempts = 10;
|
|
20
|
-
reconnectDelay = 1e3;
|
|
21
|
-
constructor(url) {
|
|
22
|
-
super();
|
|
23
|
-
this.url = url;
|
|
24
|
-
}
|
|
25
|
-
async connect() {
|
|
26
|
-
return new Promise((resolve) => {
|
|
27
|
-
try {
|
|
28
|
-
const handleError = (error) => {
|
|
29
|
-
clearTimeout(connectionTimeout);
|
|
30
|
-
if (process.env["DEBUG"]) {
|
|
31
|
-
console.log("WebSocket connection failed:", error.message);
|
|
32
|
-
}
|
|
33
|
-
if (this.ws) {
|
|
34
|
-
this.ws.removeAllListeners();
|
|
35
|
-
this.ws.terminate();
|
|
36
|
-
this.ws = null;
|
|
37
|
-
}
|
|
38
|
-
resolve();
|
|
39
|
-
};
|
|
40
|
-
const connectionTimeout = setTimeout(() => {
|
|
41
|
-
if (this.ws) {
|
|
42
|
-
this.ws.removeAllListeners();
|
|
43
|
-
this.ws.terminate();
|
|
44
|
-
this.ws = null;
|
|
45
|
-
}
|
|
46
|
-
console.log("\u26A0\uFE0F Running in offline mode (no WebSocket server)");
|
|
47
|
-
this.emit("offline");
|
|
48
|
-
resolve();
|
|
49
|
-
}, 1e3);
|
|
50
|
-
try {
|
|
51
|
-
this.ws = new WebSocket(this.url);
|
|
52
|
-
} catch (wsError) {
|
|
53
|
-
handleError(wsError);
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
this.ws.once("error", handleError);
|
|
57
|
-
this.ws.once("open", () => {
|
|
58
|
-
clearTimeout(connectionTimeout);
|
|
59
|
-
this.ws?.removeListener("error", handleError);
|
|
60
|
-
this.ws?.on("error", (error) => {
|
|
61
|
-
if (process.env["DEBUG"]) {
|
|
62
|
-
console.error("WebSocket error during operation:", error);
|
|
63
|
-
}
|
|
64
|
-
this.emit("error", error);
|
|
65
|
-
});
|
|
66
|
-
console.log("\u2705 WebSocket connected");
|
|
67
|
-
this.reconnectAttempts = 0;
|
|
68
|
-
this.emit("connected");
|
|
69
|
-
resolve();
|
|
70
|
-
});
|
|
71
|
-
this.ws.on("message", (data) => {
|
|
72
|
-
this.handleMessage(data);
|
|
73
|
-
});
|
|
74
|
-
this.ws.once("close", () => {
|
|
75
|
-
clearTimeout(connectionTimeout);
|
|
76
|
-
if (this.reconnectAttempts > 0) {
|
|
77
|
-
console.log("WebSocket disconnected");
|
|
78
|
-
this.emit("disconnected");
|
|
79
|
-
this.attemptReconnect();
|
|
80
|
-
}
|
|
81
|
-
resolve();
|
|
82
|
-
});
|
|
83
|
-
} catch (error) {
|
|
84
|
-
console.log("\u26A0\uFE0F Running in offline mode");
|
|
85
|
-
this.emit("offline");
|
|
86
|
-
resolve();
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
handleMessage(data) {
|
|
91
|
-
try {
|
|
92
|
-
const message = JSON.parse(data.toString());
|
|
93
|
-
switch (message.type) {
|
|
94
|
-
case "session:update":
|
|
95
|
-
this.emit("session:update", message.data);
|
|
96
|
-
break;
|
|
97
|
-
case "task:update":
|
|
98
|
-
this.emit("task:update", message.data);
|
|
99
|
-
break;
|
|
100
|
-
case "frame:update":
|
|
101
|
-
this.emit("frame:update", message.data);
|
|
102
|
-
break;
|
|
103
|
-
case "agent:status":
|
|
104
|
-
this.emit("agent:status", message.data);
|
|
105
|
-
break;
|
|
106
|
-
case "pr:update":
|
|
107
|
-
this.emit("pr:update", message.data);
|
|
108
|
-
break;
|
|
109
|
-
case "analytics:update":
|
|
110
|
-
this.emit("analytics:update", message.data);
|
|
111
|
-
break;
|
|
112
|
-
case "notification":
|
|
113
|
-
this.emit("notification", message.data);
|
|
114
|
-
break;
|
|
115
|
-
default:
|
|
116
|
-
this.emit("message", message);
|
|
117
|
-
}
|
|
118
|
-
} catch (error) {
|
|
119
|
-
console.error("Failed to parse WebSocket message:", error);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
attemptReconnect() {
|
|
123
|
-
if (this.reconnectAttempts >= this.maxReconnectAttempts) {
|
|
124
|
-
this.emit("error", new Error("Max reconnection attempts reached"));
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
this.reconnectAttempts++;
|
|
128
|
-
const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);
|
|
129
|
-
console.log(
|
|
130
|
-
`Attempting to reconnect in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`
|
|
131
|
-
);
|
|
132
|
-
this.reconnectTimer = setTimeout(() => {
|
|
133
|
-
this.connect().catch((error) => {
|
|
134
|
-
console.error("Reconnection failed:", error);
|
|
135
|
-
});
|
|
136
|
-
}, delay);
|
|
137
|
-
}
|
|
138
|
-
send(type, data) {
|
|
139
|
-
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
|
|
140
|
-
this.ws.send(JSON.stringify({ type, data }));
|
|
141
|
-
} else {
|
|
142
|
-
console.warn("WebSocket is not connected");
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
disconnect() {
|
|
146
|
-
if (this.reconnectTimer) {
|
|
147
|
-
clearTimeout(this.reconnectTimer);
|
|
148
|
-
this.reconnectTimer = null;
|
|
149
|
-
}
|
|
150
|
-
if (this.ws) {
|
|
151
|
-
this.ws.close();
|
|
152
|
-
this.ws = null;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
isConnected() {
|
|
156
|
-
return this.ws !== null && this.ws.readyState === WebSocket.OPEN;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
export {
|
|
160
|
-
WebSocketClient
|
|
161
|
-
};
|
|
162
|
-
//# sourceMappingURL=websocket-client.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/features/tui/services/websocket-client.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * WebSocket Client\n * Real-time data streaming for TUI dashboard\n */\n\nimport { EventEmitter } from 'events';\nimport WebSocket from 'ws';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nexport class WebSocketClient extends EventEmitter {\n private ws: WebSocket | null = null;\n private url: string;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 10;\n private reconnectDelay = 1000;\n\n constructor(url: string) {\n super();\n this.url = url;\n }\n\n async connect(): Promise<void> {\n return new Promise((resolve) => {\n try {\n // Add error handler before creating WebSocket to catch connection errors\n const handleError = (error: Error) => {\n clearTimeout(connectionTimeout);\n // Silent error handling - continue in offline mode\n if (process.env['DEBUG']) {\n console.log('WebSocket connection failed:', error.message);\n }\n if (this.ws) {\n this.ws.removeAllListeners();\n this.ws.terminate();\n this.ws = null;\n }\n resolve(); // Always resolve to continue in offline mode\n };\n\n // Set a timeout for connection\n const connectionTimeout = setTimeout(() => {\n if (this.ws) {\n this.ws.removeAllListeners();\n this.ws.terminate();\n this.ws = null;\n }\n console.log('\u26A0\uFE0F Running in offline mode (no WebSocket server)');\n this.emit('offline');\n resolve();\n }, 1000); // Reduce timeout to 1 second\n\n try {\n this.ws = new WebSocket(this.url);\n } catch (wsError: unknown) {\n handleError(wsError as Error);\n return;\n }\n\n // Immediately add error handler to catch connection errors\n this.ws.once('error', handleError);\n\n this.ws.once('open', () => {\n clearTimeout(connectionTimeout);\n // Remove the error handler and add a new one for ongoing errors\n this.ws?.removeListener('error', handleError);\n this.ws?.on('error', (error: Error) => {\n if (process.env['DEBUG']) {\n console.error('WebSocket error during operation:', error);\n }\n this.emit('error', error);\n });\n\n console.log('\u2705 WebSocket connected');\n this.reconnectAttempts = 0;\n this.emit('connected');\n resolve();\n });\n\n this.ws.on('message', (data: WebSocket.Data) => {\n this.handleMessage(data);\n });\n\n this.ws.once('close', () => {\n clearTimeout(connectionTimeout);\n if (this.reconnectAttempts > 0) {\n console.log('WebSocket disconnected');\n this.emit('disconnected');\n this.attemptReconnect();\n }\n // If this is the first close, just resolve\n resolve();\n });\n } catch (error: unknown) {\n // If anything fails, continue in offline mode\n console.log('\u26A0\uFE0F Running in offline mode');\n this.emit('offline');\n resolve();\n }\n });\n }\n\n private handleMessage(data: WebSocket.Data): void {\n try {\n const message = JSON.parse(data.toString());\n\n switch (message.type) {\n case 'session:update':\n this.emit('session:update', message.data);\n break;\n\n case 'task:update':\n this.emit('task:update', message.data);\n break;\n\n case 'frame:update':\n this.emit('frame:update', message.data);\n break;\n\n case 'agent:status':\n this.emit('agent:status', message.data);\n break;\n\n case 'pr:update':\n this.emit('pr:update', message.data);\n break;\n\n case 'analytics:update':\n this.emit('analytics:update', message.data);\n break;\n\n case 'notification':\n this.emit('notification', message.data);\n break;\n\n default:\n this.emit('message', message);\n }\n } catch (error: unknown) {\n console.error('Failed to parse WebSocket message:', error);\n }\n }\n\n private attemptReconnect(): void {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n this.emit('error', new Error('Max reconnection attempts reached'));\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n\n console.log(\n `Attempting to reconnect in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`\n );\n\n this.reconnectTimer = setTimeout(() => {\n this.connect().catch((error) => {\n console.error('Reconnection failed:', error);\n });\n }, delay);\n }\n\n send(type: string, data: any): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify({ type, data }));\n } else {\n console.warn('WebSocket is not connected');\n }\n }\n\n disconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
function getEnv(key, defaultValue) {
|
|
2
|
-
const value = process.env[key];
|
|
3
|
-
if (value === void 0) {
|
|
4
|
-
if (defaultValue !== void 0) return defaultValue;
|
|
5
|
-
throw new Error(`Environment variable ${key} is required`);
|
|
6
|
-
}
|
|
7
|
-
return value;
|
|
8
|
-
}
|
|
9
|
-
function getOptionalEnv(key) {
|
|
10
|
-
return process.env[key];
|
|
11
|
-
}
|
|
12
|
-
class TerminalCompatibility {
|
|
13
|
-
static instance;
|
|
14
|
-
terminalInfo;
|
|
15
|
-
constructor() {
|
|
16
|
-
this.terminalInfo = this.detectTerminal();
|
|
17
|
-
}
|
|
18
|
-
static getInstance() {
|
|
19
|
-
if (!this.instance) {
|
|
20
|
-
this.instance = new TerminalCompatibility();
|
|
21
|
-
}
|
|
22
|
-
return this.instance;
|
|
23
|
-
}
|
|
24
|
-
detectTerminal() {
|
|
25
|
-
const termEnv = process.env["TERM"] || "";
|
|
26
|
-
const termProgram = process.env["TERM_PROGRAM"] || "";
|
|
27
|
-
const isInsideTmux = !!process.env["TMUX"];
|
|
28
|
-
const isGhostty = termEnv.includes("ghostty") || termProgram === "ghostty";
|
|
29
|
-
const isIterm2 = termProgram === "iTerm.app";
|
|
30
|
-
const isTerminalApp = termProgram === "Apple_Terminal";
|
|
31
|
-
let type = "unknown";
|
|
32
|
-
if (isGhostty) {
|
|
33
|
-
type = "ghostty";
|
|
34
|
-
} else if (isInsideTmux) {
|
|
35
|
-
type = "tmux";
|
|
36
|
-
} else if (isIterm2) {
|
|
37
|
-
type = "iterm2";
|
|
38
|
-
} else if (isTerminalApp) {
|
|
39
|
-
type = "terminal";
|
|
40
|
-
} else if (termEnv.includes("xterm")) {
|
|
41
|
-
type = "xterm";
|
|
42
|
-
}
|
|
43
|
-
const supportsTrueColor = this.checkTrueColorSupport();
|
|
44
|
-
const supportsUnicode = this.checkUnicodeSupport();
|
|
45
|
-
const recommendedConfig = this.getRecommendedConfig(type, isInsideTmux);
|
|
46
|
-
return {
|
|
47
|
-
type,
|
|
48
|
-
isInsideTmux,
|
|
49
|
-
supportsTrueColor,
|
|
50
|
-
supportsUnicode,
|
|
51
|
-
termEnv,
|
|
52
|
-
recommendedConfig
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
checkTrueColorSupport() {
|
|
56
|
-
const colorterm = process.env["COLORTERM"];
|
|
57
|
-
if (colorterm === "truecolor" || colorterm === "24bit") {
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
const termProgram = process.env["TERM_PROGRAM"] || "";
|
|
61
|
-
if (["iTerm.app", "Hyper", "vscode"].includes(termProgram)) {
|
|
62
|
-
return true;
|
|
63
|
-
}
|
|
64
|
-
return false;
|
|
65
|
-
}
|
|
66
|
-
checkUnicodeSupport() {
|
|
67
|
-
const lang = process.env["LANG"] || "";
|
|
68
|
-
const lcAll = process.env["LC_ALL"] || "";
|
|
69
|
-
const lcCtype = process.env["LC_CTYPE"] || "";
|
|
70
|
-
const hasUtf8 = [lang, lcAll, lcCtype].some(
|
|
71
|
-
(v) => v.toLowerCase().includes("utf-8") || v.toLowerCase().includes("utf8")
|
|
72
|
-
);
|
|
73
|
-
return hasUtf8;
|
|
74
|
-
}
|
|
75
|
-
getRecommendedConfig(type, isInsideTmux) {
|
|
76
|
-
const baseConfig = {
|
|
77
|
-
smartCSR: true,
|
|
78
|
-
fullUnicode: true,
|
|
79
|
-
forceUnicode: null,
|
|
80
|
-
dockBorders: true,
|
|
81
|
-
terminal: "xterm-256color",
|
|
82
|
-
title: "StackMemory TUI Dashboard",
|
|
83
|
-
warnings: false
|
|
84
|
-
};
|
|
85
|
-
switch (type) {
|
|
86
|
-
case "ghostty":
|
|
87
|
-
return {
|
|
88
|
-
...baseConfig,
|
|
89
|
-
smartCSR: false,
|
|
90
|
-
// Disable smart cursor restore
|
|
91
|
-
terminal: "xterm",
|
|
92
|
-
// Use basic xterm instead of xterm-256color
|
|
93
|
-
dockBorders: false,
|
|
94
|
-
// Can cause rendering issues
|
|
95
|
-
artificalCursor: true,
|
|
96
|
-
// Use artificial cursor
|
|
97
|
-
grabKeys: false,
|
|
98
|
-
// Don't grab all keys
|
|
99
|
-
sendFocus: false
|
|
100
|
-
// Don't send focus events
|
|
101
|
-
};
|
|
102
|
-
case "tmux":
|
|
103
|
-
return {
|
|
104
|
-
...baseConfig,
|
|
105
|
-
terminal: isInsideTmux ? "screen-256color" : "xterm-256color",
|
|
106
|
-
smartCSR: !isInsideTmux,
|
|
107
|
-
// Disable inside tmux
|
|
108
|
-
sendFocus: false
|
|
109
|
-
};
|
|
110
|
-
case "iterm2":
|
|
111
|
-
return {
|
|
112
|
-
...baseConfig,
|
|
113
|
-
terminal: "xterm-256color",
|
|
114
|
-
fullUnicode: true,
|
|
115
|
-
forceUnicode: true
|
|
116
|
-
};
|
|
117
|
-
case "terminal":
|
|
118
|
-
return {
|
|
119
|
-
...baseConfig,
|
|
120
|
-
terminal: "xterm-256color",
|
|
121
|
-
fullUnicode: true
|
|
122
|
-
};
|
|
123
|
-
case "xterm":
|
|
124
|
-
default:
|
|
125
|
-
return {
|
|
126
|
-
...baseConfig,
|
|
127
|
-
smartCSR: false,
|
|
128
|
-
fullUnicode: false,
|
|
129
|
-
forceUnicode: false
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
getTerminalInfo() {
|
|
134
|
-
return this.terminalInfo;
|
|
135
|
-
}
|
|
136
|
-
getBlessedConfig() {
|
|
137
|
-
return this.terminalInfo.recommendedConfig;
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Set optimal TERM environment variable for the detected terminal
|
|
141
|
-
*/
|
|
142
|
-
configureEnvironment() {
|
|
143
|
-
const { type, isInsideTmux } = this.terminalInfo;
|
|
144
|
-
if (type === "ghostty") {
|
|
145
|
-
process.env["TERM"] = "xterm";
|
|
146
|
-
} else if (isInsideTmux) {
|
|
147
|
-
process.env["TERM"] = "screen-256color";
|
|
148
|
-
} else if (!process.env["TERM"] || process.env["TERM"] === "dumb") {
|
|
149
|
-
process.env["TERM"] = "xterm-256color";
|
|
150
|
-
}
|
|
151
|
-
process.env["NODE_NO_WARNINGS"] = "1";
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Check if terminal is suitable for TUI
|
|
155
|
-
*/
|
|
156
|
-
isCompatible() {
|
|
157
|
-
if (process.env["CI"] || process.env["CONTINUOUS_INTEGRATION"]) {
|
|
158
|
-
return false;
|
|
159
|
-
}
|
|
160
|
-
const term = process.env["TERM"] || "";
|
|
161
|
-
if (term === "dumb") {
|
|
162
|
-
return false;
|
|
163
|
-
}
|
|
164
|
-
if (process.env["FORCE_TUI"]) {
|
|
165
|
-
return true;
|
|
166
|
-
}
|
|
167
|
-
const hasAnyTTY = process.stdout.isTTY || process.stdin.isTTY || process.stderr.isTTY;
|
|
168
|
-
if (!hasAnyTTY) {
|
|
169
|
-
const { type } = this.terminalInfo;
|
|
170
|
-
if (type !== "unknown" || term.includes("xterm") || term.includes("screen")) {
|
|
171
|
-
return true;
|
|
172
|
-
}
|
|
173
|
-
return false;
|
|
174
|
-
}
|
|
175
|
-
return true;
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Get compatibility warnings for the current terminal
|
|
179
|
-
*/
|
|
180
|
-
getWarnings() {
|
|
181
|
-
const warnings = [];
|
|
182
|
-
const { type, supportsUnicode, supportsTrueColor } = this.terminalInfo;
|
|
183
|
-
if (type === "ghostty") {
|
|
184
|
-
warnings.push(
|
|
185
|
-
"Ghostty terminal detected: Using compatibility mode with reduced features"
|
|
186
|
-
);
|
|
187
|
-
}
|
|
188
|
-
if (!supportsUnicode) {
|
|
189
|
-
warnings.push(
|
|
190
|
-
"Unicode support not detected: Some icons may not display correctly"
|
|
191
|
-
);
|
|
192
|
-
}
|
|
193
|
-
if (!supportsTrueColor) {
|
|
194
|
-
warnings.push("True color support not detected: Using 256 color mode");
|
|
195
|
-
}
|
|
196
|
-
if (type === "unknown") {
|
|
197
|
-
warnings.push("Unknown terminal type: Using conservative settings");
|
|
198
|
-
}
|
|
199
|
-
return warnings;
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Get terminal capabilities as a string for debugging
|
|
203
|
-
*/
|
|
204
|
-
getCapabilitiesString() {
|
|
205
|
-
const { type, isInsideTmux, supportsTrueColor, supportsUnicode, termEnv } = this.terminalInfo;
|
|
206
|
-
return [
|
|
207
|
-
`Terminal Type: ${type}`,
|
|
208
|
-
`TERM: ${termEnv}`,
|
|
209
|
-
`Inside tmux: ${isInsideTmux}`,
|
|
210
|
-
`True Color: ${supportsTrueColor}`,
|
|
211
|
-
`Unicode: ${supportsUnicode}`
|
|
212
|
-
].join(" | ");
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
const terminalCompat = TerminalCompatibility.getInstance();
|
|
216
|
-
export {
|
|
217
|
-
TerminalCompatibility,
|
|
218
|
-
terminalCompat
|
|
219
|
-
};
|
|
220
|
-
//# sourceMappingURL=terminal-compat.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/features/tui/terminal-compat.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Terminal Compatibility Layer\n * Handles different terminal environments (Ghostty, tmux, standard terminals)\n */\n\nimport os from 'os';\nimport { execSync } from 'child_process';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nexport interface TerminalInfo {\n type: 'ghostty' | 'tmux' | 'iterm2' | 'terminal' | 'xterm' | 'unknown';\n isInsideTmux: boolean;\n supportsTrueColor: boolean;\n supportsUnicode: boolean;\n termEnv: string;\n recommendedConfig: BlessedConfig;\n}\n\nexport interface BlessedConfig {\n smartCSR: boolean;\n fullUnicode: boolean;\n forceUnicode: boolean | null;\n dockBorders: boolean;\n terminal: string;\n title: string;\n // Compatibility flags\n artificalCursor?: boolean;\n grabKeys?: boolean;\n sendFocus?: boolean;\n warnings?: boolean;\n}\n\nexport class TerminalCompatibility {\n private static instance: TerminalCompatibility;\n private terminalInfo: TerminalInfo;\n\n private constructor() {\n this.terminalInfo = this.detectTerminal();\n }\n\n static getInstance(): TerminalCompatibility {\n if (!this.instance) {\n this.instance = new TerminalCompatibility();\n }\n return this.instance;\n }\n\n private detectTerminal(): TerminalInfo {\n const termEnv = process.env['TERM'] || '';\n const termProgram = process.env['TERM_PROGRAM'] || '';\n const isInsideTmux = !!process.env['TMUX'];\n const isGhostty = termEnv.includes('ghostty') || termProgram === 'ghostty';\n const isIterm2 = termProgram === 'iTerm.app';\n const isTerminalApp = termProgram === 'Apple_Terminal';\n\n let type: TerminalInfo['type'] = 'unknown';\n\n if (isGhostty) {\n type = 'ghostty';\n } else if (isInsideTmux) {\n type = 'tmux';\n } else if (isIterm2) {\n type = 'iterm2';\n } else if (isTerminalApp) {\n type = 'terminal';\n } else if (termEnv.includes('xterm')) {\n type = 'xterm';\n }\n\n // Check for true color support\n const supportsTrueColor = this.checkTrueColorSupport();\n const supportsUnicode = this.checkUnicodeSupport();\n\n // Get recommended config based on terminal type\n const recommendedConfig = this.getRecommendedConfig(type, isInsideTmux);\n\n return {\n type,\n isInsideTmux,\n supportsTrueColor,\n supportsUnicode,\n termEnv,\n recommendedConfig,\n };\n }\n\n private checkTrueColorSupport(): boolean {\n const colorterm = process.env['COLORTERM'];\n if (colorterm === 'truecolor' || colorterm === '24bit') {\n return true;\n }\n\n // Check terminal specific env vars\n const termProgram = process.env['TERM_PROGRAM'] || '';\n if (['iTerm.app', 'Hyper', 'vscode'].includes(termProgram)) {\n return true;\n }\n\n return false;\n }\n\n private checkUnicodeSupport(): boolean {\n // Most modern terminals support unicode\n const lang = process.env['LANG'] || '';\n const lcAll = process.env['LC_ALL'] || '';\n const lcCtype = process.env['LC_CTYPE'] || '';\n\n const hasUtf8 = [lang, lcAll, lcCtype].some(\n (v) =>\n v.toLowerCase().includes('utf-8') || v.toLowerCase().includes('utf8')\n );\n\n return hasUtf8;\n }\n\n private getRecommendedConfig(\n type: TerminalInfo['type'],\n isInsideTmux: boolean\n ): BlessedConfig {\n const baseConfig: BlessedConfig = {\n smartCSR: true,\n fullUnicode: true,\n forceUnicode: null,\n dockBorders: true,\n terminal: 'xterm-256color',\n title: 'StackMemory TUI Dashboard',\n warnings: false,\n };\n\n // Terminal-specific adjustments\n switch (type) {\n case 'ghostty':\n // Ghostty has issues with certain escape sequences\n return {\n ...baseConfig,\n smartCSR: false, // Disable smart cursor restore\n terminal: 'xterm', // Use basic xterm instead of xterm-256color\n dockBorders: false, // Can cause rendering issues\n artificalCursor: true, // Use artificial cursor\n grabKeys: false, // Don't grab all keys\n sendFocus: false, // Don't send focus events\n };\n\n case 'tmux':\n // Inside tmux, we need to be more conservative\n return {\n ...baseConfig,\n terminal: isInsideTmux ? 'screen-256color' : 'xterm-256color',\n smartCSR: !isInsideTmux, // Disable inside tmux\n sendFocus: false,\n };\n\n case 'iterm2':\n // iTerm2 has excellent terminal support\n return {\n ...baseConfig,\n terminal: 'xterm-256color',\n fullUnicode: true,\n forceUnicode: true,\n };\n\n case 'terminal':\n // macOS Terminal.app\n return {\n ...baseConfig,\n terminal: 'xterm-256color',\n fullUnicode: true,\n };\n\n case 'xterm':\n default:\n // Conservative defaults for unknown terminals\n return {\n ...baseConfig,\n smartCSR: false,\n fullUnicode: false,\n forceUnicode: false,\n };\n }\n }\n\n getTerminalInfo(): TerminalInfo {\n return this.terminalInfo;\n }\n\n getBlessedConfig(): BlessedConfig {\n return this.terminalInfo.recommendedConfig;\n }\n\n /**\n * Set optimal TERM environment variable for the detected terminal\n */\n configureEnvironment(): void {\n const { type, isInsideTmux } = this.terminalInfo;\n\n if (type === 'ghostty') {\n // Ghostty works better with basic xterm\n process.env['TERM'] = 'xterm';\n } else if (isInsideTmux) {\n // Inside tmux, use screen-256color\n process.env['TERM'] = 'screen-256color';\n } else if (!process.env['TERM'] || process.env['TERM'] === 'dumb') {\n // Fallback to xterm-256color if not set\n process.env['TERM'] = 'xterm-256color';\n }\n\n // Disable Node warnings that can interfere with TUI\n process.env['NODE_NO_WARNINGS'] = '1';\n }\n\n /**\n * Check if terminal is suitable for TUI\n */\n isCompatible(): boolean {\n // Check if we're in a non-interactive environment\n if (process.env['CI'] || process.env['CONTINUOUS_INTEGRATION']) {\n return false;\n }\n\n // Check if terminal is too basic\n const term = process.env['TERM'] || '';\n if (term === 'dumb') {\n return false;\n }\n\n // Allow if FORCE_TUI is set\n if (process.env['FORCE_TUI']) {\n return true;\n }\n\n // Check if any TTY is available (stdout, stdin, or stderr)\n const hasAnyTTY =\n process.stdout.isTTY || process.stdin.isTTY || process.stderr.isTTY;\n\n // When running through npm/node, TTY detection might fail\n // but we still want to allow TUI if terminal is capable\n if (!hasAnyTTY) {\n const { type } = this.terminalInfo;\n // Allow known terminal types even without TTY detection\n if (\n type !== 'unknown' ||\n term.includes('xterm') ||\n term.includes('screen')\n ) {\n return true;\n }\n return false;\n }\n\n return true;\n }\n\n /**\n * Get compatibility warnings for the current terminal\n */\n getWarnings(): string[] {\n const warnings: string[] = [];\n const { type, supportsUnicode, supportsTrueColor } = this.terminalInfo;\n\n if (type === 'ghostty') {\n warnings.push(\n 'Ghostty terminal detected: Using compatibility mode with reduced features'\n );\n }\n\n if (!supportsUnicode) {\n warnings.push(\n 'Unicode support not detected: Some icons may not display correctly'\n );\n }\n\n if (!supportsTrueColor) {\n warnings.push('True color support not detected: Using 256 color mode');\n }\n\n if (type === 'unknown') {\n warnings.push('Unknown terminal type: Using conservative settings');\n }\n\n return warnings;\n }\n\n /**\n * Get terminal capabilities as a string for debugging\n */\n getCapabilitiesString(): string {\n const { type, isInsideTmux, supportsTrueColor, supportsUnicode, termEnv } =\n this.terminalInfo;\n\n return [\n `Terminal Type: ${type}`,\n `TERM: ${termEnv}`,\n `Inside tmux: ${isInsideTmux}`,\n `True Color: ${supportsTrueColor}`,\n `Unicode: ${supportsUnicode}`,\n ].join(' | ');\n }\n}\n\n// Export singleton instance\nexport const terminalCompat = TerminalCompatibility.getInstance();\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=types.js.map
|