@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
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
package/dist/hooks/config.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
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": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/dist/hooks/daemon.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
package/dist/hooks/events.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
package/dist/hooks/index.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/hooks/linear-task-picker.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Linear Task Picker\n * Picks the next best task from Linear queue, prioritizing tasks with test/validation requirements\n */\n\nimport { LinearClient, LinearIssue } from '../integrations/linear/client.js';\nimport { LinearAuthManager } from '../integrations/linear/auth.js';\n\nexport interface TaskSuggestion {\n id: string;\n identifier: string; // e.g., \"STA-123\"\n title: string;\n priority: number;\n hasTestRequirements: boolean;\n estimatedPoints?: number;\n url: string;\n score: number;\n}\n\nexport interface PickerOptions {\n teamId?: string;\n preferTestTasks?: boolean;\n limit?: number;\n}\n\n// Keywords indicating test/validation requirements\nconst TEST_KEYWORDS = [\n 'test',\n 'spec',\n 'unit test',\n 'integration test',\n 'e2e',\n 'end-to-end',\n 'jest',\n 'vitest',\n 'mocha',\n];\n\nconst VALIDATION_KEYWORDS = [\n 'validate',\n 'verify',\n 'verification',\n 'acceptance criteria',\n 'ac:',\n 'acceptance:',\n 'given when then',\n 'criteria:',\n];\n\nconst QA_KEYWORDS = ['qa', 'quality', 'regression', 'coverage', 'assertion'];\n\n// Labels that indicate test requirements\nconst TEST_LABELS = [\n 'needs-tests',\n 'test-required',\n 'qa-review',\n 'has-ac',\n 'acceptance-criteria',\n 'tdd',\n 'testing',\n];\n\n/**\n * Check if text contains any of the keywords (case-insensitive)\n */\nfunction containsKeywords(text: string, keywords: string[]): boolean {\n const lowerText = text.toLowerCase();\n return keywords.some((kw) => lowerText.includes(kw.toLowerCase()));\n}\n\n/**\n * Score a task based on test/validation requirements\n */\nfunction scoreTask(issue: LinearIssue, preferTestTasks: boolean): number {\n let score = 0;\n const description = issue.description || '';\n const title = issue.title || '';\n const fullText = `${title} ${description}`;\n\n // +10 if has test/validation keywords in description\n if (containsKeywords(fullText, TEST_KEYWORDS)) {\n score += preferTestTasks ? 10 : 5;\n }\n\n if (containsKeywords(fullText, VALIDATION_KEYWORDS)) {\n score += preferTestTasks ? 8 : 4;\n }\n\n if (containsKeywords(fullText, QA_KEYWORDS)) {\n score += preferTestTasks ? 5 : 2;\n }\n\n // +5 if has test-related labels\n const labelNames =\n issue.labels?.nodes?.map((l: { name: string }) => l.name.toLowerCase()) ||\n [];\n const hasTestLabel = TEST_LABELS.some((tl) =>\n labelNames.some((ln: string) => ln.includes(tl))\n );\n if (hasTestLabel) {\n score += preferTestTasks ? 5 : 3;\n }\n\n // +3 for higher priority (urgent=1, high=2)\n if (issue.priority === 1) {\n score += 5; // Urgent\n } else if (issue.priority === 2) {\n score += 3; // High\n } else if (issue.priority === 3) {\n score += 1; // Medium\n }\n\n // +2 if has acceptance criteria pattern\n if (\n description.includes('## Acceptance') ||\n description.includes('### AC') ||\n description.includes('- [ ]')\n ) {\n score += 2;\n }\n\n // +1 if has estimate (indicates well-scoped)\n if (issue.estimate) {\n score += 1;\n }\n\n return score;\n}\n\n/**\n * Get Linear client instance\n * Returns null if credentials are missing or invalid\n */\nfunction getLinearClient(): LinearClient | null {\n // Try API key first - must be valid format (lin_api_*)\n const apiKey = process.env['LINEAR_API_KEY'];\n if (apiKey && apiKey.startsWith('lin_api_')) {\n return new LinearClient({ apiKey });\n }\n\n // Fall back to OAuth\n try {\n const authManager = new LinearAuthManager();\n const tokens = authManager.loadTokens();\n if (tokens?.accessToken) {\n return new LinearClient({ accessToken: tokens.accessToken });\n }\n } catch {\n // Auth not available\n }\n\n return null;\n}\n\n/**\n * Pick the next best task from Linear\n */\nexport async function pickNextLinearTask(\n options: PickerOptions = {}\n): Promise<TaskSuggestion | null> {\n const client = getLinearClient();\n if (!client) {\n return null;\n }\n\n const { teamId, preferTestTasks = true, limit = 20 } = options;\n\n try {\n // Fetch backlog and unstarted issues\n const [backlogIssues, unstartedIssues] = await Promise.all([\n client.getIssues({ teamId, stateType: 'backlog', limit }),\n client.getIssues({ teamId, stateType: 'unstarted', limit }),\n ]);\n\n const allIssues = [...backlogIssues, ...unstartedIssues];\n\n // Filter out assigned issues (we want unassigned ones)\n const unassignedIssues = allIssues.filter((issue) => !issue.assignee);\n\n if (unassignedIssues.length === 0) {\n // If no unassigned, consider all\n if (allIssues.length === 0) {\n return null;\n }\n }\n\n const issuesToScore =\n unassignedIssues.length > 0 ? unassignedIssues : allIssues;\n\n // Score and sort\n const scoredIssues = issuesToScore.map((issue) => ({\n issue,\n score: scoreTask(issue, preferTestTasks),\n }));\n\n scoredIssues.sort((a, b) => b.score - a.score);\n\n const best = scoredIssues[0];\n if (!best) {\n return null;\n }\n\n const description = best.issue.description || '';\n const hasTestRequirements =\n containsKeywords(description, TEST_KEYWORDS) ||\n containsKeywords(description, VALIDATION_KEYWORDS);\n\n return {\n id: best.issue.id,\n identifier: best.issue.identifier,\n title: best.issue.title,\n priority: best.issue.priority,\n hasTestRequirements,\n estimatedPoints: best.issue.estimate,\n url: best.issue.url,\n score: best.score,\n };\n } catch (error) {\n // Silent fail for auth errors (401/403) - expected when not configured\n const isAuthError =\n error instanceof Error &&\n (error.message.includes('401') || error.message.includes('403'));\n if (!isAuthError) {\n console.error('[linear-task-picker] Error fetching tasks:', error);\n }\n return null;\n }\n}\n\n/**\n * Get multiple task suggestions (for showing options)\n */\nexport async function getTopTaskSuggestions(\n options: PickerOptions = {},\n count: number = 3\n): Promise<TaskSuggestion[]> {\n const client = getLinearClient();\n if (!client) {\n return [];\n }\n\n const { teamId, preferTestTasks = true, limit = 30 } = options;\n\n try {\n const [backlogIssues, unstartedIssues] = await Promise.all([\n client.getIssues({ teamId, stateType: 'backlog', limit }),\n client.getIssues({ teamId, stateType: 'unstarted', limit }),\n ]);\n\n const allIssues = [...backlogIssues, ...unstartedIssues];\n const unassignedIssues = allIssues.filter((issue) => !issue.assignee);\n const issuesToScore =\n unassignedIssues.length > 0 ? unassignedIssues : allIssues;\n\n const scoredIssues = issuesToScore.map((issue) => ({\n issue,\n score: scoreTask(issue, preferTestTasks),\n }));\n\n scoredIssues.sort((a, b) => b.score - a.score);\n\n return scoredIssues.slice(0, count).map(({ issue, score }) => {\n const description = issue.description || '';\n const hasTestRequirements =\n containsKeywords(description, TEST_KEYWORDS) ||\n containsKeywords(description, VALIDATION_KEYWORDS);\n\n return {\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n priority: issue.priority,\n hasTestRequirements,\n estimatedPoints: issue.estimate,\n url: issue.url,\n score,\n };\n });\n } catch (error) {\n // Silent fail for auth errors (401/403) - expected when not configured\n const isAuthError =\n error instanceof Error &&\n (error.message.includes('401') || error.message.includes('403'));\n if (!isAuthError) {\n console.error('[linear-task-picker] Error fetching tasks:', error);\n }\n return [];\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/hooks/schemas.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Zod schemas for hook configuration validation\n * Prevents malformed or malicious configs from being loaded\n */\n\nimport { z } from 'zod';\nimport { logConfigInvalid } from './security-logger.js';\n\n// SMS/WhatsApp notification schemas\nexport const PromptOptionSchema = z.object({\n key: z.string().max(10),\n label: z.string().max(200),\n action: z.string().max(500).optional(),\n});\n\nexport const PendingPromptSchema = z.object({\n id: z.string().max(32),\n timestamp: z\n .string()\n .datetime({ offset: true })\n .or(z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T/)),\n message: z.string().max(1000),\n options: z.array(PromptOptionSchema).max(10),\n type: z.enum(['options', 'yesno', 'freeform']),\n callback: z.string().max(500).optional(),\n expiresAt: z\n .string()\n .datetime({ offset: true })\n .or(z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T/)),\n});\n\nexport const NotifyOnSchema = z.object({\n taskComplete: z.boolean(),\n reviewReady: z.boolean(),\n error: z.boolean(),\n custom: z.boolean(),\n contextSync: z.boolean().optional().default(true),\n});\n\nexport const QuietHoursSchema = z.object({\n enabled: z.boolean(),\n start: z.string().regex(/^\\d{2}:\\d{2}$/),\n end: z.string().regex(/^\\d{2}:\\d{2}$/),\n});\n\nexport const SMSConfigSchema = z.object({\n enabled: z.boolean(),\n channel: z.enum(['whatsapp', 'sms']),\n accountSid: z.string().max(100).optional(),\n authToken: z.string().max(100).optional(),\n smsFromNumber: z.string().max(20).optional(),\n smsToNumber: z.string().max(20).optional(),\n whatsappFromNumber: z.string().max(30).optional(),\n whatsappToNumber: z.string().max(30).optional(),\n fromNumber: z.string().max(20).optional(),\n toNumber: z.string().max(20).optional(),\n webhookUrl: z.string().url().max(500).optional(),\n notifyOn: NotifyOnSchema,\n quietHours: QuietHoursSchema.optional(),\n responseTimeout: z.number().int().min(30).max(3600),\n pendingPrompts: z.array(PendingPromptSchema).max(100),\n});\n\n// Action queue schemas\nexport const PendingActionSchema = z.object({\n id: z.string().max(32),\n promptId: z.string().max(32),\n response: z.string().max(1000),\n action: z.string().max(500),\n timestamp: z\n .string()\n .datetime({ offset: true })\n .or(z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T/)),\n status: z.enum(['pending', 'running', 'completed', 'failed']),\n result: z.string().max(10000).optional(),\n error: z.string().max(1000).optional(),\n});\n\nexport const ActionQueueSchema = z.object({\n actions: z.array(PendingActionSchema).max(1000),\n lastChecked: z\n .string()\n .datetime({ offset: true })\n .or(z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T/)),\n});\n\n// Auto-background config schema\nexport const AutoBackgroundConfigSchema = z.object({\n enabled: z.boolean(),\n timeoutMs: z.number().int().min(1000).max(600000),\n alwaysBackground: z.array(z.string().max(200)).max(100),\n neverBackground: z.array(z.string().max(200)).max(100),\n verbose: z.boolean().optional(),\n});\n\n// WhatsApp Sync Options schema\nexport const SyncOptionsSchema = z.object({\n autoSyncOnClose: z.boolean(),\n minFrameDuration: z.number().int().min(0).max(3600), // 0 to 1 hour\n includeDecisions: z.boolean(),\n includeFiles: z.boolean(),\n includeTests: z.boolean(),\n maxDigestLength: z.number().int().min(100).max(1000), // WhatsApp limit ~4096 chars\n});\n\n// WhatsApp Schedule Config schema\nexport const ScheduleConfigSchema = z.object({\n type: z.enum(['daily', 'hourly', 'interval']),\n time: z\n .string()\n .regex(/^\\d{2}:\\d{2}$/)\n .optional(), // \"HH:MM\" for daily\n intervalMinutes: z.number().int().min(5).max(1440).optional(), // 5 min to 24 hours\n includeInactive: z.boolean(), // Include when no activity\n quietHoursRespect: z.boolean(), // Respect quiet hours setting\n});\n\n// WhatsApp Schedule storage schema\nexport const ScheduleSchema = z.object({\n id: z.string().max(32),\n config: ScheduleConfigSchema,\n enabled: z.boolean(),\n lastRun: z\n .string()\n .datetime({ offset: true })\n .or(z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T/))\n .optional(),\n nextRun: z\n .string()\n .datetime({ offset: true })\n .or(z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T/))\n .optional(),\n createdAt: z\n .string()\n .datetime({ offset: true })\n .or(z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T/)),\n});\n\nexport const ScheduleStorageSchema = z.object({\n schedules: z.array(ScheduleSchema).max(10),\n lastChecked: z\n .string()\n .datetime({ offset: true })\n .or(z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T/)),\n});\n\n// WhatsApp Command schema\nexport const WhatsAppCommandSchema = z.object({\n name: z.string().max(50),\n description: z.string().max(200),\n enabled: z.boolean(),\n action: z.string().max(500).optional(), // Safe action to execute\n requiresArg: z.boolean().optional(),\n argPattern: z.string().max(100).optional(), // Regex pattern for arg validation\n});\n\nexport const WhatsAppCommandsConfigSchema = z.object({\n enabled: z.boolean(),\n commands: z.array(WhatsAppCommandSchema).max(50),\n});\n\n// Model Router schemas\nexport const ModelProviderSchema = z.enum([\n 'anthropic',\n 'qwen',\n 'openai',\n 'ollama',\n 'custom',\n]);\n\nexport const ModelConfigSchema = z.object({\n provider: ModelProviderSchema,\n model: z.string().max(100),\n baseUrl: z.string().url().max(500).optional(),\n apiKeyEnv: z.string().max(100),\n headers: z.record(z.string().max(500)).optional(),\n params: z.record(z.unknown()).optional(),\n});\n\nexport const ModelRouterConfigSchema = z.object({\n enabled: z.boolean(),\n defaultProvider: ModelProviderSchema,\n taskRouting: z\n .object({\n plan: ModelProviderSchema.optional(),\n think: ModelProviderSchema.optional(),\n code: ModelProviderSchema.optional(),\n review: ModelProviderSchema.optional(),\n })\n .optional()\n .default({}),\n fallback: z.object({\n enabled: z.boolean(),\n provider: ModelProviderSchema,\n onRateLimit: z.boolean(),\n onError: z.boolean(),\n onTimeout: z.boolean(),\n maxRetries: z.number().int().min(0).max(10),\n retryDelayMs: z.number().int().min(100).max(30000),\n }),\n providers: z\n .object({\n anthropic: ModelConfigSchema.optional(),\n qwen: ModelConfigSchema.optional(),\n openai: ModelConfigSchema.optional(),\n ollama: ModelConfigSchema.optional(),\n custom: ModelConfigSchema.optional(),\n })\n .optional()\n .default({}),\n thinkingMode: z.object({\n enabled: z.boolean(),\n budget: z.number().int().min(1000).max(100000).optional(),\n temperature: z.number().min(0).max(2).optional(),\n topP: z.number().min(0).max(1).optional(),\n }),\n});\n\n// Type exports\nexport type ModelRouterConfigValidated = z.infer<\n typeof ModelRouterConfigSchema\n>;\nexport type SMSConfigValidated = z.infer<typeof SMSConfigSchema>;\nexport type ActionQueueValidated = z.infer<typeof ActionQueueSchema>;\nexport type AutoBackgroundConfigValidated = z.infer<\n typeof AutoBackgroundConfigSchema\n>;\nexport type SyncOptionsValidated = z.infer<typeof SyncOptionsSchema>;\nexport type ScheduleConfigValidated = z.infer<typeof ScheduleConfigSchema>;\nexport type ScheduleValidated = z.infer<typeof ScheduleSchema>;\nexport type ScheduleStorageValidated = z.infer<typeof ScheduleStorageSchema>;\nexport type WhatsAppCommandValidated = z.infer<typeof WhatsAppCommandSchema>;\nexport type WhatsAppCommandsConfigValidated = z.infer<\n typeof WhatsAppCommandsConfigSchema\n>;\n\n/**\n * Safely parse and validate config, returning default on failure\n */\nexport function parseConfigSafe<T>(\n schema: z.ZodSchema<T>,\n data: unknown,\n defaultValue: T,\n configName: string\n): T {\n const result = schema.safeParse(data);\n if (result.success) {\n return result.data;\n }\n const errors = result.error.issues.map(\n (i) => `${i.path.join('.')}: ${i.message}`\n );\n logConfigInvalid(configName, errors);\n console.error(`[hooks] Invalid ${configName} config:`, errors.join(', '));\n return defaultValue;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/hooks/secure-fs.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Secure file system utilities for hooks\n * Ensures config files have restricted permissions (0600)\n */\n\nimport {\n writeFileSync,\n mkdirSync,\n chmodSync,\n existsSync,\n renameSync,\n unlinkSync,\n} from 'fs';\nimport { dirname, join } from 'path';\nimport { randomBytes } from 'crypto';\n\n/**\n * Write file with secure permissions (0600 - user read/write only)\n * Uses atomic write pattern: write to temp file, then rename\n * This prevents corruption if process crashes mid-write\n */\nexport function writeFileSecure(filePath: string, data: string): void {\n const dir = dirname(filePath);\n\n // Create directory with secure permissions if needed\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n\n // Generate temp file path in same directory (required for atomic rename)\n const tempPath = join(dir, `.tmp-${randomBytes(8).toString('hex')}`);\n\n try {\n // Write to temp file first\n writeFileSync(tempPath, data);\n\n // Set secure permissions on temp file\n chmodSync(tempPath, 0o600);\n\n // Atomic rename (same filesystem, so this is atomic on POSIX)\n renameSync(tempPath, filePath);\n } catch (error) {\n // Clean up temp file on failure\n try {\n if (existsSync(tempPath)) {\n unlinkSync(tempPath);\n }\n } catch {\n // Ignore cleanup errors\n }\n throw error;\n }\n}\n\n/**\n * Ensure directory exists with secure permissions (0700)\n */\nexport function ensureSecureDir(dirPath: string): void {\n if (!existsSync(dirPath)) {\n mkdirSync(dirPath, { recursive: true, mode: 0o700 });\n } else {\n // Set permissions on existing directory\n try {\n chmodSync(dirPath, 0o700);\n } catch {\n // Ignore if we can't change permissions (not owner)\n }\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;AAKA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS,YAAY;AAC9B,SAAS,mBAAmB;AAOrB,SAAS,gBAAgB,UAAkB,MAAoB;AACpE,QAAM,MAAM,QAAQ,QAAQ;AAG5B,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,cAAU,KAAK,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAAA,EACjD;AAGA,QAAM,WAAW,KAAK,KAAK,QAAQ,YAAY,CAAC,EAAE,SAAS,KAAK,CAAC,EAAE;AAEnE,MAAI;AAEF,kBAAc,UAAU,IAAI;AAG5B,cAAU,UAAU,GAAK;AAGzB,eAAW,UAAU,QAAQ;AAAA,EAC/B,SAAS,OAAO;AAEd,QAAI;AACF,UAAI,WAAW,QAAQ,GAAG;AACxB,mBAAW,QAAQ;AAAA,MACrB;AAAA,IACF,QAAQ;AAAA,IAER;AACA,UAAM;AAAA,EACR;AACF;AAKO,SAAS,gBAAgB,SAAuB;AACrD,MAAI,CAAC,WAAW,OAAO,GAAG;AACxB,cAAU,SAAS,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAAA,EACrD,OAAO;AAEL,QAAI;AACF,gBAAU,SAAS,GAAK;AAAA,IAC1B,QAAQ;AAAA,IAER;AAAA,EACF;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/hooks/security-logger.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Security Event Logger for hooks\n * Logs security-relevant events for audit trail\n */\n\nimport { appendFileSync, existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { ensureSecureDir } from './secure-fs.js';\n\nconst LOG_DIR = join(homedir(), '.stackmemory', 'logs');\nconst SECURITY_LOG = join(LOG_DIR, 'security.log');\nconst MAX_LOG_ENTRIES = 10000;\n\nexport type SecurityEventType =\n | 'auth_success'\n | 'auth_failure'\n | 'rate_limit'\n | 'action_allowed'\n | 'action_blocked'\n | 'config_invalid'\n | 'config_loaded'\n | 'webhook_request'\n | 'signature_invalid'\n | 'body_too_large'\n | 'content_type_invalid'\n | 'cleanup';\n\nexport interface SecurityEvent {\n timestamp: string;\n type: SecurityEventType;\n source: string;\n message: string;\n details?: Record<string, unknown>;\n ip?: string;\n}\n\nlet logCount = 0;\n\n/**\n * Log a security event\n */\nexport function logSecurityEvent(\n type: SecurityEventType,\n source: string,\n message: string,\n details?: Record<string, unknown>,\n ip?: string\n): void {\n try {\n ensureSecureDir(LOG_DIR);\n\n const event: SecurityEvent = {\n timestamp: new Date().toISOString(),\n type,\n source,\n message,\n ...(details && { details }),\n ...(ip && { ip: maskIp(ip) }),\n };\n\n const logLine = JSON.stringify(event) + '\\n';\n appendFileSync(SECURITY_LOG, logLine, { mode: 0o600 });\n\n logCount++;\n\n // Rotate log if too large (simple rotation - truncate)\n if (logCount > MAX_LOG_ENTRIES) {\n rotateLog();\n }\n } catch {\n // Don't let logging failures break the application\n }\n}\n\n/**\n * Mask IP address for privacy (keep first two octets)\n */\nfunction maskIp(ip: string): string {\n if (!ip) return 'unknown';\n\n // Handle IPv6 localhost\n if (ip === '::1' || ip === '::ffff:127.0.0.1') return '127.0.0.x';\n\n // Handle IPv4\n const parts = ip.replace('::ffff:', '').split('.');\n if (parts.length === 4) {\n return `${parts[0]}.${parts[1]}.x.x`;\n }\n\n // Handle IPv6 - mask last 64 bits\n if (ip.includes(':')) {\n const segments = ip.split(':');\n if (segments.length >= 4) {\n return segments.slice(0, 4).join(':') + ':x:x:x:x';\n }\n }\n\n return 'masked';\n}\n\n/**\n * Simple log rotation - keep last half of entries\n */\nfunction rotateLog(): void {\n try {\n if (existsSync(SECURITY_LOG)) {\n const content = readFileSync(SECURITY_LOG, 'utf8');\n const lines = content.trim().split('\\n');\n const keepLines = lines.slice(-MAX_LOG_ENTRIES / 2);\n writeFileSync(SECURITY_LOG, keepLines.join('\\n') + '\\n', { mode: 0o600 });\n logCount = keepLines.length;\n }\n } catch {\n // Ignore rotation errors\n }\n}\n\n// Convenience functions for common events\n\nexport function logAuthSuccess(\n source: string,\n details?: Record<string, unknown>\n): void {\n logSecurityEvent(\n 'auth_success',\n source,\n 'Authentication successful',\n details\n );\n}\n\nexport function logAuthFailure(\n source: string,\n reason: string,\n ip?: string,\n details?: Record<string, unknown>\n): void {\n logSecurityEvent(\n 'auth_failure',\n source,\n `Authentication failed: ${reason}`,\n details,\n ip\n );\n}\n\nexport function logRateLimit(source: string, ip: string): void {\n logSecurityEvent('rate_limit', source, 'Rate limit exceeded', undefined, ip);\n}\n\nexport function logActionAllowed(source: string, action: string): void {\n logSecurityEvent(\n 'action_allowed',\n source,\n `Action executed: ${action.substring(0, 100)}`\n );\n}\n\nexport function logActionBlocked(\n source: string,\n action: string,\n reason: string\n): void {\n logSecurityEvent('action_blocked', source, `Action blocked: ${reason}`, {\n action: action.substring(0, 100),\n });\n}\n\nexport function logConfigInvalid(source: string, errors: string[]): void {\n logSecurityEvent('config_invalid', source, 'Invalid config rejected', {\n errors: errors.slice(0, 5),\n });\n}\n\nexport function logWebhookRequest(\n source: string,\n method: string,\n path: string,\n ip?: string\n): void {\n logSecurityEvent(\n 'webhook_request',\n source,\n `${method} ${path}`,\n undefined,\n ip\n );\n}\n\nexport function logSignatureInvalid(source: string, ip?: string): void {\n logSecurityEvent(\n 'signature_invalid',\n source,\n 'Invalid request signature',\n undefined,\n ip\n );\n}\n\nexport function logBodyTooLarge(\n source: string,\n size: number,\n ip?: string\n): void {\n logSecurityEvent(\n 'body_too_large',\n source,\n `Request body too large: ${size} bytes`,\n undefined,\n ip\n );\n}\n\nexport function logContentTypeInvalid(\n source: string,\n contentType: string,\n ip?: string\n): void {\n logSecurityEvent(\n 'content_type_invalid',\n source,\n `Invalid content type: ${contentType}`,\n undefined,\n ip\n );\n}\n\nexport function logCleanup(\n source: string,\n expiredPrompts: number,\n oldActions: number\n): void {\n if (expiredPrompts > 0 || oldActions > 0) {\n logSecurityEvent('cleanup', source, 'Cleanup completed', {\n expiredPrompts,\n oldActions,\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/hooks/session-summary.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Session Summary Generator\n * Generates intelligent suggestions for what to do next after a Claude session\n */\n\nimport { execSync } from 'child_process';\nimport { pickNextLinearTask, TaskSuggestion } from './linear-task-picker.js';\n\nexport interface SessionContext {\n instanceId: string;\n exitCode: number | null;\n sessionStartTime: number;\n worktreePath?: string;\n branch?: string;\n task?: string;\n}\n\nexport interface Suggestion {\n key: string;\n label: string;\n action: string;\n priority: number;\n}\n\nexport interface SessionSummary {\n duration: string;\n exitCode: number | null;\n branch: string;\n status: 'success' | 'error' | 'interrupted';\n suggestions: Suggestion[];\n linearTask?: TaskSuggestion;\n}\n\n/**\n * Format duration in human-readable form\n */\nfunction 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) {\n return `${hours}h ${minutes % 60}min`;\n }\n if (minutes > 0) {\n return `${minutes}min`;\n }\n return `${seconds}s`;\n}\n\n/**\n * Get current git branch\n */\nfunction getCurrentBranch(): string {\n try {\n return execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n } catch {\n return 'unknown';\n }\n}\n\n/**\n * Check for uncommitted changes\n */\nfunction hasUncommittedChanges(): { changed: boolean; count: number } {\n try {\n const status = execSync('git status --porcelain', {\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n const lines = status.trim().split('\\n').filter(Boolean);\n return { changed: lines.length > 0, count: lines.length };\n } catch {\n return { changed: false, count: 0 };\n }\n}\n\n/**\n * Check if we're in a worktree\n */\nfunction isInWorktree(): boolean {\n try {\n execSync('git rev-parse --is-inside-work-tree', {\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n // Check if it's a worktree (not the main repo)\n const gitDir = execSync('git rev-parse --git-dir', {\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n return gitDir.includes('.git/worktrees/');\n } catch {\n return false;\n }\n}\n\n/**\n * Check if tests exist and might need running\n */\nfunction hasTestScript(): boolean {\n try {\n const packageJson = execSync('cat package.json', {\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n const pkg = JSON.parse(packageJson);\n return !!(pkg.scripts?.test || pkg.scripts?.['test:run']);\n } catch {\n return false;\n }\n}\n\n/**\n * Generate suggestions based on session context\n */\nasync function generateSuggestions(\n context: SessionContext\n): Promise<Suggestion[]> {\n const suggestions: Suggestion[] = [];\n let keyIndex = 1;\n\n const changes = hasUncommittedChanges();\n const inWorktree = isInWorktree();\n const hasTests = hasTestScript();\n\n // Error case - suggest reviewing logs\n if (context.exitCode !== 0 && context.exitCode !== null) {\n suggestions.push({\n key: String(keyIndex++),\n label: 'Review error logs',\n action: 'cat ~/.claude/logs/claude-*.log | tail -50',\n priority: 100,\n });\n }\n\n // Uncommitted changes - suggest commit or PR\n if (changes.changed) {\n suggestions.push({\n key: String(keyIndex++),\n label: `Commit changes (${changes.count} files)`,\n action: 'git add -A && git commit',\n priority: 90,\n });\n\n // If on feature branch, suggest PR\n const branch = getCurrentBranch();\n if (branch !== 'main' && branch !== 'master' && branch !== 'unknown') {\n suggestions.push({\n key: String(keyIndex++),\n label: 'Create PR',\n action: 'gh pr create --fill',\n priority: 80,\n });\n }\n }\n\n // If tests exist and changes were made, suggest running tests\n if (hasTests && changes.changed) {\n suggestions.push({\n key: String(keyIndex++),\n label: 'Run tests',\n action: 'npm run test:run',\n priority: 85,\n });\n }\n\n // Worktree-specific suggestions\n if (inWorktree) {\n suggestions.push({\n key: String(keyIndex++),\n label: 'Merge to main',\n action: 'cwm', // custom alias\n priority: 70,\n });\n }\n\n // Try to get next Linear task\n try {\n const linearTask = await pickNextLinearTask({ preferTestTasks: true });\n if (linearTask) {\n suggestions.push({\n key: String(keyIndex++),\n label: `Start: ${linearTask.identifier} - ${linearTask.title.substring(0, 40)}${linearTask.title.length > 40 ? '...' : ''}${linearTask.hasTestRequirements ? ' (has tests)' : ''}`,\n action: `stackmemory task start ${linearTask.id} --assign-me`,\n priority: 60,\n });\n }\n } catch {\n // Linear not available, skip\n }\n\n // Long session suggestion\n const durationMs = Date.now() - context.sessionStartTime;\n if (durationMs > 30 * 60 * 1000) {\n // > 30 minutes\n suggestions.push({\n key: String(keyIndex++),\n label: 'Take a break',\n action: 'echo \"Great work! Time for a coffee break.\"',\n priority: 10,\n });\n }\n\n // Sort by priority (highest first) and re-key\n suggestions.sort((a, b) => b.priority - a.priority);\n\n // Ensure minimum 2 options always\n if (suggestions.length < 2) {\n // Add default options if not enough suggestions\n if (suggestions.length === 0) {\n suggestions.push({\n key: '1',\n label: 'Start new Claude session',\n action: 'claude-sm',\n priority: 50,\n });\n }\n if (suggestions.length < 2) {\n suggestions.push({\n key: '2',\n label: 'View session logs',\n action: 'cat ~/.claude/logs/claude-*.log | tail -30',\n priority: 40,\n });\n }\n }\n\n suggestions.forEach((s, i) => {\n s.key = String(i + 1);\n });\n\n return suggestions;\n}\n\n/**\n * Generate full session summary\n */\nexport async function generateSessionSummary(\n context: SessionContext\n): Promise<SessionSummary> {\n const durationMs = Date.now() - context.sessionStartTime;\n const duration = formatDuration(durationMs);\n const branch = context.branch || getCurrentBranch();\n\n let status: 'success' | 'error' | 'interrupted' = 'success';\n if (context.exitCode !== 0 && context.exitCode !== null) {\n status = 'error';\n }\n\n const suggestions = await generateSuggestions(context);\n\n // Extract linear task if present\n let linearTask: TaskSuggestion | undefined;\n try {\n linearTask = await pickNextLinearTask({ preferTestTasks: true });\n } catch {\n // Linear not available\n }\n\n return {\n duration,\n exitCode: context.exitCode,\n branch,\n status,\n suggestions,\n linearTask,\n };\n}\n\n/**\n * Format session summary as WhatsApp message\n */\nexport function formatSummaryMessage(\n summary: SessionSummary,\n sessionId?: string\n): string {\n const statusEmoji = summary.status === 'success' ? '' : '';\n const exitInfo =\n summary.exitCode !== null ? ` | Exit: ${summary.exitCode}` : '';\n const sessionInfo = sessionId ? ` | Session: ${sessionId}` : '';\n\n let message = `Claude session complete ${statusEmoji}\\n`;\n message += `Duration: ${summary.duration}${exitInfo}${sessionInfo}\\n`;\n message += `Branch: ${summary.branch}\\n`;\n\n // Add Claude Code session URL if session ID is available\n if (sessionId) {\n message += `View: https://claude.ai/chat/${sessionId}\\n`;\n }\n\n message += '\\n';\n\n if (summary.suggestions.length > 0) {\n message += `What to do next:\\n`;\n for (const s of summary.suggestions.slice(0, 4)) {\n message += `${s.key}. ${s.label}\\n`;\n }\n message += `\\nReply with number or custom action`;\n } else {\n message += `No pending actions. Nice work!`;\n }\n\n return message;\n}\n\n/**\n * Get action for a suggestion key\n */\nexport function getActionForKey(\n suggestions: Suggestion[],\n key: string\n): string | null {\n const suggestion = suggestions.find((s) => s.key === key);\n return suggestion?.action || null;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|