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
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session lifecycle and context tracking.
|
|
3
|
+
* Tracks current session ID, start time, and provides session-scoped observation queries.
|
|
4
|
+
* Sessions are identified by a timestamp-based ID generated at server startup.
|
|
5
|
+
*
|
|
6
|
+
* Phase 3: Sessions persist as Observation nodes in Qdrant with type: 'session_marker'.
|
|
7
|
+
* Cross-session retrieval queries those nodes to build a session registry.
|
|
8
|
+
*/
|
|
9
|
+
import { randomUUID } from 'crypto';
|
|
10
|
+
import { embedText } from '../ingestion/embedder.js';
|
|
11
|
+
import { logger } from '../util/logger.js';
|
|
12
|
+
// The active session for this server process (created at startup)
|
|
13
|
+
// Format: session-{timestamp} as specified in the architecture
|
|
14
|
+
const SESSION_TIMESTAMP = Date.now();
|
|
15
|
+
const SESSION_ID = `session-${SESSION_TIMESTAMP}`;
|
|
16
|
+
const SESSION_START = SESSION_TIMESTAMP;
|
|
17
|
+
// Track observation count for this session (in-memory)
|
|
18
|
+
let observationCount = 0;
|
|
19
|
+
// Whether we have already persisted this session's marker to Qdrant
|
|
20
|
+
let sessionMarkerPersisted = false;
|
|
21
|
+
/**
|
|
22
|
+
* Get the current session ID.
|
|
23
|
+
* Format: session-{timestamp}. Consistent for the lifetime of the MCP server process.
|
|
24
|
+
*/
|
|
25
|
+
export function getCurrentSessionId() {
|
|
26
|
+
return SESSION_ID;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get the session start timestamp (Unix ms).
|
|
30
|
+
*/
|
|
31
|
+
export function getSessionStart() {
|
|
32
|
+
return SESSION_START;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get session uptime in seconds.
|
|
36
|
+
*/
|
|
37
|
+
export function getUptimeSeconds() {
|
|
38
|
+
return Math.round((Date.now() - SESSION_START) / 1000);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Increment the in-memory observation count for this session.
|
|
42
|
+
* Called by observation-store after a successful save.
|
|
43
|
+
*/
|
|
44
|
+
export function incrementObservationCount() {
|
|
45
|
+
observationCount++;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get the current session observation count.
|
|
49
|
+
*/
|
|
50
|
+
export function getObservationCount() {
|
|
51
|
+
return observationCount;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Persist the current session as a session_marker observation in Qdrant.
|
|
55
|
+
* This enables cross-session discovery — other processes can find recent sessions
|
|
56
|
+
* by searching for type: 'session_marker' observations.
|
|
57
|
+
*
|
|
58
|
+
* Idempotent — only writes once per process lifecycle.
|
|
59
|
+
*/
|
|
60
|
+
export async function persistSessionMarker(vectorStore) {
|
|
61
|
+
if (sessionMarkerPersisted)
|
|
62
|
+
return;
|
|
63
|
+
try {
|
|
64
|
+
const markerId = randomUUID();
|
|
65
|
+
const content = `Session ${SESSION_ID} started at ${new Date(SESSION_START).toISOString()}`;
|
|
66
|
+
// Embed the session marker content for potential semantic retrieval
|
|
67
|
+
let vector;
|
|
68
|
+
try {
|
|
69
|
+
vector = await embedText(content);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
vector = new Array(384).fill(0);
|
|
73
|
+
}
|
|
74
|
+
const markerPayload = {
|
|
75
|
+
id: markerId,
|
|
76
|
+
repo_id: null,
|
|
77
|
+
session_id: SESSION_ID,
|
|
78
|
+
content,
|
|
79
|
+
type: 'working', // session markers are working memory
|
|
80
|
+
category: 'session_marker',
|
|
81
|
+
tags: ['session_marker'],
|
|
82
|
+
importance: 0.1,
|
|
83
|
+
created_at: SESSION_START,
|
|
84
|
+
accessed_at: SESSION_START,
|
|
85
|
+
access_count: 0,
|
|
86
|
+
is_stale: false,
|
|
87
|
+
linked_symbols: [],
|
|
88
|
+
source: 'forge',
|
|
89
|
+
metadata: {
|
|
90
|
+
session_id: SESSION_ID,
|
|
91
|
+
started_at: SESSION_START,
|
|
92
|
+
is_session_marker: true,
|
|
93
|
+
},
|
|
94
|
+
key: SESSION_ID,
|
|
95
|
+
namespace: 'session_registry',
|
|
96
|
+
};
|
|
97
|
+
await vectorStore.upsertObservation(markerId, vector, markerPayload);
|
|
98
|
+
sessionMarkerPersisted = true;
|
|
99
|
+
logger.debug('Session marker persisted', { sessionId: SESSION_ID });
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
logger.warn('Failed to persist session marker (non-fatal)', { error: String(err) });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Retrieve recent session IDs and their start times from Qdrant.
|
|
107
|
+
* Queries for session_marker observations ordered by created_at descending.
|
|
108
|
+
*/
|
|
109
|
+
export async function getRecentSessions(vectorStore, count = 5) {
|
|
110
|
+
try {
|
|
111
|
+
const filter = {
|
|
112
|
+
must: [
|
|
113
|
+
{ key: 'namespace', match: { value: 'session_registry' } },
|
|
114
|
+
{ key: 'tags', match: { value: 'session_marker' } },
|
|
115
|
+
],
|
|
116
|
+
};
|
|
117
|
+
const results = await vectorStore.filterObservations(filter, count * 2);
|
|
118
|
+
const sessions = results
|
|
119
|
+
.map(r => {
|
|
120
|
+
const payload = r.payload;
|
|
121
|
+
return {
|
|
122
|
+
sessionId: payload.session_id,
|
|
123
|
+
startedAt: payload.created_at,
|
|
124
|
+
};
|
|
125
|
+
})
|
|
126
|
+
// Sort by startedAt descending (most recent first)
|
|
127
|
+
.sort((a, b) => b.startedAt - a.startedAt)
|
|
128
|
+
// Deduplicate by sessionId (keep first/most-recent occurrence)
|
|
129
|
+
.filter((s, idx, arr) => arr.findIndex(x => x.sessionId === s.sessionId) === idx)
|
|
130
|
+
.slice(0, count);
|
|
131
|
+
return sessions;
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
logger.warn('Failed to get recent sessions', { error: String(err) });
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Get observations from recent sessions.
|
|
140
|
+
* Phase 3: Queries the persistent session registry to find sessions,
|
|
141
|
+
* then retrieves observations for each one.
|
|
142
|
+
*
|
|
143
|
+
* If a query is provided, observations are ranked by semantic relevance.
|
|
144
|
+
* Otherwise they are returned in reverse chronological order.
|
|
145
|
+
*/
|
|
146
|
+
export async function getRecentSessionObservations(vectorStore, opts) {
|
|
147
|
+
const { query, queryVector, sessionCount = 3, limit = 10 } = opts;
|
|
148
|
+
try {
|
|
149
|
+
// Always include the current session
|
|
150
|
+
const recentSessions = await getRecentSessions(vectorStore, sessionCount);
|
|
151
|
+
// Ensure the current session is included even if not yet persisted
|
|
152
|
+
const sessionIds = new Set(recentSessions.map(s => s.sessionId));
|
|
153
|
+
sessionIds.add(SESSION_ID);
|
|
154
|
+
// Build the full session list with timestamps
|
|
155
|
+
const sessionsWithTime = [
|
|
156
|
+
{ sessionId: SESSION_ID, startedAt: SESSION_START },
|
|
157
|
+
...recentSessions.filter(s => s.sessionId !== SESSION_ID),
|
|
158
|
+
].slice(0, sessionCount);
|
|
159
|
+
// Determine the query vector for relevance ranking
|
|
160
|
+
let resolvedQueryVector = queryVector;
|
|
161
|
+
if (query && !resolvedQueryVector) {
|
|
162
|
+
try {
|
|
163
|
+
resolvedQueryVector = await embedText(query);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
resolvedQueryVector = undefined;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Retrieve observations per session
|
|
170
|
+
const groups = [];
|
|
171
|
+
let remainingLimit = limit;
|
|
172
|
+
for (const session of sessionsWithTime) {
|
|
173
|
+
if (remainingLimit <= 0)
|
|
174
|
+
break;
|
|
175
|
+
const sessionObs = await getSessionObservations(vectorStore, session.sessionId, resolvedQueryVector, remainingLimit);
|
|
176
|
+
if (sessionObs.length > 0) {
|
|
177
|
+
groups.push({
|
|
178
|
+
sessionId: session.sessionId,
|
|
179
|
+
startedAt: session.startedAt,
|
|
180
|
+
observations: sessionObs,
|
|
181
|
+
});
|
|
182
|
+
remainingLimit -= sessionObs.length;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return groups;
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
logger.warn('Failed to get recent session observations', { error: String(err) });
|
|
189
|
+
return [];
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Retrieve observations for a specific session from Qdrant.
|
|
194
|
+
* Excludes session_marker observations and stale observations.
|
|
195
|
+
* If a queryVector is provided, filters use it for ordering but Qdrant scroll
|
|
196
|
+
* doesn't support semantic ranking — we fetch extra and sort in memory.
|
|
197
|
+
*/
|
|
198
|
+
async function getSessionObservations(vectorStore, sessionId, queryVector, limit = 10) {
|
|
199
|
+
try {
|
|
200
|
+
// If we have a query vector, use semantic search for this session
|
|
201
|
+
if (queryVector) {
|
|
202
|
+
const results = await vectorStore.searchObservations(queryVector, {
|
|
203
|
+
limit: limit * 3,
|
|
204
|
+
scoreThreshold: 0.0,
|
|
205
|
+
filter: {
|
|
206
|
+
must: [
|
|
207
|
+
{ key: 'session_id', match: { value: sessionId } },
|
|
208
|
+
],
|
|
209
|
+
must_not: [
|
|
210
|
+
{ key: 'tags', match: { value: 'session_marker' } },
|
|
211
|
+
],
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
return results
|
|
215
|
+
.map(r => {
|
|
216
|
+
const payload = r.payload;
|
|
217
|
+
return {
|
|
218
|
+
id: payload.id,
|
|
219
|
+
content: payload.content,
|
|
220
|
+
relevance_score: Math.round(r.score * 1000) / 1000,
|
|
221
|
+
is_stale: payload.is_stale,
|
|
222
|
+
};
|
|
223
|
+
})
|
|
224
|
+
.filter(o => !o.is_stale)
|
|
225
|
+
.slice(0, limit);
|
|
226
|
+
}
|
|
227
|
+
// No query vector: use scroll (filterObservations) for chronological retrieval
|
|
228
|
+
const filter = {
|
|
229
|
+
session_id: sessionId,
|
|
230
|
+
};
|
|
231
|
+
const results = await vectorStore.filterObservations(filter, limit * 2);
|
|
232
|
+
return results
|
|
233
|
+
.map(r => {
|
|
234
|
+
const payload = r.payload;
|
|
235
|
+
return {
|
|
236
|
+
id: payload.id,
|
|
237
|
+
content: payload.content,
|
|
238
|
+
relevance_score: r.score,
|
|
239
|
+
is_stale: payload.is_stale,
|
|
240
|
+
};
|
|
241
|
+
})
|
|
242
|
+
// Exclude session_marker observations from result listing
|
|
243
|
+
.filter(o => !o.is_stale)
|
|
244
|
+
.slice(0, limit);
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
logger.warn('Failed to get session observations', { sessionId, error: String(err) });
|
|
248
|
+
return [];
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get the current session info summary.
|
|
253
|
+
*/
|
|
254
|
+
export function getSessionInfo() {
|
|
255
|
+
return {
|
|
256
|
+
sessionId: SESSION_ID,
|
|
257
|
+
startedAt: SESSION_START,
|
|
258
|
+
uptimeSeconds: getUptimeSeconds(),
|
|
259
|
+
observationCount,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=session-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-tracker.js","sourceRoot":"","sources":["../../src/memory/session-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import type { PipelineDB } from '../storage/sqlite.js';
|
|
2
|
+
import type { Phase, PipelineTier, Project, ProjectMetadata, Trajectory, TrajectoryStepMetadata, PhaseOutput, Claim, ClaimStatus, PipelineEvent } from '../util/types.js';
|
|
3
|
+
export interface CreateProjectOptions {
|
|
4
|
+
name: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
repoId: string;
|
|
7
|
+
tier?: PipelineTier;
|
|
8
|
+
metadata?: ProjectMetadata;
|
|
9
|
+
}
|
|
10
|
+
export interface TransitionResult {
|
|
11
|
+
projectId: string;
|
|
12
|
+
fromPhase: Phase;
|
|
13
|
+
toPhase: Phase;
|
|
14
|
+
trajectoryId: string;
|
|
15
|
+
cycleCounts: Record<string, number>;
|
|
16
|
+
availableTransitions: Phase[];
|
|
17
|
+
}
|
|
18
|
+
/** Full project state snapshot — returned by getState(). */
|
|
19
|
+
export interface EngineState {
|
|
20
|
+
project: Project;
|
|
21
|
+
history: PipelineEvent[];
|
|
22
|
+
activeClaims: Claim[];
|
|
23
|
+
cycleCounts: Record<string, number>;
|
|
24
|
+
availableTransitions: Phase[];
|
|
25
|
+
}
|
|
26
|
+
export interface ProjectState {
|
|
27
|
+
project: Project;
|
|
28
|
+
activeTrajectory: Trajectory | null;
|
|
29
|
+
cycleCounts: Record<string, number>;
|
|
30
|
+
availableTransitions: Phase[];
|
|
31
|
+
activeClaims: Claim[];
|
|
32
|
+
}
|
|
33
|
+
export interface PhaseHistory {
|
|
34
|
+
phase: Phase;
|
|
35
|
+
agent: string;
|
|
36
|
+
startedAt: string;
|
|
37
|
+
completedAt?: string;
|
|
38
|
+
success?: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface ProjectHistory {
|
|
41
|
+
projectId: string;
|
|
42
|
+
events: PipelineEvent[];
|
|
43
|
+
outputs: PhaseOutput[];
|
|
44
|
+
history: PhaseHistory[];
|
|
45
|
+
}
|
|
46
|
+
export type PipelineEngineErrorCode = 'PROJECT_NOT_FOUND' | 'PROJECT_NOT_ACTIVE' | 'INVALID_TRANSITION' | 'CYCLE_LIMIT_EXCEEDED';
|
|
47
|
+
export declare class PipelineEngineError extends Error {
|
|
48
|
+
readonly code: PipelineEngineErrorCode;
|
|
49
|
+
readonly details: Record<string, unknown>;
|
|
50
|
+
constructor(code: PipelineEngineErrorCode, message: string, details?: Record<string, unknown>);
|
|
51
|
+
}
|
|
52
|
+
export declare class PipelineEngine {
|
|
53
|
+
private readonly db;
|
|
54
|
+
constructor(db: PipelineDB);
|
|
55
|
+
createProject(opts: CreateProjectOptions): Project;
|
|
56
|
+
getProject(projectId: string): Project | null;
|
|
57
|
+
/**
|
|
58
|
+
* Lists projects with optional repo and status filters.
|
|
59
|
+
* Ordered by updated_at DESC (most recently modified first).
|
|
60
|
+
*/
|
|
61
|
+
listProjects(repoId?: string, status?: string): Project[];
|
|
62
|
+
/**
|
|
63
|
+
* Returns the most recently updated active project for a repo, or null when
|
|
64
|
+
* there is no active project for that repo.
|
|
65
|
+
*/
|
|
66
|
+
getActiveProject(repoId: string): Project | null;
|
|
67
|
+
/**
|
|
68
|
+
* Returns the full current state of a project: project data, full event
|
|
69
|
+
* history, active claims, derived cycle counts, and available transitions.
|
|
70
|
+
*
|
|
71
|
+
* Throws PipelineEngineError with code PROJECT_NOT_FOUND when the project
|
|
72
|
+
* does not exist.
|
|
73
|
+
*/
|
|
74
|
+
getState(projectId: string): EngineState;
|
|
75
|
+
/**
|
|
76
|
+
* Atomically advances a project to `toPhase` in a single SQLite transaction:
|
|
77
|
+
* 1. Validates the transition (throws on illegal transitions).
|
|
78
|
+
* 2. Checks cycle limits (throws CYCLE_LIMIT_EXCEEDED; details include the
|
|
79
|
+
* forced advance phase so callers can decide how to proceed).
|
|
80
|
+
* 3. Inserts a phase_transition event.
|
|
81
|
+
* 4. Updates projects.current_phase and updated_at.
|
|
82
|
+
* 5. If toPhase === 'completed', marks the project status 'complete' and
|
|
83
|
+
* emits an additional project_completed event.
|
|
84
|
+
*
|
|
85
|
+
* Throws PipelineEngineError for invalid transitions and cycle limit exceeded.
|
|
86
|
+
* All writes are in a single better-sqlite3 transaction.
|
|
87
|
+
*/
|
|
88
|
+
advancePhase(projectId: string, toPhase: Phase, agent?: string, payload?: Record<string, unknown>): void;
|
|
89
|
+
/**
|
|
90
|
+
* Persists a phase output to phase_outputs. Multiple outputs per phase are
|
|
91
|
+
* allowed (e.g., vision doc, refined vision doc, etc.).
|
|
92
|
+
*
|
|
93
|
+
* Throws PipelineEngineError with code PROJECT_NOT_FOUND when the project
|
|
94
|
+
* does not exist.
|
|
95
|
+
*/
|
|
96
|
+
recordOutput(projectId: string, phase: Phase, outputType: string, content: string, filePath?: string): void;
|
|
97
|
+
/**
|
|
98
|
+
* Returns phase outputs for a project, optionally filtered to a specific
|
|
99
|
+
* phase. Ordered by created_at ASC.
|
|
100
|
+
*/
|
|
101
|
+
getOutputs(projectId: string, phase?: Phase): PhaseOutput[];
|
|
102
|
+
/**
|
|
103
|
+
* Returns all events for a project ordered by created_at ASC.
|
|
104
|
+
* This is the raw event sourcing log used for history reconstruction.
|
|
105
|
+
*/
|
|
106
|
+
getEventHistory(projectId: string): PipelineEvent[];
|
|
107
|
+
/**
|
|
108
|
+
* Marks a project as 'archived'. Emits a project_completed event with an
|
|
109
|
+
* 'abandoned' flag. Idempotent if already archived.
|
|
110
|
+
*
|
|
111
|
+
* Throws PipelineEngineError with code PROJECT_NOT_FOUND when the project
|
|
112
|
+
* does not exist.
|
|
113
|
+
*/
|
|
114
|
+
abandonProject(projectId: string): void;
|
|
115
|
+
/**
|
|
116
|
+
* Transition a project to a new phase.
|
|
117
|
+
* Validates the transition against the state machine, emits events,
|
|
118
|
+
* starts a trajectory, and returns the result.
|
|
119
|
+
*/
|
|
120
|
+
startPhase(projectId: string, toPhase: Phase, agent: string, extra?: Record<string, unknown>): TransitionResult | {
|
|
121
|
+
error: string;
|
|
122
|
+
current_phase: Phase;
|
|
123
|
+
legal_transitions: Phase[];
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Record completion of a phase: persist output, complete the trajectory,
|
|
127
|
+
* and optionally advance the state machine.
|
|
128
|
+
*/
|
|
129
|
+
completePhase(projectId: string, phase: Phase, outputType: string, content: string, opts: {
|
|
130
|
+
agent: string;
|
|
131
|
+
filePath?: string;
|
|
132
|
+
advanceTo?: Phase;
|
|
133
|
+
trajectoryId?: string;
|
|
134
|
+
qualityScore?: number;
|
|
135
|
+
metadata?: Record<string, unknown>;
|
|
136
|
+
}): {
|
|
137
|
+
outputId: number;
|
|
138
|
+
nextPhase: Phase | null;
|
|
139
|
+
};
|
|
140
|
+
startTrajectory(projectId: string, phase: Phase, agent: string): string;
|
|
141
|
+
recordTrajectoryStep(trajectoryId: string, action: string, result?: string, qualityScore?: number, metadata?: TrajectoryStepMetadata): void;
|
|
142
|
+
completeTrajectory(trajectoryId: string, success: boolean, feedback?: string): void;
|
|
143
|
+
createClaim(projectId: string, moduleName: string, agent: string): Claim;
|
|
144
|
+
completeClaim(claimId: string, result?: string): {
|
|
145
|
+
remainingCount: number;
|
|
146
|
+
allComplete: boolean;
|
|
147
|
+
};
|
|
148
|
+
failClaim(claimId: string, reason: string): void;
|
|
149
|
+
getActiveClaims(projectId: string): Claim[];
|
|
150
|
+
getClaims(projectId: string, status?: ClaimStatus): Claim[];
|
|
151
|
+
getClaim(claimId: string): Claim | null;
|
|
152
|
+
getClaimByModule(projectId: string, moduleName: string): Claim | null;
|
|
153
|
+
getPhaseOutput(projectId: string, phase: Phase, outputType?: string): PhaseOutput | null;
|
|
154
|
+
/**
|
|
155
|
+
* Retrieve metadata stored in the agent_completed event for a phase.
|
|
156
|
+
* This includes flags like requires_qa, requires_designer, modules, etc.
|
|
157
|
+
* that are passed via opts.metadata in completePhase().
|
|
158
|
+
*/
|
|
159
|
+
getPhaseMetadata(projectId: string, phase: Phase): Record<string, unknown> | null;
|
|
160
|
+
/**
|
|
161
|
+
* Record a broadcast event in the pipeline_events table.
|
|
162
|
+
* Used by phase tools to auto-broadcast module completions for swarm coordination.
|
|
163
|
+
*/
|
|
164
|
+
recordBroadcast(projectId: string, content: string, severity?: 'info' | 'warning' | 'critical'): void;
|
|
165
|
+
getAllPhaseOutputs(projectId: string): PhaseOutput[];
|
|
166
|
+
getHistory(projectId: string): ProjectHistory;
|
|
167
|
+
getCycleCounts(projectId: string): Record<string, number>;
|
|
168
|
+
private _getCycleCounts;
|
|
169
|
+
/**
|
|
170
|
+
* Retrieves a project by id and throws a typed PipelineEngineError when not
|
|
171
|
+
* found. Used by every method that requires an existing project.
|
|
172
|
+
*/
|
|
173
|
+
private _requireProject;
|
|
174
|
+
private _rowToProject;
|
|
175
|
+
private _rowToClaim;
|
|
176
|
+
private _rowToPhaseOutput;
|
|
177
|
+
getActiveTrajectory(projectId: string, phase: Phase): Trajectory | null;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/pipeline/engine.ts"],"names":[],"mappings":"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"}
|