@stackmemoryai/stackmemory 0.5.57 → 0.5.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/codex-smd +6 -0
- package/dist/cli/codex-sm-danger.js +21 -0
- package/dist/cli/codex-sm-danger.js.map +7 -0
- package/dist/cli/commands/handoff.js +33 -3
- package/dist/cli/commands/handoff.js.map +2 -2
- package/dist/cli/commands/search.js +20 -3
- package/dist/cli/commands/search.js.map +2 -2
- package/dist/core/database/sqlite-adapter.js +13 -3
- package/dist/core/database/sqlite-adapter.js.map +2 -2
- package/dist/core/errors/error-utils.js +208 -0
- package/dist/core/errors/error-utils.js.map +7 -0
- package/dist/core/errors/index.js +13 -4
- package/dist/core/errors/index.js.map +2 -2
- package/dist/core/merge/unified-merge-resolver.js +303 -0
- package/dist/core/merge/unified-merge-resolver.js.map +7 -0
- package/dist/core/monitoring/logger.js +61 -9
- package/dist/core/monitoring/logger.js.map +2 -2
- package/dist/core/security/index.js +35 -0
- package/dist/core/security/index.js.map +7 -0
- package/dist/core/security/input-sanitizer.js +321 -0
- package/dist/core/security/input-sanitizer.js.map +7 -0
- package/dist/core/session/enhanced-handoff.js +136 -2
- package/dist/core/session/enhanced-handoff.js.map +3 -3
- package/dist/integrations/linear/client.js +5 -1
- package/dist/integrations/linear/client.js.map +2 -2
- package/dist/integrations/mcp/remote-server.js +27 -36
- package/dist/integrations/mcp/remote-server.js.map +2 -2
- package/dist/integrations/mcp/server.js +44 -29
- package/dist/integrations/mcp/server.js.map +3 -3
- 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 +527 -0
- package/dist/src/agents/core/agent-task-manager.js.map +7 -0
- package/dist/src/agents/verifiers/base-verifier.js +133 -0
- package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/formatter-verifier.js +130 -0
- package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/llm-judge.js +252 -0
- package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
- package/dist/src/cli/auto-detect.js +321 -0
- package/dist/src/cli/auto-detect.js.map +7 -0
- package/dist/src/cli/claude-sm-danger.js +21 -0
- package/dist/src/cli/claude-sm-danger.js.map +7 -0
- package/dist/src/cli/claude-sm.js +1156 -0
- package/dist/src/cli/claude-sm.js.map +7 -0
- package/dist/src/cli/codex-sm-danger.js +21 -0
- package/dist/src/cli/codex-sm-danger.js.map +7 -0
- package/dist/src/cli/codex-sm.js +349 -0
- package/dist/src/cli/codex-sm.js.map +7 -0
- package/dist/src/cli/commands/api.js +232 -0
- package/dist/src/cli/commands/api.js.map +7 -0
- package/dist/src/cli/commands/auto-background.js +180 -0
- package/dist/src/cli/commands/auto-background.js.map +7 -0
- package/dist/src/cli/commands/cleanup-processes.js +68 -0
- package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
- package/dist/src/cli/commands/clear.js +202 -0
- package/dist/src/cli/commands/clear.js.map +7 -0
- package/dist/src/cli/commands/config.js +445 -0
- package/dist/src/cli/commands/config.js.map +7 -0
- package/dist/src/cli/commands/context-rehydrate.js +751 -0
- package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
- package/dist/src/cli/commands/context.js +343 -0
- package/dist/src/cli/commands/context.js.map +7 -0
- package/dist/src/cli/commands/daemon.js +392 -0
- package/dist/src/cli/commands/daemon.js.map +7 -0
- package/dist/src/cli/commands/dashboard.js +210 -0
- package/dist/src/cli/commands/dashboard.js.map +7 -0
- package/dist/src/cli/commands/db.js +147 -0
- package/dist/src/cli/commands/db.js.map +7 -0
- package/dist/src/cli/commands/decision.js +266 -0
- package/dist/src/cli/commands/decision.js.map +7 -0
- package/dist/src/cli/commands/discovery.js +279 -0
- package/dist/src/cli/commands/discovery.js.map +7 -0
- package/dist/src/cli/commands/handoff.js +624 -0
- package/dist/src/cli/commands/handoff.js.map +7 -0
- package/dist/src/cli/commands/hooks.js +298 -0
- package/dist/src/cli/commands/hooks.js.map +7 -0
- package/dist/src/cli/commands/linear.js +529 -0
- package/dist/src/cli/commands/linear.js.map +7 -0
- package/dist/src/cli/commands/log.js +169 -0
- package/dist/src/cli/commands/log.js.map +7 -0
- package/dist/src/cli/commands/login.js +172 -0
- package/dist/src/cli/commands/login.js.map +7 -0
- package/dist/src/cli/commands/migrate.js +240 -0
- package/dist/src/cli/commands/migrate.js.map +7 -0
- package/dist/src/cli/commands/model.js +533 -0
- package/dist/src/cli/commands/model.js.map +7 -0
- package/dist/src/cli/commands/onboard.js +536 -0
- package/dist/src/cli/commands/onboard.js.map +7 -0
- package/dist/src/cli/commands/projects.js +199 -0
- package/dist/src/cli/commands/projects.js.map +7 -0
- package/dist/src/cli/commands/ralph.js +909 -0
- package/dist/src/cli/commands/ralph.js.map +7 -0
- package/dist/src/cli/commands/retrieval.js +248 -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 +749 -0
- package/dist/src/cli/commands/service.js.map +7 -0
- package/dist/src/cli/commands/session.js +200 -0
- package/dist/src/cli/commands/session.js.map +7 -0
- package/dist/src/cli/commands/settings.js +306 -0
- package/dist/src/cli/commands/settings.js.map +7 -0
- package/dist/src/cli/commands/setup.js +701 -0
- package/dist/src/cli/commands/setup.js.map +7 -0
- package/dist/src/cli/commands/shell.js +249 -0
- package/dist/src/cli/commands/shell.js.map +7 -0
- package/dist/src/cli/commands/signup.js +50 -0
- package/dist/src/cli/commands/signup.js.map +7 -0
- package/dist/src/cli/commands/skills.js +470 -0
- package/dist/src/cli/commands/skills.js.map +7 -0
- package/dist/src/cli/commands/sms-notify.js +795 -0
- package/dist/src/cli/commands/sms-notify.js.map +7 -0
- package/dist/src/cli/commands/storage-tier.js +183 -0
- package/dist/src/cli/commands/storage-tier.js.map +7 -0
- package/dist/src/cli/commands/sweep.js +249 -0
- package/dist/src/cli/commands/sweep.js.map +7 -0
- package/dist/src/cli/commands/tasks.js +213 -0
- package/dist/src/cli/commands/tasks.js.map +7 -0
- package/dist/src/cli/commands/worktree.js +319 -0
- package/dist/src/cli/commands/worktree.js.map +7 -0
- package/dist/src/cli/index.js +594 -0
- package/dist/src/cli/index.js.map +7 -0
- package/dist/src/cli/opencode-sm.js +448 -0
- package/dist/src/cli/opencode-sm.js.map +7 -0
- package/dist/src/cli/utils/viewer.js +96 -0
- package/dist/src/cli/utils/viewer.js.map +7 -0
- package/dist/src/core/config/config-manager.js +398 -0
- package/dist/src/core/config/config-manager.js.map +7 -0
- package/dist/src/core/config/feature-flags.js +76 -0
- package/dist/src/core/config/feature-flags.js.map +7 -0
- package/dist/src/core/config/storage-config.js +115 -0
- package/dist/src/core/config/storage-config.js.map +7 -0
- package/dist/src/core/config/types.js +144 -0
- package/dist/src/core/config/types.js.map +7 -0
- package/dist/src/core/context/auto-context.js +80 -0
- package/dist/src/core/context/auto-context.js.map +7 -0
- package/dist/src/core/context/dual-stack-manager.js +870 -0
- package/dist/src/core/context/dual-stack-manager.js.map +7 -0
- package/dist/src/core/context/enhanced-rehydration.js +994 -0
- package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
- package/dist/src/core/context/frame-database.js +479 -0
- package/dist/src/core/context/frame-database.js.map +7 -0
- package/dist/src/core/context/frame-digest.js +250 -0
- package/dist/src/core/context/frame-digest.js.map +7 -0
- package/dist/src/core/context/frame-handoff-manager.js +778 -0
- package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js +119 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
- package/dist/src/core/context/frame-recovery.js +302 -0
- package/dist/src/core/context/frame-recovery.js.map +7 -0
- package/dist/src/core/context/frame-stack.js +314 -0
- package/dist/src/core/context/frame-stack.js.map +7 -0
- package/dist/src/core/context/frame-types.js +5 -0
- package/dist/src/core/context/frame-types.js.map +7 -0
- package/dist/src/core/context/index.js +25 -0
- package/dist/src/core/context/index.js.map +7 -0
- package/dist/src/core/context/permission-manager.js +185 -0
- package/dist/src/core/context/permission-manager.js.map +7 -0
- package/dist/src/core/context/recursive-context-manager.js +592 -0
- package/dist/src/core/context/recursive-context-manager.js.map +7 -0
- package/dist/src/core/context/refactored-frame-manager.js +754 -0
- package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
- package/dist/src/core/context/shared-context-layer.js +621 -0
- package/dist/src/core/context/shared-context-layer.js.map +7 -0
- package/dist/src/core/context/stack-merge-resolver.js +749 -0
- package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
- package/dist/src/core/context/validation.js +130 -0
- package/dist/src/core/context/validation.js.map +7 -0
- package/dist/src/core/database/batch-operations.js +384 -0
- package/dist/src/core/database/batch-operations.js.map +7 -0
- package/dist/src/core/database/connection-pool.js +330 -0
- package/dist/src/core/database/connection-pool.js.map +7 -0
- package/dist/src/core/database/database-adapter.js +60 -0
- package/dist/src/core/database/database-adapter.js.map +7 -0
- package/dist/src/core/database/migration-manager.js +614 -0
- package/dist/src/core/database/migration-manager.js.map +7 -0
- package/dist/src/core/database/query-cache.js +298 -0
- package/dist/src/core/database/query-cache.js.map +7 -0
- package/dist/src/core/database/query-router.js +430 -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 +277 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
- package/dist/src/core/digest/frame-digest-integration.js +176 -0
- package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
- package/dist/src/core/digest/hybrid-digest-generator.js +553 -0
- package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
- package/dist/src/core/digest/index.js +9 -0
- package/dist/src/core/digest/index.js.map +7 -0
- package/dist/src/core/digest/types.js +25 -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 +269 -0
- package/dist/src/core/errors/recovery.js.map +7 -0
- package/dist/src/core/execution/parallel-executor.js +258 -0
- package/dist/src/core/execution/parallel-executor.js.map +7 -0
- package/dist/src/core/frame/workflow-templates.js +319 -0
- package/dist/src/core/frame/workflow-templates.js.map +7 -0
- package/dist/src/core/merge/conflict-detector.js +431 -0
- package/dist/src/core/merge/conflict-detector.js.map +7 -0
- package/dist/src/core/merge/index.js +9 -0
- package/dist/src/core/merge/index.js.map +7 -0
- package/dist/src/core/merge/resolution-engine.js +558 -0
- package/dist/src/core/merge/resolution-engine.js.map +7 -0
- package/dist/src/core/merge/stack-diff.js +532 -0
- package/dist/src/core/merge/stack-diff.js.map +7 -0
- package/dist/src/core/merge/types.js +5 -0
- package/dist/src/core/merge/types.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 +232 -0
- package/dist/src/core/models/fallback-monitor.js.map +7 -0
- package/dist/src/core/models/model-router.js +340 -0
- package/dist/src/core/models/model-router.js.map +7 -0
- package/dist/src/core/monitoring/error-handler.js +49 -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 +172 -0
- package/dist/src/core/monitoring/metrics.js.map +7 -0
- package/dist/src/core/monitoring/progress-tracker.js +189 -0
- package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
- package/dist/src/core/monitoring/session-monitor.js +300 -0
- package/dist/src/core/monitoring/session-monitor.js.map +7 -0
- package/dist/src/core/performance/context-cache.js +273 -0
- package/dist/src/core/performance/context-cache.js.map +7 -0
- package/dist/src/core/performance/index.js +11 -0
- package/dist/src/core/performance/index.js.map +7 -0
- package/dist/src/core/performance/lazy-context-loader.js +327 -0
- package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
- package/dist/src/core/performance/monitor.js +221 -0
- package/dist/src/core/performance/monitor.js.map +7 -0
- package/dist/src/core/performance/optimized-frame-context.js +345 -0
- package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
- package/dist/src/core/performance/performance-benchmark.js +277 -0
- package/dist/src/core/performance/performance-benchmark.js.map +7 -0
- package/dist/src/core/performance/performance-profiler.js +370 -0
- package/dist/src/core/performance/performance-profiler.js.map +7 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js +195 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
- package/dist/src/core/persistence/postgres-adapter.js +349 -0
- package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
- package/dist/src/core/projects/project-isolation.js +201 -0
- package/dist/src/core/projects/project-isolation.js.map +7 -0
- package/dist/src/core/projects/project-manager.js +697 -0
- package/dist/src/core/projects/project-manager.js.map +7 -0
- package/dist/src/core/query/query-parser.js +370 -0
- package/dist/src/core/query/query-parser.js.map +7 -0
- package/dist/src/core/query/query-templates.js +321 -0
- package/dist/src/core/query/query-templates.js.map +7 -0
- package/dist/src/core/retrieval/context-retriever.js +479 -0
- package/dist/src/core/retrieval/context-retriever.js.map +7 -0
- package/dist/src/core/retrieval/index.js +8 -0
- package/dist/src/core/retrieval/index.js.map +7 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js +613 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
- package/dist/src/core/retrieval/llm-provider.js +151 -0
- package/dist/src/core/retrieval/llm-provider.js.map +7 -0
- package/dist/src/core/retrieval/retrieval-audit.js +236 -0
- package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
- package/dist/src/core/retrieval/summary-generator.js +589 -0
- package/dist/src/core/retrieval/summary-generator.js.map +7 -0
- package/dist/src/core/retrieval/types.js +21 -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 +465 -0
- package/dist/src/core/session/clear-survival.js.map +7 -0
- package/dist/src/core/session/enhanced-handoff.js +792 -0
- package/dist/src/core/session/enhanced-handoff.js.map +7 -0
- package/dist/src/core/session/handoff-generator.js +343 -0
- package/dist/src/core/session/handoff-generator.js.map +7 -0
- package/dist/src/core/session/index.js +15 -0
- package/dist/src/core/session/index.js.map +7 -0
- package/dist/src/core/session/session-manager.js +347 -0
- package/dist/src/core/session/session-manager.js.map +7 -0
- package/dist/src/core/skills/index.js +7 -0
- package/dist/src/core/skills/index.js.map +7 -0
- package/dist/src/core/skills/skill-storage.js +764 -0
- package/dist/src/core/skills/skill-storage.js.map +7 -0
- package/dist/src/core/skills/types.js +193 -0
- package/dist/src/core/skills/types.js.map +7 -0
- package/dist/src/core/storage/chromadb-adapter.js +354 -0
- package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
- package/dist/src/core/storage/infinite-storage.js +510 -0
- package/dist/src/core/storage/infinite-storage.js.map +7 -0
- package/dist/src/core/storage/remote-storage.js +489 -0
- package/dist/src/core/storage/remote-storage.js.map +7 -0
- package/dist/src/core/storage/two-tier-storage.js +766 -0
- package/dist/src/core/storage/two-tier-storage.js.map +7 -0
- package/dist/src/core/trace/cli-trace-wrapper.js +132 -0
- package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/db-trace-wrapper.js +247 -0
- package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/debug-trace.js +417 -0
- package/dist/src/core/trace/debug-trace.js.map +7 -0
- package/dist/src/core/trace/index.js +109 -0
- package/dist/src/core/trace/index.js.map +7 -0
- package/dist/src/core/trace/linear-api-wrapper.js +178 -0
- package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
- package/dist/src/core/trace/trace-detector.js +528 -0
- package/dist/src/core/trace/trace-detector.js.map +7 -0
- package/dist/src/core/trace/trace-store.js +345 -0
- package/dist/src/core/trace/trace-store.js.map +7 -0
- package/dist/src/core/trace/types.js +77 -0
- package/dist/src/core/trace/types.js.map +7 -0
- package/dist/src/core/types.js +5 -0
- package/dist/src/core/types.js.map +7 -0
- package/dist/src/core/utils/async-mutex.js +114 -0
- package/dist/src/core/utils/async-mutex.js.map +7 -0
- package/dist/src/core/utils/compression.js +83 -0
- package/dist/src/core/utils/compression.js.map +7 -0
- package/dist/src/core/utils/update-checker.js +218 -0
- package/dist/src/core/utils/update-checker.js.map +7 -0
- package/dist/src/core/worktree/worktree-manager.js +465 -0
- package/dist/src/core/worktree/worktree-manager.js.map +7 -0
- package/dist/src/daemon/daemon-config.js +149 -0
- package/dist/src/daemon/daemon-config.js.map +7 -0
- package/dist/src/daemon/services/context-service.js +122 -0
- package/dist/src/daemon/services/context-service.js.map +7 -0
- package/dist/src/daemon/services/linear-service.js +136 -0
- package/dist/src/daemon/services/linear-service.js.map +7 -0
- package/dist/src/daemon/session-daemon.js +312 -0
- package/dist/src/daemon/session-daemon.js.map +7 -0
- package/dist/src/daemon/unified-daemon.js +276 -0
- package/dist/src/daemon/unified-daemon.js.map +7 -0
- package/dist/src/features/analytics/api/analytics-api.js +287 -0
- package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
- package/dist/src/features/analytics/core/analytics-service.js +282 -0
- package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
- package/dist/src/features/analytics/index.js +18 -0
- package/dist/src/features/analytics/index.js.map +7 -0
- package/dist/src/features/analytics/queries/metrics-queries.js +277 -0
- package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
- package/dist/src/features/analytics/types/metrics.js +5 -0
- package/dist/src/features/analytics/types/metrics.js.map +7 -0
- package/dist/src/features/browser/browser-mcp.js +492 -0
- package/dist/src/features/browser/browser-mcp.js.map +7 -0
- package/dist/src/features/sweep/index.js +20 -0
- package/dist/src/features/sweep/index.js.map +7 -0
- package/dist/src/features/sweep/prediction-client.js +155 -0
- package/dist/src/features/sweep/prediction-client.js.map +7 -0
- package/dist/src/features/sweep/prompt-builder.js +85 -0
- package/dist/src/features/sweep/prompt-builder.js.map +7 -0
- package/dist/src/features/sweep/pty-wrapper.js +171 -0
- package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
- package/dist/src/features/sweep/state-watcher.js +87 -0
- package/dist/src/features/sweep/state-watcher.js.map +7 -0
- package/dist/src/features/sweep/status-bar.js +88 -0
- package/dist/src/features/sweep/status-bar.js.map +7 -0
- package/dist/src/features/sweep/sweep-server-manager.js +226 -0
- package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
- package/dist/src/features/sweep/tab-interceptor.js +38 -0
- package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
- package/dist/src/features/sweep/types.js +18 -0
- package/dist/src/features/sweep/types.js.map +7 -0
- package/dist/src/features/tasks/linear-task-manager.js +487 -0
- package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
- package/dist/src/features/tasks/task-aware-context.js +410 -0
- package/dist/src/features/tasks/task-aware-context.js.map +7 -0
- package/dist/src/features/tui/simple-monitor.js +116 -0
- package/dist/src/features/tui/simple-monitor.js.map +7 -0
- package/dist/src/features/tui/swarm-monitor.js +648 -0
- package/dist/src/features/tui/swarm-monitor.js.map +7 -0
- package/dist/src/features/web/client/stores/task-store.js +26 -0
- package/dist/src/features/web/client/stores/task-store.js.map +7 -0
- package/dist/src/features/web/server/index.js +194 -0
- package/dist/src/features/web/server/index.js.map +7 -0
- package/dist/src/hooks/auto-background.js +151 -0
- package/dist/src/hooks/auto-background.js.map +7 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js +197 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
- package/dist/src/hooks/config.js +150 -0
- package/dist/src/hooks/config.js.map +7 -0
- package/dist/src/hooks/daemon.js +364 -0
- package/dist/src/hooks/daemon.js.map +7 -0
- package/dist/src/hooks/events.js +58 -0
- package/dist/src/hooks/events.js.map +7 -0
- package/dist/src/hooks/index.js +12 -0
- package/dist/src/hooks/index.js.map +7 -0
- package/dist/src/hooks/linear-task-picker.js +186 -0
- package/dist/src/hooks/linear-task-picker.js.map +7 -0
- package/dist/src/hooks/schemas.js +197 -0
- package/dist/src/hooks/schemas.js.map +7 -0
- package/dist/src/hooks/secure-fs.js +49 -0
- package/dist/src/hooks/secure-fs.js.map +7 -0
- package/dist/src/hooks/security-logger.js +155 -0
- package/dist/src/hooks/security-logger.js.map +7 -0
- package/dist/src/hooks/session-summary.js +222 -0
- package/dist/src/hooks/session-summary.js.map +7 -0
- package/dist/src/hooks/sms-action-runner.js +371 -0
- package/dist/src/hooks/sms-action-runner.js.map +7 -0
- package/dist/src/hooks/sms-notify.js +506 -0
- package/dist/src/hooks/sms-notify.js.map +7 -0
- package/dist/src/hooks/sms-watcher.js +93 -0
- package/dist/src/hooks/sms-watcher.js.map +7 -0
- package/dist/src/hooks/sms-webhook.js +555 -0
- package/dist/src/hooks/sms-webhook.js.map +7 -0
- package/dist/src/hooks/whatsapp-commands.js +479 -0
- package/dist/src/hooks/whatsapp-commands.js.map +7 -0
- package/dist/src/hooks/whatsapp-scheduler.js +317 -0
- package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
- package/dist/src/hooks/whatsapp-sync.js +409 -0
- package/dist/src/hooks/whatsapp-sync.js.map +7 -0
- package/dist/src/index.js +25 -0
- package/dist/src/index.js.map +7 -0
- package/dist/src/integrations/anthropic/client.js +263 -0
- package/dist/src/integrations/anthropic/client.js.map +7 -0
- package/dist/src/integrations/claude-code/agent-bridge.js +768 -0
- package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +459 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js +254 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js +545 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js +20 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client.js +511 -0
- package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
- package/dist/src/integrations/claude-code/task-coordinator.js +360 -0
- package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
- package/dist/src/integrations/linear/auth.js +337 -0
- package/dist/src/integrations/linear/auth.js.map +7 -0
- package/dist/src/integrations/linear/auto-sync.js +258 -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 +130 -0
- package/dist/src/integrations/linear/config.js.map +7 -0
- package/dist/src/integrations/linear/migration.js +361 -0
- package/dist/src/integrations/linear/migration.js.map +7 -0
- package/dist/src/integrations/linear/oauth-server.js +454 -0
- package/dist/src/integrations/linear/oauth-server.js.map +7 -0
- package/dist/src/integrations/linear/rest-client.js +213 -0
- package/dist/src/integrations/linear/rest-client.js.map +7 -0
- package/dist/src/integrations/linear/sync-manager.js +236 -0
- package/dist/src/integrations/linear/sync-manager.js.map +7 -0
- package/dist/src/integrations/linear/sync-service.js +231 -0
- package/dist/src/integrations/linear/sync-service.js.map +7 -0
- package/dist/src/integrations/linear/sync.js +782 -0
- package/dist/src/integrations/linear/sync.js.map +7 -0
- package/dist/src/integrations/linear/types.js +5 -0
- package/dist/src/integrations/linear/types.js.map +7 -0
- package/dist/src/integrations/linear/unified-sync.js +589 -0
- package/dist/src/integrations/linear/unified-sync.js.map +7 -0
- package/dist/src/integrations/linear/webhook-handler.js +219 -0
- package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
- package/dist/src/integrations/linear/webhook-server.js +218 -0
- package/dist/src/integrations/linear/webhook-server.js.map +7 -0
- package/dist/src/integrations/linear/webhook.js +291 -0
- package/dist/src/integrations/linear/webhook.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +266 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js +257 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js +497 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/index.js +166 -0
- package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js +247 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js +529 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js +239 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js +308 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/index.js +23 -0
- package/dist/src/integrations/mcp/index.js.map +7 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js +356 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
- package/dist/src/integrations/mcp/refactored-server.js +374 -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 +147 -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 +125 -0
- package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions.js +702 -0
- package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +860 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js +301 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +360 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +410 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
- package/dist/src/integrations/ralph/index.js +18 -0
- package/dist/src/integrations/ralph/index.js.map +7 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js +401 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +448 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +294 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js +108 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +463 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +400 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +473 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +388 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js +358 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js +462 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js +404 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +428 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +996 -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/types.js.map +7 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js +585 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
- package/dist/src/mcp/stackmemory-mcp-server.js +554 -0
- package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
- package/dist/src/middleware/exponential-rate-limiter.js +289 -0
- package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
- package/dist/src/models/user.model.js +358 -0
- package/dist/src/models/user.model.js.map +7 -0
- package/dist/src/servers/production/auth-middleware.js +528 -0
- package/dist/src/servers/production/auth-middleware.js.map +7 -0
- package/dist/src/services/config-service.js +65 -0
- package/dist/src/services/config-service.js.map +7 -0
- package/dist/src/services/context-service.js +194 -0
- package/dist/src/services/context-service.js.map +7 -0
- package/dist/src/skills/api-discovery.js +354 -0
- package/dist/src/skills/api-discovery.js.map +7 -0
- package/dist/src/skills/api-skill.js +475 -0
- package/dist/src/skills/api-skill.js.map +7 -0
- package/dist/src/skills/claude-skills.js +1061 -0
- package/dist/src/skills/claude-skills.js.map +7 -0
- package/dist/src/skills/dashboard-launcher.js +216 -0
- package/dist/src/skills/dashboard-launcher.js.map +7 -0
- package/dist/src/skills/recursive-agent-orchestrator.js +575 -0
- package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
- package/dist/src/skills/repo-ingestion-skill.js +609 -0
- package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
- package/dist/src/skills/unified-rlm-orchestrator.js +404 -0
- package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
- package/dist/src/types/task.js +5 -0
- package/dist/src/types/task.js.map +7 -0
- package/dist/src/utils/env.js +50 -0
- package/dist/src/utils/env.js.map +7 -0
- package/dist/src/utils/formatting.js +62 -0
- package/dist/src/utils/formatting.js.map +7 -0
- package/dist/src/utils/process-cleanup.js +136 -0
- package/dist/src/utils/process-cleanup.js.map +7 -0
- package/package.json +4 -3
- package/scripts/create-cleanup-issues.js +302 -0
- package/scripts/demos/browser-test.ts +39 -0
- package/scripts/demos/ralph-integration-demo.ts +244 -0
- package/scripts/demos/trace-demo.ts +214 -0
- package/scripts/demos/trace-detector.demo.ts +171 -0
- package/scripts/demos/trace-test.ts +67 -0
- package/scripts/initialize.ts +16 -7
- package/scripts/install.sh +14 -62
- package/scripts/status.ts +111 -46
- package/scripts/test-claude-config.sh +123 -0
- package/scripts/validate-claude-config.sh +155 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
3
|
+
import { dirname as __pathDirname } from 'path';
|
|
4
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = __pathDirname(__filename);
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
7
|
+
import { join } from "path";
|
|
8
|
+
import { homedir } from "os";
|
|
9
|
+
import { sendNotification, loadSMSConfig } from "./sms-notify.js";
|
|
10
|
+
import {
|
|
11
|
+
getFrameDigestData,
|
|
12
|
+
generateMobileDigest,
|
|
13
|
+
loadSyncOptions
|
|
14
|
+
} from "./whatsapp-sync.js";
|
|
15
|
+
const STACKMEMORY_DIR = join(homedir(), ".stackmemory");
|
|
16
|
+
const INCOMING_REQUEST_PATH = join(
|
|
17
|
+
STACKMEMORY_DIR,
|
|
18
|
+
"sms-incoming-request.json"
|
|
19
|
+
);
|
|
20
|
+
const LATEST_RESPONSE_PATH = join(STACKMEMORY_DIR, "sms-latest-response.json");
|
|
21
|
+
const HOOK_STATE_PATH = join(STACKMEMORY_DIR, "claude-hook-state.json");
|
|
22
|
+
function loadHookState() {
|
|
23
|
+
try {
|
|
24
|
+
if (existsSync(HOOK_STATE_PATH)) {
|
|
25
|
+
return JSON.parse(readFileSync(HOOK_STATE_PATH, "utf8"));
|
|
26
|
+
}
|
|
27
|
+
} catch {
|
|
28
|
+
}
|
|
29
|
+
return { toolCount: 0, significantChanges: false };
|
|
30
|
+
}
|
|
31
|
+
function saveHookState(state) {
|
|
32
|
+
try {
|
|
33
|
+
writeFileSync(HOOK_STATE_PATH, JSON.stringify(state, null, 2));
|
|
34
|
+
} catch {
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function checkIncomingRequests() {
|
|
38
|
+
try {
|
|
39
|
+
if (!existsSync(INCOMING_REQUEST_PATH)) return null;
|
|
40
|
+
const data = JSON.parse(
|
|
41
|
+
readFileSync(INCOMING_REQUEST_PATH, "utf8")
|
|
42
|
+
);
|
|
43
|
+
if (data.processed) return null;
|
|
44
|
+
return data;
|
|
45
|
+
} catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function markRequestProcessed() {
|
|
50
|
+
try {
|
|
51
|
+
if (!existsSync(INCOMING_REQUEST_PATH)) return;
|
|
52
|
+
const data = JSON.parse(readFileSync(INCOMING_REQUEST_PATH, "utf8"));
|
|
53
|
+
data.processed = true;
|
|
54
|
+
writeFileSync(INCOMING_REQUEST_PATH, JSON.stringify(data, null, 2));
|
|
55
|
+
} catch {
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function getLatestResponse() {
|
|
59
|
+
try {
|
|
60
|
+
if (!existsSync(LATEST_RESPONSE_PATH)) return null;
|
|
61
|
+
return JSON.parse(readFileSync(LATEST_RESPONSE_PATH, "utf8"));
|
|
62
|
+
} catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function sendDigest() {
|
|
67
|
+
const data = await getFrameDigestData();
|
|
68
|
+
if (!data) return;
|
|
69
|
+
const options = loadSyncOptions();
|
|
70
|
+
const digest = generateMobileDigest(data, options);
|
|
71
|
+
await sendNotification({
|
|
72
|
+
type: "context_sync",
|
|
73
|
+
title: "Context Update",
|
|
74
|
+
message: digest
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
async function handlePreToolUse() {
|
|
78
|
+
const state = loadHookState();
|
|
79
|
+
state.toolCount++;
|
|
80
|
+
if (state.toolCount % 5 === 0) {
|
|
81
|
+
const incoming = checkIncomingRequests();
|
|
82
|
+
if (incoming) {
|
|
83
|
+
console.error(`
|
|
84
|
+
[WhatsApp] Message from ${incoming.from}:`);
|
|
85
|
+
console.error(` "${incoming.message}"`);
|
|
86
|
+
console.error(` (Received at ${incoming.timestamp})
|
|
87
|
+
`);
|
|
88
|
+
markRequestProcessed();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
saveHookState(state);
|
|
92
|
+
}
|
|
93
|
+
async function handleStop() {
|
|
94
|
+
const config = loadSMSConfig();
|
|
95
|
+
if (!config.enabled) return;
|
|
96
|
+
const state = loadHookState();
|
|
97
|
+
console.error(`[WhatsApp] Session ended after ${state.toolCount} tool calls`);
|
|
98
|
+
try {
|
|
99
|
+
await sendDigest();
|
|
100
|
+
console.error("[WhatsApp] Session digest sent");
|
|
101
|
+
} catch (err) {
|
|
102
|
+
console.error("[WhatsApp] Failed to send digest:", err);
|
|
103
|
+
}
|
|
104
|
+
saveHookState({ toolCount: 0, significantChanges: false });
|
|
105
|
+
}
|
|
106
|
+
async function handleNotification(input) {
|
|
107
|
+
if (input.includes("[notify]") || input.includes("[whatsapp]")) {
|
|
108
|
+
const message = input.replace(/\[notify\]|\[whatsapp\]/gi, "").trim();
|
|
109
|
+
await sendNotification({
|
|
110
|
+
type: "custom",
|
|
111
|
+
title: "Claude",
|
|
112
|
+
message: message.slice(0, 300)
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async function pollForResponse(timeoutMs = 6e4) {
|
|
117
|
+
const startTime = Date.now();
|
|
118
|
+
const pollInterval = 2e3;
|
|
119
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
120
|
+
const response = getLatestResponse();
|
|
121
|
+
if (response) {
|
|
122
|
+
const responseAge = Date.now() - new Date(response.timestamp).getTime();
|
|
123
|
+
if (responseAge < 5e3) {
|
|
124
|
+
return response.response;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
async function askViaWhatsApp(question, options) {
|
|
132
|
+
const config = loadSMSConfig();
|
|
133
|
+
if (!config.enabled) {
|
|
134
|
+
console.error("[WhatsApp] Notifications not enabled");
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
await sendNotification({
|
|
138
|
+
type: "custom",
|
|
139
|
+
title: "Claude Question",
|
|
140
|
+
message: question,
|
|
141
|
+
prompt: options ? {
|
|
142
|
+
type: "options",
|
|
143
|
+
options: options.map((o) => ({ ...o, action: o.key }))
|
|
144
|
+
} : void 0
|
|
145
|
+
});
|
|
146
|
+
return pollForResponse(12e4);
|
|
147
|
+
}
|
|
148
|
+
async function main() {
|
|
149
|
+
const args = process.argv.slice(2);
|
|
150
|
+
const hookType = args[0];
|
|
151
|
+
let input = "";
|
|
152
|
+
if (!process.stdin.isTTY) {
|
|
153
|
+
input = readFileSync(0, "utf8");
|
|
154
|
+
}
|
|
155
|
+
switch (hookType) {
|
|
156
|
+
case "pre-tool":
|
|
157
|
+
case "PreToolUse":
|
|
158
|
+
await handlePreToolUse();
|
|
159
|
+
break;
|
|
160
|
+
case "stop":
|
|
161
|
+
case "Stop":
|
|
162
|
+
await handleStop();
|
|
163
|
+
break;
|
|
164
|
+
case "notification":
|
|
165
|
+
case "Notification":
|
|
166
|
+
await handleNotification(input);
|
|
167
|
+
break;
|
|
168
|
+
case "check":
|
|
169
|
+
const incoming = checkIncomingRequests();
|
|
170
|
+
if (incoming) {
|
|
171
|
+
console.log(JSON.stringify(incoming));
|
|
172
|
+
}
|
|
173
|
+
break;
|
|
174
|
+
case "send-digest":
|
|
175
|
+
await sendDigest();
|
|
176
|
+
break;
|
|
177
|
+
case "poll":
|
|
178
|
+
const response = await pollForResponse(parseInt(args[1] || "60000", 10));
|
|
179
|
+
if (response) {
|
|
180
|
+
console.log(response);
|
|
181
|
+
}
|
|
182
|
+
break;
|
|
183
|
+
default:
|
|
184
|
+
console.error("Usage: claude-code-whatsapp-hook.js <hook-type>");
|
|
185
|
+
console.error(
|
|
186
|
+
"Hook types: pre-tool, stop, notification, check, send-digest, poll"
|
|
187
|
+
);
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (process.argv[1]?.includes("claude-code-whatsapp-hook")) {
|
|
192
|
+
main().catch(console.error);
|
|
193
|
+
}
|
|
194
|
+
export {
|
|
195
|
+
askViaWhatsApp
|
|
196
|
+
};
|
|
197
|
+
//# sourceMappingURL=claude-code-whatsapp-hook.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/hooks/claude-code-whatsapp-hook.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n/**\n * Claude Code WhatsApp Hook\n * Automatically integrates WhatsApp messages into Claude Code sessions\n *\n * Installation:\n * Add to ~/.claude/settings.json under \"hooks\":\n * {\n * \"hooks\": {\n * \"Stop\": [\"node\", \"/path/to/claude-code-whatsapp-hook.js\", \"stop\"],\n * \"PreToolUse\": [\"node\", \"/path/to/claude-code-whatsapp-hook.js\", \"pre-tool\"]\n * }\n * }\n *\n * Or add to ~/.claude/hooks/ directory\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { sendNotification, loadSMSConfig } from './sms-notify.js';\nimport {\n getFrameDigestData,\n generateMobileDigest,\n loadSyncOptions,\n} from './whatsapp-sync.js';\n\nconst STACKMEMORY_DIR = join(homedir(), '.stackmemory');\nconst INCOMING_REQUEST_PATH = join(\n STACKMEMORY_DIR,\n 'sms-incoming-request.json'\n);\nconst LATEST_RESPONSE_PATH = join(STACKMEMORY_DIR, 'sms-latest-response.json');\nconst HOOK_STATE_PATH = join(STACKMEMORY_DIR, 'claude-hook-state.json');\n\ninterface HookState {\n sessionId?: string;\n lastCheckedAt?: string;\n lastDigestSentAt?: string;\n toolCount: number;\n significantChanges: boolean;\n}\n\ninterface IncomingRequest {\n from: string;\n message: string;\n timestamp: string;\n processed: boolean;\n}\n\n/**\n * Load hook state\n */\nfunction loadHookState(): HookState {\n try {\n if (existsSync(HOOK_STATE_PATH)) {\n return JSON.parse(readFileSync(HOOK_STATE_PATH, 'utf8'));\n }\n } catch {\n // Use defaults\n }\n return { toolCount: 0, significantChanges: false };\n}\n\n/**\n * Save hook state\n */\nfunction saveHookState(state: HookState): void {\n try {\n writeFileSync(HOOK_STATE_PATH, JSON.stringify(state, null, 2));\n } catch {\n // Ignore\n }\n}\n\n/**\n * Check for incoming WhatsApp requests\n */\nfunction checkIncomingRequests(): IncomingRequest | null {\n try {\n if (!existsSync(INCOMING_REQUEST_PATH)) return null;\n\n const data: IncomingRequest = JSON.parse(\n readFileSync(INCOMING_REQUEST_PATH, 'utf8')\n );\n if (data.processed) return null;\n\n return data;\n } catch {\n return null;\n }\n}\n\n/**\n * Mark incoming request as processed\n */\nfunction markRequestProcessed(): void {\n try {\n if (!existsSync(INCOMING_REQUEST_PATH)) return;\n\n const data = JSON.parse(readFileSync(INCOMING_REQUEST_PATH, 'utf8'));\n data.processed = true;\n writeFileSync(INCOMING_REQUEST_PATH, JSON.stringify(data, null, 2));\n } catch {\n // Ignore\n }\n}\n\n/**\n * Get latest response from file\n */\nfunction getLatestResponse(): {\n promptId: string;\n response: string;\n timestamp: string;\n} | null {\n try {\n if (!existsSync(LATEST_RESPONSE_PATH)) return null;\n return JSON.parse(readFileSync(LATEST_RESPONSE_PATH, 'utf8'));\n } catch {\n return null;\n }\n}\n\n/**\n * Send context digest to WhatsApp\n */\nasync function sendDigest(): Promise<void> {\n const data = await getFrameDigestData();\n if (!data) return;\n\n const options = loadSyncOptions();\n const digest = generateMobileDigest(data, options);\n\n await sendNotification({\n type: 'context_sync',\n title: 'Context Update',\n message: digest,\n });\n}\n\n/**\n * Handle PreToolUse hook - check for incoming messages\n */\nasync function handlePreToolUse(): Promise<void> {\n const state = loadHookState();\n state.toolCount++;\n\n // Check for incoming WhatsApp messages every 5 tool uses\n if (state.toolCount % 5 === 0) {\n const incoming = checkIncomingRequests();\n if (incoming) {\n // Print to stderr so Claude sees it\n console.error(`\\n[WhatsApp] Message from ${incoming.from}:`);\n console.error(` \"${incoming.message}\"`);\n console.error(` (Received at ${incoming.timestamp})\\n`);\n\n // Mark as processed\n markRequestProcessed();\n }\n }\n\n saveHookState(state);\n}\n\n/**\n * Handle Stop hook - send session summary to WhatsApp\n */\nasync function handleStop(): Promise<void> {\n const config = loadSMSConfig();\n if (!config.enabled) return;\n\n // Load state for logging\n const state = loadHookState();\n console.error(`[WhatsApp] Session ended after ${state.toolCount} tool calls`);\n\n // Send final digest\n try {\n await sendDigest();\n console.error('[WhatsApp] Session digest sent');\n } catch (err) {\n console.error('[WhatsApp] Failed to send digest:', err);\n }\n\n // Reset state\n saveHookState({ toolCount: 0, significantChanges: false });\n}\n\n/**\n * Handle Notification hook - relay Claude's output to WhatsApp if requested\n */\nasync function handleNotification(input: string): Promise<void> {\n // Check if user requested WhatsApp notification\n if (input.includes('[notify]') || input.includes('[whatsapp]')) {\n const message = input.replace(/\\[notify\\]|\\[whatsapp\\]/gi, '').trim();\n\n await sendNotification({\n type: 'custom',\n title: 'Claude',\n message: message.slice(0, 300),\n });\n }\n}\n\n/**\n * Poll for WhatsApp responses (for long-running tasks)\n */\nasync function pollForResponse(\n timeoutMs: number = 60000\n): Promise<string | null> {\n const startTime = Date.now();\n const pollInterval = 2000;\n\n while (Date.now() - startTime < timeoutMs) {\n const response = getLatestResponse();\n if (response) {\n const responseAge = Date.now() - new Date(response.timestamp).getTime();\n if (responseAge < 5000) {\n // Fresh response (within 5 seconds)\n return response.response;\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n return null;\n}\n\n/**\n * Send a prompt to WhatsApp and wait for response\n */\nexport async function askViaWhatsApp(\n question: string,\n options?: { key: string; label: string }[]\n): Promise<string | null> {\n const config = loadSMSConfig();\n if (!config.enabled) {\n console.error('[WhatsApp] Notifications not enabled');\n return null;\n }\n\n // Send the question\n await sendNotification({\n type: 'custom',\n title: 'Claude Question',\n message: question,\n prompt: options\n ? {\n type: 'options',\n options: options.map((o) => ({ ...o, action: o.key })),\n }\n : undefined,\n });\n\n // Wait for response\n return pollForResponse(120000); // 2 minute timeout\n}\n\n/**\n * Main entry point\n */\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const hookType = args[0];\n\n // Read stdin for hook input\n let input = '';\n if (!process.stdin.isTTY) {\n input = readFileSync(0, 'utf8');\n }\n\n switch (hookType) {\n case 'pre-tool':\n case 'PreToolUse':\n await handlePreToolUse();\n break;\n\n case 'stop':\n case 'Stop':\n await handleStop();\n break;\n\n case 'notification':\n case 'Notification':\n await handleNotification(input);\n break;\n\n case 'check':\n // Just check for incoming messages\n const incoming = checkIncomingRequests();\n if (incoming) {\n console.log(JSON.stringify(incoming));\n }\n break;\n\n case 'send-digest':\n await sendDigest();\n break;\n\n case 'poll':\n const response = await pollForResponse(parseInt(args[1] || '60000', 10));\n if (response) {\n console.log(response);\n }\n break;\n\n default:\n console.error('Usage: claude-code-whatsapp-hook.js <hook-type>');\n console.error(\n 'Hook types: pre-tool, stop, notification, check, send-digest, poll'\n );\n process.exit(1);\n }\n}\n\n// Run if called directly\nif (process.argv[1]?.includes('claude-code-whatsapp-hook')) {\n main().catch(console.error);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __pathDirname(__filename);
|
|
5
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
6
|
+
import { join, dirname } from "path";
|
|
7
|
+
const DEFAULT_CONFIG = {
|
|
8
|
+
version: "1.0.0",
|
|
9
|
+
daemon: {
|
|
10
|
+
enabled: true,
|
|
11
|
+
log_level: "info",
|
|
12
|
+
pid_file: join(process.env.HOME || "/tmp", ".stackmemory", "hooks.pid"),
|
|
13
|
+
log_file: join(process.env.HOME || "/tmp", ".stackmemory", "hooks.log")
|
|
14
|
+
},
|
|
15
|
+
file_watch: {
|
|
16
|
+
enabled: true,
|
|
17
|
+
paths: ["."],
|
|
18
|
+
ignore: ["node_modules", ".git", "dist", "build", ".next", "__pycache__"],
|
|
19
|
+
extensions: [".ts", ".tsx", ".js", ".jsx", ".py", ".go", ".rs", ".java"]
|
|
20
|
+
},
|
|
21
|
+
hooks: {
|
|
22
|
+
file_change: {
|
|
23
|
+
enabled: true,
|
|
24
|
+
handler: "sweep-predict",
|
|
25
|
+
output: "log",
|
|
26
|
+
debounce_ms: 2e3,
|
|
27
|
+
cooldown_ms: 1e4
|
|
28
|
+
},
|
|
29
|
+
session_start: {
|
|
30
|
+
enabled: true,
|
|
31
|
+
handler: "context-load",
|
|
32
|
+
output: "silent"
|
|
33
|
+
},
|
|
34
|
+
suggestion_ready: {
|
|
35
|
+
enabled: true,
|
|
36
|
+
handler: "display-suggestion",
|
|
37
|
+
output: "overlay"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
function getConfigPath() {
|
|
42
|
+
return join(process.env.HOME || "/tmp", ".stackmemory", "hooks.yaml");
|
|
43
|
+
}
|
|
44
|
+
function loadConfig() {
|
|
45
|
+
const configPath = getConfigPath();
|
|
46
|
+
if (!existsSync(configPath)) {
|
|
47
|
+
return DEFAULT_CONFIG;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const content = readFileSync(configPath, "utf-8");
|
|
51
|
+
const parsed = parseYaml(content);
|
|
52
|
+
return mergeConfig(DEFAULT_CONFIG, parsed);
|
|
53
|
+
} catch {
|
|
54
|
+
return DEFAULT_CONFIG;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function saveConfig(config) {
|
|
58
|
+
const configPath = getConfigPath();
|
|
59
|
+
const dir = dirname(configPath);
|
|
60
|
+
if (!existsSync(dir)) {
|
|
61
|
+
mkdirSync(dir, { recursive: true });
|
|
62
|
+
}
|
|
63
|
+
const yaml = toYaml(config);
|
|
64
|
+
writeFileSync(configPath, yaml);
|
|
65
|
+
}
|
|
66
|
+
function initConfig() {
|
|
67
|
+
const configPath = getConfigPath();
|
|
68
|
+
if (existsSync(configPath)) {
|
|
69
|
+
return loadConfig();
|
|
70
|
+
}
|
|
71
|
+
saveConfig(DEFAULT_CONFIG);
|
|
72
|
+
return DEFAULT_CONFIG;
|
|
73
|
+
}
|
|
74
|
+
function parseYaml(content) {
|
|
75
|
+
const result = {};
|
|
76
|
+
const lines = content.split("\n");
|
|
77
|
+
const stack = [
|
|
78
|
+
{ indent: -1, obj: result }
|
|
79
|
+
];
|
|
80
|
+
for (const line of lines) {
|
|
81
|
+
if (!line.trim() || line.trim().startsWith("#")) continue;
|
|
82
|
+
const indent = line.search(/\S/);
|
|
83
|
+
const trimmed = line.trim();
|
|
84
|
+
while (stack.length > 1 && stack[stack.length - 1].indent >= indent) {
|
|
85
|
+
stack.pop();
|
|
86
|
+
}
|
|
87
|
+
const colonIdx = trimmed.indexOf(":");
|
|
88
|
+
if (colonIdx === -1) continue;
|
|
89
|
+
const key = trimmed.slice(0, colonIdx).trim();
|
|
90
|
+
const value = trimmed.slice(colonIdx + 1).trim();
|
|
91
|
+
const current = stack[stack.length - 1].obj;
|
|
92
|
+
if (value === "" || value === "|") {
|
|
93
|
+
current[key] = {};
|
|
94
|
+
stack.push({ indent, obj: current[key] });
|
|
95
|
+
} else if (value.startsWith("[") && value.endsWith("]")) {
|
|
96
|
+
current[key] = value.slice(1, -1).split(",").map((s) => s.trim().replace(/['"]/g, ""));
|
|
97
|
+
} else if (value === "true") {
|
|
98
|
+
current[key] = true;
|
|
99
|
+
} else if (value === "false") {
|
|
100
|
+
current[key] = false;
|
|
101
|
+
} else if (/^\d+$/.test(value)) {
|
|
102
|
+
current[key] = parseInt(value, 10);
|
|
103
|
+
} else {
|
|
104
|
+
current[key] = value.replace(/['"]/g, "");
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
function toYaml(obj, indent = 0) {
|
|
110
|
+
const spaces = " ".repeat(indent);
|
|
111
|
+
let result = "";
|
|
112
|
+
if (Array.isArray(obj)) {
|
|
113
|
+
result += `[${obj.map((v) => typeof v === "string" ? `'${v}'` : v).join(", ")}]
|
|
114
|
+
`;
|
|
115
|
+
} else if (typeof obj === "object" && obj !== null) {
|
|
116
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
117
|
+
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
|
118
|
+
result += `${spaces}${key}:
|
|
119
|
+
${toYaml(value, indent + 1)}`;
|
|
120
|
+
} else {
|
|
121
|
+
result += `${spaces}${key}: ${toYaml(value, indent)}`;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
} else if (typeof obj === "string") {
|
|
125
|
+
result += `${obj}
|
|
126
|
+
`;
|
|
127
|
+
} else if (typeof obj === "boolean" || typeof obj === "number") {
|
|
128
|
+
result += `${obj}
|
|
129
|
+
`;
|
|
130
|
+
} else {
|
|
131
|
+
result += "\n";
|
|
132
|
+
}
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
function mergeConfig(defaults, overrides) {
|
|
136
|
+
return {
|
|
137
|
+
...defaults,
|
|
138
|
+
...overrides,
|
|
139
|
+
daemon: { ...defaults.daemon, ...overrides.daemon || {} },
|
|
140
|
+
file_watch: { ...defaults.file_watch, ...overrides.file_watch || {} },
|
|
141
|
+
hooks: { ...defaults.hooks, ...overrides.hooks || {} }
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
export {
|
|
145
|
+
getConfigPath,
|
|
146
|
+
initConfig,
|
|
147
|
+
loadConfig,
|
|
148
|
+
saveConfig
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/hooks/config.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * StackMemory Hook Configuration\n * Loads and manages hook configuration\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { HookEventType } from './events.js';\n\nexport type OutputType =\n | 'overlay'\n | 'notification'\n | 'log'\n | 'prepend'\n | 'silent';\n\nexport interface HookConfig {\n enabled: boolean;\n handler: string;\n output: OutputType;\n delay_ms?: number;\n debounce_ms?: number;\n cooldown_ms?: number;\n options?: Record<string, unknown>;\n}\n\nexport interface HooksConfig {\n version: string;\n daemon: {\n enabled: boolean;\n log_level: 'debug' | 'info' | 'warn' | 'error';\n pid_file: string;\n log_file: string;\n };\n file_watch: {\n enabled: boolean;\n paths: string[];\n ignore: string[];\n extensions: string[];\n };\n hooks: Partial<Record<HookEventType, HookConfig>>;\n}\n\nconst DEFAULT_CONFIG: HooksConfig = {\n version: '1.0.0',\n daemon: {\n enabled: true,\n log_level: 'info',\n pid_file: join(process.env.HOME || '/tmp', '.stackmemory', 'hooks.pid'),\n log_file: join(process.env.HOME || '/tmp', '.stackmemory', 'hooks.log'),\n },\n file_watch: {\n enabled: true,\n paths: ['.'],\n ignore: ['node_modules', '.git', 'dist', 'build', '.next', '__pycache__'],\n extensions: ['.ts', '.tsx', '.js', '.jsx', '.py', '.go', '.rs', '.java'],\n },\n hooks: {\n file_change: {\n enabled: true,\n handler: 'sweep-predict',\n output: 'log',\n debounce_ms: 2000,\n cooldown_ms: 10000,\n },\n session_start: {\n enabled: true,\n handler: 'context-load',\n output: 'silent',\n },\n suggestion_ready: {\n enabled: true,\n handler: 'display-suggestion',\n output: 'overlay',\n },\n },\n};\n\nexport function getConfigPath(): string {\n return join(process.env.HOME || '/tmp', '.stackmemory', 'hooks.yaml');\n}\n\nexport function loadConfig(): HooksConfig {\n const configPath = getConfigPath();\n\n if (!existsSync(configPath)) {\n return DEFAULT_CONFIG;\n }\n\n try {\n const content = readFileSync(configPath, 'utf-8');\n const parsed = parseYaml(content);\n return mergeConfig(DEFAULT_CONFIG, parsed);\n } catch {\n return DEFAULT_CONFIG;\n }\n}\n\nexport function saveConfig(config: HooksConfig): void {\n const configPath = getConfigPath();\n const dir = dirname(configPath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const yaml = toYaml(config);\n writeFileSync(configPath, yaml);\n}\n\nexport function initConfig(): HooksConfig {\n const configPath = getConfigPath();\n\n if (existsSync(configPath)) {\n return loadConfig();\n }\n\n saveConfig(DEFAULT_CONFIG);\n return DEFAULT_CONFIG;\n}\n\nfunction parseYaml(content: string): Partial<HooksConfig> {\n const result: Record<string, unknown> = {};\n const lines = content.split('\\n');\n const stack: { indent: number; obj: Record<string, unknown> }[] = [\n { indent: -1, obj: result },\n ];\n\n for (const line of lines) {\n if (!line.trim() || line.trim().startsWith('#')) continue;\n\n const indent = line.search(/\\S/);\n const trimmed = line.trim();\n\n while (stack.length > 1 && stack[stack.length - 1].indent >= indent) {\n stack.pop();\n }\n\n const colonIdx = trimmed.indexOf(':');\n if (colonIdx === -1) continue;\n\n const key = trimmed.slice(0, colonIdx).trim();\n const value = trimmed.slice(colonIdx + 1).trim();\n\n const current = stack[stack.length - 1].obj;\n\n if (value === '' || value === '|') {\n current[key] = {};\n stack.push({ indent, obj: current[key] as Record<string, unknown> });\n } else if (value.startsWith('[') && value.endsWith(']')) {\n current[key] = value\n .slice(1, -1)\n .split(',')\n .map((s) => s.trim().replace(/['\"]/g, ''));\n } else if (value === 'true') {\n current[key] = true;\n } else if (value === 'false') {\n current[key] = false;\n } else if (/^\\d+$/.test(value)) {\n current[key] = parseInt(value, 10);\n } else {\n current[key] = value.replace(/['\"]/g, '');\n }\n }\n\n return result as Partial<HooksConfig>;\n}\n\nfunction toYaml(obj: unknown, indent = 0): string {\n const spaces = ' '.repeat(indent);\n let result = '';\n\n if (Array.isArray(obj)) {\n result += `[${obj.map((v) => (typeof v === 'string' ? `'${v}'` : v)).join(', ')}]\\n`;\n } else if (typeof obj === 'object' && obj !== null) {\n for (const [key, value] of Object.entries(obj)) {\n if (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n ) {\n result += `${spaces}${key}:\\n${toYaml(value, indent + 1)}`;\n } else {\n result += `${spaces}${key}: ${toYaml(value, indent)}`;\n }\n }\n } else if (typeof obj === 'string') {\n result += `${obj}\\n`;\n } else if (typeof obj === 'boolean' || typeof obj === 'number') {\n result += `${obj}\\n`;\n } else {\n result += '\\n';\n }\n\n return result;\n}\n\nfunction mergeConfig(\n defaults: HooksConfig,\n overrides: Partial<HooksConfig>\n): HooksConfig {\n return {\n ...defaults,\n ...overrides,\n daemon: { ...defaults.daemon, ...(overrides.daemon || {}) },\n file_watch: { ...defaults.file_watch, ...(overrides.file_watch || {}) },\n hooks: { ...defaults.hooks, ...(overrides.hooks || {}) },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|