@stackmemoryai/stackmemory 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -272
- package/dist/cli/commands/clear.js +191 -0
- package/dist/cli/commands/clear.js.map +7 -0
- package/dist/cli/commands/config.js +152 -1
- package/dist/cli/commands/config.js.map +2 -2
- package/dist/cli/commands/dashboard.js +178 -0
- package/dist/cli/commands/dashboard.js.map +7 -0
- package/dist/cli/commands/handoff.js +125 -8
- package/dist/cli/commands/handoff.js.map +2 -2
- package/dist/cli/commands/linear-create.js +132 -0
- package/dist/cli/commands/linear-create.js.map +7 -0
- package/dist/cli/commands/linear-list.js +69 -0
- package/dist/cli/commands/linear-list.js.map +7 -0
- package/dist/cli/commands/linear-migrate.js +40 -0
- package/dist/cli/commands/linear-migrate.js.map +7 -0
- package/dist/cli/commands/linear.js +185 -36
- package/dist/cli/commands/linear.js.map +2 -2
- package/dist/cli/commands/monitor.js +309 -0
- package/dist/cli/commands/monitor.js.map +7 -0
- package/dist/cli/commands/quality.js +414 -0
- package/dist/cli/commands/quality.js.map +7 -0
- package/dist/cli/commands/storage.js +275 -0
- package/dist/cli/commands/storage.js.map +7 -0
- package/dist/cli/commands/tui.js +66 -0
- package/dist/cli/commands/tui.js.map +7 -0
- package/dist/cli/commands/workflow.js +134 -0
- package/dist/cli/commands/workflow.js.map +7 -0
- package/dist/cli/index.js +104 -8
- package/dist/cli/index.js.map +3 -3
- package/dist/core/analytics/team-analytics.js +374 -0
- package/dist/core/analytics/team-analytics.js.map +7 -0
- package/dist/core/context/context-bridge.js +234 -0
- package/dist/core/context/context-bridge.js.map +7 -0
- package/dist/core/context/dual-stack-manager.js +850 -0
- package/dist/core/context/dual-stack-manager.js.map +7 -0
- package/dist/core/context/frame-handoff-manager.js +384 -0
- package/dist/core/context/frame-handoff-manager.js.map +7 -0
- package/dist/core/context/frame-manager.js +132 -12
- package/dist/core/context/frame-manager.js.map +2 -2
- package/dist/core/context/permission-manager.js +181 -0
- package/dist/core/context/permission-manager.js.map +7 -0
- package/dist/core/context/shared-context-layer.js +386 -0
- package/dist/core/context/shared-context-layer.js.map +7 -0
- package/dist/core/context/stack-merge-resolver.js +600 -0
- package/dist/core/context/stack-merge-resolver.js.map +7 -0
- package/dist/core/context/validation.js +121 -0
- package/dist/core/context/validation.js.map +7 -0
- package/dist/core/database/connection-pool.js +266 -175
- package/dist/core/database/connection-pool.js.map +2 -2
- package/dist/core/database/database-adapter.js +51 -0
- package/dist/core/database/database-adapter.js.map +7 -0
- package/dist/core/database/migration-manager.js +514 -0
- package/dist/core/database/migration-manager.js.map +7 -0
- package/dist/core/database/paradedb-adapter.js +970 -0
- package/dist/core/database/paradedb-adapter.js.map +7 -0
- package/dist/core/database/query-router.js +421 -0
- package/dist/core/database/query-router.js.map +7 -0
- package/dist/core/database/sqlite-adapter.js +547 -0
- package/dist/core/database/sqlite-adapter.js.map +7 -0
- package/dist/core/errors/index.js +21 -1
- package/dist/core/errors/index.js.map +2 -2
- package/dist/core/frame/workflow-templates-stub.js +42 -0
- package/dist/core/frame/workflow-templates-stub.js.map +7 -0
- package/dist/core/frame/workflow-templates.js +276 -0
- package/dist/core/frame/workflow-templates.js.map +7 -0
- package/dist/core/merge/conflict-detector.js +5 -2
- package/dist/core/merge/conflict-detector.js.map +2 -2
- package/dist/core/merge/resolution-engine.js +3 -14
- package/dist/core/merge/resolution-engine.js.map +2 -2
- package/dist/core/merge/stack-diff.js.map +2 -2
- package/dist/core/monitoring/logger.js +18 -3
- package/dist/core/monitoring/logger.js.map +2 -2
- package/dist/core/monitoring/session-monitor.js +296 -0
- package/dist/core/monitoring/session-monitor.js.map +7 -0
- package/dist/core/retrieval/context-retriever.js +475 -0
- package/dist/core/retrieval/context-retriever.js.map +7 -0
- package/dist/core/retrieval/graph-retrieval.js +658 -0
- package/dist/core/retrieval/graph-retrieval.js.map +7 -0
- package/dist/core/retrieval/hierarchical-retrieval.js +652 -0
- package/dist/core/retrieval/hierarchical-retrieval.js.map +7 -0
- package/dist/core/retrieval/retrieval-benchmarks.js +517 -0
- package/dist/core/retrieval/retrieval-benchmarks.js.map +7 -0
- package/dist/core/session/clear-survival-stub.js +49 -0
- package/dist/core/session/clear-survival-stub.js.map +7 -0
- package/dist/core/session/clear-survival.js +426 -0
- package/dist/core/session/clear-survival.js.map +7 -0
- package/dist/core/session/handoff-generator.js +339 -0
- package/dist/core/session/handoff-generator.js.map +7 -0
- package/dist/core/session/session-manager.js +61 -26
- package/dist/core/session/session-manager.js.map +3 -3
- package/dist/core/skills/index.js +3 -0
- package/dist/core/skills/index.js.map +7 -0
- package/dist/core/skills/skill-storage.js +749 -0
- package/dist/core/skills/skill-storage.js.map +7 -0
- package/dist/core/skills/types.js +189 -0
- package/dist/core/skills/types.js.map +7 -0
- package/dist/core/storage/railway-optimized-storage.js +550 -0
- package/dist/core/storage/railway-optimized-storage.js.map +7 -0
- package/dist/core/storage/remote-storage.js +456 -0
- package/dist/core/storage/remote-storage.js.map +7 -0
- package/dist/core/trace/trace-detector.js +136 -5
- package/dist/core/trace/trace-detector.js.map +2 -2
- package/dist/core/trace/trace-store.js.map +2 -2
- package/dist/features/tui/components/analytics-panel.js +136 -0
- package/dist/features/tui/components/analytics-panel.js.map +7 -0
- package/dist/features/tui/components/frame-visualizer.js +377 -0
- package/dist/features/tui/components/frame-visualizer.js.map +7 -0
- package/dist/features/tui/components/pr-tracker.js +123 -0
- package/dist/features/tui/components/pr-tracker.js.map +7 -0
- package/dist/features/tui/components/session-monitor.js +286 -0
- package/dist/features/tui/components/session-monitor.js.map +7 -0
- package/dist/features/tui/components/subagent-fleet.js +388 -0
- package/dist/features/tui/components/subagent-fleet.js.map +7 -0
- package/dist/features/tui/components/task-board.js +475 -0
- package/dist/features/tui/components/task-board.js.map +7 -0
- package/dist/features/tui/index.js +397 -0
- package/dist/features/tui/index.js.map +7 -0
- package/dist/features/tui/services/data-service.js +654 -0
- package/dist/features/tui/services/data-service.js.map +7 -0
- package/dist/features/tui/services/websocket-client.js +149 -0
- package/dist/features/tui/services/websocket-client.js.map +7 -0
- package/dist/features/tui/terminal-compat.js +205 -0
- package/dist/features/tui/terminal-compat.js.map +7 -0
- package/dist/features/tui/types.js +1 -0
- package/dist/features/tui/types.js.map +7 -0
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js +455 -0
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
- package/dist/integrations/claude-code/lifecycle-hooks.js +250 -0
- package/dist/integrations/claude-code/lifecycle-hooks.js.map +7 -0
- package/dist/integrations/claude-code/post-task-hooks.js +541 -0
- package/dist/integrations/claude-code/post-task-hooks.js.map +7 -0
- package/dist/integrations/linear/client.js +22 -4
- package/dist/integrations/linear/client.js.map +2 -2
- package/dist/integrations/linear/migration.js +299 -0
- package/dist/integrations/linear/migration.js.map +7 -0
- package/dist/integrations/linear/oauth-server.js +396 -0
- package/dist/integrations/linear/oauth-server.js.map +7 -0
- package/dist/integrations/linear/rest-client.js +199 -0
- package/dist/integrations/linear/rest-client.js.map +7 -0
- package/dist/integrations/linear/sync.js +14 -2
- package/dist/integrations/linear/sync.js.map +2 -2
- package/dist/integrations/linear/webhook-handler.js +200 -0
- package/dist/integrations/linear/webhook-handler.js.map +7 -0
- package/dist/integrations/mcp/handlers/skill-handlers.js +514 -0
- package/dist/integrations/mcp/handlers/skill-handlers.js.map +7 -0
- package/dist/integrations/mcp/middleware/tool-scoring.js +352 -0
- package/dist/integrations/mcp/middleware/tool-scoring.js.map +7 -0
- package/dist/integrations/mcp/refactored-server.js +31 -3
- package/dist/integrations/mcp/refactored-server.js.map +2 -2
- package/dist/integrations/mcp/server.js +25 -7
- package/dist/integrations/mcp/server.js.map +2 -2
- package/dist/mcp/stackmemory-mcp-server.js.map +1 -1
- package/dist/models/user.model.js +3 -0
- package/dist/models/user.model.js.map +2 -2
- package/dist/services/context-service.js.map +2 -2
- package/dist/utils/formatting.js +58 -0
- package/dist/utils/formatting.js.map +7 -0
- package/package.json +21 -5
- package/dist/cli/__tests__/index.test.js +0 -290
- package/dist/cli/__tests__/index.test.js.map +0 -7
- package/dist/core/config/__tests__/config-manager.test.js +0 -248
- package/dist/core/config/__tests__/config-manager.test.js.map +0 -7
- package/dist/core/context/__tests__/frame-manager.test.js +0 -879
- package/dist/core/context/__tests__/frame-manager.test.js.map +0 -7
- package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js +0 -379
- package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js.map +0 -7
- package/dist/core/digest/__tests__/frame-digest-integration.test.js +0 -230
- package/dist/core/digest/__tests__/frame-digest-integration.test.js.map +0 -7
- package/dist/core/errors/__tests__/error-handling.test.js +0 -270
- package/dist/core/errors/__tests__/error-handling.test.js.map +0 -7
- package/dist/core/merge/__tests__/conflict-scenarios.test.js +0 -414
- package/dist/core/merge/__tests__/conflict-scenarios.test.js.map +0 -7
- package/dist/core/query/__tests__/query-parser.test.js +0 -301
- package/dist/core/query/__tests__/query-parser.test.js.map +0 -7
- package/dist/core/query/__tests__/query-templates.test.js +0 -210
- package/dist/core/query/__tests__/query-templates.test.js.map +0 -7
- package/dist/core/trace/trace-detector.test.js +0 -401
- package/dist/core/trace/trace-detector.test.js.map +0 -7
- package/dist/features/tasks/__tests__/pebbles-task-store.test.js +0 -747
- package/dist/features/tasks/__tests__/pebbles-task-store.test.js.map +0 -7
- package/dist/integrations/linear/__tests__/auth.test.js +0 -558
- package/dist/integrations/linear/__tests__/auth.test.js.map +0 -7
- package/dist/integrations/linear/__tests__/sync-service.test.js +0 -760
- package/dist/integrations/linear/__tests__/sync-service.test.js.map +0 -7
- package/dist/integrations/mcp/__tests__/server.test.js +0 -798
- package/dist/integrations/mcp/__tests__/server.test.js.map +0 -7
- package/dist/scripts/benchmark-performance.d.ts +0 -7
- package/dist/scripts/benchmark-performance.d.ts.map +0 -1
- package/dist/scripts/benchmark-performance.js +0 -44
- package/dist/scripts/benchmark-performance.js.map +0 -1
- package/dist/scripts/cancel-duplicate-tasks.d.ts +0 -7
- package/dist/scripts/cancel-duplicate-tasks.d.ts.map +0 -1
- package/dist/scripts/cancel-duplicate-tasks.js +0 -172
- package/dist/scripts/cancel-duplicate-tasks.js.map +0 -1
- package/dist/scripts/cleanup-duplicate-tasks.d.ts +0 -12
- package/dist/scripts/cleanup-duplicate-tasks.d.ts.map +0 -1
- package/dist/scripts/cleanup-duplicate-tasks.js +0 -215
- package/dist/scripts/cleanup-duplicate-tasks.js.map +0 -1
- package/dist/scripts/initialize.d.ts +0 -6
- package/dist/scripts/initialize.d.ts.map +0 -1
- package/dist/scripts/initialize.js +0 -93
- package/dist/scripts/initialize.js.map +0 -1
- package/dist/scripts/list-linear-tasks.d.ts +0 -6
- package/dist/scripts/list-linear-tasks.d.ts.map +0 -1
- package/dist/scripts/list-linear-tasks.js +0 -121
- package/dist/scripts/list-linear-tasks.js.map +0 -1
- package/dist/scripts/merge-linear-duplicates-safe.d.ts +0 -7
- package/dist/scripts/merge-linear-duplicates-safe.d.ts.map +0 -1
- package/dist/scripts/merge-linear-duplicates-safe.js +0 -267
- package/dist/scripts/merge-linear-duplicates-safe.js.map +0 -1
- package/dist/scripts/show-linear-summary.d.ts +0 -6
- package/dist/scripts/show-linear-summary.d.ts.map +0 -1
- package/dist/scripts/show-linear-summary.js +0 -120
- package/dist/scripts/show-linear-summary.js.map +0 -1
- package/dist/scripts/status.d.ts +0 -6
- package/dist/scripts/status.d.ts.map +0 -1
- package/dist/scripts/status.js +0 -101
- package/dist/scripts/status.js.map +0 -1
- package/dist/src/agents/core/agent-task-manager.d.ts +0 -154
- package/dist/src/agents/core/agent-task-manager.d.ts.map +0 -1
- package/dist/src/agents/core/agent-task-manager.js +0 -504
- package/dist/src/agents/core/agent-task-manager.js.map +0 -1
- package/dist/src/agents/verifiers/base-verifier.d.ts +0 -112
- package/dist/src/agents/verifiers/base-verifier.d.ts.map +0 -1
- package/dist/src/agents/verifiers/base-verifier.js +0 -130
- package/dist/src/agents/verifiers/base-verifier.js.map +0 -1
- package/dist/src/agents/verifiers/formatter-verifier.d.ts +0 -14
- package/dist/src/agents/verifiers/formatter-verifier.d.ts.map +0 -1
- package/dist/src/agents/verifiers/formatter-verifier.js +0 -107
- package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -1
- package/dist/src/agents/verifiers/llm-judge.d.ts +0 -46
- package/dist/src/agents/verifiers/llm-judge.d.ts.map +0 -1
- package/dist/src/agents/verifiers/llm-judge.js +0 -248
- package/dist/src/agents/verifiers/llm-judge.js.map +0 -1
- package/dist/src/cli/auto-detect.d.ts +0 -61
- package/dist/src/cli/auto-detect.d.ts.map +0 -1
- package/dist/src/cli/auto-detect.js +0 -350
- package/dist/src/cli/auto-detect.js.map +0 -1
- package/dist/src/cli/browser-test.d.ts +0 -6
- package/dist/src/cli/browser-test.d.ts.map +0 -1
- package/dist/src/cli/browser-test.js +0 -32
- package/dist/src/cli/browser-test.js.map +0 -1
- package/dist/src/cli/claude-sm.d.ts +0 -7
- package/dist/src/cli/claude-sm.d.ts.map +0 -1
- package/dist/src/cli/claude-sm.js +0 -412
- package/dist/src/cli/claude-sm.js.map +0 -1
- package/dist/src/cli/commands/agent.d.ts +0 -9
- package/dist/src/cli/commands/agent.d.ts.map +0 -1
- package/dist/src/cli/commands/agent.js +0 -303
- package/dist/src/cli/commands/agent.js.map +0 -1
- package/dist/src/cli/commands/config.d.ts +0 -6
- package/dist/src/cli/commands/config.d.ts.map +0 -1
- package/dist/src/cli/commands/config.js +0 -224
- package/dist/src/cli/commands/config.js.map +0 -1
- package/dist/src/cli/commands/context.d.ts +0 -7
- package/dist/src/cli/commands/context.d.ts.map +0 -1
- package/dist/src/cli/commands/context.js +0 -365
- package/dist/src/cli/commands/context.js.map +0 -1
- package/dist/src/cli/commands/handoff.d.ts +0 -6
- package/dist/src/cli/commands/handoff.d.ts.map +0 -1
- package/dist/src/cli/commands/handoff.js +0 -212
- package/dist/src/cli/commands/handoff.js.map +0 -1
- package/dist/src/cli/commands/linear-test.d.ts +0 -6
- package/dist/src/cli/commands/linear-test.d.ts.map +0 -1
- package/dist/src/cli/commands/linear-test.js +0 -123
- package/dist/src/cli/commands/linear-test.js.map +0 -1
- package/dist/src/cli/commands/linear.d.ts +0 -6
- package/dist/src/cli/commands/linear.d.ts.map +0 -1
- package/dist/src/cli/commands/linear.js +0 -393
- package/dist/src/cli/commands/linear.js.map +0 -1
- package/dist/src/cli/commands/log.d.ts +0 -7
- package/dist/src/cli/commands/log.d.ts.map +0 -1
- package/dist/src/cli/commands/log.js +0 -168
- package/dist/src/cli/commands/log.js.map +0 -1
- package/dist/src/cli/commands/onboard.d.ts +0 -8
- package/dist/src/cli/commands/onboard.d.ts.map +0 -1
- package/dist/src/cli/commands/onboard.js +0 -363
- package/dist/src/cli/commands/onboard.js.map +0 -1
- package/dist/src/cli/commands/projects.d.ts +0 -8
- package/dist/src/cli/commands/projects.d.ts.map +0 -1
- package/dist/src/cli/commands/projects.js +0 -220
- package/dist/src/cli/commands/projects.js.map +0 -1
- package/dist/src/cli/commands/search.d.ts +0 -7
- package/dist/src/cli/commands/search.d.ts.map +0 -1
- package/dist/src/cli/commands/search.js +0 -162
- package/dist/src/cli/commands/search.js.map +0 -1
- package/dist/src/cli/commands/session.d.ts +0 -7
- package/dist/src/cli/commands/session.d.ts.map +0 -1
- package/dist/src/cli/commands/session.js +0 -222
- package/dist/src/cli/commands/session.js.map +0 -1
- package/dist/src/cli/commands/tasks.d.ts +0 -7
- package/dist/src/cli/commands/tasks.d.ts.map +0 -1
- package/dist/src/cli/commands/tasks.js +0 -229
- package/dist/src/cli/commands/tasks.js.map +0 -1
- package/dist/src/cli/commands/webhook.d.ts +0 -3
- package/dist/src/cli/commands/webhook.d.ts.map +0 -1
- package/dist/src/cli/commands/webhook.js +0 -157
- package/dist/src/cli/commands/webhook.js.map +0 -1
- package/dist/src/cli/commands/worktree.d.ts +0 -8
- package/dist/src/cli/commands/worktree.d.ts.map +0 -1
- package/dist/src/cli/commands/worktree.js +0 -339
- package/dist/src/cli/commands/worktree.js.map +0 -1
- package/dist/src/cli/index.d.ts +0 -8
- package/dist/src/cli/index.d.ts.map +0 -1
- package/dist/src/cli/index.js +0 -995
- package/dist/src/cli/index.js.map +0 -1
- package/dist/src/cli/utils/viewer.d.ts +0 -3
- package/dist/src/cli/utils/viewer.d.ts.map +0 -1
- package/dist/src/cli/utils/viewer.js +0 -91
- package/dist/src/cli/utils/viewer.js.map +0 -1
- package/dist/src/core/config/config-manager.d.ts +0 -95
- package/dist/src/core/config/config-manager.d.ts.map +0 -1
- package/dist/src/core/config/config-manager.js +0 -359
- package/dist/src/core/config/config-manager.js.map +0 -1
- package/dist/src/core/config/types.d.ts +0 -72
- package/dist/src/core/config/types.d.ts.map +0 -1
- package/dist/src/core/config/types.js +0 -127
- package/dist/src/core/config/types.js.map +0 -1
- package/dist/src/core/context/auto-context.d.ts +0 -22
- package/dist/src/core/context/auto-context.d.ts.map +0 -1
- package/dist/src/core/context/auto-context.js +0 -77
- package/dist/src/core/context/auto-context.js.map +0 -1
- package/dist/src/core/context/compaction-handler.d.ts +0 -119
- package/dist/src/core/context/compaction-handler.d.ts.map +0 -1
- package/dist/src/core/context/compaction-handler.js +0 -306
- package/dist/src/core/context/compaction-handler.js.map +0 -1
- package/dist/src/core/context/frame-database.d.ts +0 -59
- package/dist/src/core/context/frame-database.d.ts.map +0 -1
- package/dist/src/core/context/frame-database.js +0 -333
- package/dist/src/core/context/frame-database.js.map +0 -1
- package/dist/src/core/context/frame-digest.d.ts +0 -59
- package/dist/src/core/context/frame-digest.d.ts.map +0 -1
- package/dist/src/core/context/frame-digest.js +0 -264
- package/dist/src/core/context/frame-digest.js.map +0 -1
- package/dist/src/core/context/frame-manager.d.ts +0 -112
- package/dist/src/core/context/frame-manager.d.ts.map +0 -1
- package/dist/src/core/context/frame-manager.js +0 -600
- package/dist/src/core/context/frame-manager.js.map +0 -1
- package/dist/src/core/context/frame-stack.d.ts +0 -85
- package/dist/src/core/context/frame-stack.d.ts.map +0 -1
- package/dist/src/core/context/frame-stack.js +0 -287
- package/dist/src/core/context/frame-stack.js.map +0 -1
- package/dist/src/core/context/frame-types.d.ts +0 -67
- package/dist/src/core/context/frame-types.d.ts.map +0 -1
- package/dist/src/core/context/frame-types.js +0 -6
- package/dist/src/core/context/frame-types.js.map +0 -1
- package/dist/src/core/context/index.d.ts +0 -11
- package/dist/src/core/context/index.d.ts.map +0 -1
- package/dist/src/core/context/index.js +0 -14
- package/dist/src/core/context/index.js.map +0 -1
- package/dist/src/core/context/model-aware-compaction.d.ts +0 -101
- package/dist/src/core/context/model-aware-compaction.d.ts.map +0 -1
- package/dist/src/core/context/model-aware-compaction.js +0 -616
- package/dist/src/core/context/model-aware-compaction.js.map +0 -1
- package/dist/src/core/context/refactored-frame-manager.d.ts +0 -99
- package/dist/src/core/context/refactored-frame-manager.d.ts.map +0 -1
- package/dist/src/core/context/refactored-frame-manager.js +0 -340
- package/dist/src/core/context/refactored-frame-manager.js.map +0 -1
- package/dist/src/core/database/batch-operations.d.ts +0 -118
- package/dist/src/core/database/batch-operations.d.ts.map +0 -1
- package/dist/src/core/database/batch-operations.js +0 -339
- package/dist/src/core/database/batch-operations.js.map +0 -1
- package/dist/src/core/database/connection-pool.d.ts +0 -79
- package/dist/src/core/database/connection-pool.d.ts.map +0 -1
- package/dist/src/core/database/connection-pool.js +0 -236
- package/dist/src/core/database/connection-pool.js.map +0 -1
- package/dist/src/core/database/query-cache.d.ts +0 -135
- package/dist/src/core/database/query-cache.d.ts.map +0 -1
- package/dist/src/core/database/query-cache.js +0 -294
- package/dist/src/core/database/query-cache.js.map +0 -1
- package/dist/src/core/digest/enhanced-hybrid-digest.d.ts +0 -125
- package/dist/src/core/digest/enhanced-hybrid-digest.d.ts.map +0 -1
- package/dist/src/core/digest/enhanced-hybrid-digest.js +0 -282
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -1
- package/dist/src/core/digest/frame-digest-integration.d.ts +0 -67
- package/dist/src/core/digest/frame-digest-integration.d.ts.map +0 -1
- package/dist/src/core/digest/frame-digest-integration.js +0 -198
- package/dist/src/core/digest/frame-digest-integration.js.map +0 -1
- package/dist/src/core/digest/hybrid-digest-generator.d.ts +0 -76
- package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +0 -1
- package/dist/src/core/digest/hybrid-digest-generator.js +0 -629
- package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -1
- package/dist/src/core/digest/index.d.ts +0 -9
- package/dist/src/core/digest/index.d.ts.map +0 -1
- package/dist/src/core/digest/index.js +0 -9
- package/dist/src/core/digest/index.js.map +0 -1
- package/dist/src/core/digest/types.d.ts +0 -154
- package/dist/src/core/digest/types.d.ts.map +0 -1
- package/dist/src/core/digest/types.js +0 -18
- package/dist/src/core/digest/types.js.map +0 -1
- package/dist/src/core/errors/index.d.ts +0 -143
- package/dist/src/core/errors/index.d.ts.map +0 -1
- package/dist/src/core/errors/index.js +0 -282
- package/dist/src/core/errors/index.js.map +0 -1
- package/dist/src/core/errors/recovery.d.ts +0 -86
- package/dist/src/core/errors/recovery.d.ts.map +0 -1
- package/dist/src/core/errors/recovery.js +0 -274
- package/dist/src/core/errors/recovery.js.map +0 -1
- package/dist/src/core/merge/conflict-detector.d.ts +0 -122
- package/dist/src/core/merge/conflict-detector.d.ts.map +0 -1
- package/dist/src/core/merge/conflict-detector.js +0 -468
- package/dist/src/core/merge/conflict-detector.js.map +0 -1
- package/dist/src/core/merge/index.d.ts +0 -9
- package/dist/src/core/merge/index.d.ts.map +0 -1
- package/dist/src/core/merge/index.js +0 -9
- package/dist/src/core/merge/index.js.map +0 -1
- package/dist/src/core/merge/resolution-engine.d.ts +0 -120
- package/dist/src/core/merge/resolution-engine.d.ts.map +0 -1
- package/dist/src/core/merge/resolution-engine.js +0 -573
- package/dist/src/core/merge/resolution-engine.js.map +0 -1
- package/dist/src/core/merge/stack-diff.d.ts +0 -97
- package/dist/src/core/merge/stack-diff.d.ts.map +0 -1
- package/dist/src/core/merge/stack-diff.js +0 -516
- package/dist/src/core/merge/stack-diff.js.map +0 -1
- package/dist/src/core/merge/types.d.ts +0 -110
- package/dist/src/core/merge/types.d.ts.map +0 -1
- package/dist/src/core/merge/types.js +0 -6
- package/dist/src/core/merge/types.js.map +0 -1
- package/dist/src/core/monitoring/error-handler.d.ts +0 -46
- package/dist/src/core/monitoring/error-handler.d.ts.map +0 -1
- package/dist/src/core/monitoring/error-handler.js +0 -212
- package/dist/src/core/monitoring/error-handler.js.map +0 -1
- package/dist/src/core/monitoring/logger.d.ts +0 -24
- package/dist/src/core/monitoring/logger.d.ts.map +0 -1
- package/dist/src/core/monitoring/logger.js +0 -126
- package/dist/src/core/monitoring/logger.js.map +0 -1
- package/dist/src/core/monitoring/metrics.d.ts +0 -10
- package/dist/src/core/monitoring/metrics.d.ts.map +0 -1
- package/dist/src/core/monitoring/metrics.js +0 -152
- package/dist/src/core/monitoring/metrics.js.map +0 -1
- package/dist/src/core/monitoring/progress-tracker.d.ts +0 -95
- package/dist/src/core/monitoring/progress-tracker.d.ts.map +0 -1
- package/dist/src/core/monitoring/progress-tracker.js +0 -178
- package/dist/src/core/monitoring/progress-tracker.js.map +0 -1
- package/dist/src/core/performance/context-cache.d.ts +0 -109
- package/dist/src/core/performance/context-cache.d.ts.map +0 -1
- package/dist/src/core/performance/context-cache.js +0 -280
- package/dist/src/core/performance/context-cache.js.map +0 -1
- package/dist/src/core/performance/index.d.ts +0 -3
- package/dist/src/core/performance/index.d.ts.map +0 -1
- package/dist/src/core/performance/index.js +0 -3
- package/dist/src/core/performance/index.js.map +0 -1
- package/dist/src/core/performance/lazy-context-loader.d.ts +0 -93
- package/dist/src/core/performance/lazy-context-loader.d.ts.map +0 -1
- package/dist/src/core/performance/lazy-context-loader.js +0 -332
- package/dist/src/core/performance/lazy-context-loader.js.map +0 -1
- package/dist/src/core/performance/monitor.d.ts +0 -48
- package/dist/src/core/performance/monitor.d.ts.map +0 -1
- package/dist/src/core/performance/monitor.js +0 -226
- package/dist/src/core/performance/monitor.js.map +0 -1
- package/dist/src/core/performance/optimized-frame-context.d.ts +0 -74
- package/dist/src/core/performance/optimized-frame-context.d.ts.map +0 -1
- package/dist/src/core/performance/optimized-frame-context.js +0 -330
- package/dist/src/core/performance/optimized-frame-context.js.map +0 -1
- package/dist/src/core/performance/performance-benchmark.d.ts +0 -50
- package/dist/src/core/performance/performance-benchmark.d.ts.map +0 -1
- package/dist/src/core/performance/performance-benchmark.js +0 -290
- package/dist/src/core/performance/performance-benchmark.js.map +0 -1
- package/dist/src/core/performance/performance-profiler.d.ts +0 -151
- package/dist/src/core/performance/performance-profiler.d.ts.map +0 -1
- package/dist/src/core/performance/performance-profiler.js +0 -346
- package/dist/src/core/performance/performance-profiler.js.map +0 -1
- package/dist/src/core/performance/streaming-jsonl-parser.d.ts +0 -41
- package/dist/src/core/performance/streaming-jsonl-parser.d.ts.map +0 -1
- package/dist/src/core/performance/streaming-jsonl-parser.js +0 -193
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -1
- package/dist/src/core/persistence/postgres-adapter.d.ts +0 -31
- package/dist/src/core/persistence/postgres-adapter.d.ts.map +0 -1
- package/dist/src/core/persistence/postgres-adapter.js +0 -330
- package/dist/src/core/persistence/postgres-adapter.js.map +0 -1
- package/dist/src/core/projects/project-manager.d.ts +0 -130
- package/dist/src/core/projects/project-manager.d.ts.map +0 -1
- package/dist/src/core/projects/project-manager.js +0 -709
- package/dist/src/core/projects/project-manager.js.map +0 -1
- package/dist/src/core/query/query-parser.d.ts +0 -109
- package/dist/src/core/query/query-parser.d.ts.map +0 -1
- package/dist/src/core/query/query-parser.js +0 -415
- package/dist/src/core/query/query-parser.js.map +0 -1
- package/dist/src/core/query/query-templates.d.ts +0 -44
- package/dist/src/core/query/query-templates.d.ts.map +0 -1
- package/dist/src/core/query/query-templates.js +0 -326
- package/dist/src/core/query/query-templates.js.map +0 -1
- package/dist/src/core/retrieval/index.d.ts +0 -8
- package/dist/src/core/retrieval/index.d.ts.map +0 -1
- package/dist/src/core/retrieval/index.js +0 -8
- package/dist/src/core/retrieval/index.js.map +0 -1
- package/dist/src/core/retrieval/llm-context-retrieval.d.ts +0 -73
- package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +0 -1
- package/dist/src/core/retrieval/llm-context-retrieval.js +0 -597
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -1
- package/dist/src/core/retrieval/summary-generator.d.ts +0 -63
- package/dist/src/core/retrieval/summary-generator.d.ts.map +0 -1
- package/dist/src/core/retrieval/summary-generator.js +0 -622
- package/dist/src/core/retrieval/summary-generator.js.map +0 -1
- package/dist/src/core/retrieval/types.d.ts +0 -257
- package/dist/src/core/retrieval/types.d.ts.map +0 -1
- package/dist/src/core/retrieval/types.js +0 -18
- package/dist/src/core/retrieval/types.js.map +0 -1
- package/dist/src/core/session/index.d.ts +0 -2
- package/dist/src/core/session/index.d.ts.map +0 -1
- package/dist/src/core/session/index.js +0 -2
- package/dist/src/core/session/index.js.map +0 -1
- package/dist/src/core/session/session-manager.d.ts +0 -69
- package/dist/src/core/session/session-manager.d.ts.map +0 -1
- package/dist/src/core/session/session-manager.js +0 -311
- package/dist/src/core/session/session-manager.js.map +0 -1
- package/dist/src/core/trace/cli-trace-wrapper.d.ts +0 -23
- package/dist/src/core/trace/cli-trace-wrapper.d.ts.map +0 -1
- package/dist/src/core/trace/cli-trace-wrapper.js +0 -141
- package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -1
- package/dist/src/core/trace/db-trace-wrapper.d.ts +0 -36
- package/dist/src/core/trace/db-trace-wrapper.d.ts.map +0 -1
- package/dist/src/core/trace/db-trace-wrapper.js +0 -252
- package/dist/src/core/trace/db-trace-wrapper.js.map +0 -1
- package/dist/src/core/trace/debug-trace.d.ts +0 -84
- package/dist/src/core/trace/debug-trace.d.ts.map +0 -1
- package/dist/src/core/trace/debug-trace.js +0 -402
- package/dist/src/core/trace/debug-trace.js.map +0 -1
- package/dist/src/core/trace/error-test.d.ts +0 -6
- package/dist/src/core/trace/error-test.d.ts.map +0 -1
- package/dist/src/core/trace/error-test.js +0 -128
- package/dist/src/core/trace/error-test.js.map +0 -1
- package/dist/src/core/trace/index.d.ts +0 -25
- package/dist/src/core/trace/index.d.ts.map +0 -1
- package/dist/src/core/trace/index.js +0 -121
- package/dist/src/core/trace/index.js.map +0 -1
- package/dist/src/core/trace/linear-api-wrapper.d.ts +0 -17
- package/dist/src/core/trace/linear-api-wrapper.d.ts.map +0 -1
- package/dist/src/core/trace/linear-api-wrapper.js +0 -205
- package/dist/src/core/trace/linear-api-wrapper.js.map +0 -1
- package/dist/src/core/trace/performance-test.d.ts +0 -6
- package/dist/src/core/trace/performance-test.d.ts.map +0 -1
- package/dist/src/core/trace/performance-test.js +0 -111
- package/dist/src/core/trace/performance-test.js.map +0 -1
- package/dist/src/core/trace/trace-demo.d.ts +0 -8
- package/dist/src/core/trace/trace-demo.d.ts.map +0 -1
- package/dist/src/core/trace/trace-demo.js +0 -154
- package/dist/src/core/trace/trace-demo.js.map +0 -1
- package/dist/src/core/trace/trace-detector.d.ts +0 -108
- package/dist/src/core/trace/trace-detector.d.ts.map +0 -1
- package/dist/src/core/trace/trace-detector.demo.d.ts +0 -5
- package/dist/src/core/trace/trace-detector.demo.d.ts.map +0 -1
- package/dist/src/core/trace/trace-detector.demo.js +0 -145
- package/dist/src/core/trace/trace-detector.demo.js.map +0 -1
- package/dist/src/core/trace/trace-detector.js +0 -425
- package/dist/src/core/trace/trace-detector.js.map +0 -1
- package/dist/src/core/trace/trace-store.d.ts +0 -60
- package/dist/src/core/trace/trace-store.d.ts.map +0 -1
- package/dist/src/core/trace/trace-store.js +0 -323
- package/dist/src/core/trace/trace-store.js.map +0 -1
- package/dist/src/core/trace/types.d.ts +0 -81
- package/dist/src/core/trace/types.d.ts.map +0 -1
- package/dist/src/core/trace/types.js +0 -70
- package/dist/src/core/trace/types.js.map +0 -1
- package/dist/src/core/types.d.ts +0 -35
- package/dist/src/core/types.d.ts.map +0 -1
- package/dist/src/core/types.js +0 -2
- package/dist/src/core/types.js.map +0 -1
- package/dist/src/core/utils/update-checker.d.ts +0 -38
- package/dist/src/core/utils/update-checker.d.ts.map +0 -1
- package/dist/src/core/utils/update-checker.js +0 -213
- package/dist/src/core/utils/update-checker.js.map +0 -1
- package/dist/src/core/worktree/worktree-manager.d.ts +0 -110
- package/dist/src/core/worktree/worktree-manager.d.ts.map +0 -1
- package/dist/src/core/worktree/worktree-manager.js +0 -456
- package/dist/src/core/worktree/worktree-manager.js.map +0 -1
- package/dist/src/features/analytics/api/analytics-api.d.ts +0 -24
- package/dist/src/features/analytics/api/analytics-api.d.ts.map +0 -1
- package/dist/src/features/analytics/api/analytics-api.js +0 -289
- package/dist/src/features/analytics/api/analytics-api.js.map +0 -1
- package/dist/src/features/analytics/core/analytics-service.d.ts +0 -29
- package/dist/src/features/analytics/core/analytics-service.d.ts.map +0 -1
- package/dist/src/features/analytics/core/analytics-service.js +0 -275
- package/dist/src/features/analytics/core/analytics-service.js.map +0 -1
- package/dist/src/features/analytics/index.d.ts +0 -12
- package/dist/src/features/analytics/index.d.ts.map +0 -1
- package/dist/src/features/analytics/index.js +0 -11
- package/dist/src/features/analytics/index.js.map +0 -1
- package/dist/src/features/analytics/queries/metrics-queries.d.ts +0 -11
- package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +0 -1
- package/dist/src/features/analytics/queries/metrics-queries.js +0 -240
- package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -1
- package/dist/src/features/analytics/types/metrics.d.ts +0 -60
- package/dist/src/features/analytics/types/metrics.d.ts.map +0 -1
- package/dist/src/features/analytics/types/metrics.js +0 -2
- package/dist/src/features/analytics/types/metrics.js.map +0 -1
- package/dist/src/features/browser/browser-mcp.d.ts +0 -94
- package/dist/src/features/browser/browser-mcp.d.ts.map +0 -1
- package/dist/src/features/browser/browser-mcp.js +0 -459
- package/dist/src/features/browser/browser-mcp.js.map +0 -1
- package/dist/src/features/tasks/pebbles-task-store.d.ts +0 -128
- package/dist/src/features/tasks/pebbles-task-store.d.ts.map +0 -1
- package/dist/src/features/tasks/pebbles-task-store.js +0 -572
- package/dist/src/features/tasks/pebbles-task-store.js.map +0 -1
- package/dist/src/features/tasks/task-aware-context.d.ts +0 -103
- package/dist/src/features/tasks/task-aware-context.d.ts.map +0 -1
- package/dist/src/features/tasks/task-aware-context.js +0 -412
- package/dist/src/features/tasks/task-aware-context.js.map +0 -1
- package/dist/src/index.d.ts +0 -21
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -9
- package/dist/src/index.js.map +0 -1
- package/dist/src/integrations/linear/auth.d.ts +0 -99
- package/dist/src/integrations/linear/auth.d.ts.map +0 -1
- package/dist/src/integrations/linear/auth.js +0 -319
- package/dist/src/integrations/linear/auth.js.map +0 -1
- package/dist/src/integrations/linear/auto-sync.d.ts +0 -77
- package/dist/src/integrations/linear/auto-sync.d.ts.map +0 -1
- package/dist/src/integrations/linear/auto-sync.js +0 -268
- package/dist/src/integrations/linear/auto-sync.js.map +0 -1
- package/dist/src/integrations/linear/client.d.ts +0 -127
- package/dist/src/integrations/linear/client.d.ts.map +0 -1
- package/dist/src/integrations/linear/client.js +0 -446
- package/dist/src/integrations/linear/client.js.map +0 -1
- package/dist/src/integrations/linear/config.d.ts +0 -51
- package/dist/src/integrations/linear/config.d.ts.map +0 -1
- package/dist/src/integrations/linear/config.js +0 -103
- package/dist/src/integrations/linear/config.js.map +0 -1
- package/dist/src/integrations/linear/sync-manager.d.ts +0 -78
- package/dist/src/integrations/linear/sync-manager.d.ts.map +0 -1
- package/dist/src/integrations/linear/sync-manager.js +0 -235
- package/dist/src/integrations/linear/sync-manager.js.map +0 -1
- package/dist/src/integrations/linear/sync-service.d.ts +0 -46
- package/dist/src/integrations/linear/sync-service.d.ts.map +0 -1
- package/dist/src/integrations/linear/sync-service.js +0 -217
- package/dist/src/integrations/linear/sync-service.js.map +0 -1
- package/dist/src/integrations/linear/sync.d.ts +0 -125
- package/dist/src/integrations/linear/sync.d.ts.map +0 -1
- package/dist/src/integrations/linear/sync.js +0 -563
- package/dist/src/integrations/linear/sync.js.map +0 -1
- package/dist/src/integrations/linear/types.d.ts +0 -90
- package/dist/src/integrations/linear/types.d.ts.map +0 -1
- package/dist/src/integrations/linear/types.js +0 -2
- package/dist/src/integrations/linear/types.js.map +0 -1
- package/dist/src/integrations/linear/webhook-server.d.ts +0 -32
- package/dist/src/integrations/linear/webhook-server.d.ts.map +0 -1
- package/dist/src/integrations/linear/webhook-server.js +0 -190
- package/dist/src/integrations/linear/webhook-server.js.map +0 -1
- package/dist/src/integrations/linear/webhook.d.ts +0 -108
- package/dist/src/integrations/linear/webhook.d.ts.map +0 -1
- package/dist/src/integrations/linear/webhook.js +0 -291
- package/dist/src/integrations/linear/webhook.js.map +0 -1
- package/dist/src/integrations/mcp/handlers/context-handlers.d.ts +0 -39
- package/dist/src/integrations/mcp/handlers/context-handlers.d.ts.map +0 -1
- package/dist/src/integrations/mcp/handlers/context-handlers.js +0 -266
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -1
- package/dist/src/integrations/mcp/handlers/index.d.ts +0 -37
- package/dist/src/integrations/mcp/handlers/index.d.ts.map +0 -1
- package/dist/src/integrations/mcp/handlers/index.js +0 -134
- package/dist/src/integrations/mcp/handlers/index.js.map +0 -1
- package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts +0 -33
- package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts.map +0 -1
- package/dist/src/integrations/mcp/handlers/linear-handlers.js +0 -251
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -1
- package/dist/src/integrations/mcp/handlers/task-handlers.d.ts +0 -42
- package/dist/src/integrations/mcp/handlers/task-handlers.d.ts.map +0 -1
- package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -238
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -1
- package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts +0 -41
- package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts.map +0 -1
- package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -298
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -1
- package/dist/src/integrations/mcp/index.d.ts +0 -13
- package/dist/src/integrations/mcp/index.d.ts.map +0 -1
- package/dist/src/integrations/mcp/index.js +0 -17
- package/dist/src/integrations/mcp/index.js.map +0 -1
- package/dist/src/integrations/mcp/refactored-server.d.ts +0 -76
- package/dist/src/integrations/mcp/refactored-server.d.ts.map +0 -1
- package/dist/src/integrations/mcp/refactored-server.js +0 -351
- package/dist/src/integrations/mcp/refactored-server.js.map +0 -1
- package/dist/src/integrations/mcp/server.d.ts +0 -54
- package/dist/src/integrations/mcp/server.d.ts.map +0 -1
- package/dist/src/integrations/mcp/server.js +0 -1616
- package/dist/src/integrations/mcp/server.js.map +0 -1
- package/dist/src/integrations/mcp/tool-definitions.d.ts +0 -44
- package/dist/src/integrations/mcp/tool-definitions.d.ts.map +0 -1
- package/dist/src/integrations/mcp/tool-definitions.js +0 -563
- package/dist/src/integrations/mcp/tool-definitions.js.map +0 -1
- package/dist/src/integrations/mcp/trace-test.d.ts +0 -5
- package/dist/src/integrations/mcp/trace-test.d.ts.map +0 -1
- package/dist/src/integrations/mcp/trace-test.js +0 -54
- package/dist/src/integrations/mcp/trace-test.js.map +0 -1
- package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts +0 -48
- package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts.map +0 -1
- package/dist/src/integrations/pg-aiguide/embedding-provider.js +0 -190
- package/dist/src/integrations/pg-aiguide/embedding-provider.js.map +0 -1
- package/dist/src/integrations/pg-aiguide/semantic-search.d.ts +0 -34
- package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +0 -1
- package/dist/src/integrations/pg-aiguide/semantic-search.js +0 -176
- package/dist/src/integrations/pg-aiguide/semantic-search.js.map +0 -1
- package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts +0 -44
- package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts.map +0 -1
- package/dist/src/integrations/pg-aiguide/timescale-analytics.js +0 -215
- package/dist/src/integrations/pg-aiguide/timescale-analytics.js.map +0 -1
- package/dist/src/mcp/stackmemory-mcp-server.d.ts +0 -9
- package/dist/src/mcp/stackmemory-mcp-server.d.ts.map +0 -1
- package/dist/src/mcp/stackmemory-mcp-server.js +0 -519
- package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -1
- package/dist/src/middleware/exponential-rate-limiter.d.ts +0 -78
- package/dist/src/middleware/exponential-rate-limiter.d.ts.map +0 -1
- package/dist/src/middleware/exponential-rate-limiter.js +0 -293
- package/dist/src/middleware/exponential-rate-limiter.js.map +0 -1
- package/dist/src/models/user.model.d.ts +0 -62
- package/dist/src/models/user.model.d.ts.map +0 -1
- package/dist/src/models/user.model.js +0 -311
- package/dist/src/models/user.model.js.map +0 -1
- package/dist/src/servers/production/auth-middleware.d.ts +0 -76
- package/dist/src/servers/production/auth-middleware.d.ts.map +0 -1
- package/dist/src/servers/production/auth-middleware.js +0 -558
- package/dist/src/servers/production/auth-middleware.js.map +0 -1
- package/dist/src/servers/railway/index.d.ts +0 -7
- package/dist/src/servers/railway/index.d.ts.map +0 -1
- package/dist/src/servers/railway/index.js +0 -401
- package/dist/src/servers/railway/index.js.map +0 -1
- package/dist/src/services/config-service.d.ts +0 -44
- package/dist/src/services/config-service.d.ts.map +0 -1
- package/dist/src/services/config-service.js +0 -61
- package/dist/src/services/config-service.js.map +0 -1
- package/dist/src/services/context-service.d.ts +0 -17
- package/dist/src/services/context-service.d.ts.map +0 -1
- package/dist/src/services/context-service.js +0 -173
- package/dist/src/services/context-service.js.map +0 -1
- package/dist/src/types/task.d.ts +0 -27
- package/dist/src/types/task.d.ts.map +0 -1
- package/dist/src/types/task.js +0 -2
- package/dist/src/types/task.js.map +0 -1
- package/dist/src/utils/logger.d.ts +0 -13
- package/dist/src/utils/logger.d.ts.map +0 -1
- package/dist/src/utils/logger.js +0 -52
- package/dist/src/utils/logger.js.map +0 -1
- package/dist/src/validation/schemas.d.ts +0 -633
- package/dist/src/validation/schemas.d.ts.map +0 -1
- package/dist/src/validation/schemas.js +0 -347
- package/dist/src/validation/schemas.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/models/user.model.ts"],
|
|
4
|
-
"sourcesContent": ["import BetterSqlite3 from 'better-sqlite3';\nimport { v4 as uuidv4 } from 'uuid';\nimport * as bcrypt from 'bcryptjs';\nimport { logger } from '../core/monitoring/logger.js';\n\ntype Database = BetterSqlite3.Database;\n\nexport interface User {\n id: string;\n sub: string; // Subject identifier from auth provider\n email: string;\n name?: string;\n avatar?: string;\n tier: 'free' | 'pro' | 'enterprise';\n permissions: string[];\n organizations: Array<{\n id: string;\n name: string;\n role: string;\n }>;\n apiKeys?: string[];\n createdAt: Date;\n updatedAt: Date;\n lastLoginAt?: Date;\n metadata?: Record<string, any>;\n}\n\nexport interface UserSession {\n id: string;\n userId: string;\n token: string;\n expiresAt: Date;\n createdAt: Date;\n metadata?: Record<string, any>;\n}\n\nexport class UserModel {\n private db: Database;\n\n constructor(db: Database) {\n this.db = db;\n this.initialize();\n }\n\n private initialize(): void {\n // Create users table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n sub TEXT UNIQUE NOT NULL,\n email TEXT UNIQUE NOT NULL,\n name TEXT,\n avatar TEXT,\n tier TEXT DEFAULT 'free',\n permissions TEXT DEFAULT '[\"read\", \"write\"]',\n organizations TEXT DEFAULT '[]',\n api_keys TEXT DEFAULT '[]',\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n last_login_at DATETIME,\n metadata TEXT DEFAULT '{}'\n )\n `);\n\n // Create sessions table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS user_sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n token TEXT UNIQUE NOT NULL,\n expires_at DATETIME NOT NULL,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n metadata TEXT DEFAULT '{}',\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )\n `);\n\n // Create api_keys table for efficient lookup\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS api_keys (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n key_hash TEXT UNIQUE NOT NULL,\n name TEXT,\n last_used_at DATETIME,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n expires_at DATETIME,\n metadata TEXT DEFAULT '{}',\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )\n `);\n\n // Create indexes\n this.db.exec(`\n CREATE INDEX IF NOT EXISTS idx_users_sub ON users(sub);\n CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);\n CREATE INDEX IF NOT EXISTS idx_sessions_token ON user_sessions(token);\n CREATE INDEX IF NOT EXISTS idx_sessions_user ON user_sessions(user_id);\n CREATE INDEX IF NOT EXISTS idx_sessions_expires ON user_sessions(expires_at);\n CREATE INDEX IF NOT EXISTS idx_api_keys_hash ON api_keys(key_hash);\n CREATE INDEX IF NOT EXISTS idx_api_keys_user ON api_keys(user_id);\n `);\n\n logger.info('User database schema initialized');\n }\n\n async createUser(userData: Partial<User>): Promise<User> {\n const user: User = {\n id: userData.id || uuidv4(),\n sub: userData.sub!,\n email: userData.email!,\n name: userData.name,\n avatar: userData.avatar,\n tier: userData.tier || 'free',\n permissions: userData.permissions || ['read', 'write'],\n organizations: userData.organizations || [],\n apiKeys: userData.apiKeys || [],\n createdAt: new Date(),\n updatedAt: new Date(),\n metadata: userData.metadata || {},\n };\n\n const stmt = this.db.prepare(`\n INSERT INTO users (\n id, sub, email, name, avatar, tier, permissions, \n organizations, api_keys, created_at, updated_at, metadata\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n user.id,\n user.sub,\n user.email,\n user.name,\n user.avatar,\n user.tier,\n JSON.stringify(user.permissions),\n JSON.stringify(user.organizations),\n JSON.stringify(user.apiKeys),\n user.createdAt.toISOString(),\n user.updatedAt.toISOString(),\n JSON.stringify(user.metadata)\n );\n\n logger.info('User created', { userId: user.id, email: user.email });\n return user;\n }\n\n async findUserBySub(sub: string): Promise<User | null> {\n const stmt = this.db.prepare('SELECT * FROM users WHERE sub = ?');\n const row = stmt.get(sub) as any;\n\n if (!row) {\n return null;\n }\n\n return this.rowToUser(row);\n }\n\n async findUserByEmail(email: string): Promise<User | null> {\n const stmt = this.db.prepare('SELECT * FROM users WHERE email = ?');\n const row = stmt.get(email) as any;\n\n if (!row) {\n return null;\n }\n\n return this.rowToUser(row);\n }\n\n async findUserById(id: string): Promise<User | null> {\n const stmt = this.db.prepare('SELECT * FROM users WHERE id = ?');\n const row = stmt.get(id) as any;\n\n if (!row) {\n return null;\n }\n\n return this.rowToUser(row);\n }\n\n async updateUser(id: string, updates: Partial<User>): Promise<User | null> {\n const user = await this.findUserById(id);\n if (!user) {\n return null;\n }\n\n const updatedUser = {\n ...user,\n ...updates,\n updatedAt: new Date(),\n };\n\n const stmt = this.db.prepare(`\n UPDATE users SET\n email = ?, name = ?, avatar = ?, tier = ?, \n permissions = ?, organizations = ?, api_keys = ?,\n updated_at = ?, last_login_at = ?, metadata = ?\n WHERE id = ?\n `);\n\n stmt.run(\n updatedUser.email,\n updatedUser.name,\n updatedUser.avatar,\n updatedUser.tier,\n JSON.stringify(updatedUser.permissions),\n JSON.stringify(updatedUser.organizations),\n JSON.stringify(updatedUser.apiKeys),\n updatedUser.updatedAt.toISOString(),\n updatedUser.lastLoginAt?.toISOString(),\n JSON.stringify(updatedUser.metadata),\n id\n );\n\n logger.info('User updated', { userId: id });\n return updatedUser;\n }\n\n async deleteUser(id: string): Promise<boolean> {\n const stmt = this.db.prepare('DELETE FROM users WHERE id = ?');\n const result = stmt.run(id);\n\n if (result.changes > 0) {\n logger.info('User deleted', { userId: id });\n return true;\n }\n\n return false;\n }\n\n async updateLastLogin(id: string): Promise<void> {\n const stmt = this.db.prepare(\n 'UPDATE users SET last_login_at = ? WHERE id = ?'\n );\n stmt.run(new Date().toISOString(), id);\n }\n\n // Session management\n async createSession(userId: string, expiresIn = 86400): Promise<UserSession> {\n const session: UserSession = {\n id: uuidv4(),\n userId,\n token: this.generateSessionToken(),\n expiresAt: new Date(Date.now() + expiresIn * 1000),\n createdAt: new Date(),\n metadata: {},\n };\n\n const stmt = this.db.prepare(`\n INSERT INTO user_sessions (id, user_id, token, expires_at, created_at, metadata)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n session.id,\n session.userId,\n session.token,\n session.expiresAt.toISOString(),\n session.createdAt.toISOString(),\n JSON.stringify(session.metadata)\n );\n\n logger.info('Session created', { sessionId: session.id, userId });\n return session;\n }\n\n async findSessionByToken(token: string): Promise<UserSession | null> {\n const stmt = this.db.prepare('SELECT * FROM user_sessions WHERE token = ?');\n const row = stmt.get(token) as any;\n\n if (!row) {\n return null;\n }\n\n return this.rowToSession(row);\n }\n\n async validateSession(token: string): Promise<User | null> {\n const session = await this.findSessionByToken(token);\n\n if (!session) {\n return null;\n }\n\n // Check if session is expired\n if (new Date(session.expiresAt) < new Date()) {\n await this.deleteSession(session.id);\n return null;\n }\n\n // Get the user\n return await this.findUserById(session.userId);\n }\n\n async deleteSession(id: string): Promise<boolean> {\n const stmt = this.db.prepare('DELETE FROM user_sessions WHERE id = ?');\n const result = stmt.run(id);\n return result.changes > 0;\n }\n\n async deleteExpiredSessions(): Promise<number> {\n const stmt = this.db.prepare(\n 'DELETE FROM user_sessions WHERE expires_at < ?'\n );\n const result = stmt.run(new Date().toISOString());\n\n if (result.changes > 0) {\n logger.info('Expired sessions deleted', { count: result.changes });\n }\n\n return result.changes;\n }\n\n // API Key management\n async generateApiKey(userId: string, name?: string): Promise<string> {\n const user = await this.findUserById(userId);\n if (!user) {\n throw new Error('User not found');\n }\n\n const apiKey = `sk-${this.generateToken(32)}`;\n const hashedKey = await bcrypt.hash(apiKey, 10);\n\n // Store in dedicated api_keys table\n const stmt = this.db.prepare(`\n INSERT INTO api_keys (id, user_id, key_hash, name, created_at)\n VALUES (?, ?, ?, ?, ?)\n `);\n\n const apiKeyId = uuidv4();\n stmt.run(\n apiKeyId,\n userId,\n hashedKey,\n name || 'API Key',\n new Date().toISOString()\n );\n\n logger.info('API key generated', { userId, apiKeyId });\n return apiKey;\n }\n\n async validateApiKey(apiKey: string): Promise<User | null> {\n // Efficient lookup using indexed api_keys table\n const stmt = this.db.prepare(`\n SELECT u.*, ak.id as api_key_id, ak.key_hash\n FROM api_keys ak\n JOIN users u ON ak.user_id = u.id\n WHERE (ak.expires_at IS NULL OR ak.expires_at > datetime('now'))\n `);\n\n const rows = stmt.all() as any[];\n\n for (const row of rows) {\n if (await bcrypt.compare(apiKey, row.key_hash)) {\n // Update last used timestamp\n const updateStmt = this.db.prepare(\n 'UPDATE api_keys SET last_used_at = ? WHERE id = ?'\n );\n updateStmt.run(new Date().toISOString(), row.api_key_id);\n\n return this.rowToUser(row);\n }\n }\n\n return null;\n }\n\n async revokeApiKey(userId: string, apiKeyId: string): Promise<boolean> {\n const stmt = this.db.prepare(\n 'DELETE FROM api_keys WHERE id = ? AND user_id = ?'\n );\n const result = stmt.run(apiKeyId, userId);\n\n if (result.changes > 0) {\n logger.info('API key revoked', { userId, apiKeyId });\n return true;\n }\n\n return false;\n }\n\n async listApiKeys(\n userId: string\n ): Promise<\n Array<{ id: string; name: string; lastUsed?: Date; createdAt: Date }>\n > {\n const stmt = this.db.prepare(`\n SELECT id, name, last_used_at, created_at\n FROM api_keys\n WHERE user_id = ?\n ORDER BY created_at DESC\n `);\n\n const rows = stmt.all(userId) as any[];\n return rows.map((row) => ({\n id: row.id,\n name: row.name,\n lastUsed: row.last_used_at ? new Date(row.last_used_at) : undefined,\n createdAt: new Date(row.created_at),\n }));\n }\n\n // Helper methods\n private rowToUser(row: any): User {\n return {\n id: row.id,\n sub: row.sub,\n email: row.email,\n name: row.name,\n avatar: row.avatar,\n tier: row.tier,\n permissions: JSON.parse(row.permissions),\n organizations: JSON.parse(row.organizations),\n apiKeys: JSON.parse(row.api_keys || '[]'),\n createdAt: new Date(row.created_at),\n updatedAt: new Date(row.updated_at),\n lastLoginAt: row.last_login_at ? new Date(row.last_login_at) : undefined,\n metadata: JSON.parse(row.metadata || '{}'),\n };\n }\n\n private rowToSession(row: any): UserSession {\n return {\n id: row.id,\n userId: row.user_id,\n token: row.token,\n expiresAt: new Date(row.expires_at),\n createdAt: new Date(row.created_at),\n metadata: JSON.parse(row.metadata || '{}'),\n };\n }\n\n private generateSessionToken(): string {\n return this.generateToken(48);\n }\n\n private generateToken(length: number): string {\n const chars =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let token = '';\n for (let i = 0; i < length; i++) {\n token += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return token;\n }\n}\n\n// Singleton instance management\nlet userModelInstance: UserModel | null = null;\n\nexport function getUserModel(db: BetterSqlite3.Database): UserModel {\n if (!userModelInstance) {\n userModelInstance = new UserModel(db);\n }\n return userModelInstance;\n}\n"],
|
|
5
|
-
"mappings": "AACA,SAAS,MAAM,cAAc;AAC7B,YAAY,YAAY;AACxB,SAAS,cAAc;
|
|
4
|
+
"sourcesContent": ["import BetterSqlite3 from 'better-sqlite3';\nimport { v4 as uuidv4 } from 'uuid';\nimport * as bcrypt from 'bcryptjs';\nimport { logger } from '../core/monitoring/logger.js';\n\ntype Database = BetterSqlite3.Database;\n\ninterface UserRow {\n id: string;\n sub: string;\n email: string;\n name?: string;\n avatar?: string;\n tier: 'free' | 'pro' | 'enterprise';\n permissions: string;\n organizations: string;\n api_keys: string;\n created_at: number;\n updated_at: number;\n last_login_at?: number;\n metadata?: string;\n}\n\ninterface SessionRow {\n id: string;\n user_id: string;\n token: string;\n expires_at: number;\n created_at: number;\n metadata?: string;\n}\n\nexport interface User {\n id: string;\n sub: string; // Subject identifier from auth provider\n email: string;\n name?: string;\n avatar?: string;\n tier: 'free' | 'pro' | 'enterprise';\n permissions: string[];\n organizations: Array<{\n id: string;\n name: string;\n role: string;\n }>;\n apiKeys?: string[];\n createdAt: Date;\n updatedAt: Date;\n lastLoginAt?: Date;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UserSession {\n id: string;\n userId: string;\n token: string;\n expiresAt: Date;\n createdAt: Date;\n metadata?: Record<string, unknown>;\n}\n\nexport class UserModel {\n private db: Database;\n\n constructor(db: Database) {\n this.db = db;\n this.initialize();\n }\n\n private initialize(): void {\n // Create users table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n sub TEXT UNIQUE NOT NULL,\n email TEXT UNIQUE NOT NULL,\n name TEXT,\n avatar TEXT,\n tier TEXT DEFAULT 'free',\n permissions TEXT DEFAULT '[\"read\", \"write\"]',\n organizations TEXT DEFAULT '[]',\n api_keys TEXT DEFAULT '[]',\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n last_login_at DATETIME,\n metadata TEXT DEFAULT '{}'\n )\n `);\n\n // Create sessions table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS user_sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n token TEXT UNIQUE NOT NULL,\n expires_at DATETIME NOT NULL,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n metadata TEXT DEFAULT '{}',\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )\n `);\n\n // Create api_keys table for efficient lookup\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS api_keys (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n key_hash TEXT UNIQUE NOT NULL,\n name TEXT,\n last_used_at DATETIME,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n expires_at DATETIME,\n metadata TEXT DEFAULT '{}',\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )\n `);\n\n // Create indexes\n this.db.exec(`\n CREATE INDEX IF NOT EXISTS idx_users_sub ON users(sub);\n CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);\n CREATE INDEX IF NOT EXISTS idx_sessions_token ON user_sessions(token);\n CREATE INDEX IF NOT EXISTS idx_sessions_user ON user_sessions(user_id);\n CREATE INDEX IF NOT EXISTS idx_sessions_expires ON user_sessions(expires_at);\n CREATE INDEX IF NOT EXISTS idx_api_keys_hash ON api_keys(key_hash);\n CREATE INDEX IF NOT EXISTS idx_api_keys_user ON api_keys(user_id);\n `);\n\n logger.info('User database schema initialized');\n }\n\n async createUser(userData: Partial<User>): Promise<User> {\n if (!userData.sub || !userData.email) {\n throw new Error('User sub and email are required');\n }\n\n const user: User = {\n id: userData.id || uuidv4(),\n sub: userData.sub,\n email: userData.email,\n name: userData.name,\n avatar: userData.avatar,\n tier: userData.tier || 'free',\n permissions: userData.permissions || ['read', 'write'],\n organizations: userData.organizations || [],\n apiKeys: userData.apiKeys || [],\n createdAt: new Date(),\n updatedAt: new Date(),\n metadata: userData.metadata || {},\n };\n\n const stmt = this.db.prepare(`\n INSERT INTO users (\n id, sub, email, name, avatar, tier, permissions, \n organizations, api_keys, created_at, updated_at, metadata\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n user.id,\n user.sub,\n user.email,\n user.name,\n user.avatar,\n user.tier,\n JSON.stringify(user.permissions),\n JSON.stringify(user.organizations),\n JSON.stringify(user.apiKeys),\n user.createdAt.toISOString(),\n user.updatedAt.toISOString(),\n JSON.stringify(user.metadata)\n );\n\n logger.info('User created', { userId: user.id, email: user.email });\n return user;\n }\n\n async findUserBySub(sub: string): Promise<User | null> {\n const stmt = this.db.prepare('SELECT * FROM users WHERE sub = ?');\n const row = stmt.get(sub) as UserRow | undefined;\n\n if (!row) {\n return null;\n }\n\n return this.rowToUser(row);\n }\n\n async findUserByEmail(email: string): Promise<User | null> {\n const stmt = this.db.prepare('SELECT * FROM users WHERE email = ?');\n const row = stmt.get(email) as UserRow | undefined;\n\n if (!row) {\n return null;\n }\n\n return this.rowToUser(row);\n }\n\n async findUserById(id: string): Promise<User | null> {\n const stmt = this.db.prepare('SELECT * FROM users WHERE id = ?');\n const row = stmt.get(id) as UserRow | undefined;\n\n if (!row) {\n return null;\n }\n\n return this.rowToUser(row);\n }\n\n async updateUser(id: string, updates: Partial<User>): Promise<User | null> {\n const user = await this.findUserById(id);\n if (!user) {\n return null;\n }\n\n const updatedUser = {\n ...user,\n ...updates,\n updatedAt: new Date(),\n };\n\n const stmt = this.db.prepare(`\n UPDATE users SET\n email = ?, name = ?, avatar = ?, tier = ?, \n permissions = ?, organizations = ?, api_keys = ?,\n updated_at = ?, last_login_at = ?, metadata = ?\n WHERE id = ?\n `);\n\n stmt.run(\n updatedUser.email,\n updatedUser.name,\n updatedUser.avatar,\n updatedUser.tier,\n JSON.stringify(updatedUser.permissions),\n JSON.stringify(updatedUser.organizations),\n JSON.stringify(updatedUser.apiKeys),\n updatedUser.updatedAt.toISOString(),\n updatedUser.lastLoginAt?.toISOString(),\n JSON.stringify(updatedUser.metadata),\n id\n );\n\n logger.info('User updated', { userId: id });\n return updatedUser;\n }\n\n async deleteUser(id: string): Promise<boolean> {\n const stmt = this.db.prepare('DELETE FROM users WHERE id = ?');\n const result = stmt.run(id);\n\n if (result.changes > 0) {\n logger.info('User deleted', { userId: id });\n return true;\n }\n\n return false;\n }\n\n async updateLastLogin(id: string): Promise<void> {\n const stmt = this.db.prepare(\n 'UPDATE users SET last_login_at = ? WHERE id = ?'\n );\n stmt.run(new Date().toISOString(), id);\n }\n\n // Session management\n async createSession(userId: string, expiresIn = 86400): Promise<UserSession> {\n const session: UserSession = {\n id: uuidv4(),\n userId,\n token: this.generateSessionToken(),\n expiresAt: new Date(Date.now() + expiresIn * 1000),\n createdAt: new Date(),\n metadata: {},\n };\n\n const stmt = this.db.prepare(`\n INSERT INTO user_sessions (id, user_id, token, expires_at, created_at, metadata)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n session.id,\n session.userId,\n session.token,\n session.expiresAt.toISOString(),\n session.createdAt.toISOString(),\n JSON.stringify(session.metadata)\n );\n\n logger.info('Session created', { sessionId: session.id, userId });\n return session;\n }\n\n async findSessionByToken(token: string): Promise<UserSession | null> {\n const stmt = this.db.prepare('SELECT * FROM user_sessions WHERE token = ?');\n const row = stmt.get(token) as SessionRow | undefined;\n\n if (!row) {\n return null;\n }\n\n return this.rowToSession(row);\n }\n\n async validateSession(token: string): Promise<User | null> {\n const session = await this.findSessionByToken(token);\n\n if (!session) {\n return null;\n }\n\n // Check if session is expired\n if (new Date(session.expiresAt) < new Date()) {\n await this.deleteSession(session.id);\n return null;\n }\n\n // Get the user\n return await this.findUserById(session.userId);\n }\n\n async deleteSession(id: string): Promise<boolean> {\n const stmt = this.db.prepare('DELETE FROM user_sessions WHERE id = ?');\n const result = stmt.run(id);\n return result.changes > 0;\n }\n\n async deleteExpiredSessions(): Promise<number> {\n const stmt = this.db.prepare(\n 'DELETE FROM user_sessions WHERE expires_at < ?'\n );\n const result = stmt.run(new Date().toISOString());\n\n if (result.changes > 0) {\n logger.info('Expired sessions deleted', { count: result.changes });\n }\n\n return result.changes;\n }\n\n // API Key management\n async generateApiKey(userId: string, name?: string): Promise<string> {\n const user = await this.findUserById(userId);\n if (!user) {\n throw new Error('User not found');\n }\n\n const apiKey = `sk-${this.generateToken(32)}`;\n const hashedKey = await bcrypt.hash(apiKey, 10);\n\n // Store in dedicated api_keys table\n const stmt = this.db.prepare(`\n INSERT INTO api_keys (id, user_id, key_hash, name, created_at)\n VALUES (?, ?, ?, ?, ?)\n `);\n\n const apiKeyId = uuidv4();\n stmt.run(\n apiKeyId,\n userId,\n hashedKey,\n name || 'API Key',\n new Date().toISOString()\n );\n\n logger.info('API key generated', { userId, apiKeyId });\n return apiKey;\n }\n\n async validateApiKey(apiKey: string): Promise<User | null> {\n // Efficient lookup using indexed api_keys table\n const stmt = this.db.prepare(`\n SELECT u.*, ak.id as api_key_id, ak.key_hash\n FROM api_keys ak\n JOIN users u ON ak.user_id = u.id\n WHERE (ak.expires_at IS NULL OR ak.expires_at > datetime('now'))\n `);\n\n const rows = stmt.all() as SessionRow[];\n\n for (const row of rows) {\n if (await bcrypt.compare(apiKey, row.key_hash)) {\n // Update last used timestamp\n const updateStmt = this.db.prepare(\n 'UPDATE api_keys SET last_used_at = ? WHERE id = ?'\n );\n updateStmt.run(new Date().toISOString(), row.api_key_id);\n\n return this.rowToUser(row);\n }\n }\n\n return null;\n }\n\n async revokeApiKey(userId: string, apiKeyId: string): Promise<boolean> {\n const stmt = this.db.prepare(\n 'DELETE FROM api_keys WHERE id = ? AND user_id = ?'\n );\n const result = stmt.run(apiKeyId, userId);\n\n if (result.changes > 0) {\n logger.info('API key revoked', { userId, apiKeyId });\n return true;\n }\n\n return false;\n }\n\n async listApiKeys(\n userId: string\n ): Promise<\n Array<{ id: string; name: string; lastUsed?: Date; createdAt: Date }>\n > {\n const stmt = this.db.prepare(`\n SELECT id, name, last_used_at, created_at\n FROM api_keys\n WHERE user_id = ?\n ORDER BY created_at DESC\n `);\n\n const rows = stmt.all(userId) as SessionRow[];\n return rows.map((row) => ({\n id: row.id,\n name: row.name,\n lastUsed: row.last_used_at ? new Date(row.last_used_at) : undefined,\n createdAt: new Date(row.created_at),\n }));\n }\n\n // Helper methods\n private rowToUser(row: UserRow): User {\n return {\n id: row.id,\n sub: row.sub,\n email: row.email,\n name: row.name,\n avatar: row.avatar,\n tier: row.tier,\n permissions: JSON.parse(row.permissions),\n organizations: JSON.parse(row.organizations),\n apiKeys: JSON.parse(row.api_keys || '[]'),\n createdAt: new Date(row.created_at),\n updatedAt: new Date(row.updated_at),\n lastLoginAt: row.last_login_at ? new Date(row.last_login_at) : undefined,\n metadata: JSON.parse(row.metadata || '{}'),\n };\n }\n\n private rowToSession(row: SessionRow): UserSession {\n return {\n id: row.id,\n userId: row.user_id,\n token: row.token,\n expiresAt: new Date(row.expires_at),\n createdAt: new Date(row.created_at),\n metadata: JSON.parse(row.metadata || '{}'),\n };\n }\n\n private generateSessionToken(): string {\n return this.generateToken(48);\n }\n\n private generateToken(length: number): string {\n const chars =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let token = '';\n for (let i = 0; i < length; i++) {\n token += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return token;\n }\n}\n\n// Singleton instance management\nlet userModelInstance: UserModel | null = null;\n\nexport function getUserModel(db: BetterSqlite3.Database): UserModel {\n if (!userModelInstance) {\n userModelInstance = new UserModel(db);\n }\n return userModelInstance;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/context-service.ts"],
|
|
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 '../utils/logger.js';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\nexport class ContextService {\n private logger: Logger;\n private db: Database.Database | null = null;\n private tasks: Map<string, Task> = new Map();\n\n constructor() {\n this.logger = new Logger('ContextService');\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) {\n this.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
|
|
5
|
-
"mappings": "AAGA,SAAS,cAAc;AACvB,OAAO,cAAc;AACrB,SAAS,YAAY;AACrB,SAAS,kBAAkB;
|
|
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 '../utils/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 private logger: Logger;\n private db: Database.Database | null = null;\n private tasks: Map<string, Task> = new Map();\n\n constructor() {\n this.logger = new Logger('ContextService');\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) {\n this.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 this.logger.info(`Loaded ${rows.length} tasks from database`);\n } catch (error) {\n this.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) {\n this.logger.error('Failed to persist task to database', error);\n }\n }\n\n this.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) {\n this.logger.error('Failed to update task in database', error);\n }\n }\n\n this.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) {\n this.logger.error('Failed to delete task from database', error);\n }\n }\n this.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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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
function formatBytes(bytes) {
|
|
2
|
+
if (bytes === 0) return "0 B";
|
|
3
|
+
const k = 1024;
|
|
4
|
+
const sizes = ["B", "KB", "MB", "GB", "TB"];
|
|
5
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
6
|
+
return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;
|
|
7
|
+
}
|
|
8
|
+
function formatDuration(ms) {
|
|
9
|
+
if (ms < 1e3) return `${ms}ms`;
|
|
10
|
+
const seconds = Math.floor(ms / 1e3);
|
|
11
|
+
const minutes = Math.floor(seconds / 60);
|
|
12
|
+
const hours = Math.floor(minutes / 60);
|
|
13
|
+
const days = Math.floor(hours / 24);
|
|
14
|
+
if (days > 0) {
|
|
15
|
+
return `${days}d ${hours % 24}h`;
|
|
16
|
+
}
|
|
17
|
+
if (hours > 0) {
|
|
18
|
+
return `${hours}h ${minutes % 60}m`;
|
|
19
|
+
}
|
|
20
|
+
if (minutes > 0) {
|
|
21
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
22
|
+
}
|
|
23
|
+
return `${seconds}s`;
|
|
24
|
+
}
|
|
25
|
+
function formatRelativeTime(timestamp) {
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
const diff = now - timestamp;
|
|
28
|
+
const minutes = Math.floor(diff / 6e4);
|
|
29
|
+
const hours = Math.floor(minutes / 60);
|
|
30
|
+
const days = Math.floor(hours / 24);
|
|
31
|
+
if (days > 0) return `${days} day${days > 1 ? "s" : ""} ago`;
|
|
32
|
+
if (hours > 0) return `${hours} hour${hours > 1 ? "s" : ""} ago`;
|
|
33
|
+
if (minutes > 0) return `${minutes} minute${minutes > 1 ? "s" : ""} ago`;
|
|
34
|
+
return "just now";
|
|
35
|
+
}
|
|
36
|
+
function truncate(str, maxLength) {
|
|
37
|
+
if (str.length <= maxLength) return str;
|
|
38
|
+
return str.substring(0, maxLength - 3) + "...";
|
|
39
|
+
}
|
|
40
|
+
function formatPercent(value, total) {
|
|
41
|
+
if (total === 0) return "0%";
|
|
42
|
+
return `${(value / total * 100).toFixed(1)}%`;
|
|
43
|
+
}
|
|
44
|
+
function createProgressBar(value, max, width = 20) {
|
|
45
|
+
const percent = Math.min(value / max, 1);
|
|
46
|
+
const filled = Math.floor(percent * width);
|
|
47
|
+
const empty = width - filled;
|
|
48
|
+
return "\u2588".repeat(filled) + "\u2591".repeat(empty);
|
|
49
|
+
}
|
|
50
|
+
export {
|
|
51
|
+
createProgressBar,
|
|
52
|
+
formatBytes,
|
|
53
|
+
formatDuration,
|
|
54
|
+
formatPercent,
|
|
55
|
+
formatRelativeTime,
|
|
56
|
+
truncate
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=formatting.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/formatting.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Formatting utilities for CLI output\n */\n\n/**\n * Format bytes to human-readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;\n}\n\n/**\n * Format duration in milliseconds to human-readable string\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) {\n return `${days}d ${hours % 24}h`;\n }\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n\n return `${seconds}s`;\n}\n\n/**\n * Format relative time\n */\nexport function formatRelativeTime(timestamp: number): string {\n const now = Date.now();\n const diff = now - timestamp;\n\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days} day${days > 1 ? 's' : ''} ago`;\n if (hours > 0) return `${hours} hour${hours > 1 ? 's' : ''} ago`;\n if (minutes > 0) return `${minutes} minute${minutes > 1 ? 's' : ''} ago`;\n\n return 'just now';\n}\n\n/**\n * Truncate string with ellipsis\n */\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.substring(0, maxLength - 3) + '...';\n}\n\n/**\n * Format percentage\n */\nexport function formatPercent(value: number, total: number): string {\n if (total === 0) return '0%';\n return `${((value / total) * 100).toFixed(1)}%`;\n}\n\n/**\n * Create a simple text progress bar\n */\nexport function createProgressBar(\n value: number,\n max: number,\n width: number = 20\n): string {\n const percent = Math.min(value / max, 1);\n const filled = Math.floor(percent * width);\n const empty = width - filled;\n\n return '\u2588'.repeat(filled) + '\u2591'.repeat(empty);\n}\n"],
|
|
5
|
+
"mappings": "AAOO,SAAS,YAAY,OAAuB;AACjD,MAAI,UAAU,EAAG,QAAO;AAExB,QAAM,IAAI;AACV,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,IAAI;AAC1C,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAElD,SAAO,IAAI,QAAQ,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAC3D;AAKO,SAAS,eAAe,IAAoB;AACjD,MAAI,KAAK,IAAM,QAAO,GAAG,EAAE;AAE3B,QAAM,UAAU,KAAK,MAAM,KAAK,GAAI;AACpC,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAElC,MAAI,OAAO,GAAG;AACZ,WAAO,GAAG,IAAI,KAAK,QAAQ,EAAE;AAAA,EAC/B;AACA,MAAI,QAAQ,GAAG;AACb,WAAO,GAAG,KAAK,KAAK,UAAU,EAAE;AAAA,EAClC;AACA,MAAI,UAAU,GAAG;AACf,WAAO,GAAG,OAAO,KAAK,UAAU,EAAE;AAAA,EACpC;AAEA,SAAO,GAAG,OAAO;AACnB;AAKO,SAAS,mBAAmB,WAA2B;AAC5D,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,OAAO,MAAM;AAEnB,QAAM,UAAU,KAAK,MAAM,OAAO,GAAK;AACvC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAElC,MAAI,OAAO,EAAG,QAAO,GAAG,IAAI,OAAO,OAAO,IAAI,MAAM,EAAE;AACtD,MAAI,QAAQ,EAAG,QAAO,GAAG,KAAK,QAAQ,QAAQ,IAAI,MAAM,EAAE;AAC1D,MAAI,UAAU,EAAG,QAAO,GAAG,OAAO,UAAU,UAAU,IAAI,MAAM,EAAE;AAElE,SAAO;AACT;AAKO,SAAS,SAAS,KAAa,WAA2B;AAC/D,MAAI,IAAI,UAAU,UAAW,QAAO;AACpC,SAAO,IAAI,UAAU,GAAG,YAAY,CAAC,IAAI;AAC3C;AAKO,SAAS,cAAc,OAAe,OAAuB;AAClE,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,IAAK,QAAQ,QAAS,KAAK,QAAQ,CAAC,CAAC;AAC9C;AAKO,SAAS,kBACd,OACA,KACA,QAAgB,IACR;AACR,QAAM,UAAU,KAAK,IAAI,QAAQ,KAAK,CAAC;AACvC,QAAM,SAAS,KAAK,MAAM,UAAU,KAAK;AACzC,QAAM,QAAQ,QAAQ;AAEtB,SAAO,SAAI,OAAO,MAAM,IAAI,SAAI,OAAO,KAAK;AAC9C;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stackmemoryai/stackmemory",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "Lossless
|
|
3
|
+
"version": "0.3.3",
|
|
4
|
+
"description": "Lossless memory runtime for AI coding tools - organizes context as a call stack instead of linear chat logs, with team collaboration and infinite retention",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=20.0.0",
|
|
7
7
|
"npm": ">=10.0.0"
|
|
@@ -47,6 +47,8 @@
|
|
|
47
47
|
"build:types": "tsc --emitDeclarationOnly --project tsconfig.build.json",
|
|
48
48
|
"lint": "eslint src/**/*.ts scripts/**/*.ts",
|
|
49
49
|
"lint:fix": "eslint src/**/*.ts scripts/**/*.ts --fix",
|
|
50
|
+
"test:shared-context": "vitest run src/core/context/__tests__/shared-context-layer.test.ts src/core/context/__tests__/context-bridge.test.ts src/cli/__tests__/shared-context-integration.test.ts",
|
|
51
|
+
"test:shared-context:watch": "vitest watch src/core/context/__tests__/shared-context-layer.test.ts src/core/context/__tests__/context-bridge.test.ts",
|
|
50
52
|
"lint:oxc": "oxlint src scripts",
|
|
51
53
|
"lint:fast": "oxlint src scripts && eslint src/**/*.ts scripts/**/*.ts",
|
|
52
54
|
"lint:autofix": "node scripts/development/fix-lint-loop.cjs",
|
|
@@ -54,7 +56,12 @@
|
|
|
54
56
|
"test": "vitest",
|
|
55
57
|
"test:ui": "vitest --ui",
|
|
56
58
|
"test:run": "vitest run",
|
|
57
|
-
"
|
|
59
|
+
"test:install": "npm run build && ./scripts/test-installation.sh",
|
|
60
|
+
"test:shell": "./scripts/test-shell-integration.sh",
|
|
61
|
+
"test:scenarios": "./scripts/test-installation-scenarios.sh",
|
|
62
|
+
"test:pre-publish": "npm run test:install && npm run test:shell && npm run test:scenarios",
|
|
63
|
+
"test:pre-publish:quick": "./scripts/test-pre-publish-quick.sh",
|
|
64
|
+
"prepublishOnly": "npm run build && npm run test:pre-publish:quick",
|
|
58
65
|
"quality": "npm run lint && npm run test:run && npm run build",
|
|
59
66
|
"dev": "tsx watch src/mcp/mcp-server.ts",
|
|
60
67
|
"mcp:start": "node dist/src/integrations/mcp/server.js",
|
|
@@ -64,8 +71,9 @@
|
|
|
64
71
|
"linear:setup": "node dist/src/cli/index.js linear setup",
|
|
65
72
|
"linear:status": "node dist/src/cli/index.js linear status",
|
|
66
73
|
"linear:config": "node dist/src/cli/index.js linear config --show",
|
|
67
|
-
"linear:sync": "node
|
|
68
|
-
"linear:
|
|
74
|
+
"linear:sync": "node scripts/linear-auto-sync.js",
|
|
75
|
+
"linear:sync:watch": "node scripts/linear-auto-sync.js --watch",
|
|
76
|
+
"linear:auto-sync": "node scripts/linear-auto-sync.js --watch --interval 15",
|
|
69
77
|
"analytics": "node dist/src/cli/index.js analytics --view",
|
|
70
78
|
"analytics:server": "node dist/src/cli/index.js analytics --port 3000 --open",
|
|
71
79
|
"analytics:export": "node dist/src/cli/index.js analytics --export json",
|
|
@@ -78,7 +86,9 @@
|
|
|
78
86
|
"prepare": "husky"
|
|
79
87
|
},
|
|
80
88
|
"dependencies": {
|
|
89
|
+
"@aws-sdk/client-s3": "^3.958.0",
|
|
81
90
|
"@browsermcp/mcp": "^0.1.3",
|
|
91
|
+
"@google-cloud/storage": "^7.18.0",
|
|
82
92
|
"@modelcontextprotocol/sdk": "^0.5.0",
|
|
83
93
|
"@types/bcryptjs": "^2.4.6",
|
|
84
94
|
"@types/inquirer": "^9.0.9",
|
|
@@ -92,6 +102,7 @@
|
|
|
92
102
|
"cors": "^2.8.5",
|
|
93
103
|
"dotenv": "^17.2.3",
|
|
94
104
|
"express": "^4.22.1",
|
|
105
|
+
"glob": "^13.0.0",
|
|
95
106
|
"helmet": "^8.1.0",
|
|
96
107
|
"inquirer": "^9.3.8",
|
|
97
108
|
"ioredis": "^5.8.2",
|
|
@@ -99,9 +110,12 @@
|
|
|
99
110
|
"jwks-rsa": "^3.2.0",
|
|
100
111
|
"msgpackr": "^1.10.1",
|
|
101
112
|
"ngrok": "^5.0.0-beta.2",
|
|
113
|
+
"open": "^11.0.0",
|
|
114
|
+
"ora": "^9.0.0",
|
|
102
115
|
"pg": "^8.16.3",
|
|
103
116
|
"puppeteer": "^24.34.0",
|
|
104
117
|
"rate-limiter-flexible": "^9.0.1",
|
|
118
|
+
"redis": "^5.10.0",
|
|
105
119
|
"simple-peer": "^9.11.1",
|
|
106
120
|
"socket.io": "^4.6.0",
|
|
107
121
|
"socket.io-client": "^4.6.0",
|
|
@@ -144,6 +158,8 @@
|
|
|
144
158
|
]
|
|
145
159
|
},
|
|
146
160
|
"optionalDependencies": {
|
|
161
|
+
"blessed": "^0.1.81",
|
|
162
|
+
"blessed-contrib": "^4.11.0",
|
|
147
163
|
"chokidar": "^5.0.0"
|
|
148
164
|
}
|
|
149
165
|
}
|
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
describe,
|
|
3
|
-
it,
|
|
4
|
-
expect,
|
|
5
|
-
beforeEach,
|
|
6
|
-
afterEach,
|
|
7
|
-
vi,
|
|
8
|
-
beforeAll
|
|
9
|
-
} from "vitest";
|
|
10
|
-
import { join } from "path";
|
|
11
|
-
import { mkdtempSync, rmSync, writeFileSync, existsSync, mkdirSync } from "fs";
|
|
12
|
-
import { tmpdir } from "os";
|
|
13
|
-
vi.mock("../core/monitoring/logger", () => ({
|
|
14
|
-
logger: {
|
|
15
|
-
info: vi.fn(),
|
|
16
|
-
error: vi.fn(),
|
|
17
|
-
debug: vi.fn(),
|
|
18
|
-
warn: vi.fn()
|
|
19
|
-
}
|
|
20
|
-
}));
|
|
21
|
-
vi.mock("better-sqlite3", () => ({
|
|
22
|
-
default: vi.fn().mockImplementation(() => ({
|
|
23
|
-
exec: vi.fn(),
|
|
24
|
-
prepare: vi.fn(() => ({
|
|
25
|
-
run: vi.fn(),
|
|
26
|
-
get: vi.fn(),
|
|
27
|
-
all: vi.fn(() => [])
|
|
28
|
-
})),
|
|
29
|
-
close: vi.fn()
|
|
30
|
-
}))
|
|
31
|
-
}));
|
|
32
|
-
vi.mock("../core/context/frame-manager", () => ({
|
|
33
|
-
FrameManager: vi.fn().mockImplementation(() => ({
|
|
34
|
-
createFrame: vi.fn(() => "frame-123"),
|
|
35
|
-
getActiveFramePath: vi.fn(() => []),
|
|
36
|
-
getStackDepth: vi.fn(() => 0),
|
|
37
|
-
getHotStackContext: vi.fn(() => []),
|
|
38
|
-
addEvent: vi.fn(),
|
|
39
|
-
closeFrame: vi.fn()
|
|
40
|
-
}))
|
|
41
|
-
}));
|
|
42
|
-
vi.mock("../features/tasks/pebbles-task-store.js", () => ({
|
|
43
|
-
PebblesTaskStore: vi.fn().mockImplementation(() => ({
|
|
44
|
-
createTask: vi.fn(() => "task-123"),
|
|
45
|
-
getActiveTasks: vi.fn(() => []),
|
|
46
|
-
getMetrics: vi.fn(() => ({
|
|
47
|
-
total_tasks: 0,
|
|
48
|
-
completion_rate: 0,
|
|
49
|
-
blocked_tasks: 0
|
|
50
|
-
}))
|
|
51
|
-
}))
|
|
52
|
-
}));
|
|
53
|
-
vi.mock("../integrations/linear/auth", () => ({
|
|
54
|
-
LinearAuthManager: vi.fn().mockImplementation(() => ({
|
|
55
|
-
isConfigured: vi.fn(() => false),
|
|
56
|
-
loadConfig: vi.fn(),
|
|
57
|
-
loadTokens: vi.fn()
|
|
58
|
-
})),
|
|
59
|
-
LinearOAuthSetup: vi.fn().mockImplementation(() => ({
|
|
60
|
-
setupInteractive: vi.fn(),
|
|
61
|
-
completeAuth: vi.fn(),
|
|
62
|
-
testConnection: vi.fn()
|
|
63
|
-
}))
|
|
64
|
-
}));
|
|
65
|
-
vi.mock("../integrations/linear/sync", () => ({
|
|
66
|
-
LinearSyncEngine: vi.fn().mockImplementation(() => ({
|
|
67
|
-
sync: vi.fn(() => ({
|
|
68
|
-
success: true,
|
|
69
|
-
synced: { toLinear: 1, fromLinear: 2, updated: 0 },
|
|
70
|
-
conflicts: [],
|
|
71
|
-
errors: []
|
|
72
|
-
}))
|
|
73
|
-
})),
|
|
74
|
-
DEFAULT_SYNC_CONFIG: {
|
|
75
|
-
enabled: true,
|
|
76
|
-
direction: "bidirectional"
|
|
77
|
-
}
|
|
78
|
-
}));
|
|
79
|
-
vi.mock("../integrations/linear/auto-sync.js", () => ({
|
|
80
|
-
initializeAutoSync: vi.fn(),
|
|
81
|
-
getAutoSyncService: vi.fn(() => null),
|
|
82
|
-
stopAutoSync: vi.fn()
|
|
83
|
-
}));
|
|
84
|
-
vi.mock("../integrations/linear/config.js", () => ({
|
|
85
|
-
LinearConfigManager: vi.fn().mockImplementation(() => ({
|
|
86
|
-
loadConfig: vi.fn(() => null),
|
|
87
|
-
saveConfig: vi.fn()
|
|
88
|
-
}))
|
|
89
|
-
}));
|
|
90
|
-
vi.mock("../core/utils/update-checker", () => ({
|
|
91
|
-
UpdateChecker: {
|
|
92
|
-
checkForUpdates: vi.fn().mockResolvedValue(void 0),
|
|
93
|
-
forceCheck: vi.fn().mockResolvedValue(void 0)
|
|
94
|
-
}
|
|
95
|
-
}));
|
|
96
|
-
vi.mock("../core/monitoring/progress-tracker", () => ({
|
|
97
|
-
ProgressTracker: vi.fn().mockImplementation(() => ({
|
|
98
|
-
getSummary: vi.fn(() => "Progress summary"),
|
|
99
|
-
updateLinearStatus: vi.fn()
|
|
100
|
-
}))
|
|
101
|
-
}));
|
|
102
|
-
vi.mock("child_process", () => ({
|
|
103
|
-
execSync: vi.fn(() => Buffer.from("mock git output"))
|
|
104
|
-
}));
|
|
105
|
-
const mockRegisterProjectCommands = vi.fn();
|
|
106
|
-
const mockRegisterLinearCommands = vi.fn();
|
|
107
|
-
const mockRegisterLinearTestCommand = vi.fn();
|
|
108
|
-
const mockCreateSessionCommands = vi.fn();
|
|
109
|
-
const mockRegisterWorktreeCommands = vi.fn();
|
|
110
|
-
const mockRegisterOnboardingCommand = vi.fn();
|
|
111
|
-
const mockWebhookCommand = vi.fn(() => ({ name: "webhook" }));
|
|
112
|
-
const mockRegisterTaskCommands = vi.fn();
|
|
113
|
-
const mockRegisterSearchCommands = vi.fn();
|
|
114
|
-
const mockRegisterLogCommands = vi.fn();
|
|
115
|
-
const mockRegisterContextCommands = vi.fn();
|
|
116
|
-
vi.mock("./commands/projects", () => ({
|
|
117
|
-
registerProjectCommands: mockRegisterProjectCommands
|
|
118
|
-
}));
|
|
119
|
-
vi.mock("./commands/linear", () => ({
|
|
120
|
-
registerLinearCommands: mockRegisterLinearCommands
|
|
121
|
-
}));
|
|
122
|
-
vi.mock("./commands/linear-test", () => ({
|
|
123
|
-
registerLinearTestCommand: mockRegisterLinearTestCommand
|
|
124
|
-
}));
|
|
125
|
-
vi.mock("./commands/session", () => ({
|
|
126
|
-
createSessionCommands: mockCreateSessionCommands
|
|
127
|
-
}));
|
|
128
|
-
vi.mock("./commands/worktree", () => ({
|
|
129
|
-
registerWorktreeCommands: mockRegisterWorktreeCommands
|
|
130
|
-
}));
|
|
131
|
-
vi.mock("./commands/onboard", () => ({
|
|
132
|
-
registerOnboardingCommand: mockRegisterOnboardingCommand
|
|
133
|
-
}));
|
|
134
|
-
vi.mock("./commands/webhook", () => ({
|
|
135
|
-
webhookCommand: mockWebhookCommand
|
|
136
|
-
}));
|
|
137
|
-
vi.mock("./commands/tasks", () => ({
|
|
138
|
-
registerTaskCommands: mockRegisterTaskCommands
|
|
139
|
-
}));
|
|
140
|
-
vi.mock("./commands/search", () => ({
|
|
141
|
-
registerSearchCommands: mockRegisterSearchCommands
|
|
142
|
-
}));
|
|
143
|
-
vi.mock("./commands/log", () => ({
|
|
144
|
-
registerLogCommands: mockRegisterLogCommands
|
|
145
|
-
}));
|
|
146
|
-
vi.mock("./commands/context", () => ({
|
|
147
|
-
registerContextCommands: mockRegisterContextCommands
|
|
148
|
-
}));
|
|
149
|
-
vi.mock("../core/projects/project-manager.js", () => ({
|
|
150
|
-
ProjectManager: {
|
|
151
|
-
getInstance: vi.fn(() => ({
|
|
152
|
-
detectProject: vi.fn()
|
|
153
|
-
}))
|
|
154
|
-
}
|
|
155
|
-
}));
|
|
156
|
-
vi.mock("../core/session/index.js", () => ({
|
|
157
|
-
sessionManager: {
|
|
158
|
-
initialize: vi.fn(),
|
|
159
|
-
getOrCreateSession: vi.fn(() => ({
|
|
160
|
-
sessionId: "test-session-123",
|
|
161
|
-
projectId: "test-project",
|
|
162
|
-
state: "active",
|
|
163
|
-
startedAt: Date.now() - 6e5,
|
|
164
|
-
branch: "main"
|
|
165
|
-
})),
|
|
166
|
-
listSessions: vi.fn(() => [])
|
|
167
|
-
},
|
|
168
|
-
FrameQueryMode: {
|
|
169
|
-
CURRENT_SESSION: "current_session",
|
|
170
|
-
ALL_ACTIVE: "all_active",
|
|
171
|
-
PROJECT_ACTIVE: "project_active",
|
|
172
|
-
HISTORICAL: "historical"
|
|
173
|
-
}
|
|
174
|
-
}));
|
|
175
|
-
vi.mock("../integrations/mcp/server.js", () => ({
|
|
176
|
-
runMCPServer: vi.fn().mockResolvedValue(void 0)
|
|
177
|
-
}));
|
|
178
|
-
describe("CLI Commands", () => {
|
|
179
|
-
let tempDir;
|
|
180
|
-
let originalArgv;
|
|
181
|
-
let consoleSpy;
|
|
182
|
-
let exitSpy;
|
|
183
|
-
beforeAll(() => {
|
|
184
|
-
process.setMaxListeners(50);
|
|
185
|
-
});
|
|
186
|
-
beforeEach(() => {
|
|
187
|
-
vi.resetModules();
|
|
188
|
-
tempDir = mkdtempSync(join(tmpdir(), "stackmemory-cli-test-"));
|
|
189
|
-
originalArgv = [...process.argv];
|
|
190
|
-
vi.spyOn(process, "cwd").mockReturnValue(tempDir);
|
|
191
|
-
consoleSpy = {
|
|
192
|
-
log: vi.spyOn(console, "log").mockImplementation(() => {
|
|
193
|
-
}),
|
|
194
|
-
error: vi.spyOn(console, "error").mockImplementation(() => {
|
|
195
|
-
})
|
|
196
|
-
};
|
|
197
|
-
exitSpy = vi.spyOn(process, "exit").mockImplementation((() => {
|
|
198
|
-
}));
|
|
199
|
-
});
|
|
200
|
-
afterEach(() => {
|
|
201
|
-
vi.spyOn(process, "cwd").mockRestore();
|
|
202
|
-
process.argv = originalArgv;
|
|
203
|
-
consoleSpy.log.mockRestore();
|
|
204
|
-
consoleSpy.error.mockRestore();
|
|
205
|
-
exitSpy.mockRestore();
|
|
206
|
-
if (tempDir) {
|
|
207
|
-
rmSync(tempDir, { recursive: true, force: true });
|
|
208
|
-
}
|
|
209
|
-
vi.clearAllMocks();
|
|
210
|
-
});
|
|
211
|
-
describe("init command", () => {
|
|
212
|
-
it("should initialize StackMemory in current directory", async () => {
|
|
213
|
-
const { program } = await import("../index.js");
|
|
214
|
-
process.argv = ["node", "stackmemory", "init"];
|
|
215
|
-
await program.parseAsync(process.argv);
|
|
216
|
-
const stackmemoryDir = join(tempDir, ".stackmemory");
|
|
217
|
-
expect(existsSync(stackmemoryDir)).toBe(true);
|
|
218
|
-
});
|
|
219
|
-
});
|
|
220
|
-
describe("status command", () => {
|
|
221
|
-
it("should show status when StackMemory is initialized", async () => {
|
|
222
|
-
const dbDir = join(tempDir, ".stackmemory");
|
|
223
|
-
mkdirSync(dbDir, { recursive: true });
|
|
224
|
-
writeFileSync(join(dbDir, "context.db"), "");
|
|
225
|
-
const { program } = await import("../index.js");
|
|
226
|
-
process.argv = ["node", "stackmemory", "status"];
|
|
227
|
-
await program.parseAsync(process.argv);
|
|
228
|
-
expect(consoleSpy.log).toHaveBeenCalled();
|
|
229
|
-
});
|
|
230
|
-
it("should show error when StackMemory is not initialized", async () => {
|
|
231
|
-
const { program } = await import("../index.js");
|
|
232
|
-
process.argv = ["node", "stackmemory", "status"];
|
|
233
|
-
await program.parseAsync(process.argv);
|
|
234
|
-
expect(consoleSpy.log).toHaveBeenCalledWith(
|
|
235
|
-
'\u274C StackMemory not initialized. Run "stackmemory init" first.'
|
|
236
|
-
);
|
|
237
|
-
});
|
|
238
|
-
});
|
|
239
|
-
describe("update-check command", () => {
|
|
240
|
-
it("should check for updates", async () => {
|
|
241
|
-
const { program } = await import("../index.js");
|
|
242
|
-
process.argv = ["node", "stackmemory", "update-check"];
|
|
243
|
-
await program.parseAsync(process.argv);
|
|
244
|
-
expect(consoleSpy.log).toHaveBeenCalledWith("\u{1F50D} Checking for updates...");
|
|
245
|
-
});
|
|
246
|
-
});
|
|
247
|
-
describe("mcp-server command", () => {
|
|
248
|
-
it("should start MCP server with default options", async () => {
|
|
249
|
-
const { program } = await import("../index.js");
|
|
250
|
-
process.argv = ["node", "stackmemory", "mcp-server"];
|
|
251
|
-
await program.parseAsync(process.argv);
|
|
252
|
-
expect(consoleSpy.log).toHaveBeenCalledWith(
|
|
253
|
-
"\u{1F680} Starting StackMemory MCP Server..."
|
|
254
|
-
);
|
|
255
|
-
});
|
|
256
|
-
it("should start MCP server with custom project path", async () => {
|
|
257
|
-
const customPath = "/custom/project/path";
|
|
258
|
-
const { program } = await import("../index.js");
|
|
259
|
-
process.argv = [
|
|
260
|
-
"node",
|
|
261
|
-
"stackmemory",
|
|
262
|
-
"mcp-server",
|
|
263
|
-
"--project",
|
|
264
|
-
customPath
|
|
265
|
-
];
|
|
266
|
-
await program.parseAsync(process.argv);
|
|
267
|
-
expect(consoleSpy.log).toHaveBeenCalledWith(` Project: ${customPath}`);
|
|
268
|
-
});
|
|
269
|
-
});
|
|
270
|
-
describe("Command registration", () => {
|
|
271
|
-
it("should export program with registered commands", async () => {
|
|
272
|
-
const { program } = await import("../index.js");
|
|
273
|
-
expect(program).toBeDefined();
|
|
274
|
-
expect(program.commands.length).toBeGreaterThan(0);
|
|
275
|
-
const commandNames = program.commands.map((cmd) => cmd.name());
|
|
276
|
-
expect(commandNames).toContain("init");
|
|
277
|
-
expect(commandNames).toContain("status");
|
|
278
|
-
expect(commandNames).toContain("mcp-server");
|
|
279
|
-
});
|
|
280
|
-
});
|
|
281
|
-
describe("Error handling", () => {
|
|
282
|
-
it("should handle unknown commands gracefully", async () => {
|
|
283
|
-
const { program } = await import("../index.js");
|
|
284
|
-
program.exitOverride();
|
|
285
|
-
process.argv = ["node", "stackmemory", "unknown-command"];
|
|
286
|
-
await expect(program.parseAsync(process.argv)).rejects.toThrow();
|
|
287
|
-
});
|
|
288
|
-
});
|
|
289
|
-
});
|
|
290
|
-
//# sourceMappingURL=index.test.js.map
|