@stackmemoryai/stackmemory 0.5.4 → 0.5.6
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/claude-sm +6 -0
- package/bin/claude-smd +6 -0
- package/dist/agents/core/agent-task-manager.js +4 -0
- package/dist/agents/core/agent-task-manager.js.map +1 -1
- package/dist/agents/testing-agent.js +4 -0
- package/dist/agents/testing-agent.js.map +1 -1
- package/dist/agents/verifiers/base-verifier.js +4 -0
- package/dist/agents/verifiers/base-verifier.js.map +1 -1
- package/dist/agents/verifiers/formatter-verifier.js +4 -0
- package/dist/agents/verifiers/formatter-verifier.js.map +1 -1
- package/dist/agents/verifiers/llm-judge.js +4 -0
- package/dist/agents/verifiers/llm-judge.js.map +1 -1
- package/dist/cli/auto-detect.js +4 -0
- package/dist/cli/auto-detect.js.map +1 -1
- package/dist/cli/browser-test.js +4 -0
- package/dist/cli/browser-test.js.map +1 -1
- package/dist/cli/claude-sm-danger.js +21 -0
- package/dist/cli/claude-sm-danger.js.map +7 -0
- package/dist/cli/claude-sm.js +4 -0
- package/dist/cli/claude-sm.js.map +2 -2
- package/dist/cli/codex-sm.js +4 -0
- package/dist/cli/codex-sm.js.map +1 -1
- package/dist/cli/commands/api.js +232 -0
- package/dist/cli/commands/api.js.map +7 -0
- package/dist/cli/commands/cleanup-processes.js +68 -0
- package/dist/cli/commands/cleanup-processes.js.map +7 -0
- package/dist/cli/commands/clear.js +4 -0
- package/dist/cli/commands/clear.js.map +1 -1
- package/dist/cli/commands/config.js +4 -0
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/context-rehydrate.js +4 -0
- package/dist/cli/commands/context-rehydrate.js.map +1 -1
- package/dist/cli/commands/context.js +4 -0
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/dashboard.js +4 -0
- package/dist/cli/commands/dashboard.js.map +1 -1
- package/dist/cli/commands/db.js +4 -0
- package/dist/cli/commands/db.js.map +1 -1
- package/dist/cli/commands/decision.js +4 -0
- package/dist/cli/commands/decision.js.map +1 -1
- package/dist/cli/commands/handoff.js +4 -0
- package/dist/cli/commands/handoff.js.map +1 -1
- package/dist/cli/commands/hooks.js +298 -0
- package/dist/cli/commands/hooks.js.map +7 -0
- package/dist/cli/commands/linear-unified.js +4 -0
- package/dist/cli/commands/linear-unified.js.map +1 -1
- package/dist/cli/commands/linear.js +4 -0
- package/dist/cli/commands/linear.js.map +1 -1
- package/dist/cli/commands/log.js +4 -0
- package/dist/cli/commands/log.js.map +1 -1
- package/dist/cli/commands/login.js +4 -0
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/migrate.js +4 -0
- package/dist/cli/commands/migrate.js.map +1 -1
- package/dist/cli/commands/monitor.js +4 -0
- package/dist/cli/commands/monitor.js.map +1 -1
- package/dist/cli/commands/onboard.js +4 -0
- package/dist/cli/commands/onboard.js.map +1 -1
- package/dist/cli/commands/projects.js +4 -0
- package/dist/cli/commands/projects.js.map +1 -1
- package/dist/cli/commands/quality.js +4 -0
- package/dist/cli/commands/quality.js.map +1 -1
- package/dist/cli/commands/ralph.js +4 -0
- package/dist/cli/commands/ralph.js.map +1 -1
- package/dist/cli/commands/search.js +4 -0
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/service.js +4 -0
- package/dist/cli/commands/service.js.map +1 -1
- package/dist/cli/commands/session.js +4 -0
- package/dist/cli/commands/session.js.map +1 -1
- package/dist/cli/commands/shell.js +249 -0
- package/dist/cli/commands/shell.js.map +7 -0
- package/dist/cli/commands/signup.js +4 -0
- package/dist/cli/commands/signup.js.map +1 -1
- package/dist/cli/commands/skills.js +4 -0
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/storage-tier.js +4 -0
- package/dist/cli/commands/storage-tier.js.map +1 -1
- package/dist/cli/commands/storage.js +4 -0
- package/dist/cli/commands/storage.js.map +1 -1
- package/dist/cli/commands/sweep.js +5 -4
- package/dist/cli/commands/sweep.js.map +2 -2
- package/dist/cli/commands/tasks.js +4 -0
- package/dist/cli/commands/tasks.js.map +1 -1
- package/dist/cli/commands/test.js +4 -0
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/workflow.js +4 -0
- package/dist/cli/commands/workflow.js.map +1 -1
- package/dist/cli/commands/worktree.js +4 -0
- package/dist/cli/commands/worktree.js.map +1 -1
- package/dist/cli/index.js +13 -1
- package/dist/cli/index.js.map +2 -2
- package/dist/cli/utils/viewer.js +4 -0
- package/dist/cli/utils/viewer.js.map +1 -1
- package/dist/core/analytics/team-analytics.js +4 -0
- package/dist/core/analytics/team-analytics.js.map +1 -1
- package/dist/core/config/config-manager.js +4 -0
- package/dist/core/config/config-manager.js.map +1 -1
- package/dist/core/config/storage-config.js +4 -0
- package/dist/core/config/storage-config.js.map +1 -1
- package/dist/core/config/types.js +4 -0
- package/dist/core/config/types.js.map +1 -1
- package/dist/core/context/auto-context.js +4 -0
- package/dist/core/context/auto-context.js.map +1 -1
- package/dist/core/context/compaction-handler.js +4 -0
- package/dist/core/context/compaction-handler.js.map +1 -1
- package/dist/core/context/context-bridge.js +4 -0
- package/dist/core/context/context-bridge.js.map +1 -1
- package/dist/core/context/dual-stack-manager.js +4 -0
- package/dist/core/context/dual-stack-manager.js.map +1 -1
- package/dist/core/context/enhanced-rehydration.js +4 -0
- package/dist/core/context/enhanced-rehydration.js.map +1 -1
- package/dist/core/context/frame-database.js +4 -0
- package/dist/core/context/frame-database.js.map +1 -1
- package/dist/core/context/frame-digest.js +4 -0
- package/dist/core/context/frame-digest.js.map +1 -1
- package/dist/core/context/frame-handoff-manager.js +4 -0
- package/dist/core/context/frame-handoff-manager.js.map +1 -1
- package/dist/core/context/frame-manager.js +4 -0
- package/dist/core/context/frame-manager.js.map +1 -1
- package/dist/core/context/frame-stack.js +4 -0
- package/dist/core/context/frame-stack.js.map +1 -1
- package/dist/core/context/frame-types.js +4 -0
- package/dist/core/context/incremental-gc.js +4 -0
- package/dist/core/context/incremental-gc.js.map +1 -1
- package/dist/core/context/index.js +4 -0
- package/dist/core/context/index.js.map +1 -1
- package/dist/core/context/model-aware-compaction.js +4 -0
- package/dist/core/context/model-aware-compaction.js.map +1 -1
- package/dist/core/context/permission-manager.js +4 -0
- package/dist/core/context/permission-manager.js.map +1 -1
- package/dist/core/context/recursive-context-manager.js +4 -0
- package/dist/core/context/recursive-context-manager.js.map +1 -1
- package/dist/core/context/refactored-frame-manager.js +4 -0
- package/dist/core/context/refactored-frame-manager.js.map +1 -1
- package/dist/core/context/shared-context-layer.js +4 -0
- package/dist/core/context/shared-context-layer.js.map +1 -1
- package/dist/core/context/stack-merge-resolver.js +4 -0
- package/dist/core/context/stack-merge-resolver.js.map +1 -1
- package/dist/core/context/validation.js +4 -0
- package/dist/core/context/validation.js.map +1 -1
- package/dist/core/database/batch-operations.js +4 -0
- package/dist/core/database/batch-operations.js.map +1 -1
- package/dist/core/database/connection-pool.js +4 -0
- package/dist/core/database/connection-pool.js.map +1 -1
- package/dist/core/database/database-adapter.js +4 -0
- package/dist/core/database/database-adapter.js.map +1 -1
- package/dist/core/database/migration-manager.js +4 -0
- package/dist/core/database/migration-manager.js.map +1 -1
- package/dist/core/database/paradedb-adapter.js +4 -0
- package/dist/core/database/paradedb-adapter.js.map +1 -1
- package/dist/core/database/query-cache.js +4 -0
- package/dist/core/database/query-cache.js.map +1 -1
- package/dist/core/database/query-router.js +4 -0
- package/dist/core/database/query-router.js.map +1 -1
- package/dist/core/database/sqlite-adapter.js +4 -0
- package/dist/core/database/sqlite-adapter.js.map +1 -1
- package/dist/core/digest/enhanced-hybrid-digest.js +4 -0
- package/dist/core/digest/enhanced-hybrid-digest.js.map +1 -1
- package/dist/core/digest/frame-digest-integration.js +4 -0
- package/dist/core/digest/frame-digest-integration.js.map +1 -1
- package/dist/core/digest/hybrid-digest-generator.js +4 -0
- package/dist/core/digest/hybrid-digest-generator.js.map +1 -1
- package/dist/core/digest/index.js +4 -0
- package/dist/core/digest/index.js.map +1 -1
- package/dist/core/digest/types.js +4 -0
- package/dist/core/digest/types.js.map +1 -1
- package/dist/core/errors/index.js +4 -0
- package/dist/core/errors/index.js.map +1 -1
- package/dist/core/errors/recovery.js +4 -0
- package/dist/core/errors/recovery.js.map +1 -1
- package/dist/core/execution/parallel-executor.js +4 -0
- package/dist/core/execution/parallel-executor.js.map +1 -1
- package/dist/core/frame/workflow-templates.js +4 -0
- package/dist/core/frame/workflow-templates.js.map +1 -1
- package/dist/core/merge/conflict-detector.js +4 -0
- package/dist/core/merge/conflict-detector.js.map +1 -1
- package/dist/core/merge/index.js +4 -0
- package/dist/core/merge/index.js.map +1 -1
- package/dist/core/merge/resolution-engine.js +4 -0
- package/dist/core/merge/resolution-engine.js.map +1 -1
- package/dist/core/merge/stack-diff.js +4 -0
- package/dist/core/merge/stack-diff.js.map +1 -1
- package/dist/core/merge/types.js +4 -0
- package/dist/core/monitoring/error-handler.js +4 -0
- package/dist/core/monitoring/error-handler.js.map +1 -1
- package/dist/core/monitoring/logger.js +4 -0
- package/dist/core/monitoring/logger.js.map +1 -1
- package/dist/core/monitoring/metrics.js +4 -0
- package/dist/core/monitoring/metrics.js.map +1 -1
- package/dist/core/monitoring/progress-tracker.js +4 -0
- package/dist/core/monitoring/progress-tracker.js.map +1 -1
- package/dist/core/monitoring/session-monitor.js +4 -0
- package/dist/core/monitoring/session-monitor.js.map +1 -1
- package/dist/core/performance/context-cache.js +4 -0
- package/dist/core/performance/context-cache.js.map +1 -1
- package/dist/core/performance/index.js +4 -0
- package/dist/core/performance/index.js.map +1 -1
- package/dist/core/performance/lazy-context-loader.js +4 -0
- package/dist/core/performance/lazy-context-loader.js.map +1 -1
- package/dist/core/performance/monitor.js +4 -0
- package/dist/core/performance/monitor.js.map +1 -1
- package/dist/core/performance/optimized-frame-context.js +4 -0
- package/dist/core/performance/optimized-frame-context.js.map +1 -1
- package/dist/core/performance/performance-benchmark.js +4 -0
- package/dist/core/performance/performance-benchmark.js.map +1 -1
- package/dist/core/performance/performance-profiler.js +4 -0
- package/dist/core/performance/performance-profiler.js.map +1 -1
- package/dist/core/performance/streaming-jsonl-parser.js +4 -0
- package/dist/core/performance/streaming-jsonl-parser.js.map +1 -1
- package/dist/core/persistence/postgres-adapter.js +4 -0
- package/dist/core/persistence/postgres-adapter.js.map +1 -1
- package/dist/core/projects/project-isolation.js +4 -0
- package/dist/core/projects/project-isolation.js.map +1 -1
- package/dist/core/projects/project-manager.js +4 -0
- package/dist/core/projects/project-manager.js.map +1 -1
- package/dist/core/query/query-parser.js +4 -0
- package/dist/core/query/query-parser.js.map +1 -1
- package/dist/core/query/query-templates.js +4 -0
- package/dist/core/query/query-templates.js.map +1 -1
- package/dist/core/retrieval/context-retriever.js +4 -0
- package/dist/core/retrieval/context-retriever.js.map +1 -1
- package/dist/core/retrieval/graph-retrieval.js +4 -0
- package/dist/core/retrieval/graph-retrieval.js.map +1 -1
- package/dist/core/retrieval/hierarchical-retrieval.js +4 -0
- package/dist/core/retrieval/hierarchical-retrieval.js.map +1 -1
- package/dist/core/retrieval/index.js +4 -0
- package/dist/core/retrieval/index.js.map +1 -1
- package/dist/core/retrieval/llm-context-retrieval.js +4 -0
- package/dist/core/retrieval/llm-context-retrieval.js.map +1 -1
- package/dist/core/retrieval/retrieval-benchmarks.js +4 -0
- package/dist/core/retrieval/retrieval-benchmarks.js.map +1 -1
- package/dist/core/retrieval/summary-generator.js +4 -0
- package/dist/core/retrieval/summary-generator.js.map +1 -1
- package/dist/core/retrieval/types.js +4 -0
- package/dist/core/retrieval/types.js.map +1 -1
- package/dist/core/session/clear-survival.js +4 -0
- package/dist/core/session/clear-survival.js.map +1 -1
- package/dist/core/session/enhanced-handoff.js +4 -0
- package/dist/core/session/enhanced-handoff.js.map +1 -1
- package/dist/core/session/handoff-generator.js +4 -0
- package/dist/core/session/handoff-generator.js.map +1 -1
- package/dist/core/session/index.js +4 -0
- package/dist/core/session/index.js.map +1 -1
- package/dist/core/session/session-manager.js +4 -0
- package/dist/core/session/session-manager.js.map +1 -1
- package/dist/core/skills/index.js +4 -0
- package/dist/core/skills/index.js.map +1 -1
- package/dist/core/skills/skill-storage.js +4 -0
- package/dist/core/skills/skill-storage.js.map +1 -1
- package/dist/core/skills/types.js +4 -0
- package/dist/core/skills/types.js.map +1 -1
- package/dist/core/storage/chromadb-adapter.js +4 -0
- package/dist/core/storage/chromadb-adapter.js.map +1 -1
- package/dist/core/storage/infinite-storage.js +4 -0
- package/dist/core/storage/infinite-storage.js.map +1 -1
- package/dist/core/storage/railway-optimized-storage.js +4 -0
- package/dist/core/storage/railway-optimized-storage.js.map +1 -1
- package/dist/core/storage/remote-storage.js +4 -0
- package/dist/core/storage/remote-storage.js.map +1 -1
- package/dist/core/storage/two-tier-storage.js +4 -0
- package/dist/core/storage/two-tier-storage.js.map +1 -1
- package/dist/core/trace/cli-trace-wrapper.js +4 -0
- package/dist/core/trace/cli-trace-wrapper.js.map +1 -1
- package/dist/core/trace/db-trace-wrapper.js +4 -0
- package/dist/core/trace/db-trace-wrapper.js.map +1 -1
- package/dist/core/trace/debug-trace.js +4 -0
- package/dist/core/trace/debug-trace.js.map +1 -1
- package/dist/core/trace/index.js +4 -0
- package/dist/core/trace/index.js.map +1 -1
- package/dist/core/trace/linear-api-wrapper.js +4 -0
- package/dist/core/trace/linear-api-wrapper.js.map +1 -1
- package/dist/core/trace/trace-demo.js +4 -0
- package/dist/core/trace/trace-demo.js.map +1 -1
- package/dist/core/trace/trace-detector.demo.js +4 -0
- package/dist/core/trace/trace-detector.demo.js.map +1 -1
- package/dist/core/trace/trace-detector.js +4 -0
- package/dist/core/trace/trace-detector.js.map +1 -1
- package/dist/core/trace/trace-store.js +4 -0
- package/dist/core/trace/trace-store.js.map +1 -1
- package/dist/core/trace/types.js +4 -0
- package/dist/core/trace/types.js.map +1 -1
- package/dist/core/types.js +4 -0
- package/dist/core/utils/compression.js +4 -0
- package/dist/core/utils/compression.js.map +1 -1
- package/dist/core/utils/update-checker.js +4 -0
- package/dist/core/utils/update-checker.js.map +1 -1
- package/dist/core/worktree/worktree-manager.js +4 -0
- package/dist/core/worktree/worktree-manager.js.map +1 -1
- package/dist/daemon/session-daemon.js +4 -0
- package/dist/daemon/session-daemon.js.map +1 -1
- package/dist/features/analytics/api/analytics-api.js +4 -0
- package/dist/features/analytics/api/analytics-api.js.map +1 -1
- package/dist/features/analytics/core/analytics-service.js +4 -0
- package/dist/features/analytics/core/analytics-service.js.map +1 -1
- package/dist/features/analytics/index.js +4 -0
- package/dist/features/analytics/index.js.map +1 -1
- package/dist/features/analytics/queries/metrics-queries.js +4 -0
- package/dist/features/analytics/queries/metrics-queries.js.map +1 -1
- package/dist/features/analytics/types/metrics.js +4 -0
- package/dist/features/browser/browser-mcp.js +4 -0
- package/dist/features/browser/browser-mcp.js.map +1 -1
- package/dist/features/tasks/linear-task-manager.js +4 -0
- package/dist/features/tasks/linear-task-manager.js.map +1 -1
- package/dist/features/tasks/task-aware-context.js +4 -0
- package/dist/features/tasks/task-aware-context.js.map +1 -1
- package/dist/features/tui/simple-monitor.js +4 -0
- package/dist/features/tui/simple-monitor.js.map +1 -1
- package/dist/features/tui/swarm-monitor.js +4 -0
- package/dist/features/tui/swarm-monitor.js.map +1 -1
- package/dist/features/web/client/stores/task-store.js +4 -0
- package/dist/features/web/client/stores/task-store.js.map +1 -1
- package/dist/features/web/server/index.js +4 -0
- package/dist/features/web/server/index.js.map +1 -1
- package/dist/hooks/config.js +150 -0
- package/dist/hooks/config.js.map +7 -0
- package/dist/hooks/daemon.js +364 -0
- package/dist/hooks/daemon.js.map +7 -0
- package/dist/hooks/events.js +55 -0
- package/dist/hooks/events.js.map +7 -0
- package/dist/hooks/index.js +8 -0
- package/dist/hooks/index.js.map +7 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/anthropic/client.js +4 -0
- package/dist/integrations/anthropic/client.js.map +1 -1
- package/dist/integrations/claude-code/agent-bridge.js +4 -0
- package/dist/integrations/claude-code/agent-bridge.js.map +1 -1
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js +4 -0
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +1 -1
- package/dist/integrations/claude-code/lifecycle-hooks.js +4 -0
- package/dist/integrations/claude-code/lifecycle-hooks.js.map +1 -1
- package/dist/integrations/claude-code/post-task-hooks.js +4 -0
- package/dist/integrations/claude-code/post-task-hooks.js.map +1 -1
- package/dist/integrations/claude-code/subagent-client-stub.js +4 -0
- package/dist/integrations/claude-code/subagent-client-stub.js.map +1 -1
- package/dist/integrations/claude-code/subagent-client.js +4 -0
- package/dist/integrations/claude-code/subagent-client.js.map +1 -1
- package/dist/integrations/claude-code/task-coordinator.js +4 -0
- package/dist/integrations/claude-code/task-coordinator.js.map +1 -1
- package/dist/integrations/linear/auth.js +4 -0
- package/dist/integrations/linear/auth.js.map +1 -1
- package/dist/integrations/linear/auto-sync.js +4 -0
- package/dist/integrations/linear/auto-sync.js.map +1 -1
- package/dist/integrations/linear/client.js +4 -0
- package/dist/integrations/linear/client.js.map +1 -1
- package/dist/integrations/linear/config.js +4 -0
- package/dist/integrations/linear/config.js.map +1 -1
- package/dist/integrations/linear/migration.js +4 -0
- package/dist/integrations/linear/migration.js.map +1 -1
- package/dist/integrations/linear/oauth-server.js +4 -0
- package/dist/integrations/linear/oauth-server.js.map +1 -1
- package/dist/integrations/linear/rest-client.js +4 -0
- package/dist/integrations/linear/rest-client.js.map +1 -1
- package/dist/integrations/linear/sync-manager.js +4 -0
- package/dist/integrations/linear/sync-manager.js.map +1 -1
- package/dist/integrations/linear/sync-service.js +4 -0
- package/dist/integrations/linear/sync-service.js.map +1 -1
- package/dist/integrations/linear/sync.js +4 -0
- package/dist/integrations/linear/sync.js.map +1 -1
- package/dist/integrations/linear/types.js +4 -0
- package/dist/integrations/linear/unified-sync.js +4 -0
- package/dist/integrations/linear/unified-sync.js.map +1 -1
- package/dist/integrations/linear/webhook-handler.js +4 -0
- package/dist/integrations/linear/webhook-handler.js.map +1 -1
- package/dist/integrations/linear/webhook-server.js +4 -0
- package/dist/integrations/linear/webhook-server.js.map +1 -1
- package/dist/integrations/linear/webhook.js +4 -0
- package/dist/integrations/linear/webhook.js.map +1 -1
- package/dist/integrations/mcp/handlers/code-execution-handlers.js +4 -0
- package/dist/integrations/mcp/handlers/code-execution-handlers.js.map +1 -1
- package/dist/integrations/mcp/handlers/context-handlers.js +4 -0
- package/dist/integrations/mcp/handlers/context-handlers.js.map +1 -1
- package/dist/integrations/mcp/handlers/index.js +4 -0
- package/dist/integrations/mcp/handlers/index.js.map +1 -1
- package/dist/integrations/mcp/handlers/linear-handlers.js +4 -0
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +1 -1
- package/dist/integrations/mcp/handlers/skill-handlers.js +4 -0
- package/dist/integrations/mcp/handlers/skill-handlers.js.map +1 -1
- package/dist/integrations/mcp/handlers/task-handlers.js +4 -0
- package/dist/integrations/mcp/handlers/task-handlers.js.map +1 -1
- package/dist/integrations/mcp/handlers/trace-handlers.js +4 -0
- package/dist/integrations/mcp/handlers/trace-handlers.js.map +1 -1
- package/dist/integrations/mcp/index.js +4 -0
- package/dist/integrations/mcp/index.js.map +1 -1
- package/dist/integrations/mcp/middleware/tool-scoring.js +4 -0
- package/dist/integrations/mcp/middleware/tool-scoring.js.map +1 -1
- package/dist/integrations/mcp/refactored-server.js +4 -0
- package/dist/integrations/mcp/refactored-server.js.map +1 -1
- package/dist/integrations/mcp/server.js +4 -0
- package/dist/integrations/mcp/server.js.map +1 -1
- package/dist/integrations/mcp/tool-definitions-code.js +4 -0
- package/dist/integrations/mcp/tool-definitions-code.js.map +1 -1
- package/dist/integrations/mcp/tool-definitions.js +4 -0
- package/dist/integrations/mcp/tool-definitions.js.map +1 -1
- package/dist/integrations/mcp/trace-test.js +4 -0
- package/dist/integrations/mcp/trace-test.js.map +1 -1
- package/dist/integrations/pg-aiguide/embedding-provider.js +4 -0
- package/dist/integrations/pg-aiguide/embedding-provider.js.map +1 -1
- package/dist/integrations/pg-aiguide/semantic-search.js +4 -0
- package/dist/integrations/pg-aiguide/semantic-search.js.map +1 -1
- package/dist/integrations/pg-aiguide/timescale-analytics.js +4 -0
- package/dist/integrations/pg-aiguide/timescale-analytics.js.map +1 -1
- package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js +4 -0
- package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +1 -1
- package/dist/integrations/ralph/context/context-budget-manager.js +4 -0
- package/dist/integrations/ralph/context/context-budget-manager.js.map +1 -1
- package/dist/integrations/ralph/context/stackmemory-context-loader.js +4 -0
- package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +1 -1
- package/dist/integrations/ralph/coordination/enhanced-coordination.js +4 -0
- package/dist/integrations/ralph/coordination/enhanced-coordination.js.map +1 -1
- package/dist/integrations/ralph/index.js +4 -0
- package/dist/integrations/ralph/index.js.map +1 -1
- package/dist/integrations/ralph/learning/pattern-learner.js +4 -0
- package/dist/integrations/ralph/learning/pattern-learner.js.map +1 -1
- package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js +4 -0
- package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js.map +1 -1
- package/dist/integrations/ralph/monitoring/swarm-dashboard.js +4 -0
- package/dist/integrations/ralph/monitoring/swarm-dashboard.js.map +1 -1
- package/dist/integrations/ralph/monitoring/swarm-registry.js +4 -0
- package/dist/integrations/ralph/monitoring/swarm-registry.js.map +1 -1
- package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js +4 -0
- package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +1 -1
- package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js +4 -0
- package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js.map +1 -1
- package/dist/integrations/ralph/patterns/extended-coherence-sessions.js +4 -0
- package/dist/integrations/ralph/patterns/extended-coherence-sessions.js.map +1 -1
- package/dist/integrations/ralph/patterns/oracle-worker-pattern.js +4 -0
- package/dist/integrations/ralph/patterns/oracle-worker-pattern.js.map +1 -1
- package/dist/integrations/ralph/performance/performance-optimizer.js +4 -0
- package/dist/integrations/ralph/performance/performance-optimizer.js.map +1 -1
- package/dist/integrations/ralph/ralph-integration-demo.js +4 -0
- package/dist/integrations/ralph/ralph-integration-demo.js.map +1 -1
- package/dist/integrations/ralph/recovery/crash-recovery.js +4 -0
- package/dist/integrations/ralph/recovery/crash-recovery.js.map +1 -1
- package/dist/integrations/ralph/state/state-reconciler.js +4 -0
- package/dist/integrations/ralph/state/state-reconciler.js.map +1 -1
- package/dist/integrations/ralph/swarm/git-workflow-manager.js +4 -0
- package/dist/integrations/ralph/swarm/git-workflow-manager.js.map +1 -1
- package/dist/integrations/ralph/swarm/swarm-coordinator.js +4 -0
- package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +1 -1
- package/dist/integrations/ralph/types.js +4 -0
- package/dist/integrations/ralph/visualization/ralph-debugger.js +4 -0
- package/dist/integrations/ralph/visualization/ralph-debugger.js.map +1 -1
- package/dist/mcp/stackmemory-mcp-server.js +4 -0
- package/dist/mcp/stackmemory-mcp-server.js.map +1 -1
- package/dist/middleware/exponential-rate-limiter.js +4 -0
- package/dist/middleware/exponential-rate-limiter.js.map +1 -1
- package/dist/models/user.model.js +4 -0
- package/dist/models/user.model.js.map +1 -1
- package/dist/servers/production/auth-middleware.js +4 -0
- package/dist/servers/production/auth-middleware.js.map +1 -1
- package/dist/servers/railway/config.js +4 -0
- package/dist/servers/railway/config.js.map +1 -1
- package/dist/servers/railway/index-enhanced.js +4 -0
- package/dist/servers/railway/index-enhanced.js.map +1 -1
- package/dist/servers/railway/index.js +4 -0
- package/dist/servers/railway/index.js.map +1 -1
- package/dist/servers/railway/simple.js +4 -0
- package/dist/servers/railway/simple.js.map +1 -1
- package/dist/servers/railway/storage-test.js +4 -0
- package/dist/servers/railway/storage-test.js.map +1 -1
- package/dist/services/config-service.js +4 -0
- package/dist/services/config-service.js.map +1 -1
- package/dist/services/context-service.js +4 -0
- package/dist/services/context-service.js.map +1 -1
- package/dist/skills/api-discovery.js +353 -0
- package/dist/skills/api-discovery.js.map +7 -0
- package/dist/skills/api-skill.js +475 -0
- package/dist/skills/api-skill.js.map +7 -0
- package/dist/skills/claude-skills.js +53 -1
- package/dist/skills/claude-skills.js.map +2 -2
- package/dist/skills/dashboard-launcher.js +4 -0
- package/dist/skills/dashboard-launcher.js.map +1 -1
- package/dist/skills/recursive-agent-orchestrator.js +4 -0
- package/dist/skills/recursive-agent-orchestrator.js.map +1 -1
- package/dist/skills/repo-ingestion-skill.js +4 -0
- package/dist/skills/repo-ingestion-skill.js.map +1 -1
- package/dist/skills/security-secrets-scanner.js +4 -0
- package/dist/skills/security-secrets-scanner.js.map +1 -1
- package/dist/skills/unified-rlm-orchestrator.js +4 -0
- package/dist/skills/unified-rlm-orchestrator.js.map +1 -1
- package/dist/types/task.js +4 -0
- package/dist/utils/env.js +4 -0
- package/dist/utils/env.js.map +1 -1
- package/dist/utils/formatting.js +4 -0
- package/dist/utils/formatting.js.map +1 -1
- package/dist/utils/process-cleanup.js +136 -0
- package/dist/utils/process-cleanup.js.map +7 -0
- package/dist/validation/schemas.js +4 -0
- package/dist/validation/schemas.js.map +1 -1
- package/package.json +4 -2
- package/templates/shell/sweep-complete.zsh +116 -0
- package/templates/shell/sweep-suggest.js +161 -0
|
@@ -1,4 +1,8 @@
|
|
|
1
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);
|
|
2
6
|
import express from "express";
|
|
3
7
|
import cors from "cors";
|
|
4
8
|
const app = express();
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/servers/railway/simple.ts"],
|
|
4
4
|
"sourcesContent": ["#!/usr/bin/env node\n/**\n * Simplified Railway Server - Works without external dependencies\n */\n\nimport express from 'express';\nimport cors from 'cors';\n\nconst app = express();\nconst port = process.env.PORT || 3000;\n\n// Middleware\napp.use(cors());\napp.use(express.json());\n\n// Root endpoint\napp.get('/', (req, res) => {\n res.json({\n name: 'StackMemory Railway Server (Simplified)',\n version: '1.0.0',\n status: 'running',\n endpoints: {\n 'GET /': 'This documentation',\n 'GET /health': 'Health check',\n 'GET /api/test': 'Test endpoint',\n },\n });\n});\n\n// Health check\napp.get('/health', (req, res) => {\n res.json({\n status: 'healthy',\n version: '1.0.0',\n timestamp: new Date().toISOString(),\n environment: process.env.NODE_ENV || 'development',\n port: port,\n });\n});\n\n// Basic API endpoint\napp.get('/api/test', (req, res) => {\n res.json({\n message: 'StackMemory Railway Server is running!',\n timestamp: new Date().toISOString(),\n });\n});\n\n// Error handling\napp.use((err, req, res, _next) => {\n console.error('Error:', err);\n res.status(500).json({\n error: 'Internal server error',\n message: err.message,\n });\n});\n\n// Start server\napp.listen(port, '0.0.0.0', () => {\n console.log(`\n\uD83D\uDE82 StackMemory Simple Server Started\n=====================================\nEnvironment: ${process.env.NODE_ENV || 'development'}\nPort: ${port}\nHealth: http://localhost:${port}/health\n=====================================\n `);\n});\n\n// Graceful shutdown\nprocess.on('SIGTERM', () => {\n console.log('SIGTERM received, shutting down gracefully...');\n process.exit(0);\n});\n\nprocess.on('SIGINT', () => {\n console.log('SIGINT received, shutting down...');\n process.exit(0);\n});\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;AAKA,OAAO,aAAa;AACpB,OAAO,UAAU;AAEjB,MAAM,MAAM,QAAQ;AACpB,MAAM,OAAO,QAAQ,IAAI,QAAQ;AAGjC,IAAI,IAAI,KAAK,CAAC;AACd,IAAI,IAAI,QAAQ,KAAK,CAAC;AAGtB,IAAI,IAAI,KAAK,CAAC,KAAK,QAAQ;AACzB,MAAI,KAAK;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,WAAW;AAAA,MACT,SAAS;AAAA,MACT,eAAe;AAAA,MACf,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AACH,CAAC;AAGD,IAAI,IAAI,WAAW,CAAC,KAAK,QAAQ;AAC/B,MAAI,KAAK;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,aAAa,QAAQ,IAAI,YAAY;AAAA,IACrC;AAAA,EACF,CAAC;AACH,CAAC;AAGD,IAAI,IAAI,aAAa,CAAC,KAAK,QAAQ;AACjC,MAAI,KAAK;AAAA,IACP,SAAS;AAAA,IACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC,CAAC;AACH,CAAC;AAGD,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,UAAU;AAChC,UAAQ,MAAM,UAAU,GAAG;AAC3B,MAAI,OAAO,GAAG,EAAE,KAAK;AAAA,IACnB,OAAO;AAAA,IACP,SAAS,IAAI;AAAA,EACf,CAAC;AACH,CAAC;AAGD,IAAI,OAAO,MAAM,WAAW,MAAM;AAChC,UAAQ,IAAI;AAAA;AAAA;AAAA,eAGC,QAAQ,IAAI,YAAY,aAAa;AAAA,QAC5C,IAAI;AAAA,2BACe,IAAI;AAAA;AAAA,GAE5B;AACH,CAAC;AAGD,QAAQ,GAAG,WAAW,MAAM;AAC1B,UAAQ,IAAI,+CAA+C;AAC3D,UAAQ,KAAK,CAAC;AAChB,CAAC;AAED,QAAQ,GAAG,UAAU,MAAM;AACzB,UAAQ,IAAI,mCAAmC;AAC/C,UAAQ,KAAK,CAAC;AAChB,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
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);
|
|
2
6
|
import express from "express";
|
|
3
7
|
import cors from "cors";
|
|
4
8
|
import { createClient } from "redis";
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/servers/railway/storage-test.ts"],
|
|
4
4
|
"sourcesContent": ["#!/usr/bin/env node\n/**\n * Enhanced Railway Server with Full Storage Testing\n * Tests PostgreSQL, Redis, and Railway Buckets (3-tier system)\n */\n\nimport express from 'express';\nimport cors from 'cors';\nimport { createClient } from 'redis';\nimport pg from 'pg';\nimport { S3Client, PutObjectCommand, GetObjectCommand, ListObjectsCommand } from '@aws-sdk/client-s3';\n\nconst { Client } = pg;\n\ninterface StorageTestResult {\n postgresql: any;\n redis: any;\n buckets: any;\n summary: any;\n}\n\nasync function startServer() {\n const config = {\n port: parseInt(process.env.PORT || '3000'),\n databaseUrl: process.env.DATABASE_URL,\n redisUrl: process.env.REDIS_URL || \n (process.env.REDISHOST ? `redis://${process.env.REDISHOST}:${process.env.REDISPORT || 6379}` : null),\n corsOrigins: process.env.CORS_ORIGINS?.split(',') || ['*']\n };\n \n console.log('\uD83D\uDE80 Starting StackMemory Storage Test Server');\n console.log(`\uD83D\uDCCD Port: ${config.port}`);\n console.log(`\uD83D\uDCBE PostgreSQL: ${config.databaseUrl ? 'configured' : 'not configured'}`);\n console.log(`\uD83D\uDD34 Redis: ${config.redisUrl ? 'configured' : 'not configured'}`);\n \n const app = express();\n \n // Middleware\n app.use(cors({ origin: config.corsOrigins }));\n app.use(express.json());\n \n // Health endpoint\n app.get('/health', (req, res) => {\n res.json({ \n status: 'healthy',\n service: 'stackmemory-storage-test',\n timestamp: new Date().toISOString()\n });\n });\n \n app.get('/api/health', (req, res) => {\n res.json({ \n status: 'healthy',\n service: 'stackmemory-storage-test',\n timestamp: new Date().toISOString()\n });\n });\n \n // Root endpoint\n app.get('/', (req, res) => {\n res.json({\n name: 'StackMemory Core API',\n version: '0.3.17',\n description: 'Core API with Redis, PostgreSQL, and Railway Buckets',\n endpoints: [\n '/health',\n '/api/health',\n '/api/login',\n '/api/status',\n '/test-storage',\n '/create-frame',\n '/list-frames',\n '/api/frames'\n ],\n storage_tiers: {\n hot: 'Redis (< 24 hours)',\n warm: 'Railway Buckets (1-30 days)', \n cold: 'PostgreSQL (30+ days)'\n }\n });\n });\n \n // Auto-login endpoint for seamless API access\n app.post('/api/login', async (req, res) => {\n try {\n const { username, api_key } = req.body;\n \n // Simple API key validation (in production, use proper JWT/OAuth)\n const validApiKey = process.env.API_KEY_SECRET || 'development-secret';\n \n if (api_key === validApiKey) {\n // Store session in Redis if available\n const sessionId = `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const sessionData = {\n username: username || 'api_user',\n created_at: new Date().toISOString(),\n api_key_hash: 'valid',\n permissions: ['read', 'write', 'admin']\n };\n \n if (config.redisUrl) {\n const redisClient = createClient({ url: config.redisUrl });\n await redisClient.connect();\n await redisClient.setEx(`session:${sessionId}`, 3600, JSON.stringify(sessionData)); // 1 hour\n await redisClient.disconnect();\n }\n \n res.json({\n success: true,\n session_id: sessionId,\n message: 'Automatically logged into StackMemory Core API',\n access: {\n redis: config.redisUrl ? 'available' : 'not_configured',\n postgresql: config.databaseUrl ? 'available' : 'not_configured',\n buckets: 'configurable'\n }\n });\n } else {\n res.status(401).json({\n success: false,\n message: 'Invalid API key'\n });\n }\n } catch (error: any) {\n res.status(500).json({\n success: false,\n message: 'Login failed',\n error: error.message\n });\n }\n });\n \n // Core API status endpoint\n app.get('/api/status', async (req, res) => {\n const status: any = {\n service: 'stackmemory-core-api',\n version: '0.3.17',\n environment: process.env.NODE_ENV || 'production',\n timestamp: new Date().toISOString(),\n storage: {\n tiers: {}\n }\n };\n \n // Check Redis (Hot Tier)\n if (config.redisUrl) {\n try {\n const redisClient = createClient({ url: config.redisUrl });\n await redisClient.connect();\n \n const info = await redisClient.info('memory');\n const keys = await redisClient.keys('*');\n const usedMemory = info.match(/used_memory_human:(.+)/)?.[1];\n \n status.storage.tiers.hot_redis = {\n status: 'connected',\n memory_used: usedMemory?.trim(),\n keys: keys.length,\n ttl_policy: 'auto-expire'\n };\n \n await redisClient.disconnect();\n } catch (error: any) {\n status.storage.tiers.hot_redis = { status: 'error', message: error.message };\n }\n } else {\n status.storage.tiers.hot_redis = { status: 'not_configured' };\n }\n \n // Check PostgreSQL (Cold Tier)\n if (config.databaseUrl) {\n try {\n const pgClient = new Client({ connectionString: config.databaseUrl });\n await pgClient.connect();\n \n const result = await pgClient.query('SELECT COUNT(*) as frames FROM frames WHERE created_at > NOW() - INTERVAL \\'24 hours\\'');\n const totalFrames = await pgClient.query('SELECT COUNT(*) as total FROM frames');\n \n status.storage.tiers.cold_postgresql = {\n status: 'connected',\n recent_frames: parseInt(result.rows[0].frames),\n total_frames: parseInt(totalFrames.rows[0].total)\n };\n \n await pgClient.end();\n } catch (error: any) {\n status.storage.tiers.cold_postgresql = { status: 'error', message: error.message };\n }\n }\n \n res.json(status);\n });\n \n // Comprehensive storage test endpoint\n app.get('/test-storage', async (req, res) => {\n const results: StorageTestResult = {\n postgresql: {},\n redis: {},\n buckets: {},\n summary: {}\n };\n \n try {\n // Test PostgreSQL\n if (config.databaseUrl) {\n console.log('\uD83D\uDC18 Testing PostgreSQL...');\n try {\n const pgClient = new Client({ connectionString: config.databaseUrl });\n await pgClient.connect();\n \n // Basic connectivity\n const timeResult = await pgClient.query('SELECT NOW() as time, version() as version');\n \n // Create frames table\n await pgClient.query(`\n CREATE TABLE IF NOT EXISTS frames (\n frame_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n project_id TEXT NOT NULL,\n type TEXT NOT NULL,\n name TEXT NOT NULL,\n state TEXT DEFAULT 'active',\n inputs JSONB DEFAULT '{}',\n outputs JSONB DEFAULT '{}',\n created_at TIMESTAMP DEFAULT NOW()\n )\n `);\n \n // Test insert/select\n const testId = `pg-test-${Date.now()}`;\n await pgClient.query(\n 'INSERT INTO frames (frame_id, run_id, project_id, type, name) VALUES ($1, $2, $3, $4, $5)',\n [testId, 'test-run', 'storage-test', 'test', 'PostgreSQL Test Frame']\n );\n \n const frameResult = await pgClient.query('SELECT COUNT(*) as count FROM frames');\n \n results.postgresql = {\n status: 'connected',\n server_time: timeResult.rows[0].time,\n version: timeResult.rows[0].version.split(' ')[0],\n total_frames: parseInt(frameResult.rows[0].count),\n test_frame_id: testId\n };\n \n await pgClient.end();\n } catch (error: any) {\n results.postgresql = { status: 'error', message: error.message };\n }\n } else {\n results.postgresql = { status: 'not_configured' };\n }\n \n // Test Redis\n if (config.redisUrl) {\n console.log('\uD83D\uDD34 Testing Redis...');\n try {\n const redisClient = createClient({ url: config.redisUrl });\n await redisClient.connect();\n \n // Test basic operations\n const testKey = `redis-test:${Date.now()}`;\n const testData = {\n timestamp: new Date().toISOString(),\n test: 'Redis connectivity test',\n frame_count: 1\n };\n \n await redisClient.setEx(testKey, 300, JSON.stringify(testData)); // 5 min expiry\n const retrieved = await redisClient.get(testKey);\n \n // Get server info\n const info = await redisClient.info('server');\n const memory = await redisClient.info('memory');\n const version = info.match(/redis_version:(.+)/)?.[1];\n const usedMemory = memory.match(/used_memory_human:(.+)/)?.[1];\n \n // Count keys\n const keys = await redisClient.keys('*');\n \n results.redis = {\n status: 'connected',\n version: version,\n memory_used: usedMemory?.trim(),\n total_keys: keys.length,\n test_key: testKey,\n test_data_retrieved: retrieved ? JSON.parse(retrieved) : null\n };\n \n await redisClient.disconnect();\n } catch (error: any) {\n results.redis = { status: 'error', message: error.message };\n }\n } else {\n results.redis = { status: 'not_configured' };\n }\n \n // Test Railway Buckets (S3-compatible)\n console.log('\uD83E\uDEA3 Testing Railway Buckets...');\n const bucketConfig = {\n endpoint: process.env.RAILWAY_BUCKET_ENDPOINT,\n accessKeyId: process.env.RAILWAY_BUCKET_ACCESS_KEY,\n secretAccessKey: process.env.RAILWAY_BUCKET_SECRET_KEY,\n bucket: process.env.RAILWAY_BUCKET_NAME || 'stackmemory-warm'\n };\n \n if (bucketConfig.endpoint && bucketConfig.accessKeyId && bucketConfig.secretAccessKey) {\n try {\n const s3Client = new S3Client({\n endpoint: bucketConfig.endpoint,\n region: 'us-east-1',\n credentials: {\n accessKeyId: bucketConfig.accessKeyId,\n secretAccessKey: bucketConfig.secretAccessKey\n }\n });\n \n // Test write\n const testKey = `storage-test/frame-${Date.now()}.json`;\n const testFrame = {\n frame_id: `bucket-test-${Date.now()}`,\n type: 'test',\n name: 'Railway Bucket Test',\n created_at: new Date().toISOString(),\n data: 'This is a test frame stored in Railway Buckets'\n };\n \n await s3Client.send(new PutObjectCommand({\n Bucket: bucketConfig.bucket,\n Key: testKey,\n Body: JSON.stringify(testFrame),\n ContentType: 'application/json'\n }));\n \n // Test read\n const getResult = await s3Client.send(new GetObjectCommand({\n Bucket: bucketConfig.bucket,\n Key: testKey\n }));\n \n // List objects\n const listResult = await s3Client.send(new ListObjectsCommand({\n Bucket: bucketConfig.bucket,\n MaxKeys: 10\n }));\n \n results.buckets = {\n status: 'connected',\n endpoint: bucketConfig.endpoint,\n bucket: bucketConfig.bucket,\n test_key: testKey,\n object_count: listResult.Contents?.length || 0,\n test_frame: testFrame\n };\n } catch (error: any) {\n results.buckets = { status: 'error', message: error.message };\n }\n } else {\n results.buckets = { \n status: 'not_configured',\n missing: Object.entries(bucketConfig)\n .filter(([key, value]) => !value)\n .map(([key]) => key)\n };\n }\n \n // Summary\n results.summary = {\n timestamp: new Date().toISOString(),\n tiers: {\n hot: results.redis.status === 'connected' ? 'available' : 'unavailable',\n warm: results.buckets.status === 'connected' ? 'available' : 'unavailable',\n cold: results.postgresql.status === 'connected' ? 'available' : 'unavailable'\n },\n ready_for_production: \n results.postgresql.status === 'connected' && \n results.redis.status === 'connected'\n };\n \n res.json(results);\n \n } catch (error: any) {\n console.error('Storage test error:', error);\n res.status(500).json({\n error: 'Storage test failed',\n message: error.message,\n partial_results: results\n });\n }\n });\n \n // Create a test frame across all tiers\n app.post('/create-frame', async (req, res) => {\n const frameData = {\n frame_id: `frame-${Date.now()}`,\n run_id: req.body.run_id || 'test-run',\n project_id: req.body.project_id || 'storage-test',\n type: req.body.type || 'test',\n name: req.body.name || 'Multi-tier Test Frame',\n inputs: req.body.inputs || {},\n outputs: req.body.outputs || { status: 'created' },\n created_at: new Date().toISOString()\n };\n \n const results: any = { frame: frameData, storage: {} };\n \n try {\n // Store in PostgreSQL (cold tier)\n if (config.databaseUrl) {\n const pgClient = new Client({ connectionString: config.databaseUrl });\n await pgClient.connect();\n await pgClient.query(\n 'INSERT INTO frames (frame_id, run_id, project_id, type, name, inputs, outputs) VALUES ($1, $2, $3, $4, $5, $6, $7)',\n [frameData.frame_id, frameData.run_id, frameData.project_id, frameData.type, frameData.name, frameData.inputs, frameData.outputs]\n );\n await pgClient.end();\n results.storage.postgresql = 'stored';\n }\n \n // Store in Redis (hot tier)\n if (config.redisUrl) {\n const redisClient = createClient({ url: config.redisUrl });\n await redisClient.connect();\n await redisClient.setEx(`frame:${frameData.frame_id}`, 3600, JSON.stringify(frameData));\n await redisClient.disconnect();\n results.storage.redis = 'stored';\n }\n \n res.json(results);\n } catch (error: any) {\n res.status(500).json({\n error: 'Failed to create frame',\n message: error.message,\n partial_results: results\n });\n }\n });\n \n // Core API frames endpoint\n app.get('/api/frames', async (req, res) => {\n try {\n const limit = parseInt(req.query.limit as string) || 10;\n const source = req.query.source as string || 'all'; // 'redis', 'postgresql', 'all'\n \n const results: any = { \n frames: [],\n sources_checked: [],\n total_count: 0\n };\n \n // From Redis (hot tier) - most recent\n if ((source === 'all' || source === 'redis') && config.redisUrl) {\n try {\n const redisClient = createClient({ url: config.redisUrl });\n await redisClient.connect();\n const redisKeys = await redisClient.keys('frame:*');\n const redisFrames = [];\n for (const key of redisKeys.slice(0, limit)) {\n const data = await redisClient.get(key);\n if (data) {\n const frame = JSON.parse(data);\n frame.source = 'redis';\n frame.tier = 'hot';\n redisFrames.push(frame);\n }\n }\n await redisClient.disconnect();\n results.frames.push(...redisFrames);\n results.sources_checked.push('redis');\n } catch (error: any) {\n results.redis_error = error.message;\n }\n }\n \n // From PostgreSQL (cold tier) - persistent storage\n if ((source === 'all' || source === 'postgresql') && config.databaseUrl) {\n try {\n const pgClient = new Client({ connectionString: config.databaseUrl });\n await pgClient.connect();\n const pgFrames = await pgClient.query(\n 'SELECT *, \\'postgresql\\' as source, \\'cold\\' as tier FROM frames ORDER BY created_at DESC LIMIT $1',\n [limit]\n );\n await pgClient.end();\n results.frames.push(...pgFrames.rows);\n results.sources_checked.push('postgresql');\n results.total_count = pgFrames.rowCount;\n } catch (error: any) {\n results.postgresql_error = error.message;\n }\n }\n \n // Sort by created_at if multiple sources\n if (results.frames.length > 1) {\n results.frames.sort((a: any, b: any) => \n new Date(b.created_at).getTime() - new Date(a.created_at).getTime()\n );\n }\n \n res.json({\n count: results.frames.length,\n frames: results.frames.slice(0, limit),\n metadata: {\n sources_checked: results.sources_checked,\n total_in_postgresql: results.total_count,\n tier_explanation: {\n hot: 'Redis - Recent frames (< 24 hours)',\n cold: 'PostgreSQL - All frames (persistent storage)'\n }\n }\n });\n } catch (error: any) {\n res.status(500).json({\n error: 'Failed to fetch frames',\n message: error.message\n });\n }\n });\n\n // List recent frames (legacy endpoint)\n app.get('/list-frames', async (req, res) => {\n const results: any = { sources: {} };\n \n try {\n // From PostgreSQL\n if (config.databaseUrl) {\n const pgClient = new Client({ connectionString: config.databaseUrl });\n await pgClient.connect();\n const pgFrames = await pgClient.query('SELECT * FROM frames ORDER BY created_at DESC LIMIT 5');\n await pgClient.end();\n results.sources.postgresql = pgFrames.rows;\n }\n \n // From Redis\n if (config.redisUrl) {\n const redisClient = createClient({ url: config.redisUrl });\n await redisClient.connect();\n const redisKeys = await redisClient.keys('frame:*');\n const redisFrames = [];\n for (const key of redisKeys.slice(0, 5)) {\n const data = await redisClient.get(key);\n if (data) redisFrames.push(JSON.parse(data));\n }\n await redisClient.disconnect();\n results.sources.redis = redisFrames;\n }\n \n res.json(results);\n } catch (error: any) {\n res.status(500).json({\n error: 'Failed to list frames',\n message: error.message\n });\n }\n });\n \n // Start server\n app.listen(config.port, '0.0.0.0', () => {\n console.log(`\u2705 Storage Test Server running on port ${config.port}`);\n console.log('\\n\uD83D\uDCCA Available endpoints:');\n console.log(' - GET /test-storage (comprehensive storage test)');\n console.log(' - POST /create-frame (create test frame)');\n console.log(' - GET /list-frames (list recent frames)');\n });\n}\n\nstartServer().catch(error => {\n console.error('Failed to start storage test server:', error);\n process.exit(1);\n});"],
|
|
5
|
-
"mappings": "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",
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,3 +1,7 @@
|
|
|
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);
|
|
1
5
|
import { logger } from "../core/monitoring/logger.js";
|
|
2
6
|
import { readFileSync, writeFileSync, existsSync } from "fs";
|
|
3
7
|
import { join } from "path";
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/config-service.ts"],
|
|
4
4
|
"sourcesContent": ["import { logger } from '../core/monitoring/logger.js';\nimport { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { join } from 'path';\n\nexport interface StackMemoryConfig {\n version?: string;\n projectId?: string;\n integrations?: {\n linear?: {\n enabled?: boolean;\n apiKey?: string;\n teamId?: string;\n projectId?: string;\n syncInterval?: number;\n webhookSecret?: string;\n };\n };\n webhook?: {\n port?: number;\n host?: string;\n ngrokSubdomain?: string;\n };\n features?: {\n autoSync?: boolean;\n realTimeSync?: boolean;\n conflictResolution?: 'manual' | 'auto' | 'prompt';\n };\n}\n\nexport class ConfigService {\n // Using singleton logger from monitoring\n private config: StackMemoryConfig = {};\n private configPath: string;\n\n constructor() {\n // Use singleton logger\n this.configPath = join(process.cwd(), '.stackmemory', 'config.json');\n this.loadConfig();\n }\n\n private loadConfig(): void {\n try {\n if (existsSync(this.configPath)) {\n const content = readFileSync(this.configPath, 'utf-8');\n this.config = JSON.parse(content);\n logger.debug('Loaded configuration', this.config);\n }\n } catch (error: unknown) {\n logger.warn('Failed to load configuration, using defaults', error);\n }\n }\n\n private saveConfig(): void {\n try {\n writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));\n logger.debug('Saved configuration');\n } catch (error: unknown) {\n logger.error('Failed to save configuration', error);\n }\n }\n\n public async getConfig(): Promise<StackMemoryConfig> {\n return this.config;\n }\n\n public async updateConfig(\n updates: Partial<StackMemoryConfig>\n ): Promise<void> {\n this.config = {\n ...this.config,\n ...updates,\n };\n this.saveConfig();\n }\n\n public async getLinearConfig() {\n return this.config.integrations?.linear || {};\n }\n\n public async updateLinearConfig(\n updates: Record<string, unknown>\n ): Promise<void> {\n if (!this.config.integrations) {\n this.config.integrations = {};\n }\n if (!this.config.integrations.linear) {\n this.config.integrations.linear = {};\n }\n\n this.config.integrations.linear = {\n ...this.config.integrations.linear,\n ...updates,\n };\n\n this.saveConfig();\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,cAAc;AACvB,SAAS,cAAc,eAAe,kBAAkB;AACxD,SAAS,YAAY;AA2Bd,MAAM,cAAc;AAAA;AAAA,EAEjB,SAA4B,CAAC;AAAA,EAC7B;AAAA,EAER,cAAc;AAEZ,SAAK,aAAa,KAAK,QAAQ,IAAI,GAAG,gBAAgB,aAAa;AACnE,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,aAAmB;AACzB,QAAI;AACF,UAAI,WAAW,KAAK,UAAU,GAAG;AAC/B,cAAM,UAAU,aAAa,KAAK,YAAY,OAAO;AACrD,aAAK,SAAS,KAAK,MAAM,OAAO;AAChC,eAAO,MAAM,wBAAwB,KAAK,MAAM;AAAA,MAClD;AAAA,IACF,SAAS,OAAgB;AACvB,aAAO,KAAK,gDAAgD,KAAK;AAAA,IACnE;AAAA,EACF;AAAA,EAEQ,aAAmB;AACzB,QAAI;AACF,oBAAc,KAAK,YAAY,KAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,CAAC;AACnE,aAAO,MAAM,qBAAqB;AAAA,IACpC,SAAS,OAAgB;AACvB,aAAO,MAAM,gCAAgC,KAAK;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAa,YAAwC;AACnD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,aACX,SACe;AACf,SAAK,SAAS;AAAA,MACZ,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AACA,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAa,kBAAkB;AAC7B,WAAO,KAAK,OAAO,cAAc,UAAU,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAa,mBACX,SACe;AACf,QAAI,CAAC,KAAK,OAAO,cAAc;AAC7B,WAAK,OAAO,eAAe,CAAC;AAAA,IAC9B;AACA,QAAI,CAAC,KAAK,OAAO,aAAa,QAAQ;AACpC,WAAK,OAAO,aAAa,SAAS,CAAC;AAAA,IACrC;AAEA,SAAK,OAAO,aAAa,SAAS;AAAA,MAChC,GAAG,KAAK,OAAO,aAAa;AAAA,MAC5B,GAAG;AAAA,IACL;AAEA,SAAK,WAAW;AAAA,EAClB;AACF;",
|
|
5
|
+
"mappings": ";;;;AAAA,SAAS,cAAc;AACvB,SAAS,cAAc,eAAe,kBAAkB;AACxD,SAAS,YAAY;AA2Bd,MAAM,cAAc;AAAA;AAAA,EAEjB,SAA4B,CAAC;AAAA,EAC7B;AAAA,EAER,cAAc;AAEZ,SAAK,aAAa,KAAK,QAAQ,IAAI,GAAG,gBAAgB,aAAa;AACnE,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,aAAmB;AACzB,QAAI;AACF,UAAI,WAAW,KAAK,UAAU,GAAG;AAC/B,cAAM,UAAU,aAAa,KAAK,YAAY,OAAO;AACrD,aAAK,SAAS,KAAK,MAAM,OAAO;AAChC,eAAO,MAAM,wBAAwB,KAAK,MAAM;AAAA,MAClD;AAAA,IACF,SAAS,OAAgB;AACvB,aAAO,KAAK,gDAAgD,KAAK;AAAA,IACnE;AAAA,EACF;AAAA,EAEQ,aAAmB;AACzB,QAAI;AACF,oBAAc,KAAK,YAAY,KAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,CAAC;AACnE,aAAO,MAAM,qBAAqB;AAAA,IACpC,SAAS,OAAgB;AACvB,aAAO,MAAM,gCAAgC,KAAK;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAa,YAAwC;AACnD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,aACX,SACe;AACf,SAAK,SAAS;AAAA,MACZ,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AACA,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAa,kBAAkB;AAC7B,WAAO,KAAK,OAAO,cAAc,UAAU,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAa,mBACX,SACe;AACf,QAAI,CAAC,KAAK,OAAO,cAAc;AAC7B,WAAK,OAAO,eAAe,CAAC;AAAA,IAC9B;AACA,QAAI,CAAC,KAAK,OAAO,aAAa,QAAQ;AACpC,WAAK,OAAO,aAAa,SAAS,CAAC;AAAA,IACrC;AAEA,SAAK,OAAO,aAAa,SAAS;AAAA,MAChC,GAAG,KAAK,OAAO,aAAa;AAAA,MAC5B,GAAG;AAAA,IACL;AAEA,SAAK,WAAW;AAAA,EAClB;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,3 +1,7 @@
|
|
|
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);
|
|
1
5
|
import { logger } from "../core/monitoring/logger.js";
|
|
2
6
|
import Database from "better-sqlite3";
|
|
3
7
|
import { join } from "path";
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/context-service.ts"],
|
|
4
4
|
"sourcesContent": ["import { Task } from '../types/task.js';\n// TaskStatus and TaskPriority will be used in future implementations\n// import { TaskStatus, TaskPriority } from '../types/task.js';\nimport { logger } from '../core/monitoring/logger.js';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\ninterface TaskRow {\n id: string;\n title: string;\n description?: string;\n status?: string;\n priority?: string;\n tags?: string;\n external_id?: string;\n external_identifier?: string;\n external_url?: string;\n metadata?: string;\n created_at: number;\n updated_at: number;\n}\n\nexport class ContextService {\n // Using singleton logger from monitoring\n private db: Database.Database | null = null;\n private tasks: Map<string, Task> = new Map();\n\n constructor() {\n // Use singleton logger\n this.initializeDatabase();\n }\n\n private initializeDatabase(): void {\n try {\n const dbPath = join(process.cwd(), '.stackmemory', 'context.db');\n if (existsSync(dbPath)) {\n this.db = new Database(dbPath);\n this.loadTasksFromDatabase();\n }\n } catch (error: unknown) {\n logger.warn(\n 'Could not connect to database, using in-memory storage',\n error\n );\n }\n }\n\n private loadTasksFromDatabase(): void {\n if (!this.db) return;\n\n try {\n // Create tasks table if it doesn't exist\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n description TEXT,\n status TEXT DEFAULT 'todo',\n priority TEXT,\n tags TEXT,\n external_id TEXT,\n external_identifier TEXT,\n external_url TEXT,\n metadata TEXT,\n created_at INTEGER,\n updated_at INTEGER\n )\n `);\n\n // Load all tasks from database\n const stmt = this.db.prepare('SELECT * FROM tasks');\n const rows = stmt.all() as TaskRow[];\n\n for (const row of rows) {\n const task: Task = {\n id: row.id,\n title: row.title,\n description: row.description || '',\n status: row.status || 'todo',\n priority: row.priority || undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n externalId: row.external_id || undefined,\n externalIdentifier: row.external_identifier || undefined,\n externalUrl: row.external_url || undefined,\n metadata: row.metadata ? JSON.parse(row.metadata) : undefined,\n createdAt: new Date(row.created_at),\n updatedAt: new Date(row.updated_at),\n };\n this.tasks.set(task.id, task);\n }\n\n logger.info(`Loaded ${rows.length} tasks from database`);\n } catch (error: unknown) {\n logger.error('Failed to load tasks from database', error);\n }\n }\n\n public async getTask(id: string): Promise<Task | null> {\n return this.tasks.get(id) || null;\n }\n\n public async getTaskByExternalId(externalId: string): Promise<Task | null> {\n for (const task of this.tasks.values()) {\n if (task.externalId === externalId) {\n return task;\n }\n }\n return null;\n }\n\n public async getAllTasks(): Promise<Task[]> {\n return Array.from(this.tasks.values());\n }\n\n public async createTask(taskData: Partial<Task>): Promise<Task> {\n const task: Task = {\n id: this.generateId(),\n title: taskData.title || 'Untitled Task',\n description: taskData.description || '',\n status: taskData.status || 'todo',\n priority: taskData.priority,\n tags: taskData.tags || [],\n externalId: taskData.externalId,\n externalIdentifier: taskData.externalIdentifier,\n externalUrl: taskData.externalUrl,\n metadata: taskData.metadata,\n createdAt: taskData.createdAt || new Date(),\n updatedAt: taskData.updatedAt || new Date(),\n };\n\n this.tasks.set(task.id, task);\n\n // Persist to database if available\n if (this.db) {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO tasks (id, title, description, status, priority, tags, \n external_id, external_identifier, external_url, \n metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n stmt.run(\n task.id,\n task.title,\n task.description,\n task.status,\n task.priority || null,\n JSON.stringify(task.tags),\n task.externalId || null,\n task.externalIdentifier || null,\n task.externalUrl || null,\n task.metadata ? JSON.stringify(task.metadata) : null,\n task.createdAt.getTime(),\n task.updatedAt.getTime()\n );\n } catch (error: unknown) {\n logger.error('Failed to persist task to database', error);\n }\n }\n\n logger.debug(`Created task: ${task.id} - ${task.title}`);\n return task;\n }\n\n public async updateTask(\n id: string,\n updates: Partial<Task>\n ): Promise<Task | null> {\n const task = this.tasks.get(id);\n if (!task) {\n return null;\n }\n\n const updatedTask = {\n ...task,\n ...updates,\n updatedAt: new Date(),\n };\n\n this.tasks.set(id, updatedTask);\n\n // Update in database if available\n if (this.db) {\n try {\n const stmt = this.db.prepare(`\n UPDATE tasks SET title = ?, description = ?, status = ?, \n priority = ?, tags = ?, external_id = ?, \n external_identifier = ?, external_url = ?, \n metadata = ?, updated_at = ?\n WHERE id = ?\n `);\n stmt.run(\n updatedTask.title,\n updatedTask.description,\n updatedTask.status,\n updatedTask.priority || null,\n JSON.stringify(updatedTask.tags),\n updatedTask.externalId || null,\n updatedTask.externalIdentifier || null,\n updatedTask.externalUrl || null,\n updatedTask.metadata ? JSON.stringify(updatedTask.metadata) : null,\n updatedTask.updatedAt.getTime(),\n id\n );\n } catch (error: unknown) {\n logger.error('Failed to update task in database', error);\n }\n }\n\n logger.debug(`Updated task: ${id} - ${updatedTask.title}`);\n return updatedTask;\n }\n\n public async deleteTask(id: string): Promise<boolean> {\n const deleted = this.tasks.delete(id);\n\n if (deleted) {\n // Delete from database if available\n if (this.db) {\n try {\n const stmt = this.db.prepare('DELETE FROM tasks WHERE id = ?');\n stmt.run(id);\n } catch (error: unknown) {\n logger.error('Failed to delete task from database', error);\n }\n }\n logger.debug(`Deleted task: ${id}`);\n }\n return deleted;\n }\n\n private generateId(): string {\n return 'task_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
5
|
+
"mappings": ";;;;AAGA,SAAS,cAAc;AACvB,OAAO,cAAc;AACrB,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAiBpB,MAAM,eAAe;AAAA;AAAA,EAElB,KAA+B;AAAA,EAC/B,QAA2B,oBAAI,IAAI;AAAA,EAE3C,cAAc;AAEZ,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,qBAA2B;AACjC,QAAI;AACF,YAAM,SAAS,KAAK,QAAQ,IAAI,GAAG,gBAAgB,YAAY;AAC/D,UAAI,WAAW,MAAM,GAAG;AACtB,aAAK,KAAK,IAAI,SAAS,MAAM;AAC7B,aAAK,sBAAsB;AAAA,MAC7B;AAAA,IACF,SAAS,OAAgB;AACvB,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,wBAA8B;AACpC,QAAI,CAAC,KAAK,GAAI;AAEd,QAAI;AAEF,WAAK,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAeZ;AAGD,YAAM,OAAO,KAAK,GAAG,QAAQ,qBAAqB;AAClD,YAAM,OAAO,KAAK,IAAI;AAEtB,iBAAW,OAAO,MAAM;AACtB,cAAM,OAAa;AAAA,UACjB,IAAI,IAAI;AAAA,UACR,OAAO,IAAI;AAAA,UACX,aAAa,IAAI,eAAe;AAAA,UAChC,QAAQ,IAAI,UAAU;AAAA,UACtB,UAAU,IAAI,YAAY;AAAA,UAC1B,MAAM,IAAI,OAAO,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC;AAAA,UACzC,YAAY,IAAI,eAAe;AAAA,UAC/B,oBAAoB,IAAI,uBAAuB;AAAA,UAC/C,aAAa,IAAI,gBAAgB;AAAA,UACjC,UAAU,IAAI,WAAW,KAAK,MAAM,IAAI,QAAQ,IAAI;AAAA,UACpD,WAAW,IAAI,KAAK,IAAI,UAAU;AAAA,UAClC,WAAW,IAAI,KAAK,IAAI,UAAU;AAAA,QACpC;AACA,aAAK,MAAM,IAAI,KAAK,IAAI,IAAI;AAAA,MAC9B;AAEA,aAAO,KAAK,UAAU,KAAK,MAAM,sBAAsB;AAAA,IACzD,SAAS,OAAgB;AACvB,aAAO,MAAM,sCAAsC,KAAK;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,MAAa,QAAQ,IAAkC;AACrD,WAAO,KAAK,MAAM,IAAI,EAAE,KAAK;AAAA,EAC/B;AAAA,EAEA,MAAa,oBAAoB,YAA0C;AACzE,eAAW,QAAQ,KAAK,MAAM,OAAO,GAAG;AACtC,UAAI,KAAK,eAAe,YAAY;AAClC,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,cAA+B;AAC1C,WAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,EACvC;AAAA,EAEA,MAAa,WAAW,UAAwC;AAC9D,UAAM,OAAa;AAAA,MACjB,IAAI,KAAK,WAAW;AAAA,MACpB,OAAO,SAAS,SAAS;AAAA,MACzB,aAAa,SAAS,eAAe;AAAA,MACrC,QAAQ,SAAS,UAAU;AAAA,MAC3B,UAAU,SAAS;AAAA,MACnB,MAAM,SAAS,QAAQ,CAAC;AAAA,MACxB,YAAY,SAAS;AAAA,MACrB,oBAAoB,SAAS;AAAA,MAC7B,aAAa,SAAS;AAAA,MACtB,UAAU,SAAS;AAAA,MACnB,WAAW,SAAS,aAAa,oBAAI,KAAK;AAAA,MAC1C,WAAW,SAAS,aAAa,oBAAI,KAAK;AAAA,IAC5C;AAEA,SAAK,MAAM,IAAI,KAAK,IAAI,IAAI;AAG5B,QAAI,KAAK,IAAI;AACX,UAAI;AACF,cAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,SAK5B;AACD,aAAK;AAAA,UACH,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK,YAAY;AAAA,UACjB,KAAK,UAAU,KAAK,IAAI;AAAA,UACxB,KAAK,cAAc;AAAA,UACnB,KAAK,sBAAsB;AAAA,UAC3B,KAAK,eAAe;AAAA,UACpB,KAAK,WAAW,KAAK,UAAU,KAAK,QAAQ,IAAI;AAAA,UAChD,KAAK,UAAU,QAAQ;AAAA,UACvB,KAAK,UAAU,QAAQ;AAAA,QACzB;AAAA,MACF,SAAS,OAAgB;AACvB,eAAO,MAAM,sCAAsC,KAAK;AAAA,MAC1D;AAAA,IACF;AAEA,WAAO,MAAM,iBAAiB,KAAK,EAAE,MAAM,KAAK,KAAK,EAAE;AACvD,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,WACX,IACA,SACsB;AACtB,UAAM,OAAO,KAAK,MAAM,IAAI,EAAE;AAC9B,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,UAAM,cAAc;AAAA,MAClB,GAAG;AAAA,MACH,GAAG;AAAA,MACH,WAAW,oBAAI,KAAK;AAAA,IACtB;AAEA,SAAK,MAAM,IAAI,IAAI,WAAW;AAG9B,QAAI,KAAK,IAAI;AACX,UAAI;AACF,cAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAM5B;AACD,aAAK;AAAA,UACH,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,YAAY,YAAY;AAAA,UACxB,KAAK,UAAU,YAAY,IAAI;AAAA,UAC/B,YAAY,cAAc;AAAA,UAC1B,YAAY,sBAAsB;AAAA,UAClC,YAAY,eAAe;AAAA,UAC3B,YAAY,WAAW,KAAK,UAAU,YAAY,QAAQ,IAAI;AAAA,UAC9D,YAAY,UAAU,QAAQ;AAAA,UAC9B;AAAA,QACF;AAAA,MACF,SAAS,OAAgB;AACvB,eAAO,MAAM,qCAAqC,KAAK;AAAA,MACzD;AAAA,IACF;AAEA,WAAO,MAAM,iBAAiB,EAAE,MAAM,YAAY,KAAK,EAAE;AACzD,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,WAAW,IAA8B;AACpD,UAAM,UAAU,KAAK,MAAM,OAAO,EAAE;AAEpC,QAAI,SAAS;AAEX,UAAI,KAAK,IAAI;AACX,YAAI;AACF,gBAAM,OAAO,KAAK,GAAG,QAAQ,gCAAgC;AAC7D,eAAK,IAAI,EAAE;AAAA,QACb,SAAS,OAAgB;AACvB,iBAAO,MAAM,uCAAuC,KAAK;AAAA,QAC3D;AAAA,MACF;AACA,aAAO,MAAM,iBAAiB,EAAE,EAAE;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAqB;AAC3B,WAAO,UAAU,KAAK,IAAI,IAAI,MAAM,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC;AAAA,EAC5E;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,353 @@
|
|
|
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 { execSync } from "child_process";
|
|
6
|
+
import * as fs from "fs";
|
|
7
|
+
import * as path from "path";
|
|
8
|
+
import * as os from "os";
|
|
9
|
+
import { logger } from "../core/monitoring/logger.js";
|
|
10
|
+
import { getAPISkill } from "./api-skill.js";
|
|
11
|
+
const API_PATTERNS = [
|
|
12
|
+
// Direct API URLs
|
|
13
|
+
{
|
|
14
|
+
pattern: /https?:\/\/api\.([a-z0-9-]+)\.(com|io|dev|app|co)/,
|
|
15
|
+
nameGroup: 1
|
|
16
|
+
},
|
|
17
|
+
// REST API paths in docs
|
|
18
|
+
{ pattern: /https?:\/\/([a-z0-9-]+)\.com\/api/, nameGroup: 1 },
|
|
19
|
+
// Developer docs
|
|
20
|
+
{ pattern: /https?:\/\/developer\.([a-z0-9-]+)\.com/, nameGroup: 1 },
|
|
21
|
+
// Docs subdomains
|
|
22
|
+
{ pattern: /https?:\/\/docs\.([a-z0-9-]+)\.(com|io|dev)/, nameGroup: 1 }
|
|
23
|
+
];
|
|
24
|
+
const KNOWN_SPECS = {
|
|
25
|
+
github: "https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.json",
|
|
26
|
+
stripe: "https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.json",
|
|
27
|
+
twilio: "https://raw.githubusercontent.com/twilio/twilio-oai/main/spec/json/twilio_api_v2010.json",
|
|
28
|
+
slack: "https://api.slack.com/specs/openapi/v2/slack_web.json",
|
|
29
|
+
discord: "https://raw.githubusercontent.com/discord/discord-api-spec/main/specs/openapi.json",
|
|
30
|
+
openai: "https://raw.githubusercontent.com/openai/openai-openapi/master/openapi.yaml",
|
|
31
|
+
anthropic: "https://raw.githubusercontent.com/anthropics/anthropic-sdk-python/main/openapi.json",
|
|
32
|
+
linear: "https://api.linear.app/graphql",
|
|
33
|
+
// GraphQL, not REST
|
|
34
|
+
notion: "https://raw.githubusercontent.com/NotionX/notion-sdk-js/main/openapi.json",
|
|
35
|
+
vercel: "https://openapi.vercel.sh/",
|
|
36
|
+
cloudflare: "https://raw.githubusercontent.com/cloudflare/api-schemas/main/openapi.json",
|
|
37
|
+
// Google Cloud Platform - uses Google Discovery format
|
|
38
|
+
gcp: "https://www.googleapis.com/discovery/v1/apis",
|
|
39
|
+
"gcp-compute": "https://compute.googleapis.com/$discovery/rest?version=v1",
|
|
40
|
+
"gcp-storage": "https://storage.googleapis.com/$discovery/rest?version=v1",
|
|
41
|
+
"gcp-run": "https://run.googleapis.com/$discovery/rest?version=v2",
|
|
42
|
+
"gcp-functions": "https://cloudfunctions.googleapis.com/$discovery/rest?version=v2",
|
|
43
|
+
"gcp-bigquery": "https://bigquery.googleapis.com/$discovery/rest?version=v2",
|
|
44
|
+
"gcp-aiplatform": "https://aiplatform.googleapis.com/$discovery/rest?version=v1",
|
|
45
|
+
// Railway - GraphQL API
|
|
46
|
+
railway: "https://backboard.railway.com/graphql/v2"
|
|
47
|
+
// GraphQL endpoint
|
|
48
|
+
};
|
|
49
|
+
const KNOWN_BASES = {
|
|
50
|
+
github: "https://api.github.com",
|
|
51
|
+
stripe: "https://api.stripe.com",
|
|
52
|
+
twilio: "https://api.twilio.com",
|
|
53
|
+
slack: "https://slack.com/api",
|
|
54
|
+
discord: "https://discord.com/api",
|
|
55
|
+
openai: "https://api.openai.com",
|
|
56
|
+
anthropic: "https://api.anthropic.com",
|
|
57
|
+
linear: "https://api.linear.app",
|
|
58
|
+
notion: "https://api.notion.com",
|
|
59
|
+
vercel: "https://api.vercel.com",
|
|
60
|
+
cloudflare: "https://api.cloudflare.com",
|
|
61
|
+
// Google Cloud Platform
|
|
62
|
+
gcp: "https://www.googleapis.com",
|
|
63
|
+
"gcp-compute": "https://compute.googleapis.com",
|
|
64
|
+
"gcp-storage": "https://storage.googleapis.com",
|
|
65
|
+
"gcp-run": "https://run.googleapis.com",
|
|
66
|
+
"gcp-functions": "https://cloudfunctions.googleapis.com",
|
|
67
|
+
"gcp-bigquery": "https://bigquery.googleapis.com",
|
|
68
|
+
"gcp-aiplatform": "https://aiplatform.googleapis.com",
|
|
69
|
+
// Railway (GraphQL)
|
|
70
|
+
railway: "https://backboard.railway.com/graphql/v2"
|
|
71
|
+
};
|
|
72
|
+
const API_TYPES = {
|
|
73
|
+
railway: "graphql",
|
|
74
|
+
linear: "graphql",
|
|
75
|
+
gcp: "google-discovery",
|
|
76
|
+
"gcp-compute": "google-discovery",
|
|
77
|
+
"gcp-storage": "google-discovery",
|
|
78
|
+
"gcp-run": "google-discovery",
|
|
79
|
+
"gcp-functions": "google-discovery",
|
|
80
|
+
"gcp-bigquery": "google-discovery",
|
|
81
|
+
"gcp-aiplatform": "google-discovery"
|
|
82
|
+
};
|
|
83
|
+
class APIDiscoverySkill {
|
|
84
|
+
discoveryLog;
|
|
85
|
+
discoveredAPIs = /* @__PURE__ */ new Map();
|
|
86
|
+
constructor() {
|
|
87
|
+
this.discoveryLog = path.join(
|
|
88
|
+
os.homedir(),
|
|
89
|
+
".stackmemory",
|
|
90
|
+
"api-discovery.log"
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Analyze a URL for potential API endpoints
|
|
95
|
+
*/
|
|
96
|
+
analyzeUrl(url) {
|
|
97
|
+
if (url.includes("googleapis.com")) {
|
|
98
|
+
const gcpMatch = url.match(/https?:\/\/([a-z]+)\.googleapis\.com/);
|
|
99
|
+
if (gcpMatch) {
|
|
100
|
+
const service = gcpMatch[1];
|
|
101
|
+
const name = `gcp-${service}`;
|
|
102
|
+
return {
|
|
103
|
+
name,
|
|
104
|
+
baseUrl: `https://${service}.googleapis.com`,
|
|
105
|
+
specUrl: KNOWN_SPECS[name] || `https://${service}.googleapis.com/$discovery/rest?version=v1`,
|
|
106
|
+
source: "known",
|
|
107
|
+
confidence: 0.95,
|
|
108
|
+
apiType: "google-discovery"
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (url.includes("railway.com") || url.includes("railway.app")) {
|
|
113
|
+
return {
|
|
114
|
+
name: "railway",
|
|
115
|
+
baseUrl: KNOWN_BASES["railway"],
|
|
116
|
+
specUrl: KNOWN_SPECS["railway"],
|
|
117
|
+
source: "known",
|
|
118
|
+
confidence: 0.95,
|
|
119
|
+
apiType: "graphql"
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
for (const [name, baseUrl] of Object.entries(KNOWN_BASES)) {
|
|
123
|
+
if (url.includes(name) || url.includes(baseUrl)) {
|
|
124
|
+
return {
|
|
125
|
+
name,
|
|
126
|
+
baseUrl,
|
|
127
|
+
specUrl: KNOWN_SPECS[name],
|
|
128
|
+
source: "known",
|
|
129
|
+
confidence: 0.95,
|
|
130
|
+
apiType: API_TYPES[name] || "rest"
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
for (const { pattern, nameGroup } of API_PATTERNS) {
|
|
135
|
+
const match = url.match(pattern);
|
|
136
|
+
if (match) {
|
|
137
|
+
const name = match[nameGroup].toLowerCase();
|
|
138
|
+
const baseUrl = this.inferBaseUrl(url, name);
|
|
139
|
+
return {
|
|
140
|
+
name,
|
|
141
|
+
baseUrl,
|
|
142
|
+
source: "inferred",
|
|
143
|
+
confidence: 0.7,
|
|
144
|
+
apiType: "rest"
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Infer base URL from a discovered URL
|
|
152
|
+
*/
|
|
153
|
+
inferBaseUrl(url, name) {
|
|
154
|
+
const patterns = [
|
|
155
|
+
`https://api.${name}.com`,
|
|
156
|
+
`https://api.${name}.io`,
|
|
157
|
+
`https://${name}.com/api`
|
|
158
|
+
];
|
|
159
|
+
try {
|
|
160
|
+
const urlObj = new URL(url);
|
|
161
|
+
if (urlObj.hostname.startsWith("api.")) {
|
|
162
|
+
return `${urlObj.protocol}//${urlObj.hostname}`;
|
|
163
|
+
}
|
|
164
|
+
if (urlObj.pathname.includes("/api")) {
|
|
165
|
+
return `${urlObj.protocol}//${urlObj.hostname}/api`;
|
|
166
|
+
}
|
|
167
|
+
return `${urlObj.protocol}//${urlObj.hostname}`;
|
|
168
|
+
} catch {
|
|
169
|
+
return patterns[0];
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Try to discover OpenAPI spec for a service
|
|
174
|
+
*/
|
|
175
|
+
async discoverSpec(name, baseUrl) {
|
|
176
|
+
if (KNOWN_SPECS[name]) {
|
|
177
|
+
return KNOWN_SPECS[name];
|
|
178
|
+
}
|
|
179
|
+
const specPaths = [
|
|
180
|
+
"/openapi.json",
|
|
181
|
+
"/openapi.yaml",
|
|
182
|
+
"/swagger.json",
|
|
183
|
+
"/swagger.yaml",
|
|
184
|
+
"/api-docs",
|
|
185
|
+
"/v1/openapi.json",
|
|
186
|
+
"/v2/openapi.json",
|
|
187
|
+
"/docs/openapi.json",
|
|
188
|
+
"/.well-known/openapi.json"
|
|
189
|
+
];
|
|
190
|
+
for (const specPath of specPaths) {
|
|
191
|
+
const specUrl = `${baseUrl}${specPath}`;
|
|
192
|
+
try {
|
|
193
|
+
execSync(`curl -sI --max-time 2 "${specUrl}" | grep -q "200 OK"`, {
|
|
194
|
+
stdio: "pipe"
|
|
195
|
+
});
|
|
196
|
+
return specUrl;
|
|
197
|
+
} catch {
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Process a URL and auto-register if it's an API
|
|
204
|
+
*/
|
|
205
|
+
async processUrl(url, autoRegister = true) {
|
|
206
|
+
const discovered = this.analyzeUrl(url);
|
|
207
|
+
if (!discovered) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
if (this.discoveredAPIs.has(discovered.name)) {
|
|
211
|
+
return this.discoveredAPIs.get(discovered.name);
|
|
212
|
+
}
|
|
213
|
+
if (!discovered.specUrl && discovered.source !== "known") {
|
|
214
|
+
try {
|
|
215
|
+
discovered.specUrl = await this.discoverSpec(discovered.name, discovered.baseUrl) || void 0;
|
|
216
|
+
} catch {
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
this.discoveredAPIs.set(discovered.name, discovered);
|
|
220
|
+
this.logDiscovery(discovered, url);
|
|
221
|
+
if (autoRegister && discovered.confidence >= 0.7) {
|
|
222
|
+
await this.registerAPI(discovered);
|
|
223
|
+
}
|
|
224
|
+
return discovered;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Register a discovered API
|
|
228
|
+
*/
|
|
229
|
+
async registerAPI(api) {
|
|
230
|
+
const skill = getAPISkill();
|
|
231
|
+
try {
|
|
232
|
+
const result = await skill.add(api.name, api.baseUrl, {
|
|
233
|
+
spec: api.specUrl
|
|
234
|
+
});
|
|
235
|
+
if (result.success) {
|
|
236
|
+
logger.info(`Auto-registered API: ${api.name}`);
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
239
|
+
} catch (error) {
|
|
240
|
+
logger.warn(`Failed to auto-register API ${api.name}:`, error);
|
|
241
|
+
}
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Log discovery for debugging
|
|
246
|
+
*/
|
|
247
|
+
logDiscovery(api, sourceUrl) {
|
|
248
|
+
const entry = {
|
|
249
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
250
|
+
api,
|
|
251
|
+
sourceUrl
|
|
252
|
+
};
|
|
253
|
+
try {
|
|
254
|
+
const dir = path.dirname(this.discoveryLog);
|
|
255
|
+
if (!fs.existsSync(dir)) {
|
|
256
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
257
|
+
}
|
|
258
|
+
fs.appendFileSync(this.discoveryLog, JSON.stringify(entry) + "\n");
|
|
259
|
+
} catch (error) {
|
|
260
|
+
logger.warn("Failed to log API discovery:", error);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get all discovered APIs
|
|
265
|
+
*/
|
|
266
|
+
getDiscoveredAPIs() {
|
|
267
|
+
return Array.from(this.discoveredAPIs.values());
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Suggest API registration based on recent activity
|
|
271
|
+
*/
|
|
272
|
+
async suggestFromContext(recentUrls) {
|
|
273
|
+
const result = {
|
|
274
|
+
discovered: [],
|
|
275
|
+
registered: [],
|
|
276
|
+
skipped: []
|
|
277
|
+
};
|
|
278
|
+
for (const url of recentUrls) {
|
|
279
|
+
const discovered = await this.processUrl(url, false);
|
|
280
|
+
if (discovered) {
|
|
281
|
+
result.discovered.push(discovered);
|
|
282
|
+
const skill = getAPISkill();
|
|
283
|
+
const listResult = await skill.list();
|
|
284
|
+
const existingAPIs = listResult.data || [];
|
|
285
|
+
if (existingAPIs.some((api) => api.name === discovered.name)) {
|
|
286
|
+
result.skipped.push(discovered.name);
|
|
287
|
+
} else if (discovered.confidence >= 0.7) {
|
|
288
|
+
const registered = await this.registerAPI(discovered);
|
|
289
|
+
if (registered) {
|
|
290
|
+
result.registered.push(discovered.name);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return result;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Get help text
|
|
299
|
+
*/
|
|
300
|
+
getHelp() {
|
|
301
|
+
const restAPIs = Object.keys(KNOWN_SPECS).filter(
|
|
302
|
+
(s) => !API_TYPES[s] || API_TYPES[s] === "rest"
|
|
303
|
+
);
|
|
304
|
+
const graphqlAPIs = Object.keys(KNOWN_SPECS).filter(
|
|
305
|
+
(s) => API_TYPES[s] === "graphql"
|
|
306
|
+
);
|
|
307
|
+
const gcpAPIs = Object.keys(KNOWN_SPECS).filter(
|
|
308
|
+
(s) => API_TYPES[s] === "google-discovery"
|
|
309
|
+
);
|
|
310
|
+
return `
|
|
311
|
+
API Auto-Discovery
|
|
312
|
+
|
|
313
|
+
Automatically detects and registers APIs when you browse documentation.
|
|
314
|
+
|
|
315
|
+
REST APIs (OpenAPI specs):
|
|
316
|
+
${restAPIs.map((s) => ` - ${s}`).join("\n")}
|
|
317
|
+
|
|
318
|
+
GraphQL APIs:
|
|
319
|
+
${graphqlAPIs.map((s) => ` - ${s}`).join("\n")}
|
|
320
|
+
|
|
321
|
+
Google Cloud Platform (Discovery format):
|
|
322
|
+
${gcpAPIs.map((s) => ` - ${s}`).join("\n")}
|
|
323
|
+
|
|
324
|
+
How It Works:
|
|
325
|
+
1. Monitors URLs you access during development
|
|
326
|
+
2. Identifies API documentation and endpoints
|
|
327
|
+
3. Finds OpenAPI specs automatically
|
|
328
|
+
4. Registers APIs for easy access via /api exec
|
|
329
|
+
|
|
330
|
+
Usage:
|
|
331
|
+
# Check if a URL is a known API
|
|
332
|
+
stackmemory api discover <url>
|
|
333
|
+
|
|
334
|
+
# List discovered APIs
|
|
335
|
+
stackmemory api discovered
|
|
336
|
+
|
|
337
|
+
# Register all discovered APIs
|
|
338
|
+
stackmemory api register-discovered
|
|
339
|
+
`;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
let discoveryInstance = null;
|
|
343
|
+
function getAPIDiscovery() {
|
|
344
|
+
if (!discoveryInstance) {
|
|
345
|
+
discoveryInstance = new APIDiscoverySkill();
|
|
346
|
+
}
|
|
347
|
+
return discoveryInstance;
|
|
348
|
+
}
|
|
349
|
+
export {
|
|
350
|
+
APIDiscoverySkill,
|
|
351
|
+
getAPIDiscovery
|
|
352
|
+
};
|
|
353
|
+
//# sourceMappingURL=api-discovery.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/skills/api-discovery.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * API Auto-Discovery Skill\n *\n * Automatically detects API endpoints and OpenAPI specs when Claude\n * reads documentation or API URLs, then registers them for easy access.\n */\n\nimport { execSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { logger } from '../core/monitoring/logger.js';\nimport { getAPISkill } from './api-skill.js';\n\n// Common API documentation patterns\nconst API_PATTERNS = [\n // Direct API URLs\n {\n pattern: /https?:\\/\\/api\\.([a-z0-9-]+)\\.(com|io|dev|app|co)/,\n nameGroup: 1,\n },\n // REST API paths in docs\n { pattern: /https?:\\/\\/([a-z0-9-]+)\\.com\\/api/, nameGroup: 1 },\n // Developer docs\n { pattern: /https?:\\/\\/developer\\.([a-z0-9-]+)\\.com/, nameGroup: 1 },\n // Docs subdomains\n { pattern: /https?:\\/\\/docs\\.([a-z0-9-]+)\\.(com|io|dev)/, nameGroup: 1 },\n];\n\n// Known OpenAPI spec locations for popular services\nconst KNOWN_SPECS: Record<string, string> = {\n github:\n 'https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.json',\n stripe:\n 'https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.json',\n twilio:\n 'https://raw.githubusercontent.com/twilio/twilio-oai/main/spec/json/twilio_api_v2010.json',\n slack: 'https://api.slack.com/specs/openapi/v2/slack_web.json',\n discord:\n 'https://raw.githubusercontent.com/discord/discord-api-spec/main/specs/openapi.json',\n openai:\n 'https://raw.githubusercontent.com/openai/openai-openapi/master/openapi.yaml',\n anthropic:\n 'https://raw.githubusercontent.com/anthropics/anthropic-sdk-python/main/openapi.json',\n linear: 'https://api.linear.app/graphql', // GraphQL, not REST\n notion:\n 'https://raw.githubusercontent.com/NotionX/notion-sdk-js/main/openapi.json',\n vercel: 'https://openapi.vercel.sh/',\n cloudflare:\n 'https://raw.githubusercontent.com/cloudflare/api-schemas/main/openapi.json',\n // Google Cloud Platform - uses Google Discovery format\n gcp: 'https://www.googleapis.com/discovery/v1/apis',\n 'gcp-compute': 'https://compute.googleapis.com/$discovery/rest?version=v1',\n 'gcp-storage': 'https://storage.googleapis.com/$discovery/rest?version=v1',\n 'gcp-run': 'https://run.googleapis.com/$discovery/rest?version=v2',\n 'gcp-functions':\n 'https://cloudfunctions.googleapis.com/$discovery/rest?version=v2',\n 'gcp-bigquery': 'https://bigquery.googleapis.com/$discovery/rest?version=v2',\n 'gcp-aiplatform':\n 'https://aiplatform.googleapis.com/$discovery/rest?version=v1',\n // Railway - GraphQL API\n railway: 'https://backboard.railway.com/graphql/v2', // GraphQL endpoint\n};\n\n// Known base URLs for popular services\nconst KNOWN_BASES: Record<string, string> = {\n github: 'https://api.github.com',\n stripe: 'https://api.stripe.com',\n twilio: 'https://api.twilio.com',\n slack: 'https://slack.com/api',\n discord: 'https://discord.com/api',\n openai: 'https://api.openai.com',\n anthropic: 'https://api.anthropic.com',\n linear: 'https://api.linear.app',\n notion: 'https://api.notion.com',\n vercel: 'https://api.vercel.com',\n cloudflare: 'https://api.cloudflare.com',\n // Google Cloud Platform\n gcp: 'https://www.googleapis.com',\n 'gcp-compute': 'https://compute.googleapis.com',\n 'gcp-storage': 'https://storage.googleapis.com',\n 'gcp-run': 'https://run.googleapis.com',\n 'gcp-functions': 'https://cloudfunctions.googleapis.com',\n 'gcp-bigquery': 'https://bigquery.googleapis.com',\n 'gcp-aiplatform': 'https://aiplatform.googleapis.com',\n // Railway (GraphQL)\n railway: 'https://backboard.railway.com/graphql/v2',\n};\n\n// API types for special handling\nconst API_TYPES: Record<string, 'rest' | 'graphql' | 'google-discovery'> = {\n railway: 'graphql',\n linear: 'graphql',\n gcp: 'google-discovery',\n 'gcp-compute': 'google-discovery',\n 'gcp-storage': 'google-discovery',\n 'gcp-run': 'google-discovery',\n 'gcp-functions': 'google-discovery',\n 'gcp-bigquery': 'google-discovery',\n 'gcp-aiplatform': 'google-discovery',\n};\n\nexport interface DiscoveredAPI {\n name: string;\n baseUrl: string;\n specUrl?: string;\n source: 'url' | 'docs' | 'known' | 'inferred';\n confidence: number; // 0-1\n apiType?: 'rest' | 'graphql' | 'google-discovery';\n}\n\nexport interface DiscoveryResult {\n discovered: DiscoveredAPI[];\n registered: string[];\n skipped: string[];\n}\n\nexport class APIDiscoverySkill {\n private discoveryLog: string;\n private discoveredAPIs: Map<string, DiscoveredAPI> = new Map();\n\n constructor() {\n this.discoveryLog = path.join(\n os.homedir(),\n '.stackmemory',\n 'api-discovery.log'\n );\n }\n\n /**\n * Analyze a URL for potential API endpoints\n */\n analyzeUrl(url: string): DiscoveredAPI | null {\n // Check for GCP URLs first (special pattern)\n if (url.includes('googleapis.com')) {\n const gcpMatch = url.match(/https?:\\/\\/([a-z]+)\\.googleapis\\.com/);\n if (gcpMatch) {\n const service = gcpMatch[1];\n const name = `gcp-${service}`;\n return {\n name,\n baseUrl: `https://${service}.googleapis.com`,\n specUrl:\n KNOWN_SPECS[name] ||\n `https://${service}.googleapis.com/$discovery/rest?version=v1`,\n source: 'known',\n confidence: 0.95,\n apiType: 'google-discovery',\n };\n }\n }\n\n // Check for Railway\n if (url.includes('railway.com') || url.includes('railway.app')) {\n return {\n name: 'railway',\n baseUrl: KNOWN_BASES['railway'],\n specUrl: KNOWN_SPECS['railway'],\n source: 'known',\n confidence: 0.95,\n apiType: 'graphql',\n };\n }\n\n // Check if it's a known service\n for (const [name, baseUrl] of Object.entries(KNOWN_BASES)) {\n if (url.includes(name) || url.includes(baseUrl)) {\n return {\n name,\n baseUrl,\n specUrl: KNOWN_SPECS[name],\n source: 'known',\n confidence: 0.95,\n apiType: API_TYPES[name] || 'rest',\n };\n }\n }\n\n // Try to match API patterns\n for (const { pattern, nameGroup } of API_PATTERNS) {\n const match = url.match(pattern);\n if (match) {\n const name = match[nameGroup].toLowerCase();\n const baseUrl = this.inferBaseUrl(url, name);\n\n return {\n name,\n baseUrl,\n source: 'inferred',\n confidence: 0.7,\n apiType: 'rest',\n };\n }\n }\n\n return null;\n }\n\n /**\n * Infer base URL from a discovered URL\n */\n private inferBaseUrl(url: string, name: string): string {\n // Try common patterns\n const patterns = [\n `https://api.${name}.com`,\n `https://api.${name}.io`,\n `https://${name}.com/api`,\n ];\n\n // Extract domain from URL\n try {\n const urlObj = new URL(url);\n if (urlObj.hostname.startsWith('api.')) {\n return `${urlObj.protocol}//${urlObj.hostname}`;\n }\n if (urlObj.pathname.includes('/api')) {\n return `${urlObj.protocol}//${urlObj.hostname}/api`;\n }\n return `${urlObj.protocol}//${urlObj.hostname}`;\n } catch {\n return patterns[0];\n }\n }\n\n /**\n * Try to discover OpenAPI spec for a service\n */\n async discoverSpec(name: string, baseUrl: string): Promise<string | null> {\n // Check known specs first\n if (KNOWN_SPECS[name]) {\n return KNOWN_SPECS[name];\n }\n\n // Try common spec locations\n const specPaths = [\n '/openapi.json',\n '/openapi.yaml',\n '/swagger.json',\n '/swagger.yaml',\n '/api-docs',\n '/v1/openapi.json',\n '/v2/openapi.json',\n '/docs/openapi.json',\n '/.well-known/openapi.json',\n ];\n\n for (const specPath of specPaths) {\n const specUrl = `${baseUrl}${specPath}`;\n try {\n // Quick HEAD request to check if spec exists\n execSync(`curl -sI --max-time 2 \"${specUrl}\" | grep -q \"200 OK\"`, {\n stdio: 'pipe',\n });\n return specUrl;\n } catch {\n // Spec not found at this location\n }\n }\n\n return null;\n }\n\n /**\n * Process a URL and auto-register if it's an API\n */\n async processUrl(\n url: string,\n autoRegister: boolean = true\n ): Promise<DiscoveredAPI | null> {\n const discovered = this.analyzeUrl(url);\n\n if (!discovered) {\n return null;\n }\n\n // Check if already discovered\n if (this.discoveredAPIs.has(discovered.name)) {\n return this.discoveredAPIs.get(discovered.name)!;\n }\n\n // Only probe for spec if it's not a known service (known services already have spec URLs)\n if (!discovered.specUrl && discovered.source !== 'known') {\n // Try to find OpenAPI spec (with timeout protection)\n try {\n discovered.specUrl =\n (await this.discoverSpec(discovered.name, discovered.baseUrl)) ||\n undefined;\n } catch {\n // Spec discovery failed, continue without\n }\n }\n\n this.discoveredAPIs.set(discovered.name, discovered);\n this.logDiscovery(discovered, url);\n\n // Auto-register if enabled and confidence is high enough\n if (autoRegister && discovered.confidence >= 0.7) {\n await this.registerAPI(discovered);\n }\n\n return discovered;\n }\n\n /**\n * Register a discovered API\n */\n async registerAPI(api: DiscoveredAPI): Promise<boolean> {\n const skill = getAPISkill();\n\n try {\n const result = await skill.add(api.name, api.baseUrl, {\n spec: api.specUrl,\n });\n\n if (result.success) {\n logger.info(`Auto-registered API: ${api.name}`);\n return true;\n }\n } catch (error) {\n logger.warn(`Failed to auto-register API ${api.name}:`, error);\n }\n\n return false;\n }\n\n /**\n * Log discovery for debugging\n */\n private logDiscovery(api: DiscoveredAPI, sourceUrl: string): void {\n const entry = {\n timestamp: new Date().toISOString(),\n api,\n sourceUrl,\n };\n\n try {\n const dir = path.dirname(this.discoveryLog);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n fs.appendFileSync(this.discoveryLog, JSON.stringify(entry) + '\\n');\n } catch (error) {\n logger.warn('Failed to log API discovery:', error);\n }\n }\n\n /**\n * Get all discovered APIs\n */\n getDiscoveredAPIs(): DiscoveredAPI[] {\n return Array.from(this.discoveredAPIs.values());\n }\n\n /**\n * Suggest API registration based on recent activity\n */\n async suggestFromContext(recentUrls: string[]): Promise<DiscoveryResult> {\n const result: DiscoveryResult = {\n discovered: [],\n registered: [],\n skipped: [],\n };\n\n for (const url of recentUrls) {\n const discovered = await this.processUrl(url, false);\n\n if (discovered) {\n result.discovered.push(discovered);\n\n // Check if already registered\n const skill = getAPISkill();\n const listResult = await skill.list();\n const existingAPIs = (listResult.data as Array<{ name: string }>) || [];\n\n if (existingAPIs.some((api) => api.name === discovered.name)) {\n result.skipped.push(discovered.name);\n } else if (discovered.confidence >= 0.7) {\n const registered = await this.registerAPI(discovered);\n if (registered) {\n result.registered.push(discovered.name);\n }\n }\n }\n }\n\n return result;\n }\n\n /**\n * Get help text\n */\n getHelp(): string {\n const restAPIs = Object.keys(KNOWN_SPECS).filter(\n (s) => !API_TYPES[s] || API_TYPES[s] === 'rest'\n );\n const graphqlAPIs = Object.keys(KNOWN_SPECS).filter(\n (s) => API_TYPES[s] === 'graphql'\n );\n const gcpAPIs = Object.keys(KNOWN_SPECS).filter(\n (s) => API_TYPES[s] === 'google-discovery'\n );\n\n return `\nAPI Auto-Discovery\n\nAutomatically detects and registers APIs when you browse documentation.\n\nREST APIs (OpenAPI specs):\n${restAPIs.map((s) => ` - ${s}`).join('\\n')}\n\nGraphQL APIs:\n${graphqlAPIs.map((s) => ` - ${s}`).join('\\n')}\n\nGoogle Cloud Platform (Discovery format):\n${gcpAPIs.map((s) => ` - ${s}`).join('\\n')}\n\nHow It Works:\n1. Monitors URLs you access during development\n2. Identifies API documentation and endpoints\n3. Finds OpenAPI specs automatically\n4. Registers APIs for easy access via /api exec\n\nUsage:\n # Check if a URL is a known API\n stackmemory api discover <url>\n\n # List discovered APIs\n stackmemory api discovered\n\n # Register all discovered APIs\n stackmemory api register-discovered\n`;\n }\n}\n\n// Singleton instance\nlet discoveryInstance: APIDiscoverySkill | null = null;\n\nexport function getAPIDiscovery(): APIDiscoverySkill {\n if (!discoveryInstance) {\n discoveryInstance = new APIDiscoverySkill();\n }\n return discoveryInstance;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|