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/dist/server.js
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
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
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
19
|
+
import { homedir } from 'node:os';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
import { PipelineDB } from './storage/sqlite.js';
|
|
22
|
+
import { QdrantVectorStore } from './storage/qdrant-store.js';
|
|
23
|
+
import { FalkorDBGraphStore } from './storage/falkordb-store.js';
|
|
24
|
+
import { LRUFileContentCache } from './storage/file-cache.js';
|
|
25
|
+
import { PipelineEngine } from './pipeline/engine.js';
|
|
26
|
+
import { RepoRegistry } from './knowledge/registry.js';
|
|
27
|
+
import { KnowledgeYamlStore } from './knowledge/store.js';
|
|
28
|
+
import { KnowledgeHydrator } from './knowledge/hydrator.js';
|
|
29
|
+
import { KnowledgeSearch } from './knowledge/search.js';
|
|
30
|
+
import { CodebaseContext } from './context/codebase.js';
|
|
31
|
+
import { MemoryBridge } from './context/memory.js';
|
|
32
|
+
import { ContextInjector } from './context/injector.js';
|
|
33
|
+
import { createPipelineTools } from './tools/pipeline-tools.js';
|
|
34
|
+
import { createPhaseTools } from './tools/phase-tools.js';
|
|
35
|
+
import { createContextTools } from './tools/context-tools.js';
|
|
36
|
+
import { createRegistrationTools } from './tools/registration-tools.js';
|
|
37
|
+
import { createLearningTools } from './tools/learning-tools.js';
|
|
38
|
+
import { createIngestionTools } from './tools/ingestion-tools.js';
|
|
39
|
+
import { createMemoryTools } from './tools/memory-tools.js';
|
|
40
|
+
import { createGraphTools } from './tools/graph-tools.js';
|
|
41
|
+
import { createCollaborationTools } from './tools/collaboration-tools.js';
|
|
42
|
+
import { ConfidenceManager } from './learning/confidence.js';
|
|
43
|
+
import { logger } from './util/logger.js';
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Default paths
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
const DEFAULT_DB_PATH = join(homedir(), '.forge', 'pipeline.db');
|
|
48
|
+
const QDRANT_URL = process.env['QDRANT_URL'] ?? 'http://localhost:6333';
|
|
49
|
+
const FALKORDB_HOST = process.env['FALKORDB_HOST'] ?? 'localhost';
|
|
50
|
+
const FALKORDB_PORT = parseInt(process.env['FALKORDB_PORT'] ?? '6380', 10);
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
// Server info
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
const SERVER_NAME = 'dk-forge';
|
|
55
|
+
const SERVER_VERSION = '0.1.0';
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// createForgeServer
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
export async function createForgeServer() {
|
|
60
|
+
const startTime = Date.now();
|
|
61
|
+
logger.info(`${SERVER_NAME}: initializing`, { version: SERVER_VERSION });
|
|
62
|
+
// -------------------------------------------------------------------------
|
|
63
|
+
// 1. SQLite — always succeeds; creates ~/.forge/pipeline.db if needed
|
|
64
|
+
// -------------------------------------------------------------------------
|
|
65
|
+
const dbPath = process.env['FORGE_DB_PATH'] ?? DEFAULT_DB_PATH;
|
|
66
|
+
const db = new PipelineDB(dbPath);
|
|
67
|
+
db.initialize();
|
|
68
|
+
logger.info('server: SQLite initialized', { path: dbPath });
|
|
69
|
+
// -------------------------------------------------------------------------
|
|
70
|
+
// 2. Qdrant — graceful degradation if unavailable
|
|
71
|
+
// -------------------------------------------------------------------------
|
|
72
|
+
let vectorStore = null;
|
|
73
|
+
try {
|
|
74
|
+
const qdrant = new QdrantVectorStore(QDRANT_URL);
|
|
75
|
+
const qdrantHealthy = await qdrant.isHealthy();
|
|
76
|
+
if (qdrantHealthy) {
|
|
77
|
+
// Ensure collections exist (384-dim for all-MiniLM-L6-v2)
|
|
78
|
+
await qdrant.ensureCollections(384);
|
|
79
|
+
vectorStore = qdrant;
|
|
80
|
+
logger.info('server: Qdrant connected', { url: QDRANT_URL });
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
logger.warn('server: Qdrant unavailable — knowledge search and codebase context will be degraded', {
|
|
84
|
+
url: QDRANT_URL,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
logger.warn('server: Qdrant connection failed — running without vector search', {
|
|
90
|
+
url: QDRANT_URL,
|
|
91
|
+
error: String(err),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
// -------------------------------------------------------------------------
|
|
95
|
+
// 3. FalkorDB — graceful degradation if unavailable
|
|
96
|
+
// -------------------------------------------------------------------------
|
|
97
|
+
let graphStore = null;
|
|
98
|
+
try {
|
|
99
|
+
const falkor = new FalkorDBGraphStore(`redis://${FALKORDB_HOST}:${FALKORDB_PORT}`);
|
|
100
|
+
await falkor.connect();
|
|
101
|
+
const falkorHealthy = await falkor.isHealthy();
|
|
102
|
+
if (falkorHealthy) {
|
|
103
|
+
graphStore = falkor;
|
|
104
|
+
logger.info('server: FalkorDB connected', { host: FALKORDB_HOST, port: FALKORDB_PORT });
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
logger.warn('server: FalkorDB unavailable — graph-boosted search disabled, using vector-only');
|
|
108
|
+
try {
|
|
109
|
+
await falkor.disconnect();
|
|
110
|
+
}
|
|
111
|
+
catch { }
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
logger.warn('server: FalkorDB connection failed — running without graph store', {
|
|
116
|
+
error: String(err),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// -------------------------------------------------------------------------
|
|
120
|
+
// 4. Confidence manager — tracks knowledge item usage and decay
|
|
121
|
+
// -------------------------------------------------------------------------
|
|
122
|
+
const confidenceManager = new ConfidenceManager();
|
|
123
|
+
// -------------------------------------------------------------------------
|
|
124
|
+
// 5. File content cache
|
|
125
|
+
// -------------------------------------------------------------------------
|
|
126
|
+
const fileCache = new LRUFileContentCache({
|
|
127
|
+
maxSizeBytes: 128 * 1024 * 1024, // 128 MB
|
|
128
|
+
maxEntries: 2000,
|
|
129
|
+
ttlMs: 30 * 60 * 1000, // 30 minutes
|
|
130
|
+
});
|
|
131
|
+
// -------------------------------------------------------------------------
|
|
132
|
+
// 6. Service instances
|
|
133
|
+
// -------------------------------------------------------------------------
|
|
134
|
+
// Knowledge hydrator — wires YAML store + Qdrant
|
|
135
|
+
// The KnowledgeHydrator's yamlStore is overridden per-registration call inside RepoRegistry,
|
|
136
|
+
// so we pass a placeholder that uses ~/.forge as the base directory.
|
|
137
|
+
const knowledgeHydrator = vectorStore
|
|
138
|
+
? new KnowledgeHydrator(new KnowledgeYamlStore(join(homedir(), '.forge')), vectorStore)
|
|
139
|
+
: undefined;
|
|
140
|
+
// Repo registry — passes the hydrator for knowledge sync on registration
|
|
141
|
+
const registry = new RepoRegistry(db, knowledgeHydrator);
|
|
142
|
+
// Pipeline engine
|
|
143
|
+
const engine = new PipelineEngine(db);
|
|
144
|
+
// Knowledge search — wraps Qdrant knowledge collection
|
|
145
|
+
const knowledgeSearch = vectorStore
|
|
146
|
+
? new KnowledgeSearch(vectorStore)
|
|
147
|
+
: createDegradedKnowledgeSearch();
|
|
148
|
+
// Codebase context — wraps hybrid search
|
|
149
|
+
// Sharing resolver: looks up a repo's sharing mode from the registry so that
|
|
150
|
+
// cross-repo search results from private repos are filtered out.
|
|
151
|
+
const codebaseCtx = new CodebaseContext(graphStore, vectorStore, fileCache, (repoId) => registry.getRepo(repoId)?.sharing);
|
|
152
|
+
// Memory bridge — wraps Qdrant observations collection
|
|
153
|
+
const memoryBridge = new MemoryBridge(vectorStore);
|
|
154
|
+
// Context injector — orchestrates all context assembly
|
|
155
|
+
// Accepts confidenceManager + vectorStore to auto-boost knowledge confidence
|
|
156
|
+
// on consumption (Phase 2 swarm learning).
|
|
157
|
+
const contextInjector = new ContextInjector(knowledgeSearch, codebaseCtx, memoryBridge, db, confidenceManager, vectorStore);
|
|
158
|
+
// -------------------------------------------------------------------------
|
|
159
|
+
// 7. Collect all tool handlers
|
|
160
|
+
// -------------------------------------------------------------------------
|
|
161
|
+
// Existing tool factories — updated with new params for swarm learning
|
|
162
|
+
const pipelineTools = createPipelineTools(engine, registry);
|
|
163
|
+
const phaseTools = createPhaseTools(engine, contextInjector, vectorStore, graphStore);
|
|
164
|
+
const contextTools = createContextTools(knowledgeSearch, codebaseCtx, engine, memoryBridge, vectorStore, graphStore);
|
|
165
|
+
const registrationTools = createRegistrationTools(registry, {
|
|
166
|
+
vectorStore,
|
|
167
|
+
graphStore,
|
|
168
|
+
fileCache,
|
|
169
|
+
});
|
|
170
|
+
const learningTools = createLearningTools(knowledgeSearch, confidenceManager, vectorStore);
|
|
171
|
+
const ingestionTools = createIngestionTools(graphStore);
|
|
172
|
+
// New tool factories — swarm learning, graph analysis, collaboration
|
|
173
|
+
const memoryTools = createMemoryTools(memoryBridge, vectorStore, graphStore);
|
|
174
|
+
const graphTools = createGraphTools(graphStore);
|
|
175
|
+
const collaborationTools = createCollaborationTools(vectorStore, graphStore, db);
|
|
176
|
+
const allTools = {
|
|
177
|
+
...pipelineTools,
|
|
178
|
+
...phaseTools,
|
|
179
|
+
...contextTools,
|
|
180
|
+
...registrationTools,
|
|
181
|
+
...learningTools,
|
|
182
|
+
...ingestionTools,
|
|
183
|
+
...memoryTools,
|
|
184
|
+
...graphTools,
|
|
185
|
+
...collaborationTools,
|
|
186
|
+
};
|
|
187
|
+
// -------------------------------------------------------------------------
|
|
188
|
+
// 8. Create and configure MCP server
|
|
189
|
+
// -------------------------------------------------------------------------
|
|
190
|
+
const server = new McpServer({
|
|
191
|
+
name: SERVER_NAME,
|
|
192
|
+
version: SERVER_VERSION,
|
|
193
|
+
});
|
|
194
|
+
// Register each tool with the MCP server
|
|
195
|
+
for (const [name, tool] of Object.entries(allTools)) {
|
|
196
|
+
const { schema, description, handler } = tool;
|
|
197
|
+
server.tool(name, description,
|
|
198
|
+
// MCP SDK accepts raw Zod shape objects (not the full z.object wrapper)
|
|
199
|
+
schema.shape, async (input) => {
|
|
200
|
+
try {
|
|
201
|
+
const result = await handler(input);
|
|
202
|
+
return {
|
|
203
|
+
content: [
|
|
204
|
+
{
|
|
205
|
+
type: 'text',
|
|
206
|
+
text: JSON.stringify(result, null, 2),
|
|
207
|
+
},
|
|
208
|
+
],
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
const errorPayload = {
|
|
213
|
+
error: 'TOOL_EXECUTION_ERROR',
|
|
214
|
+
tool: name,
|
|
215
|
+
message: String(err),
|
|
216
|
+
};
|
|
217
|
+
return {
|
|
218
|
+
content: [
|
|
219
|
+
{
|
|
220
|
+
type: 'text',
|
|
221
|
+
text: JSON.stringify(errorPayload, null, 2),
|
|
222
|
+
},
|
|
223
|
+
],
|
|
224
|
+
isError: true,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
logger.debug(`server: registered tool: ${name}`);
|
|
229
|
+
}
|
|
230
|
+
const elapsed = Date.now() - startTime;
|
|
231
|
+
logger.info(`${SERVER_NAME}: ready`, {
|
|
232
|
+
toolCount: Object.keys(allTools).length,
|
|
233
|
+
qdrant: vectorStore !== null,
|
|
234
|
+
falkordb: graphStore !== null,
|
|
235
|
+
startupMs: elapsed,
|
|
236
|
+
});
|
|
237
|
+
// -------------------------------------------------------------------------
|
|
238
|
+
// 9. Periodic confidence decay — runs every 24 hours
|
|
239
|
+
// -------------------------------------------------------------------------
|
|
240
|
+
// Knowledge items that haven't been accessed recently see their confidence
|
|
241
|
+
// decrease over time. This prevents stale knowledge from dominating search
|
|
242
|
+
// results. The decay is best-effort and never blocks the server.
|
|
243
|
+
const DECAY_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours
|
|
244
|
+
setInterval(() => {
|
|
245
|
+
if (vectorStore) {
|
|
246
|
+
confidenceManager.decayAll(vectorStore)
|
|
247
|
+
.catch(err => logger.warn('Periodic confidence decay failed', { error: String(err) }));
|
|
248
|
+
}
|
|
249
|
+
}, DECAY_INTERVAL);
|
|
250
|
+
// Expose close method for graceful shutdown
|
|
251
|
+
server._closeConnections = async () => {
|
|
252
|
+
db.close();
|
|
253
|
+
if (graphStore) {
|
|
254
|
+
try {
|
|
255
|
+
await graphStore.disconnect();
|
|
256
|
+
}
|
|
257
|
+
catch { }
|
|
258
|
+
}
|
|
259
|
+
logger.info('server: connections closed');
|
|
260
|
+
};
|
|
261
|
+
return server;
|
|
262
|
+
}
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
// Degraded KnowledgeSearch stub — used when Qdrant is unavailable
|
|
265
|
+
// ---------------------------------------------------------------------------
|
|
266
|
+
function createDegradedKnowledgeSearch() {
|
|
267
|
+
// We need a QdrantVectorStore that always reports unhealthy.
|
|
268
|
+
// This causes KnowledgeSearch to return empty results gracefully.
|
|
269
|
+
const degradedStore = {
|
|
270
|
+
isHealthy: async () => false,
|
|
271
|
+
searchKnowledge: async () => [],
|
|
272
|
+
upsertKnowledge: async () => { },
|
|
273
|
+
deleteKnowledge: async () => { },
|
|
274
|
+
getKnowledgeCount: async () => 0,
|
|
275
|
+
searchCodeChunks: async () => [],
|
|
276
|
+
searchObservations: async () => [],
|
|
277
|
+
upsertCodeChunks: async () => { },
|
|
278
|
+
upsertObservation: async () => { },
|
|
279
|
+
deleteFileChunks: async () => { },
|
|
280
|
+
deleteRepoChunks: async () => { },
|
|
281
|
+
getCounts: async () => ({ codeChunks: 0, observations: 0 }),
|
|
282
|
+
getObservation: async () => null,
|
|
283
|
+
updateObservation: async () => { },
|
|
284
|
+
filterObservations: async () => [],
|
|
285
|
+
ensureCollections: async () => { },
|
|
286
|
+
connect: async () => { },
|
|
287
|
+
disconnect: async () => { },
|
|
288
|
+
};
|
|
289
|
+
return new KnowledgeSearch(degradedStore);
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FalkorDB implementation of GraphStore.
|
|
3
|
+
* FalkorDB speaks Redis protocol + GRAPH commands.
|
|
4
|
+
* Connects to localhost:6380 (remapped from container port 6379 per ADR-7).
|
|
5
|
+
*
|
|
6
|
+
* FalkorDB GRAPH.QUERY --compact response format:
|
|
7
|
+
* [
|
|
8
|
+
* ["header", [...column_names]],
|
|
9
|
+
* ["data", [[row], [row], ...]],
|
|
10
|
+
* ["stats", ["Query internal execution time: X ms"]]
|
|
11
|
+
* ]
|
|
12
|
+
*
|
|
13
|
+
* Without --compact:
|
|
14
|
+
* [header_array, data_array, stats_array]
|
|
15
|
+
* where header_array = [column_names]
|
|
16
|
+
* and data_array = [[cell, cell, ...], ...]
|
|
17
|
+
*/
|
|
18
|
+
import type { GraphStore } from './interfaces.js';
|
|
19
|
+
import type { GraphQueryResult } from '../util/types.js';
|
|
20
|
+
export declare class FalkorDBGraphStore implements GraphStore {
|
|
21
|
+
private client;
|
|
22
|
+
private readonly url;
|
|
23
|
+
private readonly graphName;
|
|
24
|
+
private readonly queryTimeoutMs;
|
|
25
|
+
private connected;
|
|
26
|
+
private reconnectAttempts;
|
|
27
|
+
private readonly breaker;
|
|
28
|
+
constructor(url?: string, graphName?: string, queryTimeoutMs?: number);
|
|
29
|
+
connect(): Promise<void>;
|
|
30
|
+
disconnect(): Promise<void>;
|
|
31
|
+
isHealthy(): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* Execute a raw Cypher query and return typed results.
|
|
34
|
+
* Parses FalkorDB's non-compact response format.
|
|
35
|
+
*/
|
|
36
|
+
query(cypher: string, params?: Record<string, unknown>): Promise<GraphQueryResult>;
|
|
37
|
+
upsertNode(label: string, matchProps: Record<string, unknown>, setProps: Record<string, unknown>): Promise<void>;
|
|
38
|
+
upsertEdge(fromLabel: string, fromProps: Record<string, unknown>, edgeType: string, edgeProps: Record<string, unknown>, toLabel: string, toProps: Record<string, unknown>): Promise<void>;
|
|
39
|
+
deleteFile(filePath: string, repoId: string): Promise<void>;
|
|
40
|
+
deleteRepo(repoId: string): Promise<void>;
|
|
41
|
+
getCounts(): Promise<{
|
|
42
|
+
totalNodes: number;
|
|
43
|
+
totalEdges: number;
|
|
44
|
+
byLabel: Record<string, number>;
|
|
45
|
+
}>;
|
|
46
|
+
ensureIndexes(): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Execute a GRAPH.QUERY command with timeout, wrapped in the circuit breaker.
|
|
49
|
+
* Returns the raw FalkorDB response array.
|
|
50
|
+
*/
|
|
51
|
+
private graphQuery;
|
|
52
|
+
/**
|
|
53
|
+
* Wrap a promise with a timeout that rejects after timeoutMs.
|
|
54
|
+
*/
|
|
55
|
+
private withTimeout;
|
|
56
|
+
/**
|
|
57
|
+
* Parse FalkorDB GRAPH.QUERY response into GraphQueryResult.
|
|
58
|
+
* FalkorDB non-compact format: [header_row, data_rows, stats_row]
|
|
59
|
+
* header_row: ["column1", "column2", ...]
|
|
60
|
+
* data_rows: [[val1, val2, ...], [val1, val2, ...], ...]
|
|
61
|
+
*/
|
|
62
|
+
private parseGraphQueryResult;
|
|
63
|
+
/**
|
|
64
|
+
* Extract a single scalar number from a GRAPH.QUERY count result.
|
|
65
|
+
* Response: [["cnt"], [[42]], [...stats]]
|
|
66
|
+
*/
|
|
67
|
+
private extractScalarNumber;
|
|
68
|
+
private propsToMatch;
|
|
69
|
+
private propsToSet;
|
|
70
|
+
private valueToLiteral;
|
|
71
|
+
private escape;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=falkordb-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"falkordb-store.d.ts","sourceRoot":"","sources":["../../src/storage/falkordb-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAQzD,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;gBAGvC,GAAG,GAAE,MAAiC,EACtC,SAAS,GAAE,MAA0B,EACrC,cAAc,GAAE,MAAiC;IAY7C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAenC;;;OAGG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAUlF,UAAU,CACd,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC;IAYV,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,IAAI,CAAC;IAoBV,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB3D,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzC,SAAS,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IA+BjG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BpC;;;OAGG;YACW,UAAU;IAcxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAanB;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IA6C7B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,MAAM;CAGf"}
|