forge-server 0.1.0
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/.claude/hooks/worktree-create.sh +64 -0
- package/.claude/hooks/worktree-remove.sh +57 -0
- package/.claude/settings.local.json +29 -0
- package/.forge/knowledge/conventions.yaml +1 -0
- package/.forge/knowledge/decisions.yaml +1 -0
- package/.forge/knowledge/gotchas.yaml +1 -0
- package/.forge/knowledge/patterns.yaml +1 -0
- package/.forge/manifest.yaml +6 -0
- package/CLAUDE.md +144 -0
- package/bin/setup-forge.sh +132 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +553 -0
- package/dist/cli.js.map +1 -0
- package/dist/context/codebase.d.ts +57 -0
- package/dist/context/codebase.d.ts.map +1 -0
- package/dist/context/codebase.js +301 -0
- package/dist/context/codebase.js.map +1 -0
- package/dist/context/injector.d.ts +147 -0
- package/dist/context/injector.d.ts.map +1 -0
- package/dist/context/injector.js +533 -0
- package/dist/context/injector.js.map +1 -0
- package/dist/context/memory.d.ts +32 -0
- package/dist/context/memory.d.ts.map +1 -0
- package/dist/context/memory.js +140 -0
- package/dist/context/memory.js.map +1 -0
- package/dist/context/session-index.d.ts +54 -0
- package/dist/context/session-index.d.ts.map +1 -0
- package/dist/context/session-index.js +265 -0
- package/dist/context/session-index.js.map +1 -0
- package/dist/context/session.d.ts +42 -0
- package/dist/context/session.d.ts.map +1 -0
- package/dist/context/session.js +121 -0
- package/dist/context/session.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/ingestion/chunker.d.ts +19 -0
- package/dist/ingestion/chunker.d.ts.map +1 -0
- package/dist/ingestion/chunker.js +189 -0
- package/dist/ingestion/chunker.js.map +1 -0
- package/dist/ingestion/embedder.d.ts +45 -0
- package/dist/ingestion/embedder.d.ts.map +1 -0
- package/dist/ingestion/embedder.js +152 -0
- package/dist/ingestion/embedder.js.map +1 -0
- package/dist/ingestion/git-analyzer.d.ts +77 -0
- package/dist/ingestion/git-analyzer.d.ts.map +1 -0
- package/dist/ingestion/git-analyzer.js +437 -0
- package/dist/ingestion/git-analyzer.js.map +1 -0
- package/dist/ingestion/indexer.d.ts +79 -0
- package/dist/ingestion/indexer.d.ts.map +1 -0
- package/dist/ingestion/indexer.js +766 -0
- package/dist/ingestion/indexer.js.map +1 -0
- package/dist/ingestion/markdown-chunker.d.ts +19 -0
- package/dist/ingestion/markdown-chunker.d.ts.map +1 -0
- package/dist/ingestion/markdown-chunker.js +243 -0
- package/dist/ingestion/markdown-chunker.js.map +1 -0
- package/dist/ingestion/markdown-knowledge.d.ts +21 -0
- package/dist/ingestion/markdown-knowledge.d.ts.map +1 -0
- package/dist/ingestion/markdown-knowledge.js +129 -0
- package/dist/ingestion/markdown-knowledge.js.map +1 -0
- package/dist/ingestion/parser.d.ts +20 -0
- package/dist/ingestion/parser.d.ts.map +1 -0
- package/dist/ingestion/parser.js +429 -0
- package/dist/ingestion/parser.js.map +1 -0
- package/dist/ingestion/watcher.d.ts +28 -0
- package/dist/ingestion/watcher.d.ts.map +1 -0
- package/dist/ingestion/watcher.js +147 -0
- package/dist/ingestion/watcher.js.map +1 -0
- package/dist/knowledge/hydrator.d.ts +37 -0
- package/dist/knowledge/hydrator.d.ts.map +1 -0
- package/dist/knowledge/hydrator.js +220 -0
- package/dist/knowledge/hydrator.js.map +1 -0
- package/dist/knowledge/registry.d.ts +129 -0
- package/dist/knowledge/registry.d.ts.map +1 -0
- package/dist/knowledge/registry.js +361 -0
- package/dist/knowledge/registry.js.map +1 -0
- package/dist/knowledge/search.d.ts +114 -0
- package/dist/knowledge/search.d.ts.map +1 -0
- package/dist/knowledge/search.js +428 -0
- package/dist/knowledge/search.js.map +1 -0
- package/dist/knowledge/store.d.ts +76 -0
- package/dist/knowledge/store.d.ts.map +1 -0
- package/dist/knowledge/store.js +230 -0
- package/dist/knowledge/store.js.map +1 -0
- package/dist/learning/confidence.d.ts +30 -0
- package/dist/learning/confidence.d.ts.map +1 -0
- package/dist/learning/confidence.js +165 -0
- package/dist/learning/confidence.js.map +1 -0
- package/dist/learning/patterns.d.ts +52 -0
- package/dist/learning/patterns.d.ts.map +1 -0
- package/dist/learning/patterns.js +290 -0
- package/dist/learning/patterns.js.map +1 -0
- package/dist/learning/trajectory.d.ts +55 -0
- package/dist/learning/trajectory.d.ts.map +1 -0
- package/dist/learning/trajectory.js +200 -0
- package/dist/learning/trajectory.js.map +1 -0
- package/dist/memory/memory-compat.d.ts +100 -0
- package/dist/memory/memory-compat.d.ts.map +1 -0
- package/dist/memory/memory-compat.js +146 -0
- package/dist/memory/memory-compat.js.map +1 -0
- package/dist/memory/observation-store.d.ts +57 -0
- package/dist/memory/observation-store.d.ts.map +1 -0
- package/dist/memory/observation-store.js +154 -0
- package/dist/memory/observation-store.js.map +1 -0
- package/dist/memory/session-tracker.d.ts +81 -0
- package/dist/memory/session-tracker.d.ts.map +1 -0
- package/dist/memory/session-tracker.js +262 -0
- package/dist/memory/session-tracker.js.map +1 -0
- package/dist/pipeline/engine.d.ts +179 -0
- package/dist/pipeline/engine.d.ts.map +1 -0
- package/dist/pipeline/engine.js +691 -0
- package/dist/pipeline/engine.js.map +1 -0
- package/dist/pipeline/events.d.ts +54 -0
- package/dist/pipeline/events.d.ts.map +1 -0
- package/dist/pipeline/events.js +157 -0
- package/dist/pipeline/events.js.map +1 -0
- package/dist/pipeline/parallel.d.ts +83 -0
- package/dist/pipeline/parallel.d.ts.map +1 -0
- package/dist/pipeline/parallel.js +277 -0
- package/dist/pipeline/parallel.js.map +1 -0
- package/dist/pipeline/state-machine.d.ts +65 -0
- package/dist/pipeline/state-machine.d.ts.map +1 -0
- package/dist/pipeline/state-machine.js +176 -0
- package/dist/pipeline/state-machine.js.map +1 -0
- package/dist/query/graph-queries.d.ts +84 -0
- package/dist/query/graph-queries.d.ts.map +1 -0
- package/dist/query/graph-queries.js +216 -0
- package/dist/query/graph-queries.js.map +1 -0
- package/dist/query/hybrid-search.d.ts +34 -0
- package/dist/query/hybrid-search.d.ts.map +1 -0
- package/dist/query/hybrid-search.js +263 -0
- package/dist/query/hybrid-search.js.map +1 -0
- package/dist/query/intent-detector.d.ts +35 -0
- package/dist/query/intent-detector.d.ts.map +1 -0
- package/dist/query/intent-detector.js +115 -0
- package/dist/query/intent-detector.js.map +1 -0
- package/dist/query/ranking.d.ts +57 -0
- package/dist/query/ranking.d.ts.map +1 -0
- package/dist/query/ranking.js +109 -0
- package/dist/query/ranking.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +291 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/falkordb-store.d.ts +73 -0
- package/dist/storage/falkordb-store.d.ts.map +1 -0
- package/dist/storage/falkordb-store.js +346 -0
- package/dist/storage/falkordb-store.js.map +1 -0
- package/dist/storage/file-cache.d.ts +32 -0
- package/dist/storage/file-cache.d.ts.map +1 -0
- package/dist/storage/file-cache.js +115 -0
- package/dist/storage/file-cache.js.map +1 -0
- package/dist/storage/interfaces.d.ts +151 -0
- package/dist/storage/interfaces.d.ts.map +1 -0
- package/dist/storage/interfaces.js +7 -0
- package/dist/storage/interfaces.js.map +1 -0
- package/dist/storage/qdrant-store.d.ts +110 -0
- package/dist/storage/qdrant-store.d.ts.map +1 -0
- package/dist/storage/qdrant-store.js +467 -0
- package/dist/storage/qdrant-store.js.map +1 -0
- package/dist/storage/schema.d.ts +4 -0
- package/dist/storage/schema.d.ts.map +1 -0
- package/dist/storage/schema.js +136 -0
- package/dist/storage/schema.js.map +1 -0
- package/dist/storage/sqlite.d.ts +35 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +132 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/tools/collaboration-tools.d.ts +111 -0
- package/dist/tools/collaboration-tools.d.ts.map +1 -0
- package/dist/tools/collaboration-tools.js +174 -0
- package/dist/tools/collaboration-tools.js.map +1 -0
- package/dist/tools/context-tools.d.ts +293 -0
- package/dist/tools/context-tools.d.ts.map +1 -0
- package/dist/tools/context-tools.js +437 -0
- package/dist/tools/context-tools.js.map +1 -0
- package/dist/tools/graph-tools.d.ts +129 -0
- package/dist/tools/graph-tools.d.ts.map +1 -0
- package/dist/tools/graph-tools.js +237 -0
- package/dist/tools/graph-tools.js.map +1 -0
- package/dist/tools/ingestion-tools.d.ts +96 -0
- package/dist/tools/ingestion-tools.d.ts.map +1 -0
- package/dist/tools/ingestion-tools.js +90 -0
- package/dist/tools/ingestion-tools.js.map +1 -0
- package/dist/tools/learning-tools.d.ts +168 -0
- package/dist/tools/learning-tools.d.ts.map +1 -0
- package/dist/tools/learning-tools.js +158 -0
- package/dist/tools/learning-tools.js.map +1 -0
- package/dist/tools/memory-tools.d.ts +183 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +197 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/phase-tools.d.ts +954 -0
- package/dist/tools/phase-tools.d.ts.map +1 -0
- package/dist/tools/phase-tools.js +1215 -0
- package/dist/tools/phase-tools.js.map +1 -0
- package/dist/tools/pipeline-tools.d.ts +140 -0
- package/dist/tools/pipeline-tools.d.ts.map +1 -0
- package/dist/tools/pipeline-tools.js +162 -0
- package/dist/tools/pipeline-tools.js.map +1 -0
- package/dist/tools/registration-tools.d.ts +220 -0
- package/dist/tools/registration-tools.d.ts.map +1 -0
- package/dist/tools/registration-tools.js +391 -0
- package/dist/tools/registration-tools.js.map +1 -0
- package/dist/util/circuit-breaker.d.ts +75 -0
- package/dist/util/circuit-breaker.d.ts.map +1 -0
- package/dist/util/circuit-breaker.js +159 -0
- package/dist/util/circuit-breaker.js.map +1 -0
- package/dist/util/config.d.ts +23 -0
- package/dist/util/config.d.ts.map +1 -0
- package/dist/util/config.js +164 -0
- package/dist/util/config.js.map +1 -0
- package/dist/util/logger.d.ts +13 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +45 -0
- package/dist/util/logger.js.map +1 -0
- package/dist/util/token-counter.d.ts +24 -0
- package/dist/util/token-counter.d.ts.map +1 -0
- package/dist/util/token-counter.js +48 -0
- package/dist/util/token-counter.js.map +1 -0
- package/dist/util/types.d.ts +525 -0
- package/dist/util/types.d.ts.map +1 -0
- package/dist/util/types.js +5 -0
- package/dist/util/types.js.map +1 -0
- package/docker-compose.yml +20 -0
- package/docs/plans/2026-02-27-swarm-coordination/architecture.md +203 -0
- package/docs/plans/2026-02-27-swarm-coordination/vision.md +57 -0
- package/docs/plans/completed/2026-02-26-forge-plugin-bundling/architecture.md +1 -0
- package/docs/plans/completed/2026-02-26-forge-plugin-bundling/vision.md +300 -0
- package/docs/plans/completed/2026-02-27-forge-swarm-learning/architecture.md +480 -0
- package/docs/plans/completed/2026-02-27-forge-swarm-learning/verification-checklist.md +462 -0
- package/docs/plans/completed/2026-02-27-git-history-atlassian/git-jira-plan.md +181 -0
- package/package.json +39 -0
- package/plugin/.claude-plugin/plugin.json +8 -0
- package/plugin/.mcp.json +15 -0
- package/plugin/README.md +134 -0
- package/plugin/agents/architect.md +367 -0
- package/plugin/agents/backend-specialist.md +263 -0
- package/plugin/agents/brainstormer.md +122 -0
- package/plugin/agents/data-specialist.md +266 -0
- package/plugin/agents/designer.md +408 -0
- package/plugin/agents/frontend-specialist.md +241 -0
- package/plugin/agents/inspector.md +406 -0
- package/plugin/agents/knowledge-keeper.md +443 -0
- package/plugin/agents/platform-engineer.md +326 -0
- package/plugin/agents/product-manager.md +268 -0
- package/plugin/agents/product-owner.md +438 -0
- package/plugin/agents/pulse-checker.md +73 -0
- package/plugin/agents/qa-strategist.md +500 -0
- package/plugin/agents/self-improver.md +310 -0
- package/plugin/agents/strategist.md +360 -0
- package/plugin/agents/supervisor.md +380 -0
- package/plugin/commands/brainstorm.md +25 -0
- package/plugin/commands/forge.md +88 -0
- package/plugin/docs/atlassian-integration.md +110 -0
- package/plugin/docs/workflow.md +126 -0
- package/plugin/skills/agent-development/.skillfish.json +10 -0
- package/plugin/skills/agent-development/SKILL.md +415 -0
- package/plugin/skills/agent-development/examples/agent-creation-prompt.md +238 -0
- package/plugin/skills/agent-development/examples/complete-agent-examples.md +427 -0
- package/plugin/skills/agent-development/references/agent-creation-system-prompt.md +207 -0
- package/plugin/skills/agent-development/references/system-prompt-design.md +411 -0
- package/plugin/skills/agent-development/references/triggering-examples.md +491 -0
- package/plugin/skills/agent-development/scripts/validate-agent.sh +217 -0
- package/plugin/skills/agent-handoff/SKILL.md +335 -0
- package/plugin/skills/anti-stub/SKILL.md +317 -0
- package/plugin/skills/brainstorm/SKILL.md +31 -0
- package/plugin/skills/debugging/SKILL.md +276 -0
- package/plugin/skills/fix/SKILL.md +62 -0
- package/plugin/skills/frontend-design/.skillfish.json +10 -0
- package/plugin/skills/frontend-design/SKILL.md +42 -0
- package/plugin/skills/gotchas/SKILL.md +61 -0
- package/plugin/skills/graph-orchestrator/SKILL.md +38 -0
- package/plugin/skills/history/SKILL.md +58 -0
- package/plugin/skills/impact/SKILL.md +59 -0
- package/plugin/skills/implementation-execution/SKILL.md +291 -0
- package/plugin/skills/index-repo/SKILL.md +55 -0
- package/plugin/skills/interviewing/SKILL.md +225 -0
- package/plugin/skills/knowledge-curation/SKILL.md +393 -0
- package/plugin/skills/learn/SKILL.md +69 -0
- package/plugin/skills/mcp-integration/.skillfish.json +10 -0
- package/plugin/skills/mcp-integration/SKILL.md +554 -0
- package/plugin/skills/mcp-integration/examples/http-server.json +20 -0
- package/plugin/skills/mcp-integration/examples/sse-server.json +19 -0
- package/plugin/skills/mcp-integration/examples/stdio-server.json +26 -0
- package/plugin/skills/mcp-integration/references/authentication.md +549 -0
- package/plugin/skills/mcp-integration/references/server-types.md +536 -0
- package/plugin/skills/mcp-integration/references/tool-usage.md +538 -0
- package/plugin/skills/nestjs/.skillfish.json +10 -0
- package/plugin/skills/nestjs/SKILL.md +669 -0
- package/plugin/skills/nestjs/drizzle-reference.md +1894 -0
- package/plugin/skills/nestjs/reference.md +1447 -0
- package/plugin/skills/nestjs/workflow-optimization.md +229 -0
- package/plugin/skills/parallel-dispatch/SKILL.md +308 -0
- package/plugin/skills/project-discovery/SKILL.md +304 -0
- package/plugin/skills/search/SKILL.md +56 -0
- package/plugin/skills/security-audit/SKILL.md +362 -0
- package/plugin/skills/skill-development/.skillfish.json +10 -0
- package/plugin/skills/skill-development/SKILL.md +637 -0
- package/plugin/skills/skill-development/references/skill-creator-original.md +209 -0
- package/plugin/skills/tdd/SKILL.md +273 -0
- package/plugin/skills/terminal-presentation/SKILL.md +395 -0
- package/plugin/skills/test-strategy/SKILL.md +365 -0
- package/plugin/skills/verification-protocol/SKILL.md +256 -0
- package/plugin/skills/visual-explainer/CHANGELOG.md +97 -0
- package/plugin/skills/visual-explainer/LICENSE +21 -0
- package/plugin/skills/visual-explainer/README.md +137 -0
- package/plugin/skills/visual-explainer/SKILL.md +352 -0
- package/plugin/skills/visual-explainer/banner.png +0 -0
- package/plugin/skills/visual-explainer/package.json +11 -0
- package/plugin/skills/visual-explainer/prompts/diff-review.md +68 -0
- package/plugin/skills/visual-explainer/prompts/fact-check.md +63 -0
- package/plugin/skills/visual-explainer/prompts/generate-slides.md +18 -0
- package/plugin/skills/visual-explainer/prompts/generate-web-diagram.md +10 -0
- package/plugin/skills/visual-explainer/prompts/plan-review.md +86 -0
- package/plugin/skills/visual-explainer/prompts/project-recap.md +61 -0
- package/plugin/skills/visual-explainer/references/css-patterns.md +1188 -0
- package/plugin/skills/visual-explainer/references/libraries.md +470 -0
- package/plugin/skills/visual-explainer/references/responsive-nav.md +212 -0
- package/plugin/skills/visual-explainer/references/slide-patterns.md +1403 -0
- package/plugin/skills/visual-explainer/templates/architecture.html +596 -0
- package/plugin/skills/visual-explainer/templates/data-table.html +540 -0
- package/plugin/skills/visual-explainer/templates/mermaid-flowchart.html +435 -0
- package/plugin/skills/visual-explainer/templates/slide-deck.html +913 -0
- package/src/cli.ts +655 -0
- package/src/context/.gitkeep +0 -0
- package/src/context/codebase.ts +393 -0
- package/src/context/injector.ts +797 -0
- package/src/context/memory.ts +187 -0
- package/src/context/session-index.ts +327 -0
- package/src/context/session.ts +152 -0
- package/src/index.ts +47 -0
- package/src/ingestion/.gitkeep +0 -0
- package/src/ingestion/chunker.ts +277 -0
- package/src/ingestion/embedder.ts +167 -0
- package/src/ingestion/git-analyzer.ts +545 -0
- package/src/ingestion/indexer.ts +984 -0
- package/src/ingestion/markdown-chunker.ts +337 -0
- package/src/ingestion/markdown-knowledge.ts +175 -0
- package/src/ingestion/parser.ts +475 -0
- package/src/ingestion/watcher.ts +182 -0
- package/src/knowledge/.gitkeep +0 -0
- package/src/knowledge/hydrator.ts +246 -0
- package/src/knowledge/registry.ts +463 -0
- package/src/knowledge/search.ts +565 -0
- package/src/knowledge/store.ts +262 -0
- package/src/learning/.gitkeep +0 -0
- package/src/learning/confidence.ts +193 -0
- package/src/learning/patterns.ts +360 -0
- package/src/learning/trajectory.ts +268 -0
- package/src/memory/.gitkeep +0 -0
- package/src/memory/memory-compat.ts +233 -0
- package/src/memory/observation-store.ts +224 -0
- package/src/memory/session-tracker.ts +332 -0
- package/src/pipeline/.gitkeep +0 -0
- package/src/pipeline/engine.ts +1139 -0
- package/src/pipeline/events.ts +253 -0
- package/src/pipeline/parallel.ts +394 -0
- package/src/pipeline/state-machine.ts +199 -0
- package/src/query/.gitkeep +0 -0
- package/src/query/graph-queries.ts +262 -0
- package/src/query/hybrid-search.ts +337 -0
- package/src/query/intent-detector.ts +131 -0
- package/src/query/ranking.ts +161 -0
- package/src/server.ts +352 -0
- package/src/storage/.gitkeep +0 -0
- package/src/storage/falkordb-store.ts +388 -0
- package/src/storage/file-cache.ts +141 -0
- package/src/storage/interfaces.ts +201 -0
- package/src/storage/qdrant-store.ts +557 -0
- package/src/storage/schema.ts +139 -0
- package/src/storage/sqlite.ts +168 -0
- package/src/tools/.gitkeep +0 -0
- package/src/tools/collaboration-tools.ts +208 -0
- package/src/tools/context-tools.ts +493 -0
- package/src/tools/graph-tools.ts +295 -0
- package/src/tools/ingestion-tools.ts +122 -0
- package/src/tools/learning-tools.ts +181 -0
- package/src/tools/memory-tools.ts +234 -0
- package/src/tools/phase-tools.ts +1452 -0
- package/src/tools/pipeline-tools.ts +188 -0
- package/src/tools/registration-tools.ts +450 -0
- package/src/util/.gitkeep +0 -0
- package/src/util/circuit-breaker.ts +193 -0
- package/src/util/config.ts +177 -0
- package/src/util/logger.ts +53 -0
- package/src/util/token-counter.ts +52 -0
- package/src/util/types.ts +710 -0
- package/tests/context/.gitkeep +0 -0
- package/tests/integration/.gitkeep +0 -0
- package/tests/knowledge/.gitkeep +0 -0
- package/tests/learning/.gitkeep +0 -0
- package/tests/pipeline/.gitkeep +0 -0
- package/tests/tools/.gitkeep +0 -0
- package/tsconfig.json +21 -0
- package/vitest.config.ts +10 -0
- package/vscode-extension/.vscodeignore +7 -0
- package/vscode-extension/README.md +43 -0
- package/vscode-extension/out/edge-collector.js +274 -0
- package/vscode-extension/out/edge-collector.js.map +1 -0
- package/vscode-extension/out/extension.js +264 -0
- package/vscode-extension/out/extension.js.map +1 -0
- package/vscode-extension/out/forge-client.js +318 -0
- package/vscode-extension/out/forge-client.js.map +1 -0
- package/vscode-extension/package-lock.json +59 -0
- package/vscode-extension/package.json +71 -0
- package/vscode-extension/src/edge-collector.ts +320 -0
- package/vscode-extension/src/extension.ts +269 -0
- package/vscode-extension/src/forge-client.ts +364 -0
- package/vscode-extension/tsconfig.json +19 -0
package/src/server.ts
ADDED
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
// server.ts — B19
|
|
2
|
+
// MCP server setup: initialises all services and registers all tools.
|
|
3
|
+
//
|
|
4
|
+
// Startup sequence:
|
|
5
|
+
// 1. Initialize SQLite (PipelineDB) — always succeeds; creates file if needed
|
|
6
|
+
// 2. Attempt Qdrant connection with graceful degradation on failure
|
|
7
|
+
// 3. Attempt FalkorDB connection with graceful degradation on failure
|
|
8
|
+
// 4. Create ConfidenceManager for knowledge confidence tracking
|
|
9
|
+
// 5. Create file content cache
|
|
10
|
+
// 6. Create service instances (engine, registry, search, context, injector)
|
|
11
|
+
// 7. Collect all tool handlers (pipeline, phase, context, registration,
|
|
12
|
+
// learning, ingestion, memory, graph, collaboration)
|
|
13
|
+
// 8. Register all tools with the MCP server
|
|
14
|
+
// 9. Start periodic confidence decay (every 24 hours)
|
|
15
|
+
//
|
|
16
|
+
// Lazy loading: embedding model is NOT loaded here. It is lazy-loaded in
|
|
17
|
+
// embedder.ts on first use. This keeps server startup under 2 seconds.
|
|
18
|
+
|
|
19
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
20
|
+
import { homedir } from 'node:os';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
|
|
23
|
+
import { PipelineDB } from './storage/sqlite.js';
|
|
24
|
+
import { QdrantVectorStore } from './storage/qdrant-store.js';
|
|
25
|
+
import { FalkorDBGraphStore } from './storage/falkordb-store.js';
|
|
26
|
+
import { LRUFileContentCache } from './storage/file-cache.js';
|
|
27
|
+
|
|
28
|
+
import { PipelineEngine } from './pipeline/engine.js';
|
|
29
|
+
import { RepoRegistry } from './knowledge/registry.js';
|
|
30
|
+
import { KnowledgeYamlStore } from './knowledge/store.js';
|
|
31
|
+
import { KnowledgeHydrator } from './knowledge/hydrator.js';
|
|
32
|
+
import { KnowledgeSearch } from './knowledge/search.js';
|
|
33
|
+
|
|
34
|
+
import { CodebaseContext } from './context/codebase.js';
|
|
35
|
+
import { MemoryBridge } from './context/memory.js';
|
|
36
|
+
import { ContextInjector } from './context/injector.js';
|
|
37
|
+
|
|
38
|
+
import { createPipelineTools } from './tools/pipeline-tools.js';
|
|
39
|
+
import { createPhaseTools } from './tools/phase-tools.js';
|
|
40
|
+
import { createContextTools } from './tools/context-tools.js';
|
|
41
|
+
import { createRegistrationTools } from './tools/registration-tools.js';
|
|
42
|
+
import { createLearningTools } from './tools/learning-tools.js';
|
|
43
|
+
import { createIngestionTools } from './tools/ingestion-tools.js';
|
|
44
|
+
import { createMemoryTools } from './tools/memory-tools.js';
|
|
45
|
+
import { createGraphTools } from './tools/graph-tools.js';
|
|
46
|
+
import { createCollaborationTools } from './tools/collaboration-tools.js';
|
|
47
|
+
|
|
48
|
+
import { ConfidenceManager } from './learning/confidence.js';
|
|
49
|
+
|
|
50
|
+
import { logger } from './util/logger.js';
|
|
51
|
+
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Default paths
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
const DEFAULT_DB_PATH = join(homedir(), '.forge', 'pipeline.db');
|
|
57
|
+
const QDRANT_URL = process.env['QDRANT_URL'] ?? 'http://localhost:6333';
|
|
58
|
+
const FALKORDB_HOST = process.env['FALKORDB_HOST'] ?? 'localhost';
|
|
59
|
+
const FALKORDB_PORT = parseInt(process.env['FALKORDB_PORT'] ?? '6380', 10);
|
|
60
|
+
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Server info
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
|
|
65
|
+
const SERVER_NAME = 'dk-forge';
|
|
66
|
+
const SERVER_VERSION = '0.1.0';
|
|
67
|
+
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// createForgeServer
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
|
|
72
|
+
export async function createForgeServer(): Promise<McpServer> {
|
|
73
|
+
const startTime = Date.now();
|
|
74
|
+
logger.info(`${SERVER_NAME}: initializing`, { version: SERVER_VERSION });
|
|
75
|
+
|
|
76
|
+
// -------------------------------------------------------------------------
|
|
77
|
+
// 1. SQLite — always succeeds; creates ~/.forge/pipeline.db if needed
|
|
78
|
+
// -------------------------------------------------------------------------
|
|
79
|
+
const dbPath = process.env['FORGE_DB_PATH'] ?? DEFAULT_DB_PATH;
|
|
80
|
+
const db = new PipelineDB(dbPath);
|
|
81
|
+
db.initialize();
|
|
82
|
+
logger.info('server: SQLite initialized', { path: dbPath });
|
|
83
|
+
|
|
84
|
+
// -------------------------------------------------------------------------
|
|
85
|
+
// 2. Qdrant — graceful degradation if unavailable
|
|
86
|
+
// -------------------------------------------------------------------------
|
|
87
|
+
let vectorStore: QdrantVectorStore | null = null;
|
|
88
|
+
try {
|
|
89
|
+
const qdrant = new QdrantVectorStore(QDRANT_URL);
|
|
90
|
+
const qdrantHealthy = await qdrant.isHealthy();
|
|
91
|
+
if (qdrantHealthy) {
|
|
92
|
+
// Ensure collections exist (384-dim for all-MiniLM-L6-v2)
|
|
93
|
+
await qdrant.ensureCollections(384);
|
|
94
|
+
vectorStore = qdrant;
|
|
95
|
+
logger.info('server: Qdrant connected', { url: QDRANT_URL });
|
|
96
|
+
} else {
|
|
97
|
+
logger.warn('server: Qdrant unavailable — knowledge search and codebase context will be degraded', {
|
|
98
|
+
url: QDRANT_URL,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
} catch (err) {
|
|
102
|
+
logger.warn('server: Qdrant connection failed — running without vector search', {
|
|
103
|
+
url: QDRANT_URL,
|
|
104
|
+
error: String(err),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// -------------------------------------------------------------------------
|
|
109
|
+
// 3. FalkorDB — graceful degradation if unavailable
|
|
110
|
+
// -------------------------------------------------------------------------
|
|
111
|
+
let graphStore: FalkorDBGraphStore | null = null;
|
|
112
|
+
try {
|
|
113
|
+
const falkor = new FalkorDBGraphStore(
|
|
114
|
+
`redis://${FALKORDB_HOST}:${FALKORDB_PORT}`,
|
|
115
|
+
);
|
|
116
|
+
await falkor.connect();
|
|
117
|
+
const falkorHealthy = await falkor.isHealthy();
|
|
118
|
+
if (falkorHealthy) {
|
|
119
|
+
graphStore = falkor;
|
|
120
|
+
logger.info('server: FalkorDB connected', { host: FALKORDB_HOST, port: FALKORDB_PORT });
|
|
121
|
+
} else {
|
|
122
|
+
logger.warn('server: FalkorDB unavailable — graph-boosted search disabled, using vector-only');
|
|
123
|
+
try { await falkor.disconnect(); } catch {}
|
|
124
|
+
}
|
|
125
|
+
} catch (err) {
|
|
126
|
+
logger.warn('server: FalkorDB connection failed — running without graph store', {
|
|
127
|
+
error: String(err),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// -------------------------------------------------------------------------
|
|
132
|
+
// 4. Confidence manager — tracks knowledge item usage and decay
|
|
133
|
+
// -------------------------------------------------------------------------
|
|
134
|
+
const confidenceManager = new ConfidenceManager();
|
|
135
|
+
|
|
136
|
+
// -------------------------------------------------------------------------
|
|
137
|
+
// 5. File content cache
|
|
138
|
+
// -------------------------------------------------------------------------
|
|
139
|
+
const fileCache = new LRUFileContentCache({
|
|
140
|
+
maxSizeBytes: 128 * 1024 * 1024, // 128 MB
|
|
141
|
+
maxEntries: 2000,
|
|
142
|
+
ttlMs: 30 * 60 * 1000, // 30 minutes
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
// -------------------------------------------------------------------------
|
|
146
|
+
// 6. Service instances
|
|
147
|
+
// -------------------------------------------------------------------------
|
|
148
|
+
|
|
149
|
+
// Knowledge hydrator — wires YAML store + Qdrant
|
|
150
|
+
// The KnowledgeHydrator's yamlStore is overridden per-registration call inside RepoRegistry,
|
|
151
|
+
// so we pass a placeholder that uses ~/.forge as the base directory.
|
|
152
|
+
const knowledgeHydrator = vectorStore
|
|
153
|
+
? new KnowledgeHydrator(
|
|
154
|
+
new KnowledgeYamlStore(join(homedir(), '.forge')),
|
|
155
|
+
vectorStore,
|
|
156
|
+
)
|
|
157
|
+
: undefined;
|
|
158
|
+
|
|
159
|
+
// Repo registry — passes the hydrator for knowledge sync on registration
|
|
160
|
+
const registry = new RepoRegistry(db, knowledgeHydrator);
|
|
161
|
+
|
|
162
|
+
// Pipeline engine
|
|
163
|
+
const engine = new PipelineEngine(db);
|
|
164
|
+
|
|
165
|
+
// Knowledge search — wraps Qdrant knowledge collection
|
|
166
|
+
const knowledgeSearch = vectorStore
|
|
167
|
+
? new KnowledgeSearch(vectorStore)
|
|
168
|
+
: createDegradedKnowledgeSearch();
|
|
169
|
+
|
|
170
|
+
// Codebase context — wraps hybrid search
|
|
171
|
+
// Sharing resolver: looks up a repo's sharing mode from the registry so that
|
|
172
|
+
// cross-repo search results from private repos are filtered out.
|
|
173
|
+
const codebaseCtx = new CodebaseContext(
|
|
174
|
+
graphStore,
|
|
175
|
+
vectorStore,
|
|
176
|
+
fileCache,
|
|
177
|
+
(repoId) => registry.getRepo(repoId)?.sharing,
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
// Memory bridge — wraps Qdrant observations collection
|
|
181
|
+
const memoryBridge = new MemoryBridge(vectorStore);
|
|
182
|
+
|
|
183
|
+
// Context injector — orchestrates all context assembly
|
|
184
|
+
// Accepts confidenceManager + vectorStore to auto-boost knowledge confidence
|
|
185
|
+
// on consumption (Phase 2 swarm learning).
|
|
186
|
+
const contextInjector = new ContextInjector(
|
|
187
|
+
knowledgeSearch,
|
|
188
|
+
codebaseCtx,
|
|
189
|
+
memoryBridge,
|
|
190
|
+
db,
|
|
191
|
+
confidenceManager,
|
|
192
|
+
vectorStore as QdrantVectorStore | undefined,
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
// -------------------------------------------------------------------------
|
|
196
|
+
// 7. Collect all tool handlers
|
|
197
|
+
// -------------------------------------------------------------------------
|
|
198
|
+
|
|
199
|
+
// Existing tool factories — updated with new params for swarm learning
|
|
200
|
+
const pipelineTools = createPipelineTools(engine, registry);
|
|
201
|
+
const phaseTools = createPhaseTools(engine, contextInjector, vectorStore, graphStore);
|
|
202
|
+
const contextTools = createContextTools(
|
|
203
|
+
knowledgeSearch, codebaseCtx, engine,
|
|
204
|
+
memoryBridge, vectorStore, graphStore,
|
|
205
|
+
);
|
|
206
|
+
const registrationTools = createRegistrationTools(registry, {
|
|
207
|
+
vectorStore,
|
|
208
|
+
graphStore,
|
|
209
|
+
fileCache,
|
|
210
|
+
});
|
|
211
|
+
const learningTools = createLearningTools(
|
|
212
|
+
knowledgeSearch,
|
|
213
|
+
confidenceManager,
|
|
214
|
+
vectorStore as QdrantVectorStore | null,
|
|
215
|
+
);
|
|
216
|
+
const ingestionTools = createIngestionTools(graphStore);
|
|
217
|
+
|
|
218
|
+
// New tool factories — swarm learning, graph analysis, collaboration
|
|
219
|
+
const memoryTools = createMemoryTools(memoryBridge, vectorStore, graphStore);
|
|
220
|
+
const graphTools = createGraphTools(graphStore);
|
|
221
|
+
const collaborationTools = createCollaborationTools(vectorStore, graphStore, db);
|
|
222
|
+
|
|
223
|
+
const allTools = {
|
|
224
|
+
...pipelineTools,
|
|
225
|
+
...phaseTools,
|
|
226
|
+
...contextTools,
|
|
227
|
+
...registrationTools,
|
|
228
|
+
...learningTools,
|
|
229
|
+
...ingestionTools,
|
|
230
|
+
...memoryTools,
|
|
231
|
+
...graphTools,
|
|
232
|
+
...collaborationTools,
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
// -------------------------------------------------------------------------
|
|
236
|
+
// 8. Create and configure MCP server
|
|
237
|
+
// -------------------------------------------------------------------------
|
|
238
|
+
const server = new McpServer({
|
|
239
|
+
name: SERVER_NAME,
|
|
240
|
+
version: SERVER_VERSION,
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
// Register each tool with the MCP server
|
|
244
|
+
for (const [name, tool] of Object.entries(allTools)) {
|
|
245
|
+
const { schema, description, handler } = tool as {
|
|
246
|
+
schema: { shape: Record<string, unknown> };
|
|
247
|
+
description: string;
|
|
248
|
+
handler: (input: Record<string, unknown>) => Promise<unknown>;
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
server.tool(
|
|
252
|
+
name,
|
|
253
|
+
description,
|
|
254
|
+
// MCP SDK accepts raw Zod shape objects (not the full z.object wrapper)
|
|
255
|
+
(schema as unknown as { shape: Record<string, unknown> }).shape,
|
|
256
|
+
async (input: Record<string, unknown>) => {
|
|
257
|
+
try {
|
|
258
|
+
const result = await handler(input);
|
|
259
|
+
return {
|
|
260
|
+
content: [
|
|
261
|
+
{
|
|
262
|
+
type: 'text' as const,
|
|
263
|
+
text: JSON.stringify(result, null, 2),
|
|
264
|
+
},
|
|
265
|
+
],
|
|
266
|
+
};
|
|
267
|
+
} catch (err) {
|
|
268
|
+
const errorPayload = {
|
|
269
|
+
error: 'TOOL_EXECUTION_ERROR',
|
|
270
|
+
tool: name,
|
|
271
|
+
message: String(err),
|
|
272
|
+
};
|
|
273
|
+
return {
|
|
274
|
+
content: [
|
|
275
|
+
{
|
|
276
|
+
type: 'text' as const,
|
|
277
|
+
text: JSON.stringify(errorPayload, null, 2),
|
|
278
|
+
},
|
|
279
|
+
],
|
|
280
|
+
isError: true,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
logger.debug(`server: registered tool: ${name}`);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const elapsed = Date.now() - startTime;
|
|
290
|
+
logger.info(`${SERVER_NAME}: ready`, {
|
|
291
|
+
toolCount: Object.keys(allTools).length,
|
|
292
|
+
qdrant: vectorStore !== null,
|
|
293
|
+
falkordb: graphStore !== null,
|
|
294
|
+
startupMs: elapsed,
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
// -------------------------------------------------------------------------
|
|
298
|
+
// 9. Periodic confidence decay — runs every 24 hours
|
|
299
|
+
// -------------------------------------------------------------------------
|
|
300
|
+
// Knowledge items that haven't been accessed recently see their confidence
|
|
301
|
+
// decrease over time. This prevents stale knowledge from dominating search
|
|
302
|
+
// results. The decay is best-effort and never blocks the server.
|
|
303
|
+
const DECAY_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours
|
|
304
|
+
setInterval(() => {
|
|
305
|
+
if (vectorStore) {
|
|
306
|
+
confidenceManager.decayAll(vectorStore as QdrantVectorStore)
|
|
307
|
+
.catch(err => logger.warn('Periodic confidence decay failed', { error: String(err) }));
|
|
308
|
+
}
|
|
309
|
+
}, DECAY_INTERVAL);
|
|
310
|
+
|
|
311
|
+
// Expose close method for graceful shutdown
|
|
312
|
+
(server as McpServer & { _closeConnections?: () => Promise<void> })._closeConnections = async () => {
|
|
313
|
+
db.close();
|
|
314
|
+
if (graphStore) {
|
|
315
|
+
try { await graphStore.disconnect(); } catch {}
|
|
316
|
+
}
|
|
317
|
+
logger.info('server: connections closed');
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
return server;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// ---------------------------------------------------------------------------
|
|
324
|
+
// Degraded KnowledgeSearch stub — used when Qdrant is unavailable
|
|
325
|
+
// ---------------------------------------------------------------------------
|
|
326
|
+
|
|
327
|
+
function createDegradedKnowledgeSearch(): KnowledgeSearch {
|
|
328
|
+
// We need a QdrantVectorStore that always reports unhealthy.
|
|
329
|
+
// This causes KnowledgeSearch to return empty results gracefully.
|
|
330
|
+
const degradedStore = {
|
|
331
|
+
isHealthy: async () => false,
|
|
332
|
+
searchKnowledge: async () => [],
|
|
333
|
+
upsertKnowledge: async () => {},
|
|
334
|
+
deleteKnowledge: async () => {},
|
|
335
|
+
getKnowledgeCount: async () => 0,
|
|
336
|
+
searchCodeChunks: async () => [],
|
|
337
|
+
searchObservations: async () => [],
|
|
338
|
+
upsertCodeChunks: async () => {},
|
|
339
|
+
upsertObservation: async () => {},
|
|
340
|
+
deleteFileChunks: async () => {},
|
|
341
|
+
deleteRepoChunks: async () => {},
|
|
342
|
+
getCounts: async () => ({ codeChunks: 0, observations: 0 }),
|
|
343
|
+
getObservation: async () => null,
|
|
344
|
+
updateObservation: async () => {},
|
|
345
|
+
filterObservations: async () => [],
|
|
346
|
+
ensureCollections: async () => {},
|
|
347
|
+
connect: async () => {},
|
|
348
|
+
disconnect: async () => {},
|
|
349
|
+
} as unknown as QdrantVectorStore;
|
|
350
|
+
|
|
351
|
+
return new KnowledgeSearch(degradedStore);
|
|
352
|
+
}
|
|
File without changes
|