@stackmemoryai/stackmemory 0.5.58 → 0.5.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -1
- package/dist/scripts/benchmark-performance.js +48 -0
- package/dist/scripts/benchmark-performance.js.map +7 -0
- package/dist/scripts/check-redis.js +42 -0
- package/dist/scripts/check-redis.js.map +7 -0
- package/dist/scripts/initialize.js +116 -0
- package/dist/scripts/initialize.js.map +7 -0
- package/dist/scripts/list-linear-tasks.js +124 -0
- package/dist/scripts/list-linear-tasks.js.map +7 -0
- package/dist/scripts/measure-handoff-impact.js +340 -0
- package/dist/scripts/measure-handoff-impact.js.map +7 -0
- package/dist/scripts/query-chromadb.js +160 -0
- package/dist/scripts/query-chromadb.js.map +7 -0
- package/dist/scripts/show-linear-summary.js +119 -0
- package/dist/scripts/show-linear-summary.js.map +7 -0
- package/dist/scripts/simple-swarm-demo.js +90 -0
- package/dist/scripts/simple-swarm-demo.js.map +7 -0
- package/dist/scripts/status.js +155 -0
- package/dist/scripts/status.js.map +7 -0
- package/dist/scripts/test-chromadb-sync.js +192 -0
- package/dist/scripts/test-chromadb-sync.js.map +7 -0
- package/dist/scripts/test-ralph-iteration-fix.js +86 -0
- package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
- package/dist/scripts/test-ralph-iterations.js +121 -0
- package/dist/scripts/test-ralph-iterations.js.map +7 -0
- package/dist/scripts/test-redis-storage.js +389 -0
- package/dist/scripts/test-redis-storage.js.map +7 -0
- package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
- package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
- package/dist/scripts/test-swarm-fixes.js +125 -0
- package/dist/scripts/test-swarm-fixes.js.map +7 -0
- package/dist/scripts/test-swarm-tui.js +23 -0
- package/dist/scripts/test-swarm-tui.js.map +7 -0
- package/dist/scripts/test-tui-shortcuts.js +52 -0
- package/dist/scripts/test-tui-shortcuts.js.map +7 -0
- package/dist/scripts/validate-tui-shortcuts.js +60 -0
- package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
- package/dist/src/agents/core/agent-task-manager.js.map +7 -0
- package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
- package/dist/src/cli/auto-detect.js.map +7 -0
- package/dist/src/cli/claude-sm-danger.js.map +7 -0
- package/dist/src/cli/claude-sm.js +1236 -0
- package/dist/src/cli/claude-sm.js.map +7 -0
- package/dist/src/cli/codex-sm-danger.js.map +7 -0
- package/dist/src/cli/codex-sm.js.map +7 -0
- package/dist/src/cli/commands/api.js.map +7 -0
- package/dist/src/cli/commands/auto-background.js.map +7 -0
- package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
- package/dist/src/cli/commands/clear.js.map +7 -0
- package/dist/src/cli/commands/config.js.map +7 -0
- package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
- package/dist/src/cli/commands/context.js.map +7 -0
- package/dist/src/cli/commands/daemon.js.map +7 -0
- package/dist/src/cli/commands/dashboard.js.map +7 -0
- package/dist/src/cli/commands/db.js.map +7 -0
- package/dist/src/cli/commands/decision.js.map +7 -0
- package/dist/src/cli/commands/discovery.js.map +7 -0
- package/dist/src/cli/commands/handoff.js.map +7 -0
- package/dist/src/cli/commands/hooks.js.map +7 -0
- package/dist/src/cli/commands/linear.js.map +7 -0
- package/dist/src/cli/commands/log.js.map +7 -0
- package/dist/src/cli/commands/login.js.map +7 -0
- package/dist/src/cli/commands/migrate.js.map +7 -0
- package/dist/src/cli/commands/model.js.map +7 -0
- package/dist/src/cli/commands/onboard.js.map +7 -0
- package/dist/src/cli/commands/projects.js.map +7 -0
- package/dist/src/cli/commands/ralph.js.map +7 -0
- package/dist/src/cli/commands/retrieval.js.map +7 -0
- package/dist/src/cli/commands/search.js +173 -0
- package/dist/src/cli/commands/search.js.map +7 -0
- package/dist/src/cli/commands/service.js.map +7 -0
- package/dist/src/cli/commands/session.js.map +7 -0
- package/dist/src/cli/commands/settings.js.map +7 -0
- package/dist/src/cli/commands/setup.js.map +7 -0
- package/dist/src/cli/commands/shell.js.map +7 -0
- package/dist/src/cli/commands/signup.js.map +7 -0
- package/dist/src/cli/commands/skills.js.map +7 -0
- package/dist/src/cli/commands/sms-notify.js.map +7 -0
- package/dist/src/cli/commands/storage-tier.js.map +7 -0
- package/dist/src/cli/commands/sweep.js.map +7 -0
- package/dist/src/cli/commands/tasks.js.map +7 -0
- package/dist/src/cli/commands/worktree.js.map +7 -0
- package/dist/src/cli/index.js +609 -0
- package/dist/src/cli/index.js.map +7 -0
- package/dist/src/cli/opencode-sm.js.map +7 -0
- package/dist/src/cli/utils/viewer.js.map +7 -0
- package/dist/src/core/config/config-manager.js.map +7 -0
- package/dist/src/core/config/feature-flags.js.map +7 -0
- package/dist/src/core/config/storage-config.js.map +7 -0
- package/dist/src/core/config/types.js.map +7 -0
- package/dist/src/core/context/auto-context.js.map +7 -0
- package/dist/src/core/context/dual-stack-manager.js.map +7 -0
- package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
- package/dist/src/core/context/frame-database.js.map +7 -0
- package/dist/src/core/context/frame-digest.js.map +7 -0
- package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
- package/dist/src/core/context/frame-recovery.js.map +7 -0
- package/dist/src/core/context/frame-stack.js.map +7 -0
- package/dist/src/core/context/index.js.map +7 -0
- package/dist/src/core/context/permission-manager.js.map +7 -0
- package/dist/src/core/context/recursive-context-manager.js.map +7 -0
- package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
- package/dist/src/core/context/shared-context-layer.js.map +7 -0
- package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
- package/dist/src/core/context/validation.js.map +7 -0
- package/dist/src/core/database/batch-operations.js.map +7 -0
- package/dist/src/core/database/connection-pool.js.map +7 -0
- package/dist/src/core/database/database-adapter.js.map +7 -0
- package/dist/src/core/database/migration-manager.js.map +7 -0
- package/dist/src/core/database/query-cache.js.map +7 -0
- package/dist/src/core/database/query-router.js.map +7 -0
- package/dist/src/core/database/sqlite-adapter.js +738 -0
- package/dist/src/core/database/sqlite-adapter.js.map +7 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
- package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
- package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
- package/dist/src/core/digest/index.js.map +7 -0
- package/dist/src/core/digest/types.js.map +7 -0
- package/dist/src/core/errors/error-utils.js +208 -0
- package/dist/src/core/errors/error-utils.js.map +7 -0
- package/dist/src/core/errors/index.js +521 -0
- package/dist/src/core/errors/index.js.map +7 -0
- package/dist/src/core/errors/recovery.js.map +7 -0
- package/dist/src/core/execution/parallel-executor.js.map +7 -0
- package/dist/src/core/extensions/custom-tools.js +567 -0
- package/dist/src/core/extensions/custom-tools.js.map +7 -0
- package/dist/src/core/extensions/index.js +55 -0
- package/dist/src/core/extensions/index.js.map +7 -0
- package/dist/src/core/extensions/loader.js +709 -0
- package/dist/src/core/extensions/loader.js.map +7 -0
- package/dist/src/core/extensions/plugin-system.js +506 -0
- package/dist/src/core/extensions/plugin-system.js.map +7 -0
- package/dist/src/core/extensions/provider-adapter.js +617 -0
- package/dist/src/core/extensions/provider-adapter.js.map +7 -0
- package/dist/src/core/extensions/sandbox-runtime.js +664 -0
- package/dist/src/core/extensions/sandbox-runtime.js.map +7 -0
- package/dist/src/core/frame/workflow-templates.js.map +7 -0
- package/dist/src/core/merge/conflict-detector.js.map +7 -0
- package/dist/src/core/merge/index.js.map +7 -0
- package/dist/src/core/merge/resolution-engine.js.map +7 -0
- package/dist/src/core/merge/stack-diff.js.map +7 -0
- package/dist/src/core/merge/unified-merge-resolver.js +303 -0
- package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
- package/dist/src/core/models/fallback-monitor.js.map +7 -0
- package/dist/src/core/models/model-router.js.map +7 -0
- package/dist/src/core/monitoring/error-handler.js.map +7 -0
- package/dist/src/core/monitoring/logger.js +202 -0
- package/dist/src/core/monitoring/logger.js.map +7 -0
- package/dist/src/core/monitoring/metrics.js.map +7 -0
- package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
- package/dist/src/core/monitoring/session-monitor.js.map +7 -0
- package/dist/src/core/performance/context-cache.js.map +7 -0
- package/dist/src/core/performance/index.js.map +7 -0
- package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
- package/dist/src/core/performance/monitor.js.map +7 -0
- package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
- package/dist/src/core/performance/performance-benchmark.js.map +7 -0
- package/dist/src/core/performance/performance-profiler.js.map +7 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
- package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
- package/dist/src/core/projects/project-isolation.js.map +7 -0
- package/dist/src/core/projects/project-manager.js.map +7 -0
- package/dist/src/core/query/query-parser.js.map +7 -0
- package/dist/src/core/query/query-templates.js.map +7 -0
- package/dist/src/core/retrieval/context-retriever.js.map +7 -0
- package/dist/src/core/retrieval/index.js.map +7 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
- package/dist/src/core/retrieval/llm-provider.js.map +7 -0
- package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
- package/dist/src/core/retrieval/summary-generator.js.map +7 -0
- package/dist/src/core/retrieval/types.js.map +7 -0
- package/dist/src/core/security/index.js +35 -0
- package/dist/src/core/security/index.js.map +7 -0
- package/dist/src/core/security/input-sanitizer.js +321 -0
- package/dist/src/core/security/input-sanitizer.js.map +7 -0
- package/dist/src/core/session/clear-survival.js.map +7 -0
- package/dist/src/core/session/enhanced-handoff.js.map +7 -0
- package/dist/src/core/session/handoff-generator.js.map +7 -0
- package/dist/src/core/session/index.js.map +7 -0
- package/dist/src/core/session/session-manager.js.map +7 -0
- package/dist/src/core/skills/index.js.map +7 -0
- package/dist/src/core/skills/skill-storage.js.map +7 -0
- package/dist/src/core/skills/types.js.map +7 -0
- package/dist/src/core/storage/chromadb-adapter.js +380 -0
- package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
- package/dist/src/core/storage/infinite-storage.js.map +7 -0
- package/dist/src/core/storage/remote-storage.js.map +7 -0
- package/dist/src/core/storage/two-tier-storage.js.map +7 -0
- package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/debug-trace.js.map +7 -0
- package/dist/src/core/trace/index.js.map +7 -0
- package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
- package/dist/src/core/trace/trace-detector.js.map +7 -0
- package/dist/src/core/trace/trace-store.js.map +7 -0
- package/dist/src/core/trace/types.js.map +7 -0
- package/dist/src/core/utils/async-mutex.js.map +7 -0
- package/dist/src/core/utils/compression.js.map +7 -0
- package/dist/src/core/utils/update-checker.js.map +7 -0
- package/dist/src/core/worktree/worktree-manager.js.map +7 -0
- package/dist/src/daemon/daemon-config.js.map +7 -0
- package/dist/src/daemon/services/context-service.js.map +7 -0
- package/dist/src/daemon/services/linear-service.js.map +7 -0
- package/dist/src/daemon/session-daemon.js.map +7 -0
- package/dist/src/daemon/unified-daemon.js.map +7 -0
- package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
- package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
- package/dist/src/features/analytics/index.js.map +7 -0
- package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
- package/dist/src/features/browser/browser-mcp.js.map +7 -0
- package/dist/src/features/sweep/index.js.map +7 -0
- package/dist/src/features/sweep/prediction-client.js.map +7 -0
- package/dist/src/features/sweep/prompt-builder.js.map +7 -0
- package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
- package/dist/src/features/sweep/state-watcher.js.map +7 -0
- package/dist/src/features/sweep/status-bar.js.map +7 -0
- package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
- package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
- package/dist/src/features/sweep/types.js.map +7 -0
- package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
- package/dist/src/features/tasks/task-aware-context.js.map +7 -0
- package/dist/src/features/tui/simple-monitor.js.map +7 -0
- package/dist/src/features/tui/swarm-monitor.js.map +7 -0
- package/dist/src/features/web/client/stores/task-store.js.map +7 -0
- package/dist/src/features/web/server/index.js.map +7 -0
- package/dist/src/hooks/auto-background.js.map +7 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
- package/dist/src/hooks/config.js.map +7 -0
- package/dist/src/hooks/daemon.js.map +7 -0
- package/dist/src/hooks/events.js.map +7 -0
- package/dist/src/hooks/index.js.map +7 -0
- package/dist/src/hooks/linear-task-picker.js.map +7 -0
- package/dist/src/hooks/schemas.js.map +7 -0
- package/dist/src/hooks/secure-fs.js.map +7 -0
- package/dist/src/hooks/security-logger.js.map +7 -0
- package/dist/src/hooks/session-summary.js.map +7 -0
- package/dist/src/hooks/sms-action-runner.js.map +7 -0
- package/dist/src/hooks/sms-notify.js.map +7 -0
- package/dist/src/hooks/sms-watcher.js.map +7 -0
- package/dist/src/hooks/sms-webhook.js.map +7 -0
- package/dist/src/hooks/whatsapp-commands.js.map +7 -0
- package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
- package/dist/src/hooks/whatsapp-sync.js.map +7 -0
- package/dist/src/index.js.map +7 -0
- package/dist/src/integrations/anthropic/client.js.map +7 -0
- package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
- package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
- package/dist/src/integrations/linear/auth.js.map +7 -0
- package/dist/src/integrations/linear/auto-sync.js.map +7 -0
- package/dist/src/integrations/linear/client.js +634 -0
- package/dist/src/integrations/linear/client.js.map +7 -0
- package/dist/src/integrations/linear/config.js.map +7 -0
- package/dist/src/integrations/linear/migration.js.map +7 -0
- package/dist/src/integrations/linear/oauth-server.js.map +7 -0
- package/dist/src/integrations/linear/rest-client.js.map +7 -0
- package/dist/src/integrations/linear/sync-manager.js.map +7 -0
- package/dist/src/integrations/linear/sync-service.js.map +7 -0
- package/dist/src/integrations/linear/sync.js.map +7 -0
- package/dist/src/integrations/linear/unified-sync.js.map +7 -0
- package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
- package/dist/src/integrations/linear/webhook-server.js.map +7 -0
- package/dist/src/integrations/linear/webhook.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/index.js.map +7 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
- package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
- package/dist/src/integrations/mcp/remote-server.js +682 -0
- package/dist/src/integrations/mcp/remote-server.js.map +7 -0
- package/dist/src/integrations/mcp/schemas.js.map +7 -0
- package/dist/src/integrations/mcp/server.js +1975 -0
- package/dist/src/integrations/mcp/server.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
- package/dist/src/integrations/ralph/index.js.map +7 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
- package/dist/src/integrations/ralph/types.js +5 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
- package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
- package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
- package/dist/src/models/user.model.js.map +7 -0
- package/dist/src/servers/production/auth-middleware.js.map +7 -0
- package/dist/src/services/config-service.js.map +7 -0
- package/dist/src/services/context-service.js.map +7 -0
- package/dist/src/skills/api-discovery.js.map +7 -0
- package/dist/src/skills/api-skill.js.map +7 -0
- package/dist/src/skills/claude-skills.js.map +7 -0
- package/dist/src/skills/dashboard-launcher.js.map +7 -0
- package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
- package/dist/src/skills/repo-ingestion-skill.js +632 -0
- package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
- package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
- package/dist/src/types/task.js.map +7 -0
- package/dist/src/utils/env.js.map +7 -0
- package/dist/src/utils/formatting.js.map +7 -0
- package/dist/src/utils/process-cleanup.js.map +7 -0
- package/package.json +13 -9
- package/scripts/background-sync-manager.js +145 -83
- package/scripts/claude-sm-autostart.js +17 -12
- package/scripts/gepa/README.md +275 -0
- package/scripts/gepa/config.json +53 -0
- package/scripts/gepa/evals/coding-tasks.jsonl +5 -0
- package/scripts/gepa/evals/fixtures/buggy-loop.js +18 -0
- package/scripts/gepa/evals/fixtures/callback-hell.js +53 -0
- package/scripts/gepa/generations/gen-000/baseline.md +124 -0
- package/scripts/gepa/hooks/auto-optimize.js +494 -0
- package/scripts/gepa/hooks/eval-tracker.js +203 -0
- package/scripts/gepa/hooks/reflect.js +311 -0
- package/scripts/gepa/optimize.js +611 -0
- package/scripts/gepa/state.json +14 -0
- package/scripts/initialize.ts +16 -7
- package/scripts/install.sh +14 -62
- package/scripts/status.ts +111 -46
- package/scripts/test-pre-publish-quick.sh +1 -1
- package/dist/agents/core/agent-task-manager.js.map +0 -7
- package/dist/agents/testing-agent.js +0 -614
- package/dist/agents/testing-agent.js.map +0 -7
- package/dist/agents/verifiers/base-verifier.js.map +0 -7
- package/dist/agents/verifiers/formatter-verifier.js.map +0 -7
- package/dist/agents/verifiers/llm-judge.js.map +0 -7
- package/dist/cli/auto-detect.js.map +0 -7
- package/dist/cli/browser-test.js +0 -33
- package/dist/cli/browser-test.js.map +0 -7
- package/dist/cli/claude-sm-danger.js.map +0 -7
- package/dist/cli/claude-sm.js +0 -1156
- package/dist/cli/claude-sm.js.map +0 -7
- package/dist/cli/codex-sm-danger.js.map +0 -7
- package/dist/cli/codex-sm.js.map +0 -7
- package/dist/cli/commands/api.js.map +0 -7
- package/dist/cli/commands/auto-background.js.map +0 -7
- package/dist/cli/commands/cleanup-processes.js.map +0 -7
- package/dist/cli/commands/clear.js.map +0 -7
- package/dist/cli/commands/config.js.map +0 -7
- package/dist/cli/commands/context-rehydrate.js.map +0 -7
- package/dist/cli/commands/context.js.map +0 -7
- package/dist/cli/commands/daemon.js.map +0 -7
- package/dist/cli/commands/dashboard.js.map +0 -7
- package/dist/cli/commands/db.js.map +0 -7
- package/dist/cli/commands/decision.js.map +0 -7
- package/dist/cli/commands/discovery.js.map +0 -7
- package/dist/cli/commands/handoff.js.map +0 -7
- package/dist/cli/commands/hooks.js.map +0 -7
- package/dist/cli/commands/linear-unified.js +0 -353
- package/dist/cli/commands/linear-unified.js.map +0 -7
- package/dist/cli/commands/linear.js.map +0 -7
- package/dist/cli/commands/log.js.map +0 -7
- package/dist/cli/commands/login.js.map +0 -7
- package/dist/cli/commands/migrate.js.map +0 -7
- package/dist/cli/commands/model.js.map +0 -7
- package/dist/cli/commands/monitor.js +0 -313
- package/dist/cli/commands/monitor.js.map +0 -7
- package/dist/cli/commands/onboard.js.map +0 -7
- package/dist/cli/commands/projects.js.map +0 -7
- package/dist/cli/commands/quality.js +0 -413
- package/dist/cli/commands/quality.js.map +0 -7
- package/dist/cli/commands/ralph.js.map +0 -7
- package/dist/cli/commands/retrieval.js.map +0 -7
- package/dist/cli/commands/search.js +0 -156
- package/dist/cli/commands/search.js.map +0 -7
- package/dist/cli/commands/service.js.map +0 -7
- package/dist/cli/commands/session.js.map +0 -7
- package/dist/cli/commands/settings.js.map +0 -7
- package/dist/cli/commands/setup.js.map +0 -7
- package/dist/cli/commands/shell.js.map +0 -7
- package/dist/cli/commands/signup.js.map +0 -7
- package/dist/cli/commands/skills.js.map +0 -7
- package/dist/cli/commands/sms-notify.js.map +0 -7
- package/dist/cli/commands/storage-tier.js.map +0 -7
- package/dist/cli/commands/storage.js +0 -360
- package/dist/cli/commands/storage.js.map +0 -7
- package/dist/cli/commands/sweep.js.map +0 -7
- package/dist/cli/commands/tasks.js.map +0 -7
- package/dist/cli/commands/test.js +0 -286
- package/dist/cli/commands/test.js.map +0 -7
- package/dist/cli/commands/workflow.js +0 -142
- package/dist/cli/commands/workflow.js.map +0 -7
- package/dist/cli/commands/worktree.js.map +0 -7
- package/dist/cli/index.js +0 -594
- package/dist/cli/index.js.map +0 -7
- package/dist/cli/opencode-sm.js.map +0 -7
- package/dist/cli/utils/viewer.js.map +0 -7
- package/dist/core/analytics/team-analytics.js +0 -378
- package/dist/core/analytics/team-analytics.js.map +0 -7
- package/dist/core/config/config-manager.js.map +0 -7
- package/dist/core/config/feature-flags.js.map +0 -7
- package/dist/core/config/storage-config.js.map +0 -7
- package/dist/core/config/types.js.map +0 -7
- package/dist/core/context/auto-context.js.map +0 -7
- package/dist/core/context/dual-stack-manager.js.map +0 -7
- package/dist/core/context/enhanced-rehydration.js.map +0 -7
- package/dist/core/context/frame-database.js.map +0 -7
- package/dist/core/context/frame-digest.js.map +0 -7
- package/dist/core/context/frame-handoff-manager.js.map +0 -7
- package/dist/core/context/frame-lifecycle-hooks.js.map +0 -7
- package/dist/core/context/frame-manager.js +0 -1069
- package/dist/core/context/frame-manager.js.map +0 -7
- package/dist/core/context/frame-recovery.js.map +0 -7
- package/dist/core/context/frame-stack.js.map +0 -7
- package/dist/core/context/incremental-gc.js +0 -290
- package/dist/core/context/incremental-gc.js.map +0 -7
- package/dist/core/context/index.js.map +0 -7
- package/dist/core/context/model-aware-compaction.js +0 -623
- package/dist/core/context/model-aware-compaction.js.map +0 -7
- package/dist/core/context/permission-manager.js.map +0 -7
- package/dist/core/context/recursive-context-manager.js.map +0 -7
- package/dist/core/context/refactored-frame-manager.js.map +0 -7
- package/dist/core/context/shared-context-layer.js.map +0 -7
- package/dist/core/context/stack-merge-resolver.js.map +0 -7
- package/dist/core/context/validation.js.map +0 -7
- package/dist/core/database/batch-operations.js.map +0 -7
- package/dist/core/database/connection-pool.js.map +0 -7
- package/dist/core/database/database-adapter.js.map +0 -7
- package/dist/core/database/migration-manager.js.map +0 -7
- package/dist/core/database/paradedb-adapter.js +0 -990
- package/dist/core/database/paradedb-adapter.js.map +0 -7
- package/dist/core/database/query-cache.js.map +0 -7
- package/dist/core/database/query-router.js.map +0 -7
- package/dist/core/database/sqlite-adapter.js +0 -728
- package/dist/core/database/sqlite-adapter.js.map +0 -7
- package/dist/core/digest/enhanced-hybrid-digest.js.map +0 -7
- package/dist/core/digest/frame-digest-integration.js.map +0 -7
- package/dist/core/digest/hybrid-digest-generator.js.map +0 -7
- package/dist/core/digest/index.js.map +0 -7
- package/dist/core/digest/types.js.map +0 -7
- package/dist/core/errors/index.js +0 -512
- package/dist/core/errors/index.js.map +0 -7
- package/dist/core/errors/recovery.js.map +0 -7
- package/dist/core/execution/parallel-executor.js.map +0 -7
- package/dist/core/frame/workflow-templates.js.map +0 -7
- package/dist/core/merge/conflict-detector.js.map +0 -7
- package/dist/core/merge/index.js.map +0 -7
- package/dist/core/merge/resolution-engine.js.map +0 -7
- package/dist/core/merge/stack-diff.js.map +0 -7
- package/dist/core/models/fallback-monitor.js.map +0 -7
- package/dist/core/models/model-router.js.map +0 -7
- package/dist/core/monitoring/error-handler.js.map +0 -7
- package/dist/core/monitoring/logger.js +0 -150
- package/dist/core/monitoring/logger.js.map +0 -7
- package/dist/core/monitoring/metrics.js.map +0 -7
- package/dist/core/monitoring/progress-tracker.js.map +0 -7
- package/dist/core/monitoring/session-monitor.js.map +0 -7
- package/dist/core/performance/context-cache.js.map +0 -7
- package/dist/core/performance/index.js.map +0 -7
- package/dist/core/performance/lazy-context-loader.js.map +0 -7
- package/dist/core/performance/monitor.js.map +0 -7
- package/dist/core/performance/optimized-frame-context.js.map +0 -7
- package/dist/core/performance/performance-benchmark.js.map +0 -7
- package/dist/core/performance/performance-profiler.js.map +0 -7
- package/dist/core/performance/streaming-jsonl-parser.js.map +0 -7
- package/dist/core/persistence/postgres-adapter.js.map +0 -7
- package/dist/core/projects/project-isolation.js.map +0 -7
- package/dist/core/projects/project-manager.js.map +0 -7
- package/dist/core/query/query-parser.js.map +0 -7
- package/dist/core/query/query-templates.js.map +0 -7
- package/dist/core/retrieval/context-retriever.js.map +0 -7
- package/dist/core/retrieval/graph-retrieval.js +0 -662
- package/dist/core/retrieval/graph-retrieval.js.map +0 -7
- package/dist/core/retrieval/hierarchical-retrieval.js +0 -656
- package/dist/core/retrieval/hierarchical-retrieval.js.map +0 -7
- package/dist/core/retrieval/index.js.map +0 -7
- package/dist/core/retrieval/llm-context-retrieval.js.map +0 -7
- package/dist/core/retrieval/llm-provider.js.map +0 -7
- package/dist/core/retrieval/retrieval-audit.js.map +0 -7
- package/dist/core/retrieval/retrieval-benchmarks.js +0 -521
- package/dist/core/retrieval/retrieval-benchmarks.js.map +0 -7
- package/dist/core/retrieval/summary-generator.js.map +0 -7
- package/dist/core/retrieval/types.js.map +0 -7
- package/dist/core/session/clear-survival.js.map +0 -7
- package/dist/core/session/enhanced-handoff.js.map +0 -7
- package/dist/core/session/handoff-generator.js.map +0 -7
- package/dist/core/session/index.js.map +0 -7
- package/dist/core/session/session-manager.js.map +0 -7
- package/dist/core/skills/index.js.map +0 -7
- package/dist/core/skills/skill-storage.js.map +0 -7
- package/dist/core/skills/types.js.map +0 -7
- package/dist/core/storage/chromadb-adapter.js +0 -354
- package/dist/core/storage/chromadb-adapter.js.map +0 -7
- package/dist/core/storage/infinite-storage.js.map +0 -7
- package/dist/core/storage/railway-optimized-storage.js +0 -591
- package/dist/core/storage/railway-optimized-storage.js.map +0 -7
- package/dist/core/storage/remote-storage.js.map +0 -7
- package/dist/core/storage/two-tier-storage.js.map +0 -7
- package/dist/core/trace/cli-trace-wrapper.js.map +0 -7
- package/dist/core/trace/db-trace-wrapper.js.map +0 -7
- package/dist/core/trace/debug-trace.js.map +0 -7
- package/dist/core/trace/index.js.map +0 -7
- package/dist/core/trace/linear-api-wrapper.js.map +0 -7
- package/dist/core/trace/trace-demo.js +0 -154
- package/dist/core/trace/trace-demo.js.map +0 -7
- package/dist/core/trace/trace-detector.demo.js +0 -142
- package/dist/core/trace/trace-detector.demo.js.map +0 -7
- package/dist/core/trace/trace-detector.js.map +0 -7
- package/dist/core/trace/trace-store.js.map +0 -7
- package/dist/core/trace/types.js.map +0 -7
- package/dist/core/utils/async-mutex.js.map +0 -7
- package/dist/core/utils/compression.js.map +0 -7
- package/dist/core/utils/update-checker.js.map +0 -7
- package/dist/core/worktree/worktree-manager.js.map +0 -7
- package/dist/daemon/daemon-config.js.map +0 -7
- package/dist/daemon/services/context-service.js.map +0 -7
- package/dist/daemon/services/linear-service.js.map +0 -7
- package/dist/daemon/session-daemon.js.map +0 -7
- package/dist/daemon/unified-daemon.js.map +0 -7
- package/dist/features/analytics/api/analytics-api.js.map +0 -7
- package/dist/features/analytics/core/analytics-service.js.map +0 -7
- package/dist/features/analytics/index.js.map +0 -7
- package/dist/features/analytics/queries/metrics-queries.js.map +0 -7
- package/dist/features/browser/browser-mcp.js.map +0 -7
- package/dist/features/sweep/index.js.map +0 -7
- package/dist/features/sweep/prediction-client.js.map +0 -7
- package/dist/features/sweep/prompt-builder.js.map +0 -7
- package/dist/features/sweep/pty-wrapper.js.map +0 -7
- package/dist/features/sweep/state-watcher.js.map +0 -7
- package/dist/features/sweep/status-bar.js.map +0 -7
- package/dist/features/sweep/sweep-server-manager.js.map +0 -7
- package/dist/features/sweep/tab-interceptor.js.map +0 -7
- package/dist/features/sweep/types.js.map +0 -7
- package/dist/features/tasks/linear-task-manager.js.map +0 -7
- package/dist/features/tasks/task-aware-context.js.map +0 -7
- package/dist/features/tui/simple-monitor.js.map +0 -7
- package/dist/features/tui/swarm-monitor.js.map +0 -7
- package/dist/features/web/client/stores/task-store.js.map +0 -7
- package/dist/features/web/server/index.js.map +0 -7
- package/dist/hooks/auto-background.js.map +0 -7
- package/dist/hooks/claude-code-whatsapp-hook.js.map +0 -7
- package/dist/hooks/config.js.map +0 -7
- package/dist/hooks/daemon.js.map +0 -7
- package/dist/hooks/events.js.map +0 -7
- package/dist/hooks/index.js.map +0 -7
- package/dist/hooks/linear-task-picker.js.map +0 -7
- package/dist/hooks/schemas.js.map +0 -7
- package/dist/hooks/secure-fs.js.map +0 -7
- package/dist/hooks/security-logger.js.map +0 -7
- package/dist/hooks/session-summary.js.map +0 -7
- package/dist/hooks/sms-action-runner.js.map +0 -7
- package/dist/hooks/sms-notify.js.map +0 -7
- package/dist/hooks/sms-watcher.js.map +0 -7
- package/dist/hooks/sms-webhook.js.map +0 -7
- package/dist/hooks/whatsapp-commands.js.map +0 -7
- package/dist/hooks/whatsapp-scheduler.js.map +0 -7
- package/dist/hooks/whatsapp-sync.js.map +0 -7
- package/dist/index.js.map +0 -7
- package/dist/integrations/anthropic/client.js.map +0 -7
- package/dist/integrations/claude-code/agent-bridge.js.map +0 -7
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
- package/dist/integrations/claude-code/lifecycle-hooks.js.map +0 -7
- package/dist/integrations/claude-code/post-task-hooks.js.map +0 -7
- package/dist/integrations/claude-code/subagent-client-stub.js.map +0 -7
- package/dist/integrations/claude-code/subagent-client.js.map +0 -7
- package/dist/integrations/claude-code/task-coordinator.js.map +0 -7
- package/dist/integrations/linear/auth.js.map +0 -7
- package/dist/integrations/linear/auto-sync.js.map +0 -7
- package/dist/integrations/linear/client.js +0 -630
- package/dist/integrations/linear/client.js.map +0 -7
- package/dist/integrations/linear/config.js.map +0 -7
- package/dist/integrations/linear/migration.js.map +0 -7
- package/dist/integrations/linear/oauth-server.js.map +0 -7
- package/dist/integrations/linear/rest-client.js.map +0 -7
- package/dist/integrations/linear/sync-manager.js.map +0 -7
- package/dist/integrations/linear/sync-service.js.map +0 -7
- package/dist/integrations/linear/sync.js.map +0 -7
- package/dist/integrations/linear/unified-sync.js.map +0 -7
- package/dist/integrations/linear/webhook-handler.js.map +0 -7
- package/dist/integrations/linear/webhook-server.js.map +0 -7
- package/dist/integrations/linear/webhook.js.map +0 -7
- package/dist/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/context-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/index.js.map +0 -7
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/skill-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/task-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/trace-handlers.js.map +0 -7
- package/dist/integrations/mcp/index.js.map +0 -7
- package/dist/integrations/mcp/middleware/tool-scoring.js.map +0 -7
- package/dist/integrations/mcp/refactored-server.js.map +0 -7
- package/dist/integrations/mcp/remote-server.js +0 -691
- package/dist/integrations/mcp/remote-server.js.map +0 -7
- package/dist/integrations/mcp/schemas.js.map +0 -7
- package/dist/integrations/mcp/server.js +0 -1960
- package/dist/integrations/mcp/server.js.map +0 -7
- package/dist/integrations/mcp/tool-definitions-code.js.map +0 -7
- package/dist/integrations/mcp/tool-definitions.js.map +0 -7
- package/dist/integrations/mcp/trace-test.js +0 -48
- package/dist/integrations/mcp/trace-test.js.map +0 -7
- package/dist/integrations/pg-aiguide/embedding-provider.js +0 -189
- package/dist/integrations/pg-aiguide/embedding-provider.js.map +0 -7
- package/dist/integrations/pg-aiguide/semantic-search.js +0 -187
- package/dist/integrations/pg-aiguide/semantic-search.js.map +0 -7
- package/dist/integrations/pg-aiguide/timescale-analytics.js +0 -224
- package/dist/integrations/pg-aiguide/timescale-analytics.js.map +0 -7
- package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
- package/dist/integrations/ralph/context/context-budget-manager.js.map +0 -7
- package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
- package/dist/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
- package/dist/integrations/ralph/index.js.map +0 -7
- package/dist/integrations/ralph/learning/pattern-learner.js.map +0 -7
- package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
- package/dist/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
- package/dist/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
- package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
- package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
- package/dist/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
- package/dist/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
- package/dist/integrations/ralph/performance/performance-optimizer.js.map +0 -7
- package/dist/integrations/ralph/ralph-integration-demo.js +0 -182
- package/dist/integrations/ralph/ralph-integration-demo.js.map +0 -7
- package/dist/integrations/ralph/recovery/crash-recovery.js.map +0 -7
- package/dist/integrations/ralph/state/state-reconciler.js.map +0 -7
- package/dist/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
- package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
- package/dist/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
- package/dist/mcp/stackmemory-mcp-server.js.map +0 -7
- package/dist/middleware/exponential-rate-limiter.js.map +0 -7
- package/dist/models/user.model.js.map +0 -7
- package/dist/servers/production/auth-middleware.js.map +0 -7
- package/dist/servers/railway/config.js +0 -55
- package/dist/servers/railway/config.js.map +0 -7
- package/dist/servers/railway/index-enhanced.js +0 -160
- package/dist/servers/railway/index-enhanced.js.map +0 -7
- package/dist/servers/railway/index.js +0 -1349
- package/dist/servers/railway/index.js.map +0 -7
- package/dist/servers/railway/simple.js +0 -64
- package/dist/servers/railway/simple.js.map +0 -7
- package/dist/servers/railway/storage-test.js +0 -459
- package/dist/servers/railway/storage-test.js.map +0 -7
- package/dist/services/config-service.js.map +0 -7
- package/dist/services/context-service.js.map +0 -7
- package/dist/skills/api-discovery.js.map +0 -7
- package/dist/skills/api-skill.js.map +0 -7
- package/dist/skills/claude-skills.js.map +0 -7
- package/dist/skills/dashboard-launcher.js.map +0 -7
- package/dist/skills/recursive-agent-orchestrator.js.map +0 -7
- package/dist/skills/repo-ingestion-skill.js +0 -609
- package/dist/skills/repo-ingestion-skill.js.map +0 -7
- package/dist/skills/security-secrets-scanner.js +0 -284
- package/dist/skills/security-secrets-scanner.js.map +0 -7
- package/dist/skills/unified-rlm-orchestrator.js.map +0 -7
- package/dist/utils/env.js.map +0 -7
- package/dist/utils/formatting.js.map +0 -7
- package/dist/utils/process-cleanup.js.map +0 -7
- package/dist/validation/schemas.js +0 -222
- package/dist/validation/schemas.js.map +0 -7
- /package/dist/{agents → src/agents}/core/agent-task-manager.js +0 -0
- /package/dist/{agents → src/agents}/verifiers/base-verifier.js +0 -0
- /package/dist/{agents → src/agents}/verifiers/formatter-verifier.js +0 -0
- /package/dist/{agents → src/agents}/verifiers/llm-judge.js +0 -0
- /package/dist/{cli → src/cli}/auto-detect.js +0 -0
- /package/dist/{cli → src/cli}/claude-sm-danger.js +0 -0
- /package/dist/{cli → src/cli}/codex-sm-danger.js +0 -0
- /package/dist/{cli → src/cli}/codex-sm.js +0 -0
- /package/dist/{cli → src/cli}/commands/api.js +0 -0
- /package/dist/{cli → src/cli}/commands/auto-background.js +0 -0
- /package/dist/{cli → src/cli}/commands/cleanup-processes.js +0 -0
- /package/dist/{cli → src/cli}/commands/clear.js +0 -0
- /package/dist/{cli → src/cli}/commands/config.js +0 -0
- /package/dist/{cli → src/cli}/commands/context-rehydrate.js +0 -0
- /package/dist/{cli → src/cli}/commands/context.js +0 -0
- /package/dist/{cli → src/cli}/commands/daemon.js +0 -0
- /package/dist/{cli → src/cli}/commands/dashboard.js +0 -0
- /package/dist/{cli → src/cli}/commands/db.js +0 -0
- /package/dist/{cli → src/cli}/commands/decision.js +0 -0
- /package/dist/{cli → src/cli}/commands/discovery.js +0 -0
- /package/dist/{cli → src/cli}/commands/handoff.js +0 -0
- /package/dist/{cli → src/cli}/commands/hooks.js +0 -0
- /package/dist/{cli → src/cli}/commands/linear.js +0 -0
- /package/dist/{cli → src/cli}/commands/log.js +0 -0
- /package/dist/{cli → src/cli}/commands/login.js +0 -0
- /package/dist/{cli → src/cli}/commands/migrate.js +0 -0
- /package/dist/{cli → src/cli}/commands/model.js +0 -0
- /package/dist/{cli → src/cli}/commands/onboard.js +0 -0
- /package/dist/{cli → src/cli}/commands/projects.js +0 -0
- /package/dist/{cli → src/cli}/commands/ralph.js +0 -0
- /package/dist/{cli → src/cli}/commands/retrieval.js +0 -0
- /package/dist/{cli → src/cli}/commands/service.js +0 -0
- /package/dist/{cli → src/cli}/commands/session.js +0 -0
- /package/dist/{cli → src/cli}/commands/settings.js +0 -0
- /package/dist/{cli → src/cli}/commands/setup.js +0 -0
- /package/dist/{cli → src/cli}/commands/shell.js +0 -0
- /package/dist/{cli → src/cli}/commands/signup.js +0 -0
- /package/dist/{cli → src/cli}/commands/skills.js +0 -0
- /package/dist/{cli → src/cli}/commands/sms-notify.js +0 -0
- /package/dist/{cli → src/cli}/commands/storage-tier.js +0 -0
- /package/dist/{cli → src/cli}/commands/sweep.js +0 -0
- /package/dist/{cli → src/cli}/commands/tasks.js +0 -0
- /package/dist/{cli → src/cli}/commands/worktree.js +0 -0
- /package/dist/{cli → src/cli}/opencode-sm.js +0 -0
- /package/dist/{cli → src/cli}/utils/viewer.js +0 -0
- /package/dist/{core → src/core}/config/config-manager.js +0 -0
- /package/dist/{core → src/core}/config/feature-flags.js +0 -0
- /package/dist/{core → src/core}/config/storage-config.js +0 -0
- /package/dist/{core → src/core}/config/types.js +0 -0
- /package/dist/{core → src/core}/context/auto-context.js +0 -0
- /package/dist/{core → src/core}/context/dual-stack-manager.js +0 -0
- /package/dist/{core → src/core}/context/enhanced-rehydration.js +0 -0
- /package/dist/{core → src/core}/context/frame-database.js +0 -0
- /package/dist/{core → src/core}/context/frame-digest.js +0 -0
- /package/dist/{core → src/core}/context/frame-handoff-manager.js +0 -0
- /package/dist/{core → src/core}/context/frame-lifecycle-hooks.js +0 -0
- /package/dist/{core → src/core}/context/frame-recovery.js +0 -0
- /package/dist/{core → src/core}/context/frame-stack.js +0 -0
- /package/dist/{core → src/core}/context/frame-types.js +0 -0
- /package/dist/{core → src/core}/context/frame-types.js.map +0 -0
- /package/dist/{core → src/core}/context/index.js +0 -0
- /package/dist/{core → src/core}/context/permission-manager.js +0 -0
- /package/dist/{core → src/core}/context/recursive-context-manager.js +0 -0
- /package/dist/{core → src/core}/context/refactored-frame-manager.js +0 -0
- /package/dist/{core → src/core}/context/shared-context-layer.js +0 -0
- /package/dist/{core → src/core}/context/stack-merge-resolver.js +0 -0
- /package/dist/{core → src/core}/context/validation.js +0 -0
- /package/dist/{core → src/core}/database/batch-operations.js +0 -0
- /package/dist/{core → src/core}/database/connection-pool.js +0 -0
- /package/dist/{core → src/core}/database/database-adapter.js +0 -0
- /package/dist/{core → src/core}/database/migration-manager.js +0 -0
- /package/dist/{core → src/core}/database/query-cache.js +0 -0
- /package/dist/{core → src/core}/database/query-router.js +0 -0
- /package/dist/{core → src/core}/digest/enhanced-hybrid-digest.js +0 -0
- /package/dist/{core → src/core}/digest/frame-digest-integration.js +0 -0
- /package/dist/{core → src/core}/digest/hybrid-digest-generator.js +0 -0
- /package/dist/{core → src/core}/digest/index.js +0 -0
- /package/dist/{core → src/core}/digest/types.js +0 -0
- /package/dist/{core → src/core}/errors/recovery.js +0 -0
- /package/dist/{core → src/core}/execution/parallel-executor.js +0 -0
- /package/dist/{core/merge → src/core/extensions}/types.js +0 -0
- /package/dist/{core/merge → src/core/extensions}/types.js.map +0 -0
- /package/dist/{core → src/core}/frame/workflow-templates.js +0 -0
- /package/dist/{core → src/core}/merge/conflict-detector.js +0 -0
- /package/dist/{core → src/core}/merge/index.js +0 -0
- /package/dist/{core → src/core}/merge/resolution-engine.js +0 -0
- /package/dist/{core → src/core}/merge/stack-diff.js +0 -0
- /package/dist/{core → src/core/merge}/types.js +0 -0
- /package/dist/{core → src/core/merge}/types.js.map +0 -0
- /package/dist/{core → src/core}/models/fallback-monitor.js +0 -0
- /package/dist/{core → src/core}/models/model-router.js +0 -0
- /package/dist/{core → src/core}/monitoring/error-handler.js +0 -0
- /package/dist/{core → src/core}/monitoring/metrics.js +0 -0
- /package/dist/{core → src/core}/monitoring/progress-tracker.js +0 -0
- /package/dist/{core → src/core}/monitoring/session-monitor.js +0 -0
- /package/dist/{core → src/core}/performance/context-cache.js +0 -0
- /package/dist/{core → src/core}/performance/index.js +0 -0
- /package/dist/{core → src/core}/performance/lazy-context-loader.js +0 -0
- /package/dist/{core → src/core}/performance/monitor.js +0 -0
- /package/dist/{core → src/core}/performance/optimized-frame-context.js +0 -0
- /package/dist/{core → src/core}/performance/performance-benchmark.js +0 -0
- /package/dist/{core → src/core}/performance/performance-profiler.js +0 -0
- /package/dist/{core → src/core}/performance/streaming-jsonl-parser.js +0 -0
- /package/dist/{core → src/core}/persistence/postgres-adapter.js +0 -0
- /package/dist/{core → src/core}/projects/project-isolation.js +0 -0
- /package/dist/{core → src/core}/projects/project-manager.js +0 -0
- /package/dist/{core → src/core}/query/query-parser.js +0 -0
- /package/dist/{core → src/core}/query/query-templates.js +0 -0
- /package/dist/{core → src/core}/retrieval/context-retriever.js +0 -0
- /package/dist/{core → src/core}/retrieval/index.js +0 -0
- /package/dist/{core → src/core}/retrieval/llm-context-retrieval.js +0 -0
- /package/dist/{core → src/core}/retrieval/llm-provider.js +0 -0
- /package/dist/{core → src/core}/retrieval/retrieval-audit.js +0 -0
- /package/dist/{core → src/core}/retrieval/summary-generator.js +0 -0
- /package/dist/{core → src/core}/retrieval/types.js +0 -0
- /package/dist/{core → src/core}/session/clear-survival.js +0 -0
- /package/dist/{core → src/core}/session/enhanced-handoff.js +0 -0
- /package/dist/{core → src/core}/session/handoff-generator.js +0 -0
- /package/dist/{core → src/core}/session/index.js +0 -0
- /package/dist/{core → src/core}/session/session-manager.js +0 -0
- /package/dist/{core → src/core}/skills/index.js +0 -0
- /package/dist/{core → src/core}/skills/skill-storage.js +0 -0
- /package/dist/{core → src/core}/skills/types.js +0 -0
- /package/dist/{core → src/core}/storage/infinite-storage.js +0 -0
- /package/dist/{core → src/core}/storage/remote-storage.js +0 -0
- /package/dist/{core → src/core}/storage/two-tier-storage.js +0 -0
- /package/dist/{core → src/core}/trace/cli-trace-wrapper.js +0 -0
- /package/dist/{core → src/core}/trace/db-trace-wrapper.js +0 -0
- /package/dist/{core → src/core}/trace/debug-trace.js +0 -0
- /package/dist/{core → src/core}/trace/index.js +0 -0
- /package/dist/{core → src/core}/trace/linear-api-wrapper.js +0 -0
- /package/dist/{core → src/core}/trace/trace-detector.js +0 -0
- /package/dist/{core → src/core}/trace/trace-store.js +0 -0
- /package/dist/{core → src/core}/trace/types.js +0 -0
- /package/dist/{integrations/linear → src/core}/types.js +0 -0
- /package/dist/{integrations/linear → src/core}/types.js.map +0 -0
- /package/dist/{core → src/core}/utils/async-mutex.js +0 -0
- /package/dist/{core → src/core}/utils/compression.js +0 -0
- /package/dist/{core → src/core}/utils/update-checker.js +0 -0
- /package/dist/{core → src/core}/worktree/worktree-manager.js +0 -0
- /package/dist/{daemon → src/daemon}/daemon-config.js +0 -0
- /package/dist/{daemon → src/daemon}/services/context-service.js +0 -0
- /package/dist/{daemon → src/daemon}/services/linear-service.js +0 -0
- /package/dist/{daemon → src/daemon}/session-daemon.js +0 -0
- /package/dist/{daemon → src/daemon}/unified-daemon.js +0 -0
- /package/dist/{features → src/features}/analytics/api/analytics-api.js +0 -0
- /package/dist/{features → src/features}/analytics/core/analytics-service.js +0 -0
- /package/dist/{features → src/features}/analytics/index.js +0 -0
- /package/dist/{features → src/features}/analytics/queries/metrics-queries.js +0 -0
- /package/dist/{features → src/features}/analytics/types/metrics.js +0 -0
- /package/dist/{features → src/features}/analytics/types/metrics.js.map +0 -0
- /package/dist/{features → src/features}/browser/browser-mcp.js +0 -0
- /package/dist/{features → src/features}/sweep/index.js +0 -0
- /package/dist/{features → src/features}/sweep/prediction-client.js +0 -0
- /package/dist/{features → src/features}/sweep/prompt-builder.js +0 -0
- /package/dist/{features → src/features}/sweep/pty-wrapper.js +0 -0
- /package/dist/{features → src/features}/sweep/state-watcher.js +0 -0
- /package/dist/{features → src/features}/sweep/status-bar.js +0 -0
- /package/dist/{features → src/features}/sweep/sweep-server-manager.js +0 -0
- /package/dist/{features → src/features}/sweep/tab-interceptor.js +0 -0
- /package/dist/{features → src/features}/sweep/types.js +0 -0
- /package/dist/{features → src/features}/tasks/linear-task-manager.js +0 -0
- /package/dist/{features → src/features}/tasks/task-aware-context.js +0 -0
- /package/dist/{features → src/features}/tui/simple-monitor.js +0 -0
- /package/dist/{features → src/features}/tui/swarm-monitor.js +0 -0
- /package/dist/{features → src/features}/web/client/stores/task-store.js +0 -0
- /package/dist/{features → src/features}/web/server/index.js +0 -0
- /package/dist/{hooks → src/hooks}/auto-background.js +0 -0
- /package/dist/{hooks → src/hooks}/claude-code-whatsapp-hook.js +0 -0
- /package/dist/{hooks → src/hooks}/config.js +0 -0
- /package/dist/{hooks → src/hooks}/daemon.js +0 -0
- /package/dist/{hooks → src/hooks}/events.js +0 -0
- /package/dist/{hooks → src/hooks}/index.js +0 -0
- /package/dist/{hooks → src/hooks}/linear-task-picker.js +0 -0
- /package/dist/{hooks → src/hooks}/schemas.js +0 -0
- /package/dist/{hooks → src/hooks}/secure-fs.js +0 -0
- /package/dist/{hooks → src/hooks}/security-logger.js +0 -0
- /package/dist/{hooks → src/hooks}/session-summary.js +0 -0
- /package/dist/{hooks → src/hooks}/sms-action-runner.js +0 -0
- /package/dist/{hooks → src/hooks}/sms-notify.js +0 -0
- /package/dist/{hooks → src/hooks}/sms-watcher.js +0 -0
- /package/dist/{hooks → src/hooks}/sms-webhook.js +0 -0
- /package/dist/{hooks → src/hooks}/whatsapp-commands.js +0 -0
- /package/dist/{hooks → src/hooks}/whatsapp-scheduler.js +0 -0
- /package/dist/{hooks → src/hooks}/whatsapp-sync.js +0 -0
- /package/dist/{index.js → src/index.js} +0 -0
- /package/dist/{integrations → src/integrations}/anthropic/client.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/agent-bridge.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/enhanced-pre-clear-hooks.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/lifecycle-hooks.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/post-task-hooks.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/subagent-client-stub.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/subagent-client.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/task-coordinator.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/auth.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/auto-sync.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/config.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/migration.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/oauth-server.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/rest-client.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/sync-manager.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/sync-service.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/sync.js +0 -0
- /package/dist/{integrations/ralph → src/integrations/linear}/types.js +0 -0
- /package/dist/{integrations/ralph → src/integrations/linear}/types.js.map +0 -0
- /package/dist/{integrations → src/integrations}/linear/unified-sync.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/webhook-handler.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/webhook-server.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/webhook.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/code-execution-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/context-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/discovery-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/index.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/linear-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/skill-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/task-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/trace-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/index.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/middleware/tool-scoring.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/refactored-server.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/schemas.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/tool-definitions-code.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/tool-definitions.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/bridge/ralph-stackmemory-bridge.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/context/context-budget-manager.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/context/stackmemory-context-loader.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/coordination/enhanced-coordination.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/index.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/learning/pattern-learner.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/lifecycle/iteration-lifecycle.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/monitoring/swarm-dashboard.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/monitoring/swarm-registry.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/orchestration/multi-loop-orchestrator.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/patterns/compounding-engineering-pattern.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/patterns/extended-coherence-sessions.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/patterns/oracle-worker-pattern.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/performance/performance-optimizer.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/recovery/crash-recovery.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/state/state-reconciler.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/swarm/git-workflow-manager.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/swarm/swarm-coordinator.js +0 -0
- /package/dist/{types/task.js.map → src/integrations/ralph/types.js.map} +0 -0
- /package/dist/{integrations → src/integrations}/ralph/visualization/ralph-debugger.js +0 -0
- /package/dist/{mcp → src/mcp}/stackmemory-mcp-server.js +0 -0
- /package/dist/{middleware → src/middleware}/exponential-rate-limiter.js +0 -0
- /package/dist/{models → src/models}/user.model.js +0 -0
- /package/dist/{servers → src/servers}/production/auth-middleware.js +0 -0
- /package/dist/{services → src/services}/config-service.js +0 -0
- /package/dist/{services → src/services}/context-service.js +0 -0
- /package/dist/{skills → src/skills}/api-discovery.js +0 -0
- /package/dist/{skills → src/skills}/api-skill.js +0 -0
- /package/dist/{skills → src/skills}/claude-skills.js +0 -0
- /package/dist/{skills → src/skills}/dashboard-launcher.js +0 -0
- /package/dist/{skills → src/skills}/recursive-agent-orchestrator.js +0 -0
- /package/dist/{skills → src/skills}/unified-rlm-orchestrator.js +0 -0
- /package/dist/{types → src/types}/task.js +0 -0
- /package/dist/{utils → src/utils}/env.js +0 -0
- /package/dist/{utils → src/utils}/formatting.js +0 -0
- /package/dist/{utils → src/utils}/process-cleanup.js +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/sweep/status-bar.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Sweep Status Bar\n *\n * Renders a 1-row prediction status bar at the bottom of the terminal\n * using ANSI escape sequences. Preserves cursor position.\n */\n\nimport { basename } from 'path';\n\n// ANSI escape sequences\nconst ESC = '\\x1b';\nconst SAVE_CURSOR = `${ESC}7`;\nconst RESTORE_CURSOR = `${ESC}8`;\nconst CLEAR_LINE = `${ESC}[2K`;\nconst RESET = `${ESC}[0m`;\nconst BG_DARK = `${ESC}[48;5;236m`; // dark gray bg\nconst FG_GRAY = `${ESC}[38;5;244m`; // gray text\nconst FG_CYAN = `${ESC}[38;5;37m`; // cyan for label\nconst FG_DIM = `${ESC}[2m`; // dim\nconst BOLD = `${ESC}[1m`;\n\nfunction moveTo(row: number, col: number): string {\n return `${ESC}[${row};${col}H`;\n}\n\nexport class StatusBar {\n private rows: number;\n private cols: number;\n private visible = false;\n private currentPrediction = '';\n private currentFile = '';\n\n constructor() {\n this.rows = process.stdout.rows || 24;\n this.cols = process.stdout.columns || 80;\n }\n\n show(prediction: string, filePath: string, latencyMs: number): void {\n this.currentPrediction = prediction;\n this.currentFile = filePath;\n this.visible = true;\n\n const file = basename(filePath);\n const preview = this.truncatePreview(prediction);\n const latency = `${latencyMs}ms`;\n\n // Build status bar content\n const label = `${FG_CYAN}${BOLD}[Sweep]${RESET}${BG_DARK}`;\n const fileInfo = `${FG_GRAY} ${file}${RESET}${BG_DARK}`;\n const content = `${FG_GRAY} ${preview}${RESET}${BG_DARK}`;\n const time = `${FG_DIM}${BG_DARK} ${latency}${RESET}${BG_DARK}`;\n const keys = `${BOLD}${BG_DARK} [Tab]${RESET}${BG_DARK}${FG_GRAY} Accept ${BOLD}${BG_DARK}[Esc]${RESET}${BG_DARK}${FG_GRAY} Dismiss${RESET}`;\n\n const bar = `${BG_DARK}${label}${fileInfo}${content}${time}${keys}${RESET}`;\n\n this.render(bar);\n }\n\n showLoading(): void {\n this.visible = true;\n const bar = `${BG_DARK}${FG_CYAN}${BOLD}[Sweep]${RESET}${BG_DARK}${FG_GRAY} Predicting next edit...${RESET}`;\n this.render(bar);\n }\n\n hide(): void {\n if (!this.visible) return;\n this.visible = false;\n this.currentPrediction = '';\n this.currentFile = '';\n\n const output =\n SAVE_CURSOR + moveTo(this.rows, 1) + CLEAR_LINE + RESTORE_CURSOR;\n\n process.stdout.write(output);\n }\n\n resize(rows: number, cols: number): void {\n this.rows = rows;\n this.cols = cols;\n if (this.visible && this.currentPrediction) {\n this.show(this.currentPrediction, this.currentFile, 0);\n }\n }\n\n isVisible(): boolean {\n return this.visible;\n }\n\n private render(content: string): void {\n if (!process.stdout.isTTY) return;\n\n const output =\n SAVE_CURSOR +\n moveTo(this.rows, 1) +\n CLEAR_LINE +\n content +\n RESTORE_CURSOR;\n\n process.stdout.write(output);\n }\n\n private truncatePreview(prediction: string): string {\n // Take first non-empty line\n const lines = prediction.trim().split('\\n');\n let preview = lines[0] || '';\n\n // Max preview length: cols minus label/keys overhead (~50 chars)\n const maxLen = Math.max(10, this.cols - 55);\n if (preview.length > maxLen) {\n preview = preview.slice(0, maxLen - 3) + '...';\n }\n\n // Indicate more lines\n if (lines.length > 1) {\n preview += ` (+${lines.length - 1} lines)`;\n }\n\n return preview;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/sweep/sweep-server-manager.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Sweep Server Manager\n *\n * Manages the llama-server process for Sweep predictions.\n */\n\nimport { spawn, ChildProcess, execSync } from 'child_process';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport {\n SweepServerConfig,\n SweepServerStatus,\n DEFAULT_SERVER_CONFIG,\n} from './types.js';\nimport { createPredictionClient } from './prediction-client.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\nconst HOME = process.env['HOME'] || '/tmp';\nconst PID_FILE = join(HOME, '.stackmemory', 'sweep', 'server.pid');\nconst LOG_FILE = join(HOME, '.stackmemory', 'sweep', 'server.log');\n\nexport class SweepServerManager {\n private config: SweepServerConfig;\n private process: ChildProcess | null = null;\n\n constructor(config: Partial<SweepServerConfig> = {}) {\n this.config = { ...DEFAULT_SERVER_CONFIG, ...config };\n\n // Set default model path if not provided\n if (!this.config.modelPath) {\n this.config.modelPath = join(\n HOME,\n '.stackmemory',\n 'models',\n 'sweep',\n 'sweep-next-edit-1.5b.q8_0.v2.gguf'\n );\n }\n }\n\n /**\n * Find llama-server executable\n */\n private findLlamaServer(): string | null {\n const candidates = [\n 'llama-server',\n 'llama.cpp/llama-server',\n '/usr/local/bin/llama-server',\n '/opt/homebrew/bin/llama-server',\n join(HOME, '.local', 'bin', 'llama-server'),\n ];\n\n for (const cmd of candidates) {\n try {\n execSync(`which ${cmd}`, { stdio: 'ignore' });\n return cmd;\n } catch {\n if (existsSync(cmd)) {\n return cmd;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Start the llama-server\n */\n async startServer(): Promise<SweepServerStatus> {\n // Check if already running\n const status = await this.getStatus();\n if (status.running) {\n return status;\n }\n\n // Check model exists\n if (!existsSync(this.config.modelPath)) {\n throw new Error(\n `Model not found: ${this.config.modelPath}\\n` +\n 'Download with: huggingface-cli download sweepai/sweep-next-edit-1.5B sweep-next-edit-1.5b.q8_0.v2.gguf --local-dir ~/.stackmemory/models/sweep'\n );\n }\n\n // Find llama-server\n const llamaServer = this.findLlamaServer();\n if (!llamaServer) {\n throw new Error(\n 'llama-server not found. Install with:\\n' +\n ' brew install llama.cpp\\n' +\n 'or build from source: https://github.com/ggerganov/llama.cpp'\n );\n }\n\n // Ensure log directory exists\n const logDir = dirname(LOG_FILE);\n if (!existsSync(logDir)) {\n mkdirSync(logDir, { recursive: true });\n }\n\n // Build command args\n const args = [\n '-m',\n this.config.modelPath,\n '--port',\n String(this.config.port),\n '--host',\n this.config.host,\n '-c',\n String(this.config.contextSize),\n ];\n\n if (this.config.threads) {\n args.push('-t', String(this.config.threads));\n }\n\n if (this.config.gpuLayers && this.config.gpuLayers > 0) {\n args.push('-ngl', String(this.config.gpuLayers));\n }\n\n logger.info('Starting Sweep server', { llamaServer, args });\n\n // Start the process\n this.process = spawn(llamaServer, args, {\n detached: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n // Write PID file\n if (this.process.pid) {\n const pidDir = dirname(PID_FILE);\n if (!existsSync(pidDir)) {\n mkdirSync(pidDir, { recursive: true });\n }\n writeFileSync(\n PID_FILE,\n JSON.stringify({\n pid: this.process.pid,\n port: this.config.port,\n host: this.config.host,\n modelPath: this.config.modelPath,\n startedAt: Date.now(),\n })\n );\n }\n\n // Unref to allow parent to exit\n this.process.unref();\n\n // Wait for server to be ready\n const ready = await this.waitForReady(10000);\n if (!ready) {\n await this.stopServer();\n throw new Error('Server failed to start within timeout');\n }\n\n return this.getStatus();\n }\n\n /**\n * Wait for server to be ready\n */\n private async waitForReady(timeoutMs: number): Promise<boolean> {\n const client = createPredictionClient({\n port: this.config.port,\n host: this.config.host,\n });\n\n const startTime = Date.now();\n while (Date.now() - startTime < timeoutMs) {\n if (await client.checkHealth()) {\n return true;\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n\n return false;\n }\n\n /**\n * Stop the server\n */\n async stopServer(): Promise<void> {\n const status = await this.getStatus();\n\n if (!status.running || !status.pid) {\n return;\n }\n\n try {\n process.kill(status.pid, 'SIGTERM');\n\n // Wait for process to exit\n await new Promise<void>((resolve) => {\n const checkInterval = setInterval(() => {\n try {\n process.kill(status.pid!, 0); // Check if still running\n } catch {\n clearInterval(checkInterval);\n resolve();\n }\n }, 100);\n\n // Force kill after 5 seconds\n setTimeout(() => {\n clearInterval(checkInterval);\n try {\n process.kill(status.pid!, 'SIGKILL');\n } catch {\n // Already dead\n }\n resolve();\n }, 5000);\n });\n } catch (error) {\n // Process may already be dead\n logger.warn('Error stopping server', { error });\n }\n\n // Clean up PID file\n try {\n if (existsSync(PID_FILE)) {\n const { unlinkSync } = await import('fs');\n unlinkSync(PID_FILE);\n }\n } catch {\n // Ignore\n }\n }\n\n /**\n * Get server status\n */\n async getStatus(): Promise<SweepServerStatus> {\n // Check PID file\n if (!existsSync(PID_FILE)) {\n return { running: false };\n }\n\n try {\n const data = JSON.parse(readFileSync(PID_FILE, 'utf-8'));\n const { pid, port, host, modelPath, startedAt } = data;\n\n // Check if process is still running\n try {\n process.kill(pid, 0);\n } catch {\n // Process not running\n return { running: false };\n }\n\n // Verify server is responsive\n const client = createPredictionClient({ port, host });\n const healthy = await client.checkHealth();\n\n return {\n running: healthy,\n pid,\n port,\n host,\n modelPath,\n startedAt,\n };\n } catch {\n return { running: false };\n }\n }\n\n /**\n * Check server health\n */\n async checkHealth(): Promise<boolean> {\n const client = createPredictionClient({\n port: this.config.port,\n host: this.config.host,\n });\n return client.checkHealth();\n }\n}\n\n/**\n * Create a server manager with default config\n */\nexport function createServerManager(\n config?: Partial<SweepServerConfig>\n): SweepServerManager {\n return new SweepServerManager(config);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/sweep/tab-interceptor.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Tab Interceptor\n *\n * Intercepts Tab and Esc keystrokes when a Sweep prediction is active.\n * All other input passes through to the PTY child unchanged.\n */\n\nconst TAB = 0x09;\nconst ESC = 0x1b;\n\nexport interface TabInterceptorCallbacks {\n onAccept: () => void;\n onDismiss: () => void;\n onPassthrough: (data: Buffer) => void;\n}\n\nexport class TabInterceptor {\n private predictionActive = false;\n private callbacks: TabInterceptorCallbacks;\n\n constructor(callbacks: TabInterceptorCallbacks) {\n this.callbacks = callbacks;\n }\n\n setPredictionActive(active: boolean): void {\n this.predictionActive = active;\n }\n\n isPredictionActive(): boolean {\n return this.predictionActive;\n }\n\n process(data: Buffer): void {\n if (!this.predictionActive) {\n this.callbacks.onPassthrough(data);\n return;\n }\n\n // Tab key: accept prediction\n if (data.length === 1 && data[0] === TAB) {\n this.callbacks.onAccept();\n return;\n }\n\n // Bare Escape: dismiss prediction\n // Distinguish from escape sequences (arrow keys, etc.) by length.\n // Bare Esc is a single byte; escape sequences are multi-byte.\n if (data.length === 1 && data[0] === ESC) {\n this.callbacks.onDismiss();\n return;\n }\n\n // Everything else passes through (including escape sequences)\n this.callbacks.onPassthrough(data);\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;AAOA,MAAM,MAAM;AACZ,MAAM,MAAM;AAQL,MAAM,eAAe;AAAA,EAClB,mBAAmB;AAAA,EACnB;AAAA,EAER,YAAY,WAAoC;AAC9C,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,oBAAoB,QAAuB;AACzC,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,qBAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ,MAAoB;AAC1B,QAAI,CAAC,KAAK,kBAAkB;AAC1B,WAAK,UAAU,cAAc,IAAI;AACjC;AAAA,IACF;AAGA,QAAI,KAAK,WAAW,KAAK,KAAK,CAAC,MAAM,KAAK;AACxC,WAAK,UAAU,SAAS;AACxB;AAAA,IACF;AAKA,QAAI,KAAK,WAAW,KAAK,KAAK,CAAC,MAAM,KAAK;AACxC,WAAK,UAAU,UAAU;AACzB;AAAA,IACF;AAGA,SAAK,UAAU,cAAc,IAAI;AAAA,EACnC;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/sweep/types.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Sweep Next-Edit Types\n *\n * Types for the Sweep 1.5B model server integration.\n */\n\nexport interface SweepServerConfig {\n port: number;\n host: string;\n modelPath: string;\n contextSize: number;\n threads?: number;\n gpuLayers?: number;\n}\n\nexport interface SweepServerStatus {\n running: boolean;\n pid?: number;\n port?: number;\n host?: string;\n startedAt?: number;\n modelPath?: string;\n}\n\nexport interface SweepPredictInput {\n file_path: string;\n current_content: string;\n original_content?: string;\n context_files?: Record<string, string>;\n recent_diffs?: DiffEntry[];\n max_tokens?: number;\n temperature?: number;\n top_k?: number;\n}\n\nexport interface DiffEntry {\n file_path: string;\n original: string;\n updated: string;\n timestamp?: number;\n}\n\nexport interface SweepPredictResult {\n success: boolean;\n predicted_content?: string;\n file_path?: string;\n latency_ms?: number;\n tokens_generated?: number;\n error?: string;\n message?: string;\n}\n\nexport interface SweepPromptInput {\n filePath: string;\n originalContent: string;\n currentContent: string;\n recentDiffs: DiffEntry[];\n contextFiles?: Record<string, string>;\n}\n\nexport interface CompletionRequest {\n model: string;\n prompt: string;\n max_tokens: number;\n temperature: number;\n top_k?: number;\n stop?: string[];\n stream?: boolean;\n}\n\nexport interface CompletionResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n text: string;\n index: number;\n logprobs: null;\n finish_reason: string;\n }>;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\nexport const DEFAULT_SERVER_CONFIG: SweepServerConfig = {\n port: 8766,\n host: '127.0.0.1',\n modelPath: '',\n contextSize: 8192,\n threads: undefined,\n gpuLayers: 0,\n};\n\nexport const SWEEP_STOP_TOKENS = ['<|file_sep|>', '</s>'];\n"],
|
|
5
|
+
"mappings": ";;;;AAwFO,MAAM,wBAA2C;AAAA,EACtD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AAAA,EACX,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AACb;AAEO,MAAM,oBAAoB,CAAC,gBAAgB,MAAM;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/tasks/linear-task-manager.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Linear Task Manager\n * In-memory task storage with Linear synchronization\n * Replaces LinearTaskManager system\n */\n\nimport { EventEmitter } from 'events';\nimport { logger } from '../../core/monitoring/logger.js';\nimport {\n Task,\n TaskStatus,\n TaskPriority,\n TaskMetadata,\n} from '../../types/task.js';\nimport { LinearClient, LinearIssue } from '../../integrations/linear/client.js';\nimport { ProjectIsolationManager } from '../../core/projects/project-isolation.js';\n\nexport interface LinearTaskManagerConfig {\n linearApiKey?: string;\n teamId?: string;\n projectFilter?: string; // Filter tasks by project name/org\n autoSync?: boolean;\n syncInterval?: number; // minutes\n batchSize?: number; // Number of tasks to sync per batch (rate limiting)\n rateLimitDelay?: number; // Delay between API calls in ms\n}\n\nexport interface TaskMetrics {\n total_tasks: number;\n by_status: Record<TaskStatus, number>;\n by_priority: Record<TaskPriority, number>;\n completion_rate: number;\n avg_effort_accuracy: number;\n blocked_tasks: number;\n overdue_tasks: number;\n}\n\nexport class LinearTaskManager extends EventEmitter {\n private tasks: Map<string, Task> = new Map();\n private linearClient?: LinearClient;\n private config: LinearTaskManagerConfig;\n private projectId?: string;\n private syncTimer?: NodeJS.Timeout;\n private isolationManager: ProjectIsolationManager;\n private lastSyncTimestamp: number = 0;\n private syncInProgress: boolean = false;\n\n constructor(\n config: LinearTaskManagerConfig = {},\n projectId?: string,\n projectRoot?: string\n ) {\n super();\n this.config = config;\n this.projectId = projectId;\n this.isolationManager = ProjectIsolationManager.getInstance();\n\n // Get project-specific configuration if projectRoot is provided\n if (projectRoot) {\n const projectInfo =\n this.isolationManager.getProjectIdentification(projectRoot);\n this.projectId = projectInfo.projectId;\n\n // Override config with project-specific settings\n this.config = {\n ...config,\n teamId: config.teamId || projectInfo.linearTeamId,\n projectFilter: config.projectFilter || projectInfo.workspaceFilter,\n batchSize: config.batchSize || 5, // Conservative batch size for rate limiting\n rateLimitDelay: config.rateLimitDelay || 1000, // 1 second between calls\n };\n }\n\n // Initialize Linear client if API key is provided\n if (config.linearApiKey) {\n this.linearClient = new LinearClient({\n apiKey: config.linearApiKey,\n teamId: this.config.teamId,\n });\n }\n\n // Setup auto-sync if enabled\n if (config.autoSync && config.syncInterval && this.linearClient) {\n this.setupAutoSync();\n }\n }\n\n /**\n * Create a new task\n */\n createTask(options: {\n title: string;\n description?: string;\n priority?: TaskPriority;\n tags?: string[];\n metadata?: TaskMetadata;\n }): string {\n const id = this.generateTaskId();\n const now = new Date();\n\n const task: Task = {\n id,\n title: options.title,\n description: options.description || '',\n status: 'todo',\n priority: options.priority || 'medium',\n tags: [...(options.tags || []), ...this.getProjectTags()],\n metadata: {\n ...options.metadata,\n projectId: this.projectId,\n teamId: this.config.teamId,\n projectFilter: this.config.projectFilter,\n },\n createdAt: now,\n updatedAt: now,\n };\n\n this.tasks.set(id, task);\n this.emit('task:created', task);\n this.emit('sync:needed', 'task:created');\n\n return id;\n }\n\n /**\n * Update task status\n */\n updateTaskStatus(\n taskId: string,\n newStatus: TaskStatus,\n _reason?: string\n ): void {\n const task = this.tasks.get(taskId);\n if (!task) {\n throw new Error(`Task not found: ${taskId}`);\n }\n\n task.status = newStatus;\n task.updatedAt = new Date();\n\n this.tasks.set(taskId, task);\n\n if (newStatus === 'done') {\n this.emit('task:completed', task);\n }\n\n this.emit('task:updated', task);\n this.emit('sync:needed', 'task:updated');\n }\n\n /**\n * Get task by ID\n */\n getTask(taskId: string): Task | undefined {\n return this.tasks.get(taskId);\n }\n\n /**\n * Get all active tasks (not done/cancelled)\n */\n getActiveTasks(): Task[] {\n return Array.from(this.tasks.values())\n .filter((task) => !['done', 'cancelled'].includes(task.status))\n .sort((a, b) => {\n // Sort by priority then by creation date\n const priorityOrder = { urgent: 4, high: 3, medium: 2, low: 1 };\n const aPriority = priorityOrder[a.priority || 'medium'];\n const bPriority = priorityOrder[b.priority || 'medium'];\n\n if (aPriority !== bPriority) {\n return bPriority - aPriority; // Higher priority first\n }\n\n return a.createdAt.getTime() - b.createdAt.getTime(); // Older first\n });\n }\n\n /**\n * Get tasks by status\n */\n getTasksByStatus(status: TaskStatus): Task[] {\n return Array.from(this.tasks.values()).filter(\n (task) => task.status === status\n );\n }\n\n /**\n * Get metrics for tasks\n */\n getMetrics(): TaskMetrics {\n const allTasks = Array.from(this.tasks.values());\n const totalTasks = allTasks.length;\n\n const byStatus: Record<TaskStatus, number> = {\n todo: 0,\n in_progress: 0,\n done: 0,\n cancelled: 0,\n };\n\n const byPriority: Record<TaskPriority, number> = {\n low: 0,\n medium: 0,\n high: 0,\n urgent: 0,\n };\n\n for (const task of allTasks) {\n byStatus[task.status]++;\n if (task.priority) {\n byPriority[task.priority]++;\n }\n }\n\n const completedTasks = byStatus.done;\n const completionRate = totalTasks > 0 ? completedTasks / totalTasks : 0;\n\n return {\n total_tasks: totalTasks,\n by_status: byStatus,\n by_priority: byPriority,\n completion_rate: completionRate,\n avg_effort_accuracy: 0, // Not implemented in this simplified version\n blocked_tasks: 0, // Could be implemented with tags or metadata\n overdue_tasks: 0, // Could be implemented with due dates\n };\n }\n\n /**\n * Sync with Linear workspace (incremental with rate limiting and exponential backoff)\n */\n async syncWithLinear(): Promise<{ synced: number; errors: string[] }> {\n if (!this.linearClient) {\n throw new Error('Linear client not initialized');\n }\n\n if (this.syncInProgress) {\n logger.warn('Sync already in progress, skipping');\n return { synced: 0, errors: ['Sync already in progress'] };\n }\n\n this.syncInProgress = true;\n const errors: string[] = [];\n let synced = 0;\n\n try {\n // Get tasks that need syncing (created/updated since last sync)\n const tasksToSync = this.getTasksRequiringSync();\n const batchSize = this.config.batchSize || 5;\n const rateLimitDelay = this.config.rateLimitDelay || 1000;\n\n logger.info(\n `Starting incremental sync: ${tasksToSync.length} tasks to process`\n );\n\n // Process tasks in batches to respect rate limits\n for (let i = 0; i < tasksToSync.length; i += batchSize) {\n const batch = tasksToSync.slice(i, i + batchSize);\n\n for (const task of batch) {\n try {\n await this.withExponentialBackoff(\n async () => {\n if (!task.externalId) {\n // Create new issue in Linear\n const linearIssue = await this.createLinearIssue(task);\n task.externalId = linearIssue.id;\n task.externalIdentifier = linearIssue.identifier;\n task.externalUrl = linearIssue.url;\n task.updatedAt = new Date();\n\n logger.debug(\n `Created Linear issue: ${linearIssue.identifier} for task ${task.id}`\n );\n } else {\n // Update existing issue if needed\n await this.updateLinearIssue(task);\n\n logger.debug(\n `Updated Linear issue: ${task.externalIdentifier} for task ${task.id}`\n );\n }\n },\n 3,\n rateLimitDelay\n );\n\n synced++;\n\n // Base rate limiting delay between API calls\n if (rateLimitDelay > 0) {\n await this.sleep(rateLimitDelay);\n }\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message : String(error);\n errors.push(`Failed to sync task ${task.id}: ${errorMsg}`);\n logger.error('Failed to sync task to Linear after retries', {\n taskId: task.id,\n error: errorMsg,\n projectId: this.projectId,\n });\n }\n }\n\n // Batch delay (longer between batches)\n if (i + batchSize < tasksToSync.length && rateLimitDelay > 0) {\n await this.sleep(rateLimitDelay * 2);\n }\n }\n\n this.lastSyncTimestamp = Date.now();\n this.emit('sync:completed', {\n synced,\n errors,\n projectId: this.projectId,\n });\n\n logger.info(\n `Linear sync completed: ${synced} tasks synced, ${errors.length} errors`\n );\n return { synced, errors };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n errors.push(`Sync failed: ${errorMsg}`);\n logger.error('Linear sync failed', {\n error: errorMsg,\n projectId: this.projectId,\n });\n throw new Error(`Linear sync failed: ${errorMsg}`);\n } finally {\n this.syncInProgress = false;\n }\n }\n\n /**\n * Load tasks from Linear\n */\n async loadFromLinear(): Promise<number> {\n if (!this.linearClient || !this.config.teamId) {\n throw new Error('Linear client or team ID not configured');\n }\n\n try {\n const issues = await this.linearClient.getIssues({\n teamId: this.config.teamId,\n });\n\n let loaded = 0;\n for (const issue of issues) {\n // Only load issues that belong to this project\n if (this.shouldIncludeIssue(issue)) {\n const task = this.convertLinearIssueToTask(issue);\n this.tasks.set(task.id, task);\n loaded++;\n }\n }\n\n logger.info(\n `Loaded ${loaded} tasks from Linear for project ${this.projectId}`\n );\n this.emit('tasks:loaded', { count: loaded, projectId: this.projectId });\n return loaded;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error('Failed to load tasks from Linear', {\n error: errorMsg,\n projectId: this.projectId,\n teamId: this.config.teamId,\n });\n throw new Error(`Failed to load from Linear: ${errorMsg}`);\n }\n }\n\n /**\n * Clear all tasks (for testing or cleanup)\n */\n clear(): void {\n this.tasks.clear();\n this.emit('tasks:cleared');\n }\n\n /**\n * Get task count\n */\n getTaskCount(): number {\n return this.tasks.size;\n }\n\n // Private methods\n\n private generateTaskId(): string {\n return `tsk-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private async createLinearIssue(task: Task): Promise<LinearIssue> {\n if (!this.linearClient || !this.config.teamId) {\n throw new Error('Linear client or team ID not configured');\n }\n\n const priorityMap: Record<TaskPriority, number> = {\n urgent: 1,\n high: 2,\n medium: 3,\n low: 4,\n };\n\n return await this.linearClient.createIssue({\n title: task.title,\n description: task.description,\n teamId: this.config.teamId,\n priority: task.priority ? priorityMap[task.priority] : 3,\n });\n }\n\n private convertLinearIssueToTask(issue: LinearIssue): Task {\n const priorityMap: Record<number, TaskPriority> = {\n 1: 'urgent',\n 2: 'high',\n 3: 'medium',\n 4: 'low',\n };\n\n const statusMap: Record<string, TaskStatus> = {\n backlog: 'todo',\n unstarted: 'todo',\n started: 'in_progress',\n completed: 'done',\n cancelled: 'cancelled',\n };\n\n return {\n id: `linear-${issue.id}`,\n title: issue.title,\n description: issue.description || '',\n status: statusMap[issue.state.type] || 'todo',\n priority: priorityMap[issue.priority] || 'medium',\n tags: issue.labels?.map((label) => label.name) || [],\n externalId: issue.id,\n externalIdentifier: issue.identifier,\n externalUrl: issue.url,\n metadata: {\n linear: {\n stateId: issue.state.id,\n assigneeId: issue.assignee?.id,\n },\n },\n createdAt: new Date(issue.createdAt),\n updatedAt: new Date(issue.updatedAt),\n };\n }\n\n private setupAutoSync(): void {\n if (this.syncTimer) {\n clearInterval(this.syncTimer);\n }\n\n const intervalMs = (this.config.syncInterval || 15) * 60 * 1000;\n this.syncTimer = setInterval(async () => {\n try {\n await this.syncWithLinear();\n } catch (error) {\n logger.error(\n 'Auto-sync failed',\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }, intervalMs);\n }\n\n /**\n * Get project-specific tags\n */\n private getProjectTags(): string[] {\n const tags = [];\n if (this.config.projectFilter) {\n tags.push(`project:${this.config.projectFilter}`);\n }\n if (this.projectId) {\n tags.push(`proj:${this.projectId.slice(-8)}`); // Short project ID\n }\n return tags;\n }\n\n /**\n * Check if a Linear issue should be included in this project\n */\n private shouldIncludeIssue(issue: LinearIssue): boolean {\n if (!this.config.projectFilter) {\n return true; // Include all if no filter\n }\n\n // Check if issue has project tags\n const projectTags = issue.labels?.map((label) => label.name) || [];\n return projectTags.some(\n (tag) =>\n tag.includes(this.config.projectFilter!) ||\n tag.includes(`proj:${this.projectId?.slice(-8)}`)\n );\n }\n\n /**\n * Get project information\n */\n getProjectInfo() {\n return {\n projectId: this.projectId,\n teamId: this.config.teamId,\n projectFilter: this.config.projectFilter,\n };\n }\n\n /**\n * Cleanup resources\n */\n /**\n * Get tasks that require syncing (created or updated since last sync)\n */\n private getTasksRequiringSync(): Task[] {\n return Array.from(this.tasks.values()).filter((task) => {\n // Include tasks without external ID (new tasks)\n if (!task.externalId) {\n return true;\n }\n\n // Include tasks updated since last sync\n if (this.lastSyncTimestamp > 0) {\n return task.updatedAt.getTime() > this.lastSyncTimestamp;\n }\n\n return false;\n });\n }\n\n /**\n * Update an existing Linear issue\n */\n private async updateLinearIssue(task: Task): Promise<void> {\n if (!this.linearClient || !task.externalId) {\n return;\n }\n\n const priorityMap: Record<TaskPriority, number> = {\n urgent: 1,\n high: 2,\n medium: 3,\n low: 4,\n };\n\n // Only update if the task was modified after last sync\n if (task.updatedAt.getTime() <= this.lastSyncTimestamp) {\n return;\n }\n\n await this.linearClient.updateIssue(task.externalId, {\n title: task.title,\n description: task.description,\n priority: task.priority ? priorityMap[task.priority] : 3,\n });\n }\n\n /**\n * Sleep for specified milliseconds\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Exponential backoff retry wrapper\n */\n private async withExponentialBackoff<T>(\n operation: () => Promise<T>,\n maxRetries: number = 3,\n baseDelay: number = 1000\n ): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry on final attempt\n if (attempt === maxRetries) {\n break;\n }\n\n // Check if it's a rate limit error\n const errorMsg = lastError.message.toLowerCase();\n const isRateLimit =\n errorMsg.includes('rate limit') ||\n errorMsg.includes('429') ||\n errorMsg.includes('too many requests');\n\n if (isRateLimit) {\n // Exponential backoff with jitter for rate limit errors\n const delay = baseDelay * Math.pow(2, attempt) + Math.random() * 1000;\n logger.warn(\n `Rate limit hit, retrying in ${delay}ms (attempt ${attempt + 1}/${maxRetries + 1})`\n );\n await this.sleep(delay);\n } else {\n // For other errors, shorter delay\n const delay = baseDelay * Math.pow(1.5, attempt);\n logger.warn(\n `API error, retrying in ${delay}ms: ${lastError.message}`\n );\n await this.sleep(delay);\n }\n }\n }\n\n throw lastError!;\n }\n\n /**\n * Cleanup resources\n */\n destroy(): void {\n if (this.syncTimer) {\n clearInterval(this.syncTimer);\n this.syncTimer = undefined;\n }\n this.removeAllListeners();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/tasks/task-aware-context.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Task-Aware Context Assembly\n * Intelligently selects context based on active tasks and their relationships\n */\n\nimport Database from 'better-sqlite3';\nimport {\n Frame,\n Anchor,\n Event,\n FrameManager,\n} from '../../core/context/index.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\nexport type TaskStatus =\n | 'pending'\n | 'in_progress'\n | 'completed'\n | 'blocked'\n | 'cancelled';\nexport type TaskPriority = 'low' | 'medium' | 'high' | 'urgent';\n\nexport interface Task {\n task_id: string;\n frame_id: string;\n anchor_id?: string; // Reference to TODO anchor if exists\n name: string;\n description?: string;\n status: TaskStatus;\n priority: TaskPriority;\n parent_task_id?: string;\n depends_on: string[]; // Task IDs this depends on\n assigned_to?: string; // For team contexts\n estimated_effort?: number; // In minutes\n actual_effort?: number;\n created_at: number;\n started_at?: number;\n completed_at?: number;\n blocked_reason?: string;\n context_tags: string[]; // For context relevance scoring\n metadata: Record<string, any>;\n}\n\nexport interface TaskContext {\n activeTasks: Task[];\n blockedTasks: Task[];\n relatedContext: {\n frames: Frame[];\n anchors: Anchor[];\n recentEvents: Event[];\n };\n contextScore: number; // Relevance score for current work\n}\n\nexport interface ContextRequest {\n query?: string;\n maxTokens?: number;\n taskFocus?: string[]; // Specific task IDs to focus on\n includeHistory?: boolean;\n priorityFilter?: TaskPriority[];\n}\n\nexport class TaskAwareContextManager {\n private db: Database.Database;\n private frameManager: FrameManager;\n private projectId: string;\n\n constructor(\n db: Database.Database,\n frameManager: FrameManager,\n projectId: string\n ) {\n this.db = db;\n this.frameManager = frameManager;\n this.projectId = projectId;\n this.initializeTaskSchema();\n }\n\n private initializeTaskSchema() {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS tasks (\n task_id TEXT PRIMARY KEY,\n frame_id TEXT NOT NULL,\n anchor_id TEXT,\n name TEXT NOT NULL,\n description TEXT,\n status TEXT DEFAULT 'pending',\n priority TEXT DEFAULT 'medium',\n parent_task_id TEXT,\n depends_on TEXT DEFAULT '[]',\n assigned_to TEXT,\n estimated_effort INTEGER,\n actual_effort INTEGER,\n created_at INTEGER DEFAULT (unixepoch()),\n started_at INTEGER,\n completed_at INTEGER,\n blocked_reason TEXT,\n context_tags TEXT DEFAULT '[]',\n metadata TEXT DEFAULT '{}',\n FOREIGN KEY(frame_id) REFERENCES frames(frame_id),\n FOREIGN KEY(anchor_id) REFERENCES anchors(anchor_id),\n FOREIGN KEY(parent_task_id) REFERENCES tasks(task_id)\n );\n\n CREATE TABLE IF NOT EXISTS task_dependencies (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id TEXT NOT NULL,\n depends_on_task_id TEXT NOT NULL,\n dependency_type TEXT DEFAULT 'blocks',\n created_at INTEGER DEFAULT (unixepoch()),\n FOREIGN KEY(task_id) REFERENCES tasks(task_id),\n FOREIGN KEY(depends_on_task_id) REFERENCES tasks(task_id)\n );\n\n CREATE TABLE IF NOT EXISTS context_access_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n request_id TEXT NOT NULL,\n task_ids TEXT, -- JSON array of relevant task IDs\n context_items TEXT, -- JSON array of included context items\n relevance_scores TEXT, -- JSON object of item -> score mappings\n total_tokens INTEGER,\n query_hash TEXT,\n timestamp INTEGER DEFAULT (unixepoch())\n );\n\n CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\n CREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority);\n CREATE INDEX IF NOT EXISTS idx_tasks_frame ON tasks(frame_id);\n CREATE INDEX IF NOT EXISTS idx_task_deps ON task_dependencies(task_id);\n `);\n }\n\n /**\n * Create task from TODO anchor or standalone\n */\n public createTask(options: {\n name: string;\n description?: string;\n priority?: TaskPriority;\n frameId?: string;\n anchorId?: string;\n parentTaskId?: string;\n dependsOn?: string[];\n contextTags?: string[];\n estimatedEffort?: number;\n metadata?: Record<string, any>;\n }): string {\n const taskId = `task_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const frameId = options.frameId || this.frameManager.getCurrentFrameId();\n\n if (!frameId) {\n throw new Error('No active frame for task creation');\n }\n\n const task: Omit<\n Task,\n 'started_at' | 'completed_at' | 'blocked_reason' | 'actual_effort'\n > = {\n task_id: taskId,\n frame_id: frameId,\n anchor_id: options.anchorId,\n name: options.name,\n description: options.description,\n status: 'pending',\n priority: options.priority || 'medium',\n parent_task_id: options.parentTaskId,\n depends_on: options.dependsOn || [],\n estimated_effort: options.estimatedEffort,\n created_at: Math.floor(Date.now() / 1000),\n context_tags: options.contextTags || [],\n metadata: options.metadata || {},\n };\n\n // Insert task\n this.db\n .prepare(\n `\n INSERT INTO tasks (\n task_id, frame_id, anchor_id, name, description, status, priority,\n parent_task_id, depends_on, estimated_effort, created_at, context_tags, metadata\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `\n )\n .run(\n task.task_id,\n task.frame_id,\n task.anchor_id,\n task.name,\n task.description,\n task.status,\n task.priority,\n task.parent_task_id,\n JSON.stringify(task.depends_on),\n task.estimated_effort,\n task.created_at,\n JSON.stringify(task.context_tags),\n JSON.stringify(task.metadata)\n );\n\n // Create dependency relationships\n if (task.depends_on.length > 0) {\n const dependencyStmt = this.db.prepare(`\n INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (?, ?)\n `);\n\n task.depends_on.forEach((depTaskId) => {\n dependencyStmt.run(taskId, depTaskId);\n });\n }\n\n // Log event\n this.frameManager.addEvent('decision', {\n action: 'create_task',\n task_id: taskId,\n name: task.name,\n priority: task.priority,\n });\n\n logger.info('Created task', { taskId, name: task.name, frameId });\n return taskId;\n }\n\n /**\n * Update task status with automatic time tracking\n */\n public updateTaskStatus(\n taskId: string,\n newStatus: TaskStatus,\n reason?: string\n ): void {\n const task = this.getTask(taskId);\n if (!task) throw new Error(`Task not found: ${taskId}`);\n\n const now = Math.floor(Date.now() / 1000);\n const updates: Record<string, any> = { status: newStatus };\n\n // Automatic time tracking\n if (newStatus === 'in_progress' && task.status === 'pending') {\n updates.started_at = now;\n } else if (newStatus === 'completed' && task.status === 'in_progress') {\n updates.completed_at = now;\n if (task.started_at) {\n updates.actual_effort = now - task.started_at;\n }\n } else if (newStatus === 'blocked') {\n updates.blocked_reason = reason || 'No reason provided';\n }\n\n // Build dynamic update query\n const setClause = Object.keys(updates)\n .map((key) => `${key} = ?`)\n .join(', ');\n const values = Object.values(updates);\n\n this.db\n .prepare(`UPDATE tasks SET ${setClause} WHERE task_id = ?`)\n .run(...values, taskId);\n\n // Log status change\n this.frameManager.addEvent('observation', {\n action: 'task_status_change',\n task_id: taskId,\n old_status: task.status,\n new_status: newStatus,\n reason,\n });\n\n logger.info('Updated task status', {\n taskId,\n oldStatus: task.status,\n newStatus,\n });\n }\n\n /**\n * Assemble context optimized for active tasks and query\n */\n public assembleTaskAwareContext(request: ContextRequest): {\n context: string;\n metadata: {\n includedTasks: Task[];\n contextSources: string[];\n totalTokens: number;\n relevanceScores: Record<string, number>;\n };\n } {\n const startTime = Date.now();\n\n // 1. Get active and relevant tasks\n const activeTasks = this.getActiveTasks(request.taskFocus);\n const blockedTasks = this.getBlockedTasks();\n\n // 2. Score and select relevant context\n const contextItems = this.selectRelevantContext(activeTasks, request);\n\n // 3. Assemble final context with smart ordering\n const { context, totalTokens, relevanceScores } = this.buildContextString(\n contextItems,\n activeTasks,\n request.maxTokens || 4000\n );\n\n // 4. Log context access for learning\n this.logContextAccess({\n taskIds: activeTasks.map((t) => t.task_id),\n contextItems: contextItems.map((item) => item.id),\n relevanceScores,\n totalTokens,\n query: request.query || '',\n });\n\n const metadata = {\n includedTasks: activeTasks,\n contextSources: contextItems.map((item) => `${item.type}:${item.id}`),\n totalTokens,\n relevanceScores,\n };\n\n logger.info('Assembled task-aware context', {\n activeTasks: activeTasks.length,\n blockedTasks: blockedTasks.length,\n contextItems: contextItems.length,\n totalTokens,\n assemblyTimeMs: Date.now() - startTime,\n });\n\n return { context, metadata };\n }\n\n /**\n * Get tasks that are currently active or should be in context\n */\n private getActiveTasks(taskFocus?: string[]): Task[] {\n let query = `\n SELECT * FROM tasks \n WHERE status IN ('in_progress', 'pending') \n `;\n let params: any[] = [];\n\n if (taskFocus && taskFocus.length > 0) {\n query += ` AND task_id IN (${taskFocus.map(() => '?').join(',')})`;\n params = taskFocus;\n }\n\n query += ` ORDER BY priority DESC, created_at ASC`;\n\n const rows = this.db.prepare(query).all(...params) as any[];\n return this.hydrateTasks(rows);\n }\n\n private getBlockedTasks(): Task[] {\n const rows = this.db\n .prepare(\n `\n SELECT * FROM tasks WHERE status = 'blocked' ORDER BY priority DESC\n `\n )\n .all() as any[];\n return this.hydrateTasks(rows);\n }\n\n /**\n * Select context items relevant to active tasks\n */\n private selectRelevantContext(activeTasks: Task[], request: ContextRequest) {\n const contextItems: Array<{\n id: string;\n type: 'frame' | 'anchor' | 'event';\n content: string;\n relevanceScore: number;\n tokenEstimate: number;\n }> = [];\n\n // Get frames for active tasks\n const frameIds = [...new Set(activeTasks.map((t) => t.frame_id))];\n frameIds.forEach((frameId) => {\n const frame = this.frameManager.getFrame(frameId);\n if (frame) {\n const score = this.calculateFrameRelevance(\n frame,\n activeTasks,\n request.query\n );\n contextItems.push({\n id: frameId,\n type: 'frame',\n content: `Frame: ${frame.name} (${frame.type})`,\n relevanceScore: score,\n tokenEstimate: frame.name.length + 20,\n });\n }\n });\n\n // Get relevant anchors\n const anchors = this.getRelevantAnchors(frameIds, request);\n anchors.forEach((anchor) => {\n const score = this.calculateAnchorRelevance(\n anchor,\n activeTasks,\n request.query\n );\n contextItems.push({\n id: anchor.anchor_id,\n type: 'anchor',\n content: `${anchor.type}: ${anchor.text}`,\n relevanceScore: score,\n tokenEstimate: anchor.text.length + 10,\n });\n });\n\n // Get recent events from active frames\n if (request.includeHistory) {\n frameIds.forEach((frameId) => {\n const events = this.frameManager.getFrameEvents(frameId, 5);\n events.forEach((event) => {\n const score = this.calculateEventRelevance(\n event,\n activeTasks,\n request.query\n );\n if (score > 0.3) {\n contextItems.push({\n id: event.event_id,\n type: 'event',\n content: `Event: ${event.event_type}`,\n relevanceScore: score,\n tokenEstimate: 30,\n });\n }\n });\n });\n }\n\n // Sort by relevance score\n return contextItems.sort((a, b) => b.relevanceScore - a.relevanceScore);\n }\n\n private buildContextString(\n contextItems: any[],\n activeTasks: Task[],\n maxTokens: number\n ): {\n context: string;\n totalTokens: number;\n relevanceScores: Record<string, number>;\n } {\n let context = '# Active Task Context\\n\\n';\n let totalTokens = 20; // Header estimate\n const relevanceScores: Record<string, number> = {};\n\n // Always include active tasks summary\n context += '## Current Tasks\\n';\n activeTasks.forEach((task) => {\n const line = `- [${task.status.toUpperCase()}] ${task.name} (${task.priority})\\n`;\n context += line;\n totalTokens += line.length / 4; // Rough token estimate\n relevanceScores[task.task_id] = 1.0;\n });\n context += '\\n';\n\n // Add context items within token budget\n context += '## Relevant Context\\n';\n for (const item of contextItems) {\n if (totalTokens + item.tokenEstimate > maxTokens) break;\n\n context += `${item.content}\\n`;\n totalTokens += item.tokenEstimate;\n relevanceScores[item.id] = item.relevanceScore;\n }\n\n return { context, totalTokens, relevanceScores };\n }\n\n // Relevance scoring methods\n private calculateFrameRelevance(\n frame: Frame,\n activeTasks: Task[],\n query?: string\n ): number {\n let score = 0.5; // Base relevance\n\n // Higher score if frame contains active tasks\n if (activeTasks.some((t) => t.frame_id === frame.frame_id)) {\n score += 0.4;\n }\n\n // Query matching\n if (query) {\n const queryLower = query.toLowerCase();\n if (frame.name.toLowerCase().includes(queryLower)) {\n score += 0.3;\n }\n }\n\n // Recent frames get boost\n const ageHours = (Date.now() / 1000 - frame.created_at) / 3600;\n if (ageHours < 24) score += 0.2;\n\n return Math.min(score, 1.0);\n }\n\n private calculateAnchorRelevance(\n anchor: Anchor,\n activeTasks: Task[],\n query?: string\n ): number {\n let score = 0.3; // Base relevance\n\n // Task-related anchors get priority\n if (anchor.type === 'TODO') score += 0.4;\n if (anchor.type === 'DECISION') score += 0.3;\n if (anchor.type === 'CONSTRAINT') score += 0.2;\n\n // Priority-based boost\n score += (anchor.priority / 10) * 0.2;\n\n // Query matching\n if (query) {\n const queryLower = query.toLowerCase();\n if (anchor.text.toLowerCase().includes(queryLower)) {\n score += 0.3;\n }\n }\n\n return Math.min(score, 1.0);\n }\n\n private calculateEventRelevance(\n event: Event,\n _activeTasks: Task[],\n _query?: string\n ): number {\n let score = 0.1; // Base relevance\n\n // Event type relevance\n if (event.event_type === 'decision') score += 0.4;\n if (event.event_type === 'tool_call') score += 0.3;\n if (event.event_type === 'observation') score += 0.2;\n\n // Recent events get boost\n const ageHours = (Date.now() / 1000 - event.ts) / 3600;\n if (ageHours < 1) score += 0.3;\n else if (ageHours < 6) score += 0.2;\n\n return Math.min(score, 1.0);\n }\n\n // Helper methods\n private getTask(taskId: string): Task | undefined {\n const row = this.db\n .prepare(`SELECT * FROM tasks WHERE task_id = ?`)\n .get(taskId) as any;\n return row ? this.hydrateTask(row) : undefined;\n }\n\n private getRelevantAnchors(\n frameIds: string[],\n _request: ContextRequest\n ): Anchor[] {\n if (frameIds.length === 0) return [];\n\n const placeholders = frameIds.map(() => '?').join(',');\n const rows = this.db\n .prepare(\n `\n SELECT * FROM anchors \n WHERE frame_id IN (${placeholders})\n ORDER BY priority DESC, created_at DESC\n LIMIT 20\n `\n )\n .all(...frameIds) as any[];\n\n return rows.map((row) => ({\n ...row,\n metadata: JSON.parse(row.metadata || '{}'),\n }));\n }\n\n private hydrateTasks(rows: any[]): Task[] {\n return rows.map(this.hydrateTask);\n }\n\n private hydrateTask = (row: any): Task => ({\n ...row,\n depends_on: JSON.parse(row.depends_on || '[]'),\n context_tags: JSON.parse(row.context_tags || '[]'),\n metadata: JSON.parse(row.metadata || '{}'),\n });\n\n private logContextAccess(data: {\n taskIds: string[];\n contextItems: string[];\n relevanceScores: Record<string, number>;\n totalTokens: number;\n query: string;\n }) {\n const requestId = `ctx_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`;\n\n this.db\n .prepare(\n `\n INSERT INTO context_access_log (\n request_id, task_ids, context_items, relevance_scores, total_tokens, query_hash\n ) VALUES (?, ?, ?, ?, ?, ?)\n `\n )\n .run(\n requestId,\n JSON.stringify(data.taskIds),\n JSON.stringify(data.contextItems),\n JSON.stringify(data.relevanceScores),\n data.totalTokens,\n this.hashString(data.query)\n );\n }\n\n private hashString(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return hash.toString(16);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/tui/simple-monitor.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Simple text-based swarm monitor for terminal compatibility\n * Fallback for terminals that can't handle blessed TUI\n */\n\nimport { SwarmRegistry } from '../../integrations/ralph/monitoring/swarm-registry.js';\nimport { execSync } from 'child_process';\n// Simple monitor for terminal compatibility\n\nexport class SimpleSwarmMonitor {\n private refreshInterval: NodeJS.Timeout | null = null;\n\n /**\n * Start simple text-based monitoring\n */\n start(): void {\n console.log('\uD83E\uDDBE Ralph Swarm Monitor (Text Mode)');\n console.log('=====================================');\n console.log('');\n console.log('Press Ctrl+C to quit');\n console.log('');\n\n // Show initial status\n this.displayStatus();\n\n // Set up refresh interval\n this.refreshInterval = setInterval(() => {\n this.displayStatus();\n }, 5000);\n\n // Handle graceful shutdown\n process.on('SIGINT', () => {\n this.stop();\n process.exit(0);\n });\n }\n\n /**\n * Stop monitoring\n */\n stop(): void {\n if (this.refreshInterval) {\n clearInterval(this.refreshInterval);\n }\n console.log('\\n\uD83D\uDC4B Swarm monitoring stopped');\n }\n\n /**\n * Display current status\n */\n private displayStatus(): void {\n const timestamp = new Date().toLocaleTimeString();\n\n console.log(`\\n\u23F0 ${timestamp} - Swarm Status Update`);\n console.log('\u2500'.repeat(50));\n\n try {\n // Check registry\n const registry = SwarmRegistry.getInstance();\n const activeSwarms = registry.listActiveSwarms();\n const stats = registry.getStatistics();\n\n console.log(\n `\uD83D\uDCCA Registry Stats: ${stats.activeSwarms} active, ${stats.totalSwarms} total`\n );\n\n if (activeSwarms.length > 0) {\n console.log('\\n\uD83E\uDDBE Active Swarms:');\n for (const swarm of activeSwarms) {\n const uptime = this.formatDuration(Date.now() - swarm.startTime);\n console.log(\n ` \u2022 ${swarm.id.substring(0, 8)}: ${swarm.status} (${uptime})`\n );\n }\n } else {\n console.log('\u274C No active swarms in registry');\n }\n\n // Check for external processes\n try {\n const ralphProcesses = execSync(\n 'ps aux | grep \"ralph\" | grep -v grep',\n { encoding: 'utf8' }\n );\n if (ralphProcesses.trim()) {\n console.log('\\n\uD83D\uDD0D External Ralph Processes:');\n const processLines = ralphProcesses\n .split('\\n')\n .filter((line) => line.trim());\n processLines.slice(0, 3).forEach((line) => {\n const parts = line.split(/\\s+/);\n console.log(\n ` PID ${parts[1]}: ${parts.slice(10).join(' ').slice(0, 50)}...`\n );\n });\n if (processLines.length > 3) {\n console.log(` ... and ${processLines.length - 3} more processes`);\n }\n }\n } catch {\n // No external processes\n }\n\n // Show recent commits\n try {\n const recentCommits = execSync(\n 'git log --oneline --since=\"1 hour ago\" --pretty=format:\"%h %an %s\" | head -3',\n { encoding: 'utf8', cwd: process.cwd() }\n );\n\n if (recentCommits.trim()) {\n console.log('\\n\uD83D\uDCDD Recent Commits:');\n recentCommits\n .split('\\n')\n .filter((line) => line.trim())\n .forEach((line) => {\n console.log(` ${line}`);\n });\n }\n } catch {\n // No git or commits\n }\n } catch (error: unknown) {\n console.log(`\u274C Status error: ${(error as Error).message}`);\n }\n }\n\n /**\n * Format duration string\n */\n private formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) return `${hours}h ${minutes % 60}m`;\n if (minutes > 0) return `${minutes}m ${seconds % 60}s`;\n return `${seconds}s`;\n }\n}\n\nexport default SimpleSwarmMonitor;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/tui/swarm-monitor.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Real-time TUI for monitoring Ralph Swarm operations\n * Tracks commits, status, agents, and lines edited per agent\n */\n\nimport blessed from 'blessed';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { SwarmCoordinator } from '../../integrations/ralph/swarm/swarm-coordinator.js';\nimport { SwarmDashboard } from '../../integrations/ralph/monitoring/swarm-dashboard.js';\nimport { SwarmRegistry } from '../../integrations/ralph/monitoring/swarm-registry.js';\nimport { execSync } from 'child_process';\n\nexport interface SwarmCommitMetrics {\n agentId: string;\n role: string;\n commits: Array<{\n hash: string;\n message: string;\n timestamp: number;\n linesAdded: number;\n linesDeleted: number;\n filesChanged: number;\n }>;\n totalCommits: number;\n totalLinesAdded: number;\n totalLinesDeleted: number;\n lastActivity: number;\n}\n\nexport interface SwarmStatus {\n swarmId: string;\n status: 'active' | 'idle' | 'completed' | 'error';\n startTime: number;\n uptime: number;\n agents: Array<{\n id: string;\n role: string;\n status: string;\n currentTask?: string;\n iteration: number;\n lastActivity: number;\n }>;\n performance: {\n throughput: number;\n efficiency: number;\n totalTasks: number;\n completedTasks: number;\n };\n}\n\nexport class SwarmTUI {\n private screen: blessed.Widgets.Screen;\n private commitsTable: blessed.Widgets.TableElement;\n private statusBox: blessed.Widgets.BoxElement;\n private agentsTable: blessed.Widgets.TableElement;\n private metricsBox: blessed.Widgets.BoxElement;\n private logBox: blessed.Widgets.LogElement;\n\n private swarmCoordinator: SwarmCoordinator | null = null;\n private swarmDashboard: SwarmDashboard | null = null;\n private refreshInterval: NodeJS.Timeout | null = null;\n private commitMetrics: Map<string, SwarmCommitMetrics> = new Map();\n\n constructor() {\n // Detect terminal capabilities and set safe defaults\n const isGhostty =\n process.env.TERM_PROGRAM === 'ghostty' ||\n process.env.TERM?.includes('ghostty');\n const isBasicTerm =\n process.env.TERM === 'dumb' || process.env.TERM === 'unknown';\n\n this.screen = blessed.screen({\n smartCSR: !isGhostty, // Disable smart CSR for ghostty\n title: 'Ralph Swarm Monitor',\n terminal: isGhostty ? 'xterm-256color' : undefined,\n fullUnicode: !isBasicTerm,\n dockBorders: false,\n ignoreDockContrast: true,\n useBCE: false, // Disable background color erase for compatibility\n forceUnicode: false,\n debug: false,\n });\n\n // Add error handler for terminal issues\n this.screen.on('error', (err) => {\n logger.error('TUI screen error:', err);\n console.log(\n '\u26A0\uFE0F TUI display error detected. Try setting TERM=xterm-256color'\n );\n console.log(\n ' Alternative: Use stackmemory ralph status for text-based monitoring'\n );\n });\n\n this.createUI();\n this.setupKeyHandlers();\n\n logger.info('SwarmTUI initialized');\n }\n\n private createUI(): void {\n // Main layout container\n const container = blessed.box({\n parent: this.screen,\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n style: {\n bg: 'black',\n },\n });\n\n // Detect terminal capabilities for styling\n const isGhostty =\n process.env.TERM_PROGRAM === 'ghostty' ||\n process.env.TERM?.includes('ghostty');\n const safeColors = isGhostty;\n\n // Title bar\n blessed.box({\n parent: container,\n top: 0,\n left: 0,\n width: '100%',\n height: 3,\n content: '\uD83E\uDDBE Ralph Swarm Monitor - Real-time Swarm Operations',\n style: safeColors\n ? {\n fg: 'white',\n bold: false,\n }\n : {\n bg: 'blue',\n fg: 'white',\n bold: true,\n },\n border: {\n type: 'line',\n },\n });\n\n // Status box (top right)\n this.statusBox = blessed.box({\n parent: container,\n top: 3,\n left: '50%',\n width: '50%',\n height: 8,\n label: ' Swarm Status ',\n content: 'No active swarm',\n style: {\n bg: 'black',\n fg: 'white',\n },\n border: {\n type: 'line',\n fg: 'cyan',\n },\n });\n\n // Metrics box (top left)\n this.metricsBox = blessed.box({\n parent: container,\n top: 3,\n left: 0,\n width: '50%',\n height: 8,\n label: ' Performance Metrics ',\n content: 'Waiting for data...',\n style: {\n bg: 'black',\n fg: 'white',\n },\n border: {\n type: 'line',\n fg: 'green',\n },\n });\n\n // Agents table (middle left)\n this.agentsTable = blessed.table({\n parent: container,\n top: 11,\n left: 0,\n width: '50%',\n height: 12,\n label: ' Active Agents ',\n style: {\n bg: 'black',\n fg: 'white',\n header: {\n bg: 'blue',\n fg: 'white',\n bold: true,\n },\n cell: {\n selected: {\n bg: 'blue',\n fg: 'white',\n },\n },\n },\n border: {\n type: 'line',\n fg: 'yellow',\n },\n data: [['Role', 'Status', 'Iteration', 'Task', 'Last Active']],\n });\n\n // Commits table (middle right)\n this.commitsTable = blessed.table({\n parent: container,\n top: 11,\n left: '50%',\n width: '50%',\n height: 12,\n label: ' Recent Commits ',\n style: {\n bg: 'black',\n fg: 'white',\n header: {\n bg: 'blue',\n fg: 'white',\n bold: true,\n },\n cell: {\n selected: {\n bg: 'blue',\n fg: 'white',\n },\n },\n },\n border: {\n type: 'line',\n fg: 'magenta',\n },\n data: [['Agent', 'Message', 'Lines +/-', 'Time']],\n });\n\n // Log output (bottom)\n this.logBox = blessed.log({\n parent: container,\n top: 23,\n left: 0,\n width: '100%',\n height: '100%-23',\n label: ' Swarm Logs ',\n style: {\n bg: 'black',\n fg: 'white',\n },\n border: {\n type: 'line',\n fg: 'white',\n },\n scrollable: true,\n alwaysScroll: true,\n mouse: true,\n });\n\n // Help text\n blessed.box({\n parent: container,\n bottom: 0,\n left: 0,\n width: '100%',\n height: 1,\n content:\n 'q=quit | r=refresh | s=start swarm | t=stop swarm | h=help | c=clear logs | d=detect swarms',\n style: {\n bg: 'white',\n fg: 'black',\n },\n });\n }\n\n private setupKeyHandlers(): void {\n this.screen.key(['escape', 'q', 'C-c'], () => {\n this.cleanup();\n process.exit(0);\n });\n\n this.screen.key(['r'], () => {\n this.refreshData();\n this.logBox.log('Manual refresh triggered');\n });\n\n this.screen.key(['s'], () => {\n this.startSwarmInteractive();\n });\n\n this.screen.key(['t'], () => {\n this.stopSwarmInteractive();\n });\n\n this.screen.key(['h'], () => {\n this.showHelp();\n });\n\n this.screen.key(['c'], () => {\n this.clearLogs();\n });\n\n this.screen.key(['d'], () => {\n this.showDetectedSwarms();\n });\n }\n\n /**\n * Initialize swarm monitoring\n */\n async initialize(\n swarmCoordinator?: SwarmCoordinator,\n swarmId?: string\n ): Promise<void> {\n try {\n // Connect to existing swarm if ID provided\n if (swarmId) {\n const registry = SwarmRegistry.getInstance();\n const swarm = registry.getSwarm(swarmId);\n if (swarm) {\n this.swarmCoordinator = swarm.coordinator;\n this.logBox.log(`Connected to swarm: ${swarmId}`);\n } else {\n this.logBox.log(`Swarm not found: ${swarmId}`);\n }\n } else if (swarmCoordinator) {\n this.swarmCoordinator = swarmCoordinator;\n } else {\n // Auto-detect active swarms\n const registry = SwarmRegistry.getInstance();\n const activeSwarms = registry.listActiveSwarms();\n if (activeSwarms.length > 0) {\n this.swarmCoordinator = activeSwarms[0].coordinator;\n this.logBox.log(`Auto-connected to swarm: ${activeSwarms[0].id}`);\n }\n }\n\n if (this.swarmCoordinator) {\n this.swarmDashboard = new SwarmDashboard(this.swarmCoordinator);\n this.swarmDashboard.startMonitoring(2000); // 2 second refresh\n\n // Listen to swarm events\n this.swarmDashboard.on('metricsUpdated', (metrics) => {\n this.updateUI(metrics);\n });\n }\n\n // Start refresh interval\n this.refreshInterval = setInterval(() => {\n this.refreshData();\n }, 3000);\n\n this.logBox.log('SwarmTUI monitoring initialized');\n } catch (error: unknown) {\n logger.error('Failed to initialize SwarmTUI', error as Error);\n this.logBox.log(`Error: ${(error as Error).message}`);\n }\n }\n\n /**\n * Start the TUI display\n */\n start(): void {\n this.screen.render();\n this.logBox.log('Ralph Swarm Monitor started');\n this.logBox.log('Monitoring for active swarms...');\n }\n\n /**\n * Refresh all data\n */\n private async refreshData(): Promise<void> {\n try {\n // Update commit metrics\n await this.updateCommitMetrics();\n\n // Update swarm status if coordinator available\n if (this.swarmCoordinator) {\n const status = this.getSwarmStatus();\n this.updateStatusDisplay(status);\n } else {\n // Try to detect active swarms\n await this.detectActiveSwarms();\n }\n\n this.screen.render();\n } catch (error: unknown) {\n logger.error('Failed to refresh TUI data', error as Error);\n this.logBox.log(`Refresh error: ${(error as Error).message}`);\n }\n }\n\n /**\n * Update commit metrics for all agents\n */\n private async updateCommitMetrics(): Promise<void> {\n try {\n // Get recent commits from git log\n const gitLog = execSync(\n 'git log --oneline --since=\"1 hour ago\" --pretty=format:\"%H|%an|%s|%ct\" --numstat',\n { encoding: 'utf8', cwd: process.cwd() }\n );\n\n const commits = this.parseGitCommits(gitLog);\n this.updateCommitsTable(commits);\n } catch {\n // Git might fail if no commits, that's okay\n this.logBox.log('No recent commits found');\n }\n }\n\n /**\n * Parse git log output into commit data\n */\n private parseGitCommits(gitLog: string): Array<{\n hash: string;\n agent: string;\n message: string;\n timestamp: number;\n linesAdded: number;\n linesDeleted: number;\n }> {\n const commits = [];\n const lines = gitLog.split('\\n').filter(Boolean);\n\n let currentCommit: any = null;\n\n for (const line of lines) {\n if (line.includes('|')) {\n // Commit info line\n const [hash, author, message, timestamp] = line.split('|');\n currentCommit = {\n hash: hash.substring(0, 8),\n agent: this.extractAgentFromAuthor(author),\n message: message.substring(0, 50),\n timestamp: parseInt(timestamp),\n linesAdded: 0,\n linesDeleted: 0,\n };\n } else if (currentCommit && line.match(/^\\d+\\s+\\d+/)) {\n // Stat line (added/deleted)\n const [added, deleted] = line.split('\\t')[0].split(' ');\n currentCommit.linesAdded += parseInt(added) || 0;\n currentCommit.linesDeleted += parseInt(deleted) || 0;\n\n commits.push({ ...currentCommit });\n currentCommit = null;\n }\n }\n\n return commits.slice(0, 10); // Show last 10 commits\n }\n\n /**\n * Extract agent info from git author\n */\n private extractAgentFromAuthor(author: string): string {\n // Look for [agent_role] pattern in commit author or message\n const agentMatch = author.match(/\\[(\\w+)\\]/);\n if (agentMatch) {\n return agentMatch[1];\n }\n\n // Fallback to checking if author contains known agent roles\n const roles = [\n 'developer',\n 'tester',\n 'optimizer',\n 'documenter',\n 'architect',\n ];\n for (const role of roles) {\n if (author.toLowerCase().includes(role)) {\n return role;\n }\n }\n\n return 'user';\n }\n\n /**\n * Update commits table display\n */\n private updateCommitsTable(commits: any[]): void {\n const tableData = [['Agent', 'Message', 'Lines +/-', 'Time']];\n\n for (const commit of commits) {\n const timeAgo = this.formatTimeAgo(commit.timestamp * 1000);\n const linesChange = `+${commit.linesAdded}/-${commit.linesDeleted}`;\n\n tableData.push([commit.agent, commit.message, linesChange, timeAgo]);\n }\n\n this.commitsTable.setData(tableData);\n }\n\n /**\n * Get current swarm status\n */\n private getSwarmStatus(): SwarmStatus | null {\n if (!this.swarmCoordinator) return null;\n\n const usage = this.swarmCoordinator.getResourceUsage();\n const swarmState = (this.swarmCoordinator as any).swarmState;\n\n if (!swarmState) return null;\n\n return {\n swarmId: swarmState.id,\n status: swarmState.status,\n startTime: swarmState.startTime,\n uptime: Date.now() - swarmState.startTime,\n agents: usage.activeAgents\n ? Array.from(\n (this.swarmCoordinator as any).activeAgents?.values() || []\n ).map((agent: any) => ({\n id: agent.id,\n role: agent.role,\n status: agent.status,\n currentTask: agent.currentTask,\n iteration: agent.performance?.tasksCompleted || 0,\n lastActivity: agent.performance?.lastFreshStart || Date.now(),\n }))\n : [],\n performance: {\n throughput: swarmState.performance?.throughput || 0,\n efficiency: swarmState.performance?.efficiency || 0,\n totalTasks: swarmState.totalTaskCount || 0,\n completedTasks: swarmState.completedTaskCount || 0,\n },\n };\n }\n\n /**\n * Update status display\n */\n private updateStatusDisplay(status: SwarmStatus | null): void {\n if (!status) {\n this.statusBox.setContent('No active swarm detected');\n this.agentsTable.setData([\n ['Role', 'Status', 'Iteration', 'Task', 'Last Active'],\n ]);\n this.metricsBox.setContent('Waiting for swarm data...');\n return;\n }\n\n // Update status box\n const uptimeStr = this.formatDuration(status.uptime);\n const statusContent = `Swarm: ${status.swarmId.substring(0, 8)}\nStatus: ${status.status.toUpperCase()}\nUptime: ${uptimeStr}\nAgents: ${status.agents.length}`;\n\n this.statusBox.setContent(statusContent);\n\n // Update agents table\n const agentData = [['Role', 'Status', 'Iteration', 'Task', 'Last Active']];\n for (const agent of status.agents) {\n const lastActivity = this.formatTimeAgo(agent.lastActivity);\n const task = agent.currentTask\n ? agent.currentTask.substring(0, 20)\n : 'idle';\n\n agentData.push([\n agent.role,\n agent.status,\n agent.iteration.toString(),\n task,\n lastActivity,\n ]);\n }\n this.agentsTable.setData(agentData);\n\n // Update metrics box\n const metricsContent = `Throughput: ${status.performance.throughput.toFixed(2)} tasks/min\nEfficiency: ${(status.performance.efficiency * 100).toFixed(1)}%\nTasks: ${status.performance.completedTasks}/${status.performance.totalTasks}\nSuccess Rate: ${status.performance.efficiency > 0 ? (status.performance.efficiency * 100).toFixed(1) : 'N/A'}%`;\n\n this.metricsBox.setContent(metricsContent);\n }\n\n /**\n * Update UI with metrics from dashboard\n */\n private updateUI(metrics: any): void {\n this.logBox.log(\n `Metrics updated: ${metrics.status} - ${metrics.activeAgents} agents`\n );\n }\n\n /**\n * Detect active swarms in the system\n */\n private async detectActiveSwarms(): Promise<void> {\n try {\n const registry = SwarmRegistry.getInstance();\n const activeSwarms = registry.listActiveSwarms();\n const stats = registry.getStatistics();\n\n if (activeSwarms.length > 0) {\n let statusContent = `Available Swarms (${activeSwarms.length}):\\n`;\n for (const swarm of activeSwarms.slice(0, 3)) {\n const uptime = this.formatDuration(Date.now() - swarm.startTime);\n statusContent += `\u2022 ${swarm.id.substring(0, 8)}: ${swarm.status} (${uptime})\\n`;\n }\n if (activeSwarms.length > 3) {\n statusContent += `... and ${activeSwarms.length - 3} more`;\n }\n this.statusBox.setContent(statusContent);\n this.logBox.log(\n `Found ${activeSwarms.length} active swarms in registry`\n );\n } else {\n // Check for Ralph processes as fallback\n const ralphProcesses = execSync(\n 'ps aux | grep \"ralph\" | grep -v grep',\n { encoding: 'utf8' }\n );\n\n if (ralphProcesses.trim()) {\n this.logBox.log('Detected Ralph processes running');\n this.statusBox.setContent(\n 'External Ralph processes detected\\n(Use swarm coordinator for full monitoring)'\n );\n } else {\n this.statusBox.setContent(`No active swarms detected\nTotal swarms: ${stats.totalSwarms}\nCompleted: ${stats.completedSwarms}\n\nRun: stackmemory ralph swarm <task>`);\n }\n }\n } catch {\n // No processes found, that's fine\n }\n }\n\n /**\n * Format time ago string\n */\n private formatTimeAgo(timestamp: number): string {\n const diff = Date.now() - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d ago`;\n if (hours > 0) return `${hours}h ago`;\n if (minutes > 0) return `${minutes}m ago`;\n return 'just now';\n }\n\n /**\n * Format duration string\n */\n private formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) return `${hours}h ${minutes % 60}m`;\n if (minutes > 0) return `${minutes}m ${seconds % 60}s`;\n return `${seconds}s`;\n }\n\n /**\n * Start swarm interactively\n */\n private startSwarmInteractive(): void {\n this.logBox.log('\uD83D\uDE80 Start Swarm Interactive Mode:');\n this.logBox.log(\n 'Example: stackmemory ralph swarm \"Implement feature\" --agents developer,tester'\n );\n this.logBox.log(\n 'Tip: Run the command in another terminal, then press \"d\" to detect it'\n );\n }\n\n /**\n * Stop swarm interactively\n */\n private stopSwarmInteractive(): void {\n if (this.swarmCoordinator) {\n this.logBox.log('\uD83D\uDED1 Stopping current swarm...');\n // In a real implementation, we'd call swarmCoordinator.stop()\n this.logBox.log(\n 'Note: Swarm stopping not yet implemented - use Ctrl+C in swarm terminal'\n );\n } else {\n this.logBox.log('\u274C No active swarm coordinator to stop');\n this.logBox.log('External Ralph processes must be stopped manually');\n }\n }\n\n /**\n * Show help dialog\n */\n private showHelp(): void {\n this.logBox.log('\uD83E\uDDBE Ralph Swarm Monitor - Help');\n this.logBox.log('');\n this.logBox.log('Keyboard Shortcuts:');\n this.logBox.log(' q, Esc, Ctrl+C - Quit TUI');\n this.logBox.log(' r - Refresh data manually');\n this.logBox.log(' s - Show start swarm commands');\n this.logBox.log(' t - Stop current swarm');\n this.logBox.log(' h - Show this help');\n this.logBox.log(' c - Clear log output');\n this.logBox.log(' d - Detect and list available swarms');\n this.logBox.log('');\n this.logBox.log('Usage:');\n this.logBox.log(\n ' stackmemory ralph tui # Auto-detect swarms'\n );\n this.logBox.log(\n ' stackmemory ralph tui --swarm-id <id> # Monitor specific swarm'\n );\n this.logBox.log('');\n this.logBox.log('Starting Swarms:');\n this.logBox.log(\n ' stackmemory ralph swarm \"Task description\" --agents developer,tester'\n );\n this.logBox.log('');\n }\n\n /**\n * Clear log output\n */\n private clearLogs(): void {\n this.logBox.setContent('');\n this.logBox.log('\uD83D\uDCDD Logs cleared - monitoring continues...');\n }\n\n /**\n * Show detected swarms\n */\n private async showDetectedSwarms(): Promise<void> {\n this.logBox.log('\uD83D\uDD0D Detecting active swarms...');\n\n try {\n const registry = SwarmRegistry.getInstance();\n const activeSwarms = registry.listActiveSwarms();\n const stats = registry.getStatistics();\n\n this.logBox.log('');\n this.logBox.log('\uD83D\uDCCA Swarm Registry Status:');\n this.logBox.log(` Total swarms: ${stats.totalSwarms}`);\n this.logBox.log(` Active swarms: ${stats.activeSwarms}`);\n this.logBox.log(` Completed swarms: ${stats.completedSwarms}`);\n\n if (activeSwarms.length > 0) {\n this.logBox.log('');\n this.logBox.log('\uD83E\uDDBE Active Swarms:');\n\n for (const swarm of activeSwarms) {\n const uptime = this.formatDuration(Date.now() - swarm.startTime);\n this.logBox.log(` \u2022 ${swarm.id}: ${swarm.description} (${uptime})`);\n }\n\n this.logBox.log('');\n this.logBox.log('\uD83D\uDCA1 Use --swarm-id to connect to specific swarm');\n } else {\n this.logBox.log('');\n this.logBox.log('\u274C No active swarms in registry');\n\n // Check for external processes\n try {\n const ralphProcesses = execSync(\n 'ps aux | grep \"ralph\" | grep -v grep',\n { encoding: 'utf8' }\n );\n if (ralphProcesses.trim()) {\n this.logBox.log('\uD83D\uDD0D External Ralph processes detected:');\n ralphProcesses\n .split('\\n')\n .filter((line) => line.trim())\n .forEach((line) => {\n const parts = line.split(/\\s+/);\n this.logBox.log(\n ` PID ${parts[1]}: ${parts.slice(10).join(' ').slice(0, 60)}`\n );\n });\n }\n } catch {\n this.logBox.log('\uD83D\uDD0D No external Ralph processes found');\n }\n\n this.logBox.log('');\n this.logBox.log(\n '\uD83D\uDCA1 Start a swarm: stackmemory ralph swarm \"Task\" --agents developer'\n );\n }\n } catch (error: unknown) {\n this.logBox.log(`\u274C Detection failed: ${(error as Error).message}`);\n }\n }\n\n /**\n * Cleanup resources\n */\n private cleanup(): void {\n if (this.refreshInterval) {\n clearInterval(this.refreshInterval);\n }\n\n if (this.swarmDashboard) {\n this.swarmDashboard.stopMonitoring();\n }\n\n logger.info('SwarmTUI cleaned up');\n }\n}\n\nexport default SwarmTUI;\n"],
|
|
5
|
+
"mappings": ";;;;AAKA,OAAO,aAAa;AACpB,SAAS,cAAc;AAEvB,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AAwClB,MAAM,SAAS;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,mBAA4C;AAAA,EAC5C,iBAAwC;AAAA,EACxC,kBAAyC;AAAA,EACzC,gBAAiD,oBAAI,IAAI;AAAA,EAEjE,cAAc;AAEZ,UAAM,YACJ,QAAQ,IAAI,iBAAiB,aAC7B,QAAQ,IAAI,MAAM,SAAS,SAAS;AACtC,UAAM,cACJ,QAAQ,IAAI,SAAS,UAAU,QAAQ,IAAI,SAAS;AAEtD,SAAK,SAAS,QAAQ,OAAO;AAAA,MAC3B,UAAU,CAAC;AAAA;AAAA,MACX,OAAO;AAAA,MACP,UAAU,YAAY,mBAAmB;AAAA,MACzC,aAAa,CAAC;AAAA,MACd,aAAa;AAAA,MACb,oBAAoB;AAAA,MACpB,QAAQ;AAAA;AAAA,MACR,cAAc;AAAA,MACd,OAAO;AAAA,IACT,CAAC;AAGD,SAAK,OAAO,GAAG,SAAS,CAAC,QAAQ;AAC/B,aAAO,MAAM,qBAAqB,GAAG;AACrC,cAAQ;AAAA,QACN;AAAA,MACF;AACA,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,SAAS;AACd,SAAK,iBAAiB;AAEtB,WAAO,KAAK,sBAAsB;AAAA,EACpC;AAAA,EAEQ,WAAiB;AAEvB,UAAM,YAAY,QAAQ,IAAI;AAAA,MAC5B,QAAQ,KAAK;AAAA,MACb,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,IAAI;AAAA,MACN;AAAA,IACF,CAAC;AAGD,UAAM,YACJ,QAAQ,IAAI,iBAAiB,aAC7B,QAAQ,IAAI,MAAM,SAAS,SAAS;AACtC,UAAM,aAAa;AAGnB,YAAQ,IAAI;AAAA,MACV,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,OAAO,aACH;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,MACR,IACA;AAAA,QACE,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,MACJ,QAAQ;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF,CAAC;AAGD,SAAK,YAAY,QAAQ,IAAI;AAAA,MAC3B,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI;AAAA,MACN;AAAA,IACF,CAAC;AAGD,SAAK,aAAa,QAAQ,IAAI;AAAA,MAC5B,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI;AAAA,MACN;AAAA,IACF,CAAC;AAGD,SAAK,cAAc,QAAQ,MAAM;AAAA,MAC/B,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,QAAQ;AAAA,UACN,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,MAAM;AAAA,QACR;AAAA,QACA,MAAM;AAAA,UACJ,UAAU;AAAA,YACR,IAAI;AAAA,YACJ,IAAI;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI;AAAA,MACN;AAAA,MACA,MAAM,CAAC,CAAC,QAAQ,UAAU,aAAa,QAAQ,aAAa,CAAC;AAAA,IAC/D,CAAC;AAGD,SAAK,eAAe,QAAQ,MAAM;AAAA,MAChC,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,QAAQ;AAAA,UACN,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,MAAM;AAAA,QACR;AAAA,QACA,MAAM;AAAA,UACJ,UAAU;AAAA,YACR,IAAI;AAAA,YACJ,IAAI;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI;AAAA,MACN;AAAA,MACA,MAAM,CAAC,CAAC,SAAS,WAAW,aAAa,MAAM,CAAC;AAAA,IAClD,CAAC;AAGD,SAAK,SAAS,QAAQ,IAAI;AAAA,MACxB,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI;AAAA,MACN;AAAA,MACA,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,OAAO;AAAA,IACT,CAAC;AAGD,YAAQ,IAAI;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SACE;AAAA,MACF,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,mBAAyB;AAC/B,SAAK,OAAO,IAAI,CAAC,UAAU,KAAK,KAAK,GAAG,MAAM;AAC5C,WAAK,QAAQ;AACb,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAED,SAAK,OAAO,IAAI,CAAC,GAAG,GAAG,MAAM;AAC3B,WAAK,YAAY;AACjB,WAAK,OAAO,IAAI,0BAA0B;AAAA,IAC5C,CAAC;AAED,SAAK,OAAO,IAAI,CAAC,GAAG,GAAG,MAAM;AAC3B,WAAK,sBAAsB;AAAA,IAC7B,CAAC;AAED,SAAK,OAAO,IAAI,CAAC,GAAG,GAAG,MAAM;AAC3B,WAAK,qBAAqB;AAAA,IAC5B,CAAC;AAED,SAAK,OAAO,IAAI,CAAC,GAAG,GAAG,MAAM;AAC3B,WAAK,SAAS;AAAA,IAChB,CAAC;AAED,SAAK,OAAO,IAAI,CAAC,GAAG,GAAG,MAAM;AAC3B,WAAK,UAAU;AAAA,IACjB,CAAC;AAED,SAAK,OAAO,IAAI,CAAC,GAAG,GAAG,MAAM;AAC3B,WAAK,mBAAmB;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,kBACA,SACe;AACf,QAAI;AAEF,UAAI,SAAS;AACX,cAAM,WAAW,cAAc,YAAY;AAC3C,cAAM,QAAQ,SAAS,SAAS,OAAO;AACvC,YAAI,OAAO;AACT,eAAK,mBAAmB,MAAM;AAC9B,eAAK,OAAO,IAAI,uBAAuB,OAAO,EAAE;AAAA,QAClD,OAAO;AACL,eAAK,OAAO,IAAI,oBAAoB,OAAO,EAAE;AAAA,QAC/C;AAAA,MACF,WAAW,kBAAkB;AAC3B,aAAK,mBAAmB;AAAA,MAC1B,OAAO;AAEL,cAAM,WAAW,cAAc,YAAY;AAC3C,cAAM,eAAe,SAAS,iBAAiB;AAC/C,YAAI,aAAa,SAAS,GAAG;AAC3B,eAAK,mBAAmB,aAAa,CAAC,EAAE;AACxC,eAAK,OAAO,IAAI,4BAA4B,aAAa,CAAC,EAAE,EAAE,EAAE;AAAA,QAClE;AAAA,MACF;AAEA,UAAI,KAAK,kBAAkB;AACzB,aAAK,iBAAiB,IAAI,eAAe,KAAK,gBAAgB;AAC9D,aAAK,eAAe,gBAAgB,GAAI;AAGxC,aAAK,eAAe,GAAG,kBAAkB,CAAC,YAAY;AACpD,eAAK,SAAS,OAAO;AAAA,QACvB,CAAC;AAAA,MACH;AAGA,WAAK,kBAAkB,YAAY,MAAM;AACvC,aAAK,YAAY;AAAA,MACnB,GAAG,GAAI;AAEP,WAAK,OAAO,IAAI,iCAAiC;AAAA,IACnD,SAAS,OAAgB;AACvB,aAAO,MAAM,iCAAiC,KAAc;AAC5D,WAAK,OAAO,IAAI,UAAW,MAAgB,OAAO,EAAE;AAAA,IACtD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,OAAO,OAAO;AACnB,SAAK,OAAO,IAAI,6BAA6B;AAC7C,SAAK,OAAO,IAAI,iCAAiC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAA6B;AACzC,QAAI;AAEF,YAAM,KAAK,oBAAoB;AAG/B,UAAI,KAAK,kBAAkB;AACzB,cAAM,SAAS,KAAK,eAAe;AACnC,aAAK,oBAAoB,MAAM;AAAA,MACjC,OAAO;AAEL,cAAM,KAAK,mBAAmB;AAAA,MAChC;AAEA,WAAK,OAAO,OAAO;AAAA,IACrB,SAAS,OAAgB;AACvB,aAAO,MAAM,8BAA8B,KAAc;AACzD,WAAK,OAAO,IAAI,kBAAmB,MAAgB,OAAO,EAAE;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,sBAAqC;AACjD,QAAI;AAEF,YAAM,SAAS;AAAA,QACb;AAAA,QACA,EAAE,UAAU,QAAQ,KAAK,QAAQ,IAAI,EAAE;AAAA,MACzC;AAEA,YAAM,UAAU,KAAK,gBAAgB,MAAM;AAC3C,WAAK,mBAAmB,OAAO;AAAA,IACjC,QAAQ;AAEN,WAAK,OAAO,IAAI,yBAAyB;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,QAOrB;AACD,UAAM,UAAU,CAAC;AACjB,UAAM,QAAQ,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO;AAE/C,QAAI,gBAAqB;AAEzB,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,SAAS,GAAG,GAAG;AAEtB,cAAM,CAAC,MAAM,QAAQ,SAAS,SAAS,IAAI,KAAK,MAAM,GAAG;AACzD,wBAAgB;AAAA,UACd,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA,UACzB,OAAO,KAAK,uBAAuB,MAAM;AAAA,UACzC,SAAS,QAAQ,UAAU,GAAG,EAAE;AAAA,UAChC,WAAW,SAAS,SAAS;AAAA,UAC7B,YAAY;AAAA,UACZ,cAAc;AAAA,QAChB;AAAA,MACF,WAAW,iBAAiB,KAAK,MAAM,YAAY,GAAG;AAEpD,cAAM,CAAC,OAAO,OAAO,IAAI,KAAK,MAAM,GAAI,EAAE,CAAC,EAAE,MAAM,GAAG;AACtD,sBAAc,cAAc,SAAS,KAAK,KAAK;AAC/C,sBAAc,gBAAgB,SAAS,OAAO,KAAK;AAEnD,gBAAQ,KAAK,EAAE,GAAG,cAAc,CAAC;AACjC,wBAAgB;AAAA,MAClB;AAAA,IACF;AAEA,WAAO,QAAQ,MAAM,GAAG,EAAE;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,QAAwB;AAErD,UAAM,aAAa,OAAO,MAAM,WAAW;AAC3C,QAAI,YAAY;AACd,aAAO,WAAW,CAAC;AAAA,IACrB;AAGA,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,eAAW,QAAQ,OAAO;AACxB,UAAI,OAAO,YAAY,EAAE,SAAS,IAAI,GAAG;AACvC,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,SAAsB;AAC/C,UAAM,YAAY,CAAC,CAAC,SAAS,WAAW,aAAa,MAAM,CAAC;AAE5D,eAAW,UAAU,SAAS;AAC5B,YAAM,UAAU,KAAK,cAAc,OAAO,YAAY,GAAI;AAC1D,YAAM,cAAc,IAAI,OAAO,UAAU,KAAK,OAAO,YAAY;AAEjE,gBAAU,KAAK,CAAC,OAAO,OAAO,OAAO,SAAS,aAAa,OAAO,CAAC;AAAA,IACrE;AAEA,SAAK,aAAa,QAAQ,SAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAqC;AAC3C,QAAI,CAAC,KAAK,iBAAkB,QAAO;AAEnC,UAAM,QAAQ,KAAK,iBAAiB,iBAAiB;AACrD,UAAM,aAAc,KAAK,iBAAyB;AAElD,QAAI,CAAC,WAAY,QAAO;AAExB,WAAO;AAAA,MACL,SAAS,WAAW;AAAA,MACpB,QAAQ,WAAW;AAAA,MACnB,WAAW,WAAW;AAAA,MACtB,QAAQ,KAAK,IAAI,IAAI,WAAW;AAAA,MAChC,QAAQ,MAAM,eACV,MAAM;AAAA,QACH,KAAK,iBAAyB,cAAc,OAAO,KAAK,CAAC;AAAA,MAC5D,EAAE,IAAI,CAAC,WAAgB;AAAA,QACrB,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,QAAQ,MAAM;AAAA,QACd,aAAa,MAAM;AAAA,QACnB,WAAW,MAAM,aAAa,kBAAkB;AAAA,QAChD,cAAc,MAAM,aAAa,kBAAkB,KAAK,IAAI;AAAA,MAC9D,EAAE,IACF,CAAC;AAAA,MACL,aAAa;AAAA,QACX,YAAY,WAAW,aAAa,cAAc;AAAA,QAClD,YAAY,WAAW,aAAa,cAAc;AAAA,QAClD,YAAY,WAAW,kBAAkB;AAAA,QACzC,gBAAgB,WAAW,sBAAsB;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,QAAkC;AAC5D,QAAI,CAAC,QAAQ;AACX,WAAK,UAAU,WAAW,0BAA0B;AACpD,WAAK,YAAY,QAAQ;AAAA,QACvB,CAAC,QAAQ,UAAU,aAAa,QAAQ,aAAa;AAAA,MACvD,CAAC;AACD,WAAK,WAAW,WAAW,2BAA2B;AACtD;AAAA,IACF;AAGA,UAAM,YAAY,KAAK,eAAe,OAAO,MAAM;AACnD,UAAM,gBAAgB,UAAU,OAAO,QAAQ,UAAU,GAAG,CAAC,CAAC;AAAA,UACxD,OAAO,OAAO,YAAY,CAAC;AAAA,UAC3B,SAAS;AAAA,UACT,OAAO,OAAO,MAAM;AAE1B,SAAK,UAAU,WAAW,aAAa;AAGvC,UAAM,YAAY,CAAC,CAAC,QAAQ,UAAU,aAAa,QAAQ,aAAa,CAAC;AACzE,eAAW,SAAS,OAAO,QAAQ;AACjC,YAAM,eAAe,KAAK,cAAc,MAAM,YAAY;AAC1D,YAAM,OAAO,MAAM,cACf,MAAM,YAAY,UAAU,GAAG,EAAE,IACjC;AAEJ,gBAAU,KAAK;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM,UAAU,SAAS;AAAA,QACzB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AACA,SAAK,YAAY,QAAQ,SAAS;AAGlC,UAAM,iBAAiB,eAAe,OAAO,YAAY,WAAW,QAAQ,CAAC,CAAC;AAAA,eACnE,OAAO,YAAY,aAAa,KAAK,QAAQ,CAAC,CAAC;AAAA,SACrD,OAAO,YAAY,cAAc,IAAI,OAAO,YAAY,UAAU;AAAA,gBAC3D,OAAO,YAAY,aAAa,KAAK,OAAO,YAAY,aAAa,KAAK,QAAQ,CAAC,IAAI,KAAK;AAExG,SAAK,WAAW,WAAW,cAAc;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,SAAoB;AACnC,SAAK,OAAO;AAAA,MACV,oBAAoB,QAAQ,MAAM,MAAM,QAAQ,YAAY;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAoC;AAChD,QAAI;AACF,YAAM,WAAW,cAAc,YAAY;AAC3C,YAAM,eAAe,SAAS,iBAAiB;AAC/C,YAAM,QAAQ,SAAS,cAAc;AAErC,UAAI,aAAa,SAAS,GAAG;AAC3B,YAAI,gBAAgB,qBAAqB,aAAa,MAAM;AAAA;AAC5D,mBAAW,SAAS,aAAa,MAAM,GAAG,CAAC,GAAG;AAC5C,gBAAM,SAAS,KAAK,eAAe,KAAK,IAAI,IAAI,MAAM,SAAS;AAC/D,2BAAiB,UAAK,MAAM,GAAG,UAAU,GAAG,CAAC,CAAC,KAAK,MAAM,MAAM,KAAK,MAAM;AAAA;AAAA,QAC5E;AACA,YAAI,aAAa,SAAS,GAAG;AAC3B,2BAAiB,WAAW,aAAa,SAAS,CAAC;AAAA,QACrD;AACA,aAAK,UAAU,WAAW,aAAa;AACvC,aAAK,OAAO;AAAA,UACV,SAAS,aAAa,MAAM;AAAA,QAC9B;AAAA,MACF,OAAO;AAEL,cAAM,iBAAiB;AAAA,UACrB;AAAA,UACA,EAAE,UAAU,OAAO;AAAA,QACrB;AAEA,YAAI,eAAe,KAAK,GAAG;AACzB,eAAK,OAAO,IAAI,kCAAkC;AAClD,eAAK,UAAU;AAAA,YACb;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK,UAAU,WAAW;AAAA,gBACpB,MAAM,WAAW;AAAA,aACpB,MAAM,eAAe;AAAA;AAAA,oCAEE;AAAA,QAC5B;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,WAA2B;AAC/C,UAAM,OAAO,KAAK,IAAI,IAAI;AAC1B,UAAM,UAAU,KAAK,MAAM,OAAO,GAAK;AACvC,UAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,UAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAElC,QAAI,OAAO,EAAG,QAAO,GAAG,IAAI;AAC5B,QAAI,QAAQ,EAAG,QAAO,GAAG,KAAK;AAC9B,QAAI,UAAU,EAAG,QAAO,GAAG,OAAO;AAClC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,IAAoB;AACzC,UAAM,UAAU,KAAK,MAAM,KAAK,GAAI;AACpC,UAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,UAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AAErC,QAAI,QAAQ,EAAG,QAAO,GAAG,KAAK,KAAK,UAAU,EAAE;AAC/C,QAAI,UAAU,EAAG,QAAO,GAAG,OAAO,KAAK,UAAU,EAAE;AACnD,WAAO,GAAG,OAAO;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAA8B;AACpC,SAAK,OAAO,IAAI,yCAAkC;AAClD,SAAK,OAAO;AAAA,MACV;AAAA,IACF;AACA,SAAK,OAAO;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAA6B;AACnC,QAAI,KAAK,kBAAkB;AACzB,WAAK,OAAO,IAAI,qCAA8B;AAE9C,WAAK,OAAO;AAAA,QACV;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,OAAO,IAAI,4CAAuC;AACvD,WAAK,OAAO,IAAI,mDAAmD;AAAA,IACrE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAiB;AACvB,SAAK,OAAO,IAAI,sCAA+B;AAC/C,SAAK,OAAO,IAAI,EAAE;AAClB,SAAK,OAAO,IAAI,qBAAqB;AACrC,SAAK,OAAO,IAAI,6BAA6B;AAC7C,SAAK,OAAO,IAAI,6BAA6B;AAC7C,SAAK,OAAO,IAAI,iCAAiC;AACjD,SAAK,OAAO,IAAI,0BAA0B;AAC1C,SAAK,OAAO,IAAI,sBAAsB;AACtC,SAAK,OAAO,IAAI,wBAAwB;AACxC,SAAK,OAAO,IAAI,wCAAwC;AACxD,SAAK,OAAO,IAAI,EAAE;AAClB,SAAK,OAAO,IAAI,QAAQ;AACxB,SAAK,OAAO;AAAA,MACV;AAAA,IACF;AACA,SAAK,OAAO;AAAA,MACV;AAAA,IACF;AACA,SAAK,OAAO,IAAI,EAAE;AAClB,SAAK,OAAO,IAAI,kBAAkB;AAClC,SAAK,OAAO;AAAA,MACV;AAAA,IACF;AACA,SAAK,OAAO,IAAI,EAAE;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAkB;AACxB,SAAK,OAAO,WAAW,EAAE;AACzB,SAAK,OAAO,IAAI,kDAA2C;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAoC;AAChD,SAAK,OAAO,IAAI,sCAA+B;AAE/C,QAAI;AACF,YAAM,WAAW,cAAc,YAAY;AAC3C,YAAM,eAAe,SAAS,iBAAiB;AAC/C,YAAM,QAAQ,SAAS,cAAc;AAErC,WAAK,OAAO,IAAI,EAAE;AAClB,WAAK,OAAO,IAAI,kCAA2B;AAC3C,WAAK,OAAO,IAAI,oBAAoB,MAAM,WAAW,EAAE;AACvD,WAAK,OAAO,IAAI,qBAAqB,MAAM,YAAY,EAAE;AACzD,WAAK,OAAO,IAAI,wBAAwB,MAAM,eAAe,EAAE;AAE/D,UAAI,aAAa,SAAS,GAAG;AAC3B,aAAK,OAAO,IAAI,EAAE;AAClB,aAAK,OAAO,IAAI,0BAAmB;AAEnC,mBAAW,SAAS,cAAc;AAChC,gBAAM,SAAS,KAAK,eAAe,KAAK,IAAI,IAAI,MAAM,SAAS;AAC/D,eAAK,OAAO,IAAI,aAAQ,MAAM,EAAE,KAAK,MAAM,WAAW,KAAK,MAAM,GAAG;AAAA,QACtE;AAEA,aAAK,OAAO,IAAI,EAAE;AAClB,aAAK,OAAO,IAAI,uDAAgD;AAAA,MAClE,OAAO;AACL,aAAK,OAAO,IAAI,EAAE;AAClB,aAAK,OAAO,IAAI,qCAAgC;AAGhD,YAAI;AACF,gBAAM,iBAAiB;AAAA,YACrB;AAAA,YACA,EAAE,UAAU,OAAO;AAAA,UACrB;AACA,cAAI,eAAe,KAAK,GAAG;AACzB,iBAAK,OAAO,IAAI,8CAAuC;AACvD,2BACG,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,EAC5B,QAAQ,CAAC,SAAS;AACjB,oBAAM,QAAQ,KAAK,MAAM,KAAK;AAC9B,mBAAK,OAAO;AAAA,gBACV,UAAU,MAAM,CAAC,CAAC,KAAK,MAAM,MAAM,EAAE,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,cAC/D;AAAA,YACF,CAAC;AAAA,UACL;AAAA,QACF,QAAQ;AACN,eAAK,OAAO,IAAI,6CAAsC;AAAA,QACxD;AAEA,aAAK,OAAO,IAAI,EAAE;AAClB,aAAK,OAAO;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAgB;AACvB,WAAK,OAAO,IAAI,4BAAwB,MAAgB,OAAO,EAAE;AAAA,IACnE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAgB;AACtB,QAAI,KAAK,iBAAiB;AACxB,oBAAc,KAAK,eAAe;AAAA,IACpC;AAEA,QAAI,KAAK,gBAAgB;AACvB,WAAK,eAAe,eAAe;AAAA,IACrC;AAEA,WAAO,KAAK,qBAAqB;AAAA,EACnC;AACF;AAEA,IAAO,wBAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/features/web/client/stores/task-store.ts"],
|
|
4
|
+
"sourcesContent": ["import { create } from 'zustand';\n\nexport interface Task {\n id: string;\n identifier: string;\n title: string;\n description?: string;\n state: string;\n priority?: number;\n estimate?: number;\n assignee?: string;\n createdAt: string;\n updatedAt: string;\n lastSyncedAt?: string;\n syncStatus?: string;\n}\n\ninterface TaskStore {\n tasks: Task[];\n setTasks: (tasks: Task[]) => void;\n addTask: (task: Task) => void;\n updateTask: (id: string, updates: Partial<Task>) => void;\n removeTask: (id: string) => void;\n getTaskById: (id: string) => Task | undefined;\n getTasksByState: (state: string) => Task[];\n}\n\nexport const useTaskStore = create<TaskStore>((set, get) => ({\n tasks: [],\n\n setTasks: (tasks) => set({ tasks }),\n\n addTask: (task) =>\n set((state) => ({\n tasks: [...state.tasks, task],\n })),\n\n updateTask: (id, updates) =>\n set((state) => ({\n tasks: state.tasks.map((task: any) =>\n task.id === id ? { ...task, ...updates } : task\n ),\n })),\n\n removeTask: (id) =>\n set((state) => ({\n tasks: state.tasks.filter((task: any) => task.id !== id),\n })),\n\n getTaskById: (id) => get().tasks.find((task: any) => task.id === id),\n\n getTasksByState: (state) =>\n get().tasks.filter((task: any) => task.state === state),\n}));\n"],
|
|
5
|
+
"mappings": ";;;;AAAA,SAAS,cAAc;AA2BhB,MAAM,eAAe,OAAkB,CAAC,KAAK,SAAS;AAAA,EAC3D,OAAO,CAAC;AAAA,EAER,UAAU,CAAC,UAAU,IAAI,EAAE,MAAM,CAAC;AAAA,EAElC,SAAS,CAAC,SACR,IAAI,CAAC,WAAW;AAAA,IACd,OAAO,CAAC,GAAG,MAAM,OAAO,IAAI;AAAA,EAC9B,EAAE;AAAA,EAEJ,YAAY,CAAC,IAAI,YACf,IAAI,CAAC,WAAW;AAAA,IACd,OAAO,MAAM,MAAM;AAAA,MAAI,CAAC,SACtB,KAAK,OAAO,KAAK,EAAE,GAAG,MAAM,GAAG,QAAQ,IAAI;AAAA,IAC7C;AAAA,EACF,EAAE;AAAA,EAEJ,YAAY,CAAC,OACX,IAAI,CAAC,WAAW;AAAA,IACd,OAAO,MAAM,MAAM,OAAO,CAAC,SAAc,KAAK,OAAO,EAAE;AAAA,EACzD,EAAE;AAAA,EAEJ,aAAa,CAAC,OAAO,IAAI,EAAE,MAAM,KAAK,CAAC,SAAc,KAAK,OAAO,EAAE;AAAA,EAEnE,iBAAiB,CAAC,UAChB,IAAI,EAAE,MAAM,OAAO,CAAC,SAAc,KAAK,UAAU,KAAK;AAC1D,EAAE;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/features/web/server/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * StackMemory Web Dashboard Server\n * Express + Socket.io server for real-time dashboard\n */\n\nimport express from 'express';\nimport { createServer } from 'http';\nimport { Server as SocketServer } from 'socket.io';\nimport cors from 'cors';\nimport { LinearTaskReader } from '../../tui/services/linear-task-reader.js';\nimport { SessionManager } from '../../../core/session/session-manager.js';\nimport { FrameManager } from '../../../core/context/index.js';\nimport Database from 'better-sqlite3';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\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\nconst app = express();\nconst httpServer = createServer(app);\nconst io = new SocketServer(httpServer, {\n cors: {\n origin: process.env['CLIENT_URL'] || 'http://localhost:3000',\n methods: ['GET', 'POST'],\n },\n});\n\n// Middleware\napp.use(cors());\napp.use(express.json());\n\n// Data services\nlet taskReader: LinearTaskReader;\nlet sessionManager: SessionManager;\nlet frameManager: FrameManager | null = null;\nlet db: Database.Database | null = null;\n\n// Initialize services\nfunction initializeServices() {\n console.log('\uD83D\uDE80 Initializing StackMemory Web Server...');\n\n // Initialize task reader\n taskReader = new LinearTaskReader(process.cwd());\n console.log(\n `\uD83D\uDCCB TaskReader initialized with ${taskReader.getTasks().length} tasks`\n );\n\n // Initialize session manager\n sessionManager = new SessionManager({ enableMonitoring: true });\n console.log('\uD83D\uDCCA SessionManager initialized');\n\n // Initialize database and frame manager\n const dbPath = join(process.cwd(), '.stackmemory', 'context.db');\n if (existsSync(dbPath)) {\n try {\n db = new Database(dbPath);\n frameManager = new FrameManager(db, 'web');\n console.log('\uD83D\uDCBE Database and FrameManager initialized');\n } catch (error: unknown) {\n console.error('\u274C Failed to initialize database:', error);\n }\n }\n}\n\n// REST API Routes\napp.get('/api/health', (req, res) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n});\n\napp.get('/api/tasks', (req, res) => {\n try {\n const tasks = taskReader.getTasks();\n res.json({ tasks, total: tasks.length });\n } catch (error: unknown) {\n res.status(500).json({ error: 'Failed to fetch tasks' });\n }\n});\n\napp.get('/api/tasks/active', (req, res) => {\n try {\n const tasks = taskReader.getActiveTasks();\n res.json({ tasks, total: tasks.length });\n } catch (error: unknown) {\n res.status(500).json({ error: 'Failed to fetch active tasks' });\n }\n});\n\napp.get('/api/tasks/by-state/:state', (req, res) => {\n try {\n const tasks = taskReader.getTasksByState(req.params.state);\n res.json({ tasks, total: tasks.length });\n } catch (error: unknown) {\n res.status(500).json({ error: 'Failed to fetch tasks by state' });\n }\n});\n\napp.get('/api/sessions', (req, res) => {\n try {\n const sessions = sessionManager?.getActiveSessions\n ? sessionManager.getActiveSessions()\n : [];\n res.json({ sessions, total: sessions.length });\n } catch (error: unknown) {\n res.status(500).json({ error: 'Failed to fetch sessions' });\n }\n});\n\napp.get('/api/frames', (req, res) => {\n try {\n if (!frameManager) {\n res.json({ frames: [], total: 0 });\n return;\n }\n const frames = frameManager.getAllFrames();\n res.json({ frames, total: frames.length });\n } catch (error: unknown) {\n res.status(500).json({ error: 'Failed to fetch frames' });\n }\n});\n\napp.get('/api/analytics', (req, res) => {\n try {\n const tasks = taskReader.getTasks();\n const sessions = sessionManager?.getActiveSessions\n ? sessionManager.getActiveSessions()\n : [];\n const frames = frameManager?.getAllFrames() || [];\n\n // Calculate analytics\n const analytics = {\n summary: {\n totalTasks: tasks.length,\n activeTasks: tasks.filter((t: any) => t.state === 'In Progress').length,\n completedTasks: tasks.filter((t: any) => t.state === 'Done').length,\n totalSessions: sessions.length,\n totalFrames: frames.length,\n },\n tasksByState: tasks.reduce(\n (acc, task) => {\n acc[task.state] = (acc[task.state] || 0) + 1;\n return acc;\n },\n {} as Record<string, number>\n ),\n tasksByPriority: tasks.reduce(\n (acc, task) => {\n const priority = task.priority || 4;\n acc[priority] = (acc[priority] || 0) + 1;\n return acc;\n },\n {} as Record<number, number>\n ),\n recentActivity: {\n tasksUpdatedToday: tasks.filter((t: any) => {\n const updated = new Date(t.updatedAt);\n const today = new Date();\n return updated.toDateString() === today.toDateString();\n }).length,\n sessionsToday: sessions.filter((s: any) => {\n const started = new Date(s.startTime);\n const today = new Date();\n return started.toDateString() === today.toDateString();\n }).length,\n },\n };\n\n res.json(analytics);\n } catch (error: unknown) {\n res.status(500).json({ error: 'Failed to fetch analytics' });\n }\n});\n\n// WebSocket handling\nio.on('connection', (socket) => {\n console.log('\uD83D\uDC64 Client connected:', socket.id);\n\n // Send initial data\n socket.emit('initial-data', {\n tasks: taskReader.getTasks(),\n sessions: sessionManager?.getActiveSessions\n ? sessionManager.getActiveSessions()\n : [],\n frames: frameManager?.getAllFrames() || [],\n });\n\n // Handle client requests\n socket.on('refresh-tasks', () => {\n socket.emit('tasks:update', taskReader.getTasks());\n });\n\n socket.on('refresh-sessions', () => {\n const sessions = sessionManager?.getActiveSessions\n ? sessionManager.getActiveSessions()\n : [];\n socket.emit('sessions:update', sessions);\n });\n\n socket.on('refresh-frames', () => {\n socket.emit('frames:update', frameManager?.getAllFrames() || []);\n });\n\n socket.on('disconnect', () => {\n console.log('\uD83D\uDC4B Client disconnected:', socket.id);\n });\n});\n\n// Periodic updates (every 5 seconds)\nsetInterval(() => {\n try {\n io.emit('tasks:update', taskReader.getTasks());\n // SessionManager might not have getActiveSessions yet\n const sessions = sessionManager?.getActiveSessions\n ? sessionManager.getActiveSessions()\n : [];\n io.emit('sessions:update', sessions);\n io.emit('frames:update', frameManager?.getAllFrames() || []);\n } catch (error: unknown) {\n console.error('Error in periodic update:', error);\n }\n}, 5000);\n\n// Start server\nconst PORT = process.env['WS_PORT'] || 8080;\n\ninitializeServices();\n\nhttpServer.listen(PORT, () => {\n console.log(`\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 StackMemory Web Dashboard Server \u2551\n\u2551 Running on http://localhost:${PORT} \u2551\n\u2551 WebSocket: ws://localhost:${PORT} \u2551\n\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n `);\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/hooks/auto-background.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Auto-background hook for Claude Code\n * Automatically backgrounds long-running or specific commands\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { writeFileSecure, ensureSecureDir } from './secure-fs.js';\nimport { AutoBackgroundConfigSchema, parseConfigSafe } from './schemas.js';\n\nexport interface AutoBackgroundConfig {\n enabled: boolean;\n // Time-based: background if command runs longer than this (ms)\n timeoutMs: number;\n // Pattern-based: always background these commands\n alwaysBackground: string[];\n // Never background these (override)\n neverBackground: string[];\n // Log backgrounded commands\n verbose: boolean;\n}\n\nconst DEFAULT_CONFIG: AutoBackgroundConfig = {\n enabled: true,\n timeoutMs: 5000, // 5 seconds\n alwaysBackground: [\n // Package managers\n 'npm install',\n 'npm ci',\n 'yarn install',\n 'pnpm install',\n 'bun install',\n // Builds\n 'npm run build',\n 'yarn build',\n 'pnpm build',\n 'cargo build',\n 'go build',\n 'make',\n 'cmake',\n // Tests\n 'npm test',\n 'npm run test',\n 'yarn test',\n 'pnpm test',\n 'pytest',\n 'jest',\n 'vitest',\n 'cargo test',\n 'go test',\n // Docker\n 'docker build',\n 'docker-compose up',\n 'docker compose up',\n // Git operations that can be slow\n 'git clone',\n 'git fetch --all',\n 'git pull --all',\n // Type checking\n 'npx tsc',\n 'tsc --noEmit',\n // Linting large codebases\n 'eslint .',\n 'npm run lint',\n ],\n neverBackground: [\n // Interactive commands\n 'vim',\n 'nvim',\n 'nano',\n 'less',\n 'more',\n 'top',\n 'htop',\n // Quick commands\n 'echo',\n 'cat',\n 'ls',\n 'pwd',\n 'cd',\n 'which',\n 'git status',\n 'git diff',\n 'git log',\n ],\n verbose: false,\n};\n\nconst CONFIG_PATH = join(homedir(), '.stackmemory', 'auto-background.json');\n\nexport function loadConfig(): AutoBackgroundConfig {\n try {\n if (existsSync(CONFIG_PATH)) {\n const data = readFileSync(CONFIG_PATH, 'utf8');\n const parsed = JSON.parse(data);\n return parseConfigSafe(\n AutoBackgroundConfigSchema,\n { ...DEFAULT_CONFIG, ...parsed },\n DEFAULT_CONFIG,\n 'auto-background'\n );\n }\n } catch {\n // Use defaults\n }\n return DEFAULT_CONFIG;\n}\n\nexport function saveConfig(config: AutoBackgroundConfig): void {\n try {\n ensureSecureDir(join(homedir(), '.stackmemory'));\n writeFileSecure(CONFIG_PATH, JSON.stringify(config, null, 2));\n } catch {\n // Silently fail\n }\n}\n\nexport function shouldAutoBackground(\n command: string,\n config?: AutoBackgroundConfig\n): boolean {\n const cfg = config || loadConfig();\n\n if (!cfg.enabled) return false;\n\n const normalizedCmd = command.trim().toLowerCase();\n\n // Check never-background list first (highest priority)\n for (const pattern of cfg.neverBackground) {\n if (normalizedCmd.startsWith(pattern.toLowerCase())) {\n return false;\n }\n }\n\n // Check always-background list\n for (const pattern of cfg.alwaysBackground) {\n if (normalizedCmd.startsWith(pattern.toLowerCase())) {\n return true;\n }\n }\n\n // Default: don't auto-background (let timeout handle it)\n return false;\n}\n\n/**\n * Hook response format for Claude Code\n * Returns modified tool input if command should be backgrounded\n */\nexport interface HookResponse {\n decision: 'allow' | 'modify' | 'block';\n modifiedInput?: Record<string, unknown>;\n reason?: string;\n}\n\nexport function processToolUse(\n toolName: string,\n toolInput: Record<string, unknown>\n): HookResponse {\n // Only process Bash tool\n if (toolName !== 'Bash') {\n return { decision: 'allow' };\n }\n\n const command = toolInput.command as string;\n if (!command) {\n return { decision: 'allow' };\n }\n\n // Skip if already backgrounded\n if (toolInput.run_in_background === true) {\n return { decision: 'allow' };\n }\n\n const config = loadConfig();\n\n if (shouldAutoBackground(command, config)) {\n if (config.verbose) {\n console.error(\n `[auto-background] Backgrounding: ${command.substring(0, 50)}...`\n );\n }\n\n return {\n decision: 'modify',\n modifiedInput: {\n ...toolInput,\n run_in_background: true,\n },\n reason: `Auto-backgrounded: matches pattern`,\n };\n }\n\n return { decision: 'allow' };\n}\n\n// CLI entry point removed - use stackmemory auto-bg command instead\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/hooks/claude-code-whatsapp-hook.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n/**\n * Claude Code WhatsApp Hook\n * Automatically integrates WhatsApp messages into Claude Code sessions\n *\n * Installation:\n * Add to ~/.claude/settings.json under \"hooks\":\n * {\n * \"hooks\": {\n * \"Stop\": [\"node\", \"/path/to/claude-code-whatsapp-hook.js\", \"stop\"],\n * \"PreToolUse\": [\"node\", \"/path/to/claude-code-whatsapp-hook.js\", \"pre-tool\"]\n * }\n * }\n *\n * Or add to ~/.claude/hooks/ directory\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { sendNotification, loadSMSConfig } from './sms-notify.js';\nimport {\n getFrameDigestData,\n generateMobileDigest,\n loadSyncOptions,\n} from './whatsapp-sync.js';\n\nconst STACKMEMORY_DIR = join(homedir(), '.stackmemory');\nconst INCOMING_REQUEST_PATH = join(\n STACKMEMORY_DIR,\n 'sms-incoming-request.json'\n);\nconst LATEST_RESPONSE_PATH = join(STACKMEMORY_DIR, 'sms-latest-response.json');\nconst HOOK_STATE_PATH = join(STACKMEMORY_DIR, 'claude-hook-state.json');\n\ninterface HookState {\n sessionId?: string;\n lastCheckedAt?: string;\n lastDigestSentAt?: string;\n toolCount: number;\n significantChanges: boolean;\n}\n\ninterface IncomingRequest {\n from: string;\n message: string;\n timestamp: string;\n processed: boolean;\n}\n\n/**\n * Load hook state\n */\nfunction loadHookState(): HookState {\n try {\n if (existsSync(HOOK_STATE_PATH)) {\n return JSON.parse(readFileSync(HOOK_STATE_PATH, 'utf8'));\n }\n } catch {\n // Use defaults\n }\n return { toolCount: 0, significantChanges: false };\n}\n\n/**\n * Save hook state\n */\nfunction saveHookState(state: HookState): void {\n try {\n writeFileSync(HOOK_STATE_PATH, JSON.stringify(state, null, 2));\n } catch {\n // Ignore\n }\n}\n\n/**\n * Check for incoming WhatsApp requests\n */\nfunction checkIncomingRequests(): IncomingRequest | null {\n try {\n if (!existsSync(INCOMING_REQUEST_PATH)) return null;\n\n const data: IncomingRequest = JSON.parse(\n readFileSync(INCOMING_REQUEST_PATH, 'utf8')\n );\n if (data.processed) return null;\n\n return data;\n } catch {\n return null;\n }\n}\n\n/**\n * Mark incoming request as processed\n */\nfunction markRequestProcessed(): void {\n try {\n if (!existsSync(INCOMING_REQUEST_PATH)) return;\n\n const data = JSON.parse(readFileSync(INCOMING_REQUEST_PATH, 'utf8'));\n data.processed = true;\n writeFileSync(INCOMING_REQUEST_PATH, JSON.stringify(data, null, 2));\n } catch {\n // Ignore\n }\n}\n\n/**\n * Get latest response from file\n */\nfunction getLatestResponse(): {\n promptId: string;\n response: string;\n timestamp: string;\n} | null {\n try {\n if (!existsSync(LATEST_RESPONSE_PATH)) return null;\n return JSON.parse(readFileSync(LATEST_RESPONSE_PATH, 'utf8'));\n } catch {\n return null;\n }\n}\n\n/**\n * Send context digest to WhatsApp\n */\nasync function sendDigest(): Promise<void> {\n const data = await getFrameDigestData();\n if (!data) return;\n\n const options = loadSyncOptions();\n const digest = generateMobileDigest(data, options);\n\n await sendNotification({\n type: 'context_sync',\n title: 'Context Update',\n message: digest,\n });\n}\n\n/**\n * Handle PreToolUse hook - check for incoming messages\n */\nasync function handlePreToolUse(): Promise<void> {\n const state = loadHookState();\n state.toolCount++;\n\n // Check for incoming WhatsApp messages every 5 tool uses\n if (state.toolCount % 5 === 0) {\n const incoming = checkIncomingRequests();\n if (incoming) {\n // Print to stderr so Claude sees it\n console.error(`\\n[WhatsApp] Message from ${incoming.from}:`);\n console.error(` \"${incoming.message}\"`);\n console.error(` (Received at ${incoming.timestamp})\\n`);\n\n // Mark as processed\n markRequestProcessed();\n }\n }\n\n saveHookState(state);\n}\n\n/**\n * Handle Stop hook - send session summary to WhatsApp\n */\nasync function handleStop(): Promise<void> {\n const config = loadSMSConfig();\n if (!config.enabled) return;\n\n // Load state for logging\n const state = loadHookState();\n console.error(`[WhatsApp] Session ended after ${state.toolCount} tool calls`);\n\n // Send final digest\n try {\n await sendDigest();\n console.error('[WhatsApp] Session digest sent');\n } catch (err) {\n console.error('[WhatsApp] Failed to send digest:', err);\n }\n\n // Reset state\n saveHookState({ toolCount: 0, significantChanges: false });\n}\n\n/**\n * Handle Notification hook - relay Claude's output to WhatsApp if requested\n */\nasync function handleNotification(input: string): Promise<void> {\n // Check if user requested WhatsApp notification\n if (input.includes('[notify]') || input.includes('[whatsapp]')) {\n const message = input.replace(/\\[notify\\]|\\[whatsapp\\]/gi, '').trim();\n\n await sendNotification({\n type: 'custom',\n title: 'Claude',\n message: message.slice(0, 300),\n });\n }\n}\n\n/**\n * Poll for WhatsApp responses (for long-running tasks)\n */\nasync function pollForResponse(\n timeoutMs: number = 60000\n): Promise<string | null> {\n const startTime = Date.now();\n const pollInterval = 2000;\n\n while (Date.now() - startTime < timeoutMs) {\n const response = getLatestResponse();\n if (response) {\n const responseAge = Date.now() - new Date(response.timestamp).getTime();\n if (responseAge < 5000) {\n // Fresh response (within 5 seconds)\n return response.response;\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n return null;\n}\n\n/**\n * Send a prompt to WhatsApp and wait for response\n */\nexport async function askViaWhatsApp(\n question: string,\n options?: { key: string; label: string }[]\n): Promise<string | null> {\n const config = loadSMSConfig();\n if (!config.enabled) {\n console.error('[WhatsApp] Notifications not enabled');\n return null;\n }\n\n // Send the question\n await sendNotification({\n type: 'custom',\n title: 'Claude Question',\n message: question,\n prompt: options\n ? {\n type: 'options',\n options: options.map((o) => ({ ...o, action: o.key })),\n }\n : undefined,\n });\n\n // Wait for response\n return pollForResponse(120000); // 2 minute timeout\n}\n\n/**\n * Main entry point\n */\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const hookType = args[0];\n\n // Read stdin for hook input\n let input = '';\n if (!process.stdin.isTTY) {\n input = readFileSync(0, 'utf8');\n }\n\n switch (hookType) {\n case 'pre-tool':\n case 'PreToolUse':\n await handlePreToolUse();\n break;\n\n case 'stop':\n case 'Stop':\n await handleStop();\n break;\n\n case 'notification':\n case 'Notification':\n await handleNotification(input);\n break;\n\n case 'check':\n // Just check for incoming messages\n const incoming = checkIncomingRequests();\n if (incoming) {\n console.log(JSON.stringify(incoming));\n }\n break;\n\n case 'send-digest':\n await sendDigest();\n break;\n\n case 'poll':\n const response = await pollForResponse(parseInt(args[1] || '60000', 10));\n if (response) {\n console.log(response);\n }\n break;\n\n default:\n console.error('Usage: claude-code-whatsapp-hook.js <hook-type>');\n console.error(\n 'Hook types: pre-tool, stop, notification, check, send-digest, poll'\n );\n process.exit(1);\n }\n}\n\n// Run if called directly\nif (process.argv[1]?.includes('claude-code-whatsapp-hook')) {\n main().catch(console.error);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/hooks/config.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * StackMemory Hook Configuration\n * Loads and manages hook configuration\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { HookEventType } from './events.js';\n\nexport type OutputType =\n | 'overlay'\n | 'notification'\n | 'log'\n | 'prepend'\n | 'silent';\n\nexport interface HookConfig {\n enabled: boolean;\n handler: string;\n output: OutputType;\n delay_ms?: number;\n debounce_ms?: number;\n cooldown_ms?: number;\n options?: Record<string, unknown>;\n}\n\nexport interface HooksConfig {\n version: string;\n daemon: {\n enabled: boolean;\n log_level: 'debug' | 'info' | 'warn' | 'error';\n pid_file: string;\n log_file: string;\n };\n file_watch: {\n enabled: boolean;\n paths: string[];\n ignore: string[];\n extensions: string[];\n };\n hooks: Partial<Record<HookEventType, HookConfig>>;\n}\n\nconst DEFAULT_CONFIG: HooksConfig = {\n version: '1.0.0',\n daemon: {\n enabled: true,\n log_level: 'info',\n pid_file: join(process.env.HOME || '/tmp', '.stackmemory', 'hooks.pid'),\n log_file: join(process.env.HOME || '/tmp', '.stackmemory', 'hooks.log'),\n },\n file_watch: {\n enabled: true,\n paths: ['.'],\n ignore: ['node_modules', '.git', 'dist', 'build', '.next', '__pycache__'],\n extensions: ['.ts', '.tsx', '.js', '.jsx', '.py', '.go', '.rs', '.java'],\n },\n hooks: {\n file_change: {\n enabled: true,\n handler: 'sweep-predict',\n output: 'log',\n debounce_ms: 2000,\n cooldown_ms: 10000,\n },\n session_start: {\n enabled: true,\n handler: 'context-load',\n output: 'silent',\n },\n suggestion_ready: {\n enabled: true,\n handler: 'display-suggestion',\n output: 'overlay',\n },\n },\n};\n\nexport function getConfigPath(): string {\n return join(process.env.HOME || '/tmp', '.stackmemory', 'hooks.yaml');\n}\n\nexport function loadConfig(): HooksConfig {\n const configPath = getConfigPath();\n\n if (!existsSync(configPath)) {\n return DEFAULT_CONFIG;\n }\n\n try {\n const content = readFileSync(configPath, 'utf-8');\n const parsed = parseYaml(content);\n return mergeConfig(DEFAULT_CONFIG, parsed);\n } catch {\n return DEFAULT_CONFIG;\n }\n}\n\nexport function saveConfig(config: HooksConfig): void {\n const configPath = getConfigPath();\n const dir = dirname(configPath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const yaml = toYaml(config);\n writeFileSync(configPath, yaml);\n}\n\nexport function initConfig(): HooksConfig {\n const configPath = getConfigPath();\n\n if (existsSync(configPath)) {\n return loadConfig();\n }\n\n saveConfig(DEFAULT_CONFIG);\n return DEFAULT_CONFIG;\n}\n\nfunction parseYaml(content: string): Partial<HooksConfig> {\n const result: Record<string, unknown> = {};\n const lines = content.split('\\n');\n const stack: { indent: number; obj: Record<string, unknown> }[] = [\n { indent: -1, obj: result },\n ];\n\n for (const line of lines) {\n if (!line.trim() || line.trim().startsWith('#')) continue;\n\n const indent = line.search(/\\S/);\n const trimmed = line.trim();\n\n while (stack.length > 1 && stack[stack.length - 1].indent >= indent) {\n stack.pop();\n }\n\n const colonIdx = trimmed.indexOf(':');\n if (colonIdx === -1) continue;\n\n const key = trimmed.slice(0, colonIdx).trim();\n const value = trimmed.slice(colonIdx + 1).trim();\n\n const current = stack[stack.length - 1].obj;\n\n if (value === '' || value === '|') {\n current[key] = {};\n stack.push({ indent, obj: current[key] as Record<string, unknown> });\n } else if (value.startsWith('[') && value.endsWith(']')) {\n current[key] = value\n .slice(1, -1)\n .split(',')\n .map((s) => s.trim().replace(/['\"]/g, ''));\n } else if (value === 'true') {\n current[key] = true;\n } else if (value === 'false') {\n current[key] = false;\n } else if (/^\\d+$/.test(value)) {\n current[key] = parseInt(value, 10);\n } else {\n current[key] = value.replace(/['\"]/g, '');\n }\n }\n\n return result as Partial<HooksConfig>;\n}\n\nfunction toYaml(obj: unknown, indent = 0): string {\n const spaces = ' '.repeat(indent);\n let result = '';\n\n if (Array.isArray(obj)) {\n result += `[${obj.map((v) => (typeof v === 'string' ? `'${v}'` : v)).join(', ')}]\\n`;\n } else if (typeof obj === 'object' && obj !== null) {\n for (const [key, value] of Object.entries(obj)) {\n if (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n ) {\n result += `${spaces}${key}:\\n${toYaml(value, indent + 1)}`;\n } else {\n result += `${spaces}${key}: ${toYaml(value, indent)}`;\n }\n }\n } else if (typeof obj === 'string') {\n result += `${obj}\\n`;\n } else if (typeof obj === 'boolean' || typeof obj === 'number') {\n result += `${obj}\\n`;\n } else {\n result += '\\n';\n }\n\n return result;\n}\n\nfunction mergeConfig(\n defaults: HooksConfig,\n overrides: Partial<HooksConfig>\n): HooksConfig {\n return {\n ...defaults,\n ...overrides,\n daemon: { ...defaults.daemon, ...(overrides.daemon || {}) },\n file_watch: { ...defaults.file_watch, ...(overrides.file_watch || {}) },\n hooks: { ...defaults.hooks, ...(overrides.hooks || {}) },\n };\n}\n"],
|
|
5
|
+
"mappings": ";;;;AAKA,SAAS,YAAY,cAAc,eAAe,iBAAiB;AACnE,SAAS,MAAM,eAAe;AAqC9B,MAAM,iBAA8B;AAAA,EAClC,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU,KAAK,QAAQ,IAAI,QAAQ,QAAQ,gBAAgB,WAAW;AAAA,IACtE,UAAU,KAAK,QAAQ,IAAI,QAAQ,QAAQ,gBAAgB,WAAW;AAAA,EACxE;AAAA,EACA,YAAY;AAAA,IACV,SAAS;AAAA,IACT,OAAO,CAAC,GAAG;AAAA,IACX,QAAQ,CAAC,gBAAgB,QAAQ,QAAQ,SAAS,SAAS,aAAa;AAAA,IACxE,YAAY,CAAC,OAAO,QAAQ,OAAO,QAAQ,OAAO,OAAO,OAAO,OAAO;AAAA,EACzE;AAAA,EACA,OAAO;AAAA,IACL,aAAa;AAAA,MACX,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA,eAAe;AAAA,MACb,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,IACA,kBAAkB;AAAA,MAChB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEO,SAAS,gBAAwB;AACtC,SAAO,KAAK,QAAQ,IAAI,QAAQ,QAAQ,gBAAgB,YAAY;AACtE;AAEO,SAAS,aAA0B;AACxC,QAAM,aAAa,cAAc;AAEjC,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,aAAa,YAAY,OAAO;AAChD,UAAM,SAAS,UAAU,OAAO;AAChC,WAAO,YAAY,gBAAgB,MAAM;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,WAAW,QAA2B;AACpD,QAAM,aAAa,cAAc;AACjC,QAAM,MAAM,QAAQ,UAAU;AAE9B,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AAEA,QAAM,OAAO,OAAO,MAAM;AAC1B,gBAAc,YAAY,IAAI;AAChC;AAEO,SAAS,aAA0B;AACxC,QAAM,aAAa,cAAc;AAEjC,MAAI,WAAW,UAAU,GAAG;AAC1B,WAAO,WAAW;AAAA,EACpB;AAEA,aAAW,cAAc;AACzB,SAAO;AACT;AAEA,SAAS,UAAU,SAAuC;AACxD,QAAM,SAAkC,CAAC;AACzC,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,QAA4D;AAAA,IAChE,EAAE,QAAQ,IAAI,KAAK,OAAO;AAAA,EAC5B;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE,WAAW,GAAG,EAAG;AAEjD,UAAM,SAAS,KAAK,OAAO,IAAI;AAC/B,UAAM,UAAU,KAAK,KAAK;AAE1B,WAAO,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,EAAE,UAAU,QAAQ;AACnE,YAAM,IAAI;AAAA,IACZ;AAEA,UAAM,WAAW,QAAQ,QAAQ,GAAG;AACpC,QAAI,aAAa,GAAI;AAErB,UAAM,MAAM,QAAQ,MAAM,GAAG,QAAQ,EAAE,KAAK;AAC5C,UAAM,QAAQ,QAAQ,MAAM,WAAW,CAAC,EAAE,KAAK;AAE/C,UAAM,UAAU,MAAM,MAAM,SAAS,CAAC,EAAE;AAExC,QAAI,UAAU,MAAM,UAAU,KAAK;AACjC,cAAQ,GAAG,IAAI,CAAC;AAChB,YAAM,KAAK,EAAE,QAAQ,KAAK,QAAQ,GAAG,EAA6B,CAAC;AAAA,IACrE,WAAW,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AACvD,cAAQ,GAAG,IAAI,MACZ,MAAM,GAAG,EAAE,EACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,SAAS,EAAE,CAAC;AAAA,IAC7C,WAAW,UAAU,QAAQ;AAC3B,cAAQ,GAAG,IAAI;AAAA,IACjB,WAAW,UAAU,SAAS;AAC5B,cAAQ,GAAG,IAAI;AAAA,IACjB,WAAW,QAAQ,KAAK,KAAK,GAAG;AAC9B,cAAQ,GAAG,IAAI,SAAS,OAAO,EAAE;AAAA,IACnC,OAAO;AACL,cAAQ,GAAG,IAAI,MAAM,QAAQ,SAAS,EAAE;AAAA,IAC1C;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,OAAO,KAAc,SAAS,GAAW;AAChD,QAAM,SAAS,KAAK,OAAO,MAAM;AACjC,MAAI,SAAS;AAEb,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,cAAU,IAAI,IAAI,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,IAAI,CAAC,MAAM,CAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,EACjF,WAAW,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAClD,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,UACE,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,MAAM,QAAQ,KAAK,GACpB;AACA,kBAAU,GAAG,MAAM,GAAG,GAAG;AAAA,EAAM,OAAO,OAAO,SAAS,CAAC,CAAC;AAAA,MAC1D,OAAO;AACL,kBAAU,GAAG,MAAM,GAAG,GAAG,KAAK,OAAO,OAAO,MAAM,CAAC;AAAA,MACrD;AAAA,IACF;AAAA,EACF,WAAW,OAAO,QAAQ,UAAU;AAClC,cAAU,GAAG,GAAG;AAAA;AAAA,EAClB,WAAW,OAAO,QAAQ,aAAa,OAAO,QAAQ,UAAU;AAC9D,cAAU,GAAG,GAAG;AAAA;AAAA,EAClB,OAAO;AACL,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAEA,SAAS,YACP,UACA,WACa;AACb,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,QAAQ,EAAE,GAAG,SAAS,QAAQ,GAAI,UAAU,UAAU,CAAC,EAAG;AAAA,IAC1D,YAAY,EAAE,GAAG,SAAS,YAAY,GAAI,UAAU,cAAc,CAAC,EAAG;AAAA,IACtE,OAAO,EAAE,GAAG,SAAS,OAAO,GAAI,UAAU,SAAS,CAAC,EAAG;AAAA,EACzD;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/hooks/daemon.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * StackMemory Hook Daemon\n * Background process that manages hooks and events\n */\n\nimport {\n existsSync,\n readFileSync,\n writeFileSync,\n unlinkSync,\n watch,\n appendFileSync,\n} from 'fs';\nimport { join, extname, relative } from 'path';\nimport { spawn } from 'child_process';\nimport { loadConfig, HooksConfig } from './config.js';\nimport {\n hookEmitter,\n HookEventData,\n FileChangeEvent,\n SuggestionReadyEvent,\n} from './events.js';\n\ninterface DaemonState {\n running: boolean;\n startTime: number;\n eventsProcessed: number;\n lastEvent?: HookEventData;\n watchers: Map<string, ReturnType<typeof watch>>;\n pendingPrediction: boolean;\n lastPrediction?: number;\n}\n\nconst state: DaemonState = {\n running: false,\n startTime: 0,\n eventsProcessed: 0,\n watchers: new Map(),\n pendingPrediction: false,\n};\n\nlet config: HooksConfig;\nlet logStream: ((msg: string) => void) | null = null;\n\nexport function log(level: string, message: string, data?: unknown): void {\n const timestamp = new Date().toISOString();\n const line = `[${timestamp}] [${level.toUpperCase()}] ${message}${data ? ' ' + JSON.stringify(data) : ''}`;\n\n if (logStream) {\n logStream(line);\n }\n\n const logLevels = ['debug', 'info', 'warn', 'error'];\n const configLevel = logLevels.indexOf(config?.daemon?.log_level || 'info');\n const msgLevel = logLevels.indexOf(level);\n\n if (msgLevel >= configLevel) {\n if (level === 'error') {\n console.error(line);\n } else {\n console.log(line);\n }\n }\n}\n\nexport async function startDaemon(\n options: { foreground?: boolean } = {}\n): Promise<void> {\n config = loadConfig();\n\n if (!config.daemon.enabled) {\n log('warn', 'Daemon is disabled in config');\n return;\n }\n\n const pidFile = config.daemon.pid_file;\n\n if (existsSync(pidFile)) {\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);\n try {\n process.kill(pid, 0);\n log('warn', 'Daemon already running', { pid });\n return;\n } catch {\n unlinkSync(pidFile);\n }\n }\n\n if (!options.foreground) {\n const child = spawn(\n process.argv[0],\n [...process.argv.slice(1), '--foreground'],\n {\n detached: true,\n stdio: 'ignore',\n }\n );\n child.unref();\n log('info', 'Daemon started in background', { pid: child.pid });\n return;\n }\n\n writeFileSync(pidFile, process.pid.toString());\n state.running = true;\n state.startTime = Date.now();\n\n log('info', 'Hook daemon starting', { pid: process.pid });\n\n setupLogStream();\n registerBuiltinHandlers();\n startFileWatchers();\n setupSignalHandlers();\n\n hookEmitter.emitHook({\n type: 'session_start',\n timestamp: Date.now(),\n data: { pid: process.pid },\n });\n\n log('info', 'Hook daemon ready', {\n events: hookEmitter.getRegisteredEvents(),\n watching: Array.from(state.watchers.keys()),\n });\n\n await new Promise(() => {});\n}\n\nexport function stopDaemon(): void {\n const pidFile =\n config?.daemon?.pid_file ||\n join(process.env.HOME || '/tmp', '.stackmemory', 'hooks.pid');\n\n if (!existsSync(pidFile)) {\n log('info', 'Daemon not running');\n return;\n }\n\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);\n\n try {\n process.kill(pid, 'SIGTERM');\n log('info', 'Daemon stopped', { pid });\n } catch {\n log('warn', 'Could not stop daemon', { pid });\n }\n\n try {\n unlinkSync(pidFile);\n } catch {\n // Ignore\n }\n}\n\nexport function getDaemonStatus(): {\n running: boolean;\n pid?: number;\n uptime?: number;\n eventsProcessed?: number;\n} {\n config = loadConfig();\n const pidFile = config.daemon.pid_file;\n\n if (!existsSync(pidFile)) {\n return { running: false };\n }\n\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);\n\n try {\n process.kill(pid, 0);\n return {\n running: true,\n pid,\n uptime: state.running ? Date.now() - state.startTime : undefined,\n eventsProcessed: state.eventsProcessed,\n };\n } catch {\n return { running: false };\n }\n}\n\nfunction setupLogStream(): void {\n const logFile = config.daemon.log_file;\n\n logStream = (msg: string) => {\n try {\n appendFileSync(logFile, msg + '\\n');\n } catch {\n // Ignore\n }\n };\n}\n\nfunction registerBuiltinHandlers(): void {\n hookEmitter.registerHandler('file_change', handleFileChange);\n hookEmitter.registerHandler('suggestion_ready', handleSuggestionReady);\n hookEmitter.registerHandler('error', handleError);\n\n hookEmitter.on('*', () => {\n state.eventsProcessed++;\n });\n}\n\nasync function handleFileChange(event: HookEventData): Promise<void> {\n const fileEvent = event as FileChangeEvent;\n const hookConfig = config.hooks.file_change;\n\n if (!hookConfig?.enabled) return;\n\n log('debug', 'File change detected', { path: fileEvent.data.path });\n\n if (hookConfig.handler === 'sweep-predict') {\n await runSweepPrediction(fileEvent);\n }\n}\n\nasync function runSweepPrediction(event: FileChangeEvent): Promise<void> {\n const hookConfig = config.hooks.file_change;\n if (!hookConfig) return;\n\n if (state.pendingPrediction) {\n log('debug', 'Prediction already pending, skipping');\n return;\n }\n\n if (state.lastPrediction) {\n const cooldown = hookConfig.cooldown_ms || 10000;\n if (Date.now() - state.lastPrediction < cooldown) {\n log('debug', 'In cooldown period, skipping');\n return;\n }\n }\n\n state.pendingPrediction = true;\n\n const debounce = hookConfig.debounce_ms || 2000;\n await new Promise((r) => setTimeout(r, debounce));\n\n try {\n const sweepScript = findSweepScript();\n if (!sweepScript) {\n log('warn', 'Sweep script not found');\n state.pendingPrediction = false;\n return;\n }\n\n const filePath = event.data.path;\n const content =\n event.data.content ||\n (existsSync(filePath) ? readFileSync(filePath, 'utf-8') : '');\n\n const input = {\n file_path: filePath,\n current_content: content,\n };\n\n const result = await runPythonScript(sweepScript, input);\n\n if (result && result.success && result.predicted_content) {\n state.lastPrediction = Date.now();\n\n const suggestionEvent: SuggestionReadyEvent = {\n type: 'suggestion_ready',\n timestamp: Date.now(),\n data: {\n suggestion: result.predicted_content,\n source: 'sweep',\n confidence: result.confidence,\n preview: result.predicted_content.split('\\n').slice(0, 3).join('\\n'),\n },\n };\n\n await hookEmitter.emitHook(suggestionEvent);\n }\n } catch (error) {\n log('error', 'Sweep prediction failed', {\n error: (error as Error).message,\n });\n } finally {\n state.pendingPrediction = false;\n }\n}\n\nfunction findSweepScript(): string | null {\n const locations = [\n join(process.env.HOME || '', '.stackmemory', 'sweep', 'sweep_predict.py'),\n join(\n process.cwd(),\n 'packages',\n 'sweep-addon',\n 'python',\n 'sweep_predict.py'\n ),\n ];\n\n for (const loc of locations) {\n if (existsSync(loc)) {\n return loc;\n }\n }\n return null;\n}\n\nasync function runPythonScript(\n scriptPath: string,\n input: Record<string, unknown>\n): Promise<{\n success: boolean;\n predicted_content?: string;\n confidence?: number;\n}> {\n return new Promise((resolve) => {\n const proc = spawn('python3', [scriptPath], {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let stdout = '';\n proc.stdout.on('data', (data) => (stdout += data));\n proc.stderr.on('data', () => {});\n\n proc.on('close', () => {\n try {\n resolve(JSON.parse(stdout.trim()));\n } catch {\n resolve({ success: false });\n }\n });\n\n proc.on('error', () => resolve({ success: false }));\n\n proc.stdin.write(JSON.stringify(input));\n proc.stdin.end();\n });\n}\n\nfunction handleSuggestionReady(event: HookEventData): void {\n const suggestionEvent = event as SuggestionReadyEvent;\n const hookConfig = config.hooks.suggestion_ready;\n\n if (!hookConfig?.enabled) return;\n\n const output = hookConfig.output || 'overlay';\n\n switch (output) {\n case 'overlay':\n displayOverlay(suggestionEvent.data);\n break;\n case 'notification':\n displayNotification(suggestionEvent.data);\n break;\n case 'log':\n log('info', 'Suggestion ready', suggestionEvent.data);\n break;\n }\n}\n\nfunction displayOverlay(data: SuggestionReadyEvent['data']): void {\n const preview = data.preview || data.suggestion.slice(0, 200);\n console.log('\\n' + '\u2500'.repeat(50));\n console.log(`[${data.source}] Suggestion:`);\n console.log(preview);\n if (data.suggestion.length > 200) console.log('...');\n console.log('\u2500'.repeat(50) + '\\n');\n}\n\nfunction displayNotification(data: SuggestionReadyEvent['data']): void {\n const title = `StackMemory - ${data.source}`;\n const message = data.preview || data.suggestion.slice(0, 100);\n\n if (process.platform === 'darwin') {\n spawn('osascript', [\n '-e',\n `display notification \"${message}\" with title \"${title}\"`,\n ]);\n } else if (process.platform === 'linux') {\n spawn('notify-send', [title, message]);\n }\n}\n\nfunction handleError(event: HookEventData): void {\n log('error', 'Hook error', event.data);\n}\n\nfunction startFileWatchers(): void {\n if (!config.file_watch.enabled) return;\n\n const paths = config.file_watch.paths;\n const ignore = new Set(config.file_watch.ignore);\n const extensions = new Set(config.file_watch.extensions);\n\n for (const watchPath of paths) {\n const absPath = join(process.cwd(), watchPath);\n if (!existsSync(absPath)) continue;\n\n try {\n const watcher = watch(\n absPath,\n { recursive: true },\n (eventType, filename) => {\n if (!filename) return;\n\n const relPath = relative(absPath, join(absPath, filename));\n const parts = relPath.split('/');\n\n if (parts.some((p) => ignore.has(p))) return;\n\n const ext = extname(filename);\n if (!extensions.has(ext)) return;\n\n const fullPath = join(absPath, filename);\n const changeType =\n eventType === 'rename'\n ? existsSync(fullPath)\n ? 'create'\n : 'delete'\n : 'modify';\n\n const fileEvent: FileChangeEvent = {\n type: 'file_change',\n timestamp: Date.now(),\n data: {\n path: fullPath,\n changeType,\n content:\n changeType !== 'delete' && existsSync(fullPath)\n ? readFileSync(fullPath, 'utf-8')\n : undefined,\n },\n };\n\n hookEmitter.emitHook(fileEvent);\n }\n );\n\n state.watchers.set(absPath, watcher);\n log('debug', 'Watching directory', { path: absPath });\n } catch (error) {\n log('warn', 'Failed to watch directory', {\n path: absPath,\n error: (error as Error).message,\n });\n }\n }\n}\n\nfunction setupSignalHandlers(): void {\n const cleanup = () => {\n log('info', 'Daemon shutting down');\n state.running = false;\n\n for (const [path, watcher] of state.watchers) {\n watcher.close();\n log('debug', 'Stopped watching', { path });\n }\n\n hookEmitter.emitHook({\n type: 'session_end',\n timestamp: Date.now(),\n data: { uptime: Date.now() - state.startTime },\n });\n\n try {\n unlinkSync(config.daemon.pid_file);\n } catch {\n // Ignore\n }\n\n process.exit(0);\n };\n\n process.on('SIGTERM', cleanup);\n process.on('SIGINT', cleanup);\n process.on('SIGHUP', cleanup);\n}\n\nexport { config, state };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/hooks/events.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * StackMemory Hook Events\n * Event types and emitter for the hook system\n */\n\nimport { EventEmitter } from 'events';\n\nexport type HookEventType =\n | 'input_idle'\n | 'file_change'\n | 'context_switch'\n | 'session_start'\n | 'session_end'\n | 'prompt_submit'\n | 'tool_use'\n | 'suggestion_ready'\n | 'error';\n\nexport interface HookEvent {\n type: HookEventType;\n timestamp: number;\n data: Record<string, unknown>;\n}\n\nexport interface FileChangeEvent extends HookEvent {\n type: 'file_change';\n data: {\n path: string;\n changeType: 'create' | 'modify' | 'delete';\n content?: string;\n };\n}\n\nexport interface InputIdleEvent extends HookEvent {\n type: 'input_idle';\n data: {\n idleDuration: number;\n lastInput?: string;\n };\n}\n\nexport interface ContextSwitchEvent extends HookEvent {\n type: 'context_switch';\n data: {\n fromBranch?: string;\n toBranch?: string;\n fromProject?: string;\n toProject?: string;\n };\n}\n\nexport interface SuggestionReadyEvent extends HookEvent {\n type: 'suggestion_ready';\n data: {\n suggestion: string;\n source: string;\n confidence?: number;\n preview?: string;\n };\n}\n\nexport type HookEventData =\n | FileChangeEvent\n | InputIdleEvent\n | ContextSwitchEvent\n | SuggestionReadyEvent\n | HookEvent;\n\nexport type HookHandler = (event: HookEventData) => Promise<void> | void;\n\nexport class HookEventEmitter extends EventEmitter {\n private handlers: Map<HookEventType, Set<HookHandler>> = new Map();\n\n registerHandler(eventType: HookEventType, handler: HookHandler): void {\n if (!this.handlers.has(eventType)) {\n this.handlers.set(eventType, new Set());\n }\n const handlers = this.handlers.get(eventType);\n if (handlers) {\n handlers.add(handler);\n }\n this.on(eventType, handler);\n }\n\n unregisterHandler(eventType: HookEventType, handler: HookHandler): void {\n const handlers = this.handlers.get(eventType);\n if (handlers) {\n handlers.delete(handler);\n this.off(eventType, handler);\n }\n }\n\n async emitHook(event: HookEventData): Promise<void> {\n const handlers = this.handlers.get(event.type);\n if (!handlers || handlers.size === 0) {\n return;\n }\n\n const promises: Promise<void>[] = [];\n for (const handler of handlers) {\n try {\n const result = handler(event);\n if (result instanceof Promise) {\n promises.push(result);\n }\n } catch (error) {\n this.emit('error', {\n type: 'error',\n timestamp: Date.now(),\n data: { error, originalEvent: event },\n });\n }\n }\n\n await Promise.allSettled(promises);\n }\n\n getRegisteredEvents(): HookEventType[] {\n return Array.from(this.handlers.keys()).filter(\n (type) => (this.handlers.get(type)?.size ?? 0) > 0\n );\n }\n}\n\nexport const hookEmitter = new HookEventEmitter();\n"],
|
|
5
|
+
"mappings": ";;;;AAKA,SAAS,oBAAoB;AAiEtB,MAAM,yBAAyB,aAAa;AAAA,EACzC,WAAiD,oBAAI,IAAI;AAAA,EAEjE,gBAAgB,WAA0B,SAA4B;AACpE,QAAI,CAAC,KAAK,SAAS,IAAI,SAAS,GAAG;AACjC,WAAK,SAAS,IAAI,WAAW,oBAAI,IAAI,CAAC;AAAA,IACxC;AACA,UAAM,WAAW,KAAK,SAAS,IAAI,SAAS;AAC5C,QAAI,UAAU;AACZ,eAAS,IAAI,OAAO;AAAA,IACtB;AACA,SAAK,GAAG,WAAW,OAAO;AAAA,EAC5B;AAAA,EAEA,kBAAkB,WAA0B,SAA4B;AACtE,UAAM,WAAW,KAAK,SAAS,IAAI,SAAS;AAC5C,QAAI,UAAU;AACZ,eAAS,OAAO,OAAO;AACvB,WAAK,IAAI,WAAW,OAAO;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,OAAqC;AAClD,UAAM,WAAW,KAAK,SAAS,IAAI,MAAM,IAAI;AAC7C,QAAI,CAAC,YAAY,SAAS,SAAS,GAAG;AACpC;AAAA,IACF;AAEA,UAAM,WAA4B,CAAC;AACnC,eAAW,WAAW,UAAU;AAC9B,UAAI;AACF,cAAM,SAAS,QAAQ,KAAK;AAC5B,YAAI,kBAAkB,SAAS;AAC7B,mBAAS,KAAK,MAAM;AAAA,QACtB;AAAA,MACF,SAAS,OAAO;AACd,aAAK,KAAK,SAAS;AAAA,UACjB,MAAM;AAAA,UACN,WAAW,KAAK,IAAI;AAAA,UACpB,MAAM,EAAE,OAAO,eAAe,MAAM;AAAA,QACtC,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,QAAQ,WAAW,QAAQ;AAAA,EACnC;AAAA,EAEA,sBAAuC;AACrC,WAAO,MAAM,KAAK,KAAK,SAAS,KAAK,CAAC,EAAE;AAAA,MACtC,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,GAAG,QAAQ,KAAK;AAAA,IACnD;AAAA,EACF;AACF;AAEO,MAAM,cAAc,IAAI,iBAAiB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/hooks/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * StackMemory Hooks Module\n * User-configurable hook system for automation and suggestions\n */\n\nexport * from './events.js';\nexport * from './config.js';\nexport * from './daemon.js';\nexport * from './auto-background.js';\nexport * from './sms-notify.js';\nexport * from './sms-webhook.js';\nexport * from './sms-action-runner.js';\n"],
|
|
5
|
+
"mappings": ";;;;AAKA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|