musubi-sdd 5.0.0 → 5.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +106 -48
- package/README.md +110 -32
- package/bin/musubi-analyze.js +74 -67
- package/bin/musubi-browser.js +27 -26
- package/bin/musubi-change.js +48 -47
- package/bin/musubi-checkpoint.js +10 -7
- package/bin/musubi-convert.js +25 -25
- package/bin/musubi-costs.js +27 -10
- package/bin/musubi-gui.js +52 -46
- package/bin/musubi-init.js +1952 -10
- package/bin/musubi-orchestrate.js +327 -239
- package/bin/musubi-remember.js +69 -56
- package/bin/musubi-resolve.js +53 -45
- package/bin/musubi-trace.js +51 -22
- package/bin/musubi-validate.js +39 -30
- package/bin/musubi-workflow.js +33 -34
- package/bin/musubi.js +39 -2
- package/package.json +1 -1
- package/src/agents/agent-loop.js +94 -95
- package/src/agents/agentic/code-generator.js +119 -109
- package/src/agents/agentic/code-reviewer.js +105 -108
- package/src/agents/agentic/index.js +4 -4
- package/src/agents/browser/action-executor.js +13 -13
- package/src/agents/browser/ai-comparator.js +11 -10
- package/src/agents/browser/context-manager.js +6 -6
- package/src/agents/browser/index.js +5 -5
- package/src/agents/browser/nl-parser.js +31 -46
- package/src/agents/browser/screenshot.js +2 -2
- package/src/agents/browser/test-generator.js +6 -4
- package/src/agents/function-tool.js +71 -65
- package/src/agents/index.js +7 -7
- package/src/agents/schema-generator.js +98 -94
- package/src/analyzers/ast-extractor.js +164 -145
- package/src/analyzers/codegraph-auto-update.js +858 -0
- package/src/analyzers/complexity-analyzer.js +536 -0
- package/src/analyzers/context-optimizer.js +247 -125
- package/src/analyzers/impact-analyzer.js +1 -1
- package/src/analyzers/large-project-analyzer.js +766 -0
- package/src/analyzers/repository-map.js +83 -80
- package/src/analyzers/security-analyzer.js +19 -11
- package/src/analyzers/stuck-detector.js +19 -17
- package/src/converters/index.js +78 -57
- package/src/converters/ir/types.js +12 -12
- package/src/converters/parsers/musubi-parser.js +134 -126
- package/src/converters/parsers/openapi-parser.js +70 -53
- package/src/converters/parsers/speckit-parser.js +239 -175
- package/src/converters/writers/musubi-writer.js +123 -118
- package/src/converters/writers/speckit-writer.js +124 -113
- package/src/generators/rust-migration-generator.js +512 -0
- package/src/gui/public/index.html +1365 -1211
- package/src/gui/server.js +41 -40
- package/src/gui/services/file-watcher.js +23 -8
- package/src/gui/services/project-scanner.js +26 -20
- package/src/gui/services/replanning-service.js +27 -23
- package/src/gui/services/traceability-service.js +8 -8
- package/src/gui/services/workflow-service.js +14 -7
- package/src/index.js +151 -0
- package/src/integrations/cicd.js +90 -104
- package/src/integrations/codegraph-mcp.js +643 -0
- package/src/integrations/documentation.js +142 -103
- package/src/integrations/examples.js +95 -80
- package/src/integrations/github-client.js +17 -17
- package/src/integrations/index.js +5 -5
- package/src/integrations/mcp/index.js +21 -21
- package/src/integrations/mcp/mcp-context-provider.js +76 -78
- package/src/integrations/mcp/mcp-discovery.js +74 -72
- package/src/integrations/mcp/mcp-tool-registry.js +99 -94
- package/src/integrations/mcp-connector.js +70 -66
- package/src/integrations/platforms.js +50 -49
- package/src/integrations/tool-discovery.js +37 -31
- package/src/llm-providers/anthropic-provider.js +11 -11
- package/src/llm-providers/base-provider.js +16 -18
- package/src/llm-providers/copilot-provider.js +22 -19
- package/src/llm-providers/index.js +26 -25
- package/src/llm-providers/ollama-provider.js +11 -11
- package/src/llm-providers/openai-provider.js +12 -12
- package/src/managers/agent-memory.js +36 -24
- package/src/managers/checkpoint-manager.js +4 -8
- package/src/managers/delta-spec.js +19 -19
- package/src/managers/index.js +13 -4
- package/src/managers/memory-condenser.js +35 -45
- package/src/managers/repo-skill-manager.js +57 -31
- package/src/managers/skill-loader.js +25 -22
- package/src/managers/skill-tools.js +36 -72
- package/src/managers/workflow.js +30 -22
- package/src/monitoring/cost-tracker.js +53 -44
- package/src/monitoring/incident-manager.js +123 -103
- package/src/monitoring/index.js +144 -134
- package/src/monitoring/observability.js +82 -59
- package/src/monitoring/quality-dashboard.js +51 -39
- package/src/monitoring/release-manager.js +70 -50
- package/src/orchestration/agent-skill-binding.js +39 -47
- package/src/orchestration/error-handler.js +65 -107
- package/src/orchestration/guardrails/base-guardrail.js +26 -24
- package/src/orchestration/guardrails/guardrail-rules.js +50 -64
- package/src/orchestration/guardrails/index.js +5 -5
- package/src/orchestration/guardrails/input-guardrail.js +58 -45
- package/src/orchestration/guardrails/output-guardrail.js +104 -81
- package/src/orchestration/guardrails/safety-check.js +79 -79
- package/src/orchestration/index.js +38 -55
- package/src/orchestration/mcp-tool-adapters.js +96 -99
- package/src/orchestration/orchestration-engine.js +21 -21
- package/src/orchestration/pattern-registry.js +60 -45
- package/src/orchestration/patterns/auto.js +34 -47
- package/src/orchestration/patterns/group-chat.js +59 -65
- package/src/orchestration/patterns/handoff.js +67 -65
- package/src/orchestration/patterns/human-in-loop.js +51 -72
- package/src/orchestration/patterns/nested.js +25 -40
- package/src/orchestration/patterns/sequential.js +35 -34
- package/src/orchestration/patterns/swarm.js +63 -56
- package/src/orchestration/patterns/triage.js +150 -109
- package/src/orchestration/reasoning/index.js +9 -9
- package/src/orchestration/reasoning/planning-engine.js +143 -140
- package/src/orchestration/reasoning/reasoning-engine.js +206 -144
- package/src/orchestration/reasoning/self-correction.js +121 -128
- package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
- package/src/orchestration/replanning/alternative-generator.js +37 -42
- package/src/orchestration/replanning/config.js +63 -59
- package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
- package/src/orchestration/replanning/index.js +24 -20
- package/src/orchestration/replanning/plan-evaluator.js +49 -50
- package/src/orchestration/replanning/plan-monitor.js +32 -28
- package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
- package/src/orchestration/replanning/replan-history.js +33 -26
- package/src/orchestration/replanning/replanning-engine.js +106 -108
- package/src/orchestration/skill-executor.js +107 -109
- package/src/orchestration/skill-registry.js +85 -89
- package/src/orchestration/workflow-examples.js +228 -231
- package/src/orchestration/workflow-executor.js +65 -68
- package/src/orchestration/workflow-orchestrator.js +72 -73
- package/src/phase4-integration.js +47 -40
- package/src/phase5-integration.js +89 -30
- package/src/reporters/coverage-report.js +82 -30
- package/src/reporters/hierarchical-reporter.js +498 -0
- package/src/reporters/traceability-matrix-report.js +29 -20
- package/src/resolvers/issue-resolver.js +43 -31
- package/src/steering/advanced-validation.js +133 -124
- package/src/steering/auto-updater.js +60 -73
- package/src/steering/index.js +6 -6
- package/src/steering/quality-metrics.js +41 -35
- package/src/steering/steering-auto-update.js +83 -86
- package/src/steering/steering-validator.js +98 -106
- package/src/steering/template-constraints.js +53 -54
- package/src/templates/agents/claude-code/CLAUDE.md +32 -32
- package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
- package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
- package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
- package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
- package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
- package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
- package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
- package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
- package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
- package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
- package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
- package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
- package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
- package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
- package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
- package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
- package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
- package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
- package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
- package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
- package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
- package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
- package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
- package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
- package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
- package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
- package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
- package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
- package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
- package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
- package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
- package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
- package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
- package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
- package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
- package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
- package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
- package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
- package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
- package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
- package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
- package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
- package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
- package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
- package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
- package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
- package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
- package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
- package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
- package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
- package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
- package/src/templates/agents/codex/AGENTS.md +74 -42
- package/src/templates/agents/cursor/AGENTS.md +74 -42
- package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
- package/src/templates/agents/github-copilot/AGENTS.md +83 -51
- package/src/templates/agents/qwen-code/QWEN.md +74 -42
- package/src/templates/agents/windsurf/AGENTS.md +74 -42
- package/src/templates/architectures/README.md +41 -0
- package/src/templates/architectures/clean-architecture/README.md +113 -0
- package/src/templates/architectures/event-driven/README.md +162 -0
- package/src/templates/architectures/hexagonal/README.md +130 -0
- package/src/templates/index.js +6 -1
- package/src/templates/locale-manager.js +16 -16
- package/src/templates/shared/delta-spec-template.md +20 -13
- package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
- package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
- package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
- package/src/templates/shared/steering/structure.md +95 -0
- package/src/templates/skills/browser-agent.md +21 -16
- package/src/templates/skills/web-gui.md +8 -0
- package/src/templates/template-constraints.js +50 -53
- package/src/validators/advanced-validation.js +30 -36
- package/src/validators/constitutional-validator.js +77 -73
- package/src/validators/critic-system.js +49 -59
- package/src/validators/delta-format.js +59 -55
- package/src/validators/traceability-validator.js +7 -11
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MUSUBI MCP Context Provider
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Provides context information from MCP resources to the Agent Loop.
|
|
5
5
|
* Manages resources, prompts, and context from MCP servers.
|
|
6
|
-
*
|
|
6
|
+
*
|
|
7
7
|
* @module integrations/mcp/mcp-context-provider
|
|
8
8
|
*/
|
|
9
9
|
|
|
@@ -48,24 +48,24 @@ class MCPContextProvider extends EventEmitter {
|
|
|
48
48
|
*/
|
|
49
49
|
constructor(options = {}) {
|
|
50
50
|
super();
|
|
51
|
-
|
|
51
|
+
|
|
52
52
|
this.connector = options.connector || null;
|
|
53
53
|
this.cacheTTL = options.cacheTTL ?? 300000;
|
|
54
54
|
this.maxCacheSize = options.maxCacheSize ?? 100;
|
|
55
|
-
|
|
55
|
+
|
|
56
56
|
/** @type {Map<string, MCPResource[]>} */
|
|
57
57
|
this.resources = new Map();
|
|
58
|
-
|
|
58
|
+
|
|
59
59
|
/** @type {Map<string, MCPPrompt[]>} */
|
|
60
60
|
this.prompts = new Map();
|
|
61
|
-
|
|
61
|
+
|
|
62
62
|
/** @type {Map<string, { data: *, timestamp: number }>} */
|
|
63
63
|
this.cache = new Map();
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
/** @type {Map<string, Function>} */
|
|
66
66
|
this.subscriptions = new Map();
|
|
67
67
|
}
|
|
68
|
-
|
|
68
|
+
|
|
69
69
|
/**
|
|
70
70
|
* Set the MCP connector
|
|
71
71
|
* @param {Object} connector
|
|
@@ -73,7 +73,7 @@ class MCPContextProvider extends EventEmitter {
|
|
|
73
73
|
setConnector(connector) {
|
|
74
74
|
this.connector = connector;
|
|
75
75
|
}
|
|
76
|
-
|
|
76
|
+
|
|
77
77
|
/**
|
|
78
78
|
* Discover resources from an MCP server
|
|
79
79
|
* @param {string} serverName
|
|
@@ -83,29 +83,28 @@ class MCPContextProvider extends EventEmitter {
|
|
|
83
83
|
if (!this.connector) {
|
|
84
84
|
throw new Error('MCP connector not set');
|
|
85
85
|
}
|
|
86
|
-
|
|
86
|
+
|
|
87
87
|
try {
|
|
88
88
|
const response = await this.connector.listResources(serverName);
|
|
89
89
|
const resources = (response.resources || []).map(r => ({
|
|
90
90
|
...r,
|
|
91
|
-
serverName
|
|
91
|
+
serverName,
|
|
92
92
|
}));
|
|
93
|
-
|
|
93
|
+
|
|
94
94
|
this.resources.set(serverName, resources);
|
|
95
|
-
|
|
95
|
+
|
|
96
96
|
this.emit('resources:discovered', {
|
|
97
97
|
serverName,
|
|
98
|
-
count: resources.length
|
|
98
|
+
count: resources.length,
|
|
99
99
|
});
|
|
100
|
-
|
|
100
|
+
|
|
101
101
|
return resources;
|
|
102
|
-
|
|
103
102
|
} catch (error) {
|
|
104
103
|
this.emit('resources:error', { serverName, error });
|
|
105
104
|
throw error;
|
|
106
105
|
}
|
|
107
106
|
}
|
|
108
|
-
|
|
107
|
+
|
|
109
108
|
/**
|
|
110
109
|
* Discover prompts from an MCP server
|
|
111
110
|
* @param {string} serverName
|
|
@@ -115,29 +114,28 @@ class MCPContextProvider extends EventEmitter {
|
|
|
115
114
|
if (!this.connector) {
|
|
116
115
|
throw new Error('MCP connector not set');
|
|
117
116
|
}
|
|
118
|
-
|
|
117
|
+
|
|
119
118
|
try {
|
|
120
119
|
const response = await this.connector.listPrompts(serverName);
|
|
121
120
|
const prompts = (response.prompts || []).map(p => ({
|
|
122
121
|
...p,
|
|
123
|
-
serverName
|
|
122
|
+
serverName,
|
|
124
123
|
}));
|
|
125
|
-
|
|
124
|
+
|
|
126
125
|
this.prompts.set(serverName, prompts);
|
|
127
|
-
|
|
126
|
+
|
|
128
127
|
this.emit('prompts:discovered', {
|
|
129
128
|
serverName,
|
|
130
|
-
count: prompts.length
|
|
129
|
+
count: prompts.length,
|
|
131
130
|
});
|
|
132
|
-
|
|
131
|
+
|
|
133
132
|
return prompts;
|
|
134
|
-
|
|
135
133
|
} catch (error) {
|
|
136
134
|
this.emit('prompts:error', { serverName, error });
|
|
137
135
|
throw error;
|
|
138
136
|
}
|
|
139
137
|
}
|
|
140
|
-
|
|
138
|
+
|
|
141
139
|
/**
|
|
142
140
|
* Read a resource
|
|
143
141
|
* @param {string} serverName
|
|
@@ -149,7 +147,7 @@ class MCPContextProvider extends EventEmitter {
|
|
|
149
147
|
async readResource(serverName, uri, options = {}) {
|
|
150
148
|
const cacheKey = `resource:${serverName}:${uri}`;
|
|
151
149
|
const useCache = options.useCache ?? true;
|
|
152
|
-
|
|
150
|
+
|
|
153
151
|
// Check cache
|
|
154
152
|
if (useCache) {
|
|
155
153
|
const cached = this.getFromCache(cacheKey);
|
|
@@ -157,13 +155,13 @@ class MCPContextProvider extends EventEmitter {
|
|
|
157
155
|
return cached;
|
|
158
156
|
}
|
|
159
157
|
}
|
|
160
|
-
|
|
158
|
+
|
|
161
159
|
if (!this.connector) {
|
|
162
160
|
throw new Error('MCP connector not set');
|
|
163
161
|
}
|
|
164
|
-
|
|
162
|
+
|
|
165
163
|
const response = await this.connector.readResource(serverName, uri);
|
|
166
|
-
|
|
164
|
+
|
|
167
165
|
const contextData = {
|
|
168
166
|
type: 'resource',
|
|
169
167
|
source: `${serverName}:${uri}`,
|
|
@@ -171,16 +169,16 @@ class MCPContextProvider extends EventEmitter {
|
|
|
171
169
|
metadata: {
|
|
172
170
|
uri,
|
|
173
171
|
serverName,
|
|
174
|
-
mimeType: response.mimeType
|
|
175
|
-
}
|
|
172
|
+
mimeType: response.mimeType,
|
|
173
|
+
},
|
|
176
174
|
};
|
|
177
|
-
|
|
175
|
+
|
|
178
176
|
this.addToCache(cacheKey, contextData);
|
|
179
177
|
this.emit('resource:read', { serverName, uri });
|
|
180
|
-
|
|
178
|
+
|
|
181
179
|
return contextData;
|
|
182
180
|
}
|
|
183
|
-
|
|
181
|
+
|
|
184
182
|
/**
|
|
185
183
|
* Get a prompt with arguments
|
|
186
184
|
* @param {string} serverName
|
|
@@ -192,9 +190,9 @@ class MCPContextProvider extends EventEmitter {
|
|
|
192
190
|
if (!this.connector) {
|
|
193
191
|
throw new Error('MCP connector not set');
|
|
194
192
|
}
|
|
195
|
-
|
|
193
|
+
|
|
196
194
|
const response = await this.connector.getPrompt(serverName, promptName, args);
|
|
197
|
-
|
|
195
|
+
|
|
198
196
|
const contextData = {
|
|
199
197
|
type: 'prompt',
|
|
200
198
|
source: `${serverName}:${promptName}`,
|
|
@@ -203,15 +201,15 @@ class MCPContextProvider extends EventEmitter {
|
|
|
203
201
|
promptName,
|
|
204
202
|
serverName,
|
|
205
203
|
arguments: args,
|
|
206
|
-
description: response.description
|
|
207
|
-
}
|
|
204
|
+
description: response.description,
|
|
205
|
+
},
|
|
208
206
|
};
|
|
209
|
-
|
|
207
|
+
|
|
210
208
|
this.emit('prompt:retrieved', { serverName, promptName });
|
|
211
|
-
|
|
209
|
+
|
|
212
210
|
return contextData;
|
|
213
211
|
}
|
|
214
|
-
|
|
212
|
+
|
|
215
213
|
/**
|
|
216
214
|
* Subscribe to resource updates
|
|
217
215
|
* @param {string} serverName
|
|
@@ -221,27 +219,27 @@ class MCPContextProvider extends EventEmitter {
|
|
|
221
219
|
*/
|
|
222
220
|
subscribeToResource(serverName, uri, callback) {
|
|
223
221
|
const key = `${serverName}:${uri}`;
|
|
224
|
-
|
|
222
|
+
|
|
225
223
|
// Store callback
|
|
226
224
|
this.subscriptions.set(key, callback);
|
|
227
|
-
|
|
225
|
+
|
|
228
226
|
// Setup MCP subscription if connector supports it
|
|
229
227
|
if (this.connector && this.connector.subscribe) {
|
|
230
|
-
this.connector.subscribe(serverName, uri,
|
|
228
|
+
this.connector.subscribe(serverName, uri, update => {
|
|
231
229
|
// Invalidate cache
|
|
232
230
|
this.cache.delete(`resource:${serverName}:${uri}`);
|
|
233
|
-
|
|
231
|
+
|
|
234
232
|
// Call callback
|
|
235
233
|
callback({
|
|
236
234
|
type: 'resource:updated',
|
|
237
235
|
source: key,
|
|
238
|
-
content: update
|
|
236
|
+
content: update,
|
|
239
237
|
});
|
|
240
238
|
});
|
|
241
239
|
}
|
|
242
|
-
|
|
240
|
+
|
|
243
241
|
this.emit('subscription:created', { serverName, uri });
|
|
244
|
-
|
|
242
|
+
|
|
245
243
|
// Return unsubscribe function
|
|
246
244
|
return () => {
|
|
247
245
|
this.subscriptions.delete(key);
|
|
@@ -251,7 +249,7 @@ class MCPContextProvider extends EventEmitter {
|
|
|
251
249
|
this.emit('subscription:removed', { serverName, uri });
|
|
252
250
|
};
|
|
253
251
|
}
|
|
254
|
-
|
|
252
|
+
|
|
255
253
|
/**
|
|
256
254
|
* Get all resources
|
|
257
255
|
* @returns {MCPResource[]}
|
|
@@ -263,7 +261,7 @@ class MCPContextProvider extends EventEmitter {
|
|
|
263
261
|
}
|
|
264
262
|
return all;
|
|
265
263
|
}
|
|
266
|
-
|
|
264
|
+
|
|
267
265
|
/**
|
|
268
266
|
* Get resources by server
|
|
269
267
|
* @param {string} serverName
|
|
@@ -272,7 +270,7 @@ class MCPContextProvider extends EventEmitter {
|
|
|
272
270
|
getResourcesByServer(serverName) {
|
|
273
271
|
return this.resources.get(serverName) || [];
|
|
274
272
|
}
|
|
275
|
-
|
|
273
|
+
|
|
276
274
|
/**
|
|
277
275
|
* Get all prompts
|
|
278
276
|
* @returns {MCPPrompt[]}
|
|
@@ -284,7 +282,7 @@ class MCPContextProvider extends EventEmitter {
|
|
|
284
282
|
}
|
|
285
283
|
return all;
|
|
286
284
|
}
|
|
287
|
-
|
|
285
|
+
|
|
288
286
|
/**
|
|
289
287
|
* Get prompts by server
|
|
290
288
|
* @param {string} serverName
|
|
@@ -293,7 +291,7 @@ class MCPContextProvider extends EventEmitter {
|
|
|
293
291
|
getPromptsByServer(serverName) {
|
|
294
292
|
return this.prompts.get(serverName) || [];
|
|
295
293
|
}
|
|
296
|
-
|
|
294
|
+
|
|
297
295
|
/**
|
|
298
296
|
* Build context for Agent Loop
|
|
299
297
|
* @param {Object} options
|
|
@@ -308,10 +306,10 @@ class MCPContextProvider extends EventEmitter {
|
|
|
308
306
|
prompts: [],
|
|
309
307
|
metadata: {
|
|
310
308
|
builtAt: new Date().toISOString(),
|
|
311
|
-
sources: []
|
|
312
|
-
}
|
|
309
|
+
sources: [],
|
|
310
|
+
},
|
|
313
311
|
};
|
|
314
|
-
|
|
312
|
+
|
|
315
313
|
// Gather resources
|
|
316
314
|
if (options.resources) {
|
|
317
315
|
for (const resourceSpec of options.resources) {
|
|
@@ -325,7 +323,7 @@ class MCPContextProvider extends EventEmitter {
|
|
|
325
323
|
}
|
|
326
324
|
}
|
|
327
325
|
}
|
|
328
|
-
|
|
326
|
+
|
|
329
327
|
// Gather prompts
|
|
330
328
|
if (options.prompts) {
|
|
331
329
|
for (const promptSpec of options.prompts) {
|
|
@@ -340,15 +338,15 @@ class MCPContextProvider extends EventEmitter {
|
|
|
340
338
|
}
|
|
341
339
|
}
|
|
342
340
|
}
|
|
343
|
-
|
|
341
|
+
|
|
344
342
|
this.emit('context:built', {
|
|
345
343
|
resourceCount: context.resources.length,
|
|
346
|
-
promptCount: context.prompts.length
|
|
344
|
+
promptCount: context.prompts.length,
|
|
347
345
|
});
|
|
348
|
-
|
|
346
|
+
|
|
349
347
|
return context;
|
|
350
348
|
}
|
|
351
|
-
|
|
349
|
+
|
|
352
350
|
/**
|
|
353
351
|
* Parse resource specification (serverName:uri or serverName/name)
|
|
354
352
|
* @param {string} spec
|
|
@@ -364,7 +362,7 @@ class MCPContextProvider extends EventEmitter {
|
|
|
364
362
|
}
|
|
365
363
|
return [spec, ''];
|
|
366
364
|
}
|
|
367
|
-
|
|
365
|
+
|
|
368
366
|
/**
|
|
369
367
|
* Add item to cache
|
|
370
368
|
* @param {string} key
|
|
@@ -378,13 +376,13 @@ class MCPContextProvider extends EventEmitter {
|
|
|
378
376
|
this.cache.delete(oldest);
|
|
379
377
|
}
|
|
380
378
|
}
|
|
381
|
-
|
|
379
|
+
|
|
382
380
|
this.cache.set(key, {
|
|
383
381
|
data,
|
|
384
|
-
timestamp: Date.now()
|
|
382
|
+
timestamp: Date.now(),
|
|
385
383
|
});
|
|
386
384
|
}
|
|
387
|
-
|
|
385
|
+
|
|
388
386
|
/**
|
|
389
387
|
* Get item from cache
|
|
390
388
|
* @param {string} key
|
|
@@ -393,16 +391,16 @@ class MCPContextProvider extends EventEmitter {
|
|
|
393
391
|
getFromCache(key) {
|
|
394
392
|
const entry = this.cache.get(key);
|
|
395
393
|
if (!entry) return null;
|
|
396
|
-
|
|
394
|
+
|
|
397
395
|
// Check TTL
|
|
398
396
|
if (Date.now() - entry.timestamp > this.cacheTTL) {
|
|
399
397
|
this.cache.delete(key);
|
|
400
398
|
return null;
|
|
401
399
|
}
|
|
402
|
-
|
|
400
|
+
|
|
403
401
|
return entry.data;
|
|
404
402
|
}
|
|
405
|
-
|
|
403
|
+
|
|
406
404
|
/**
|
|
407
405
|
* Find oldest cache entry
|
|
408
406
|
* @returns {string|null}
|
|
@@ -410,17 +408,17 @@ class MCPContextProvider extends EventEmitter {
|
|
|
410
408
|
findOldestCacheEntry() {
|
|
411
409
|
let oldest = null;
|
|
412
410
|
let oldestTime = Infinity;
|
|
413
|
-
|
|
411
|
+
|
|
414
412
|
for (const [key, entry] of this.cache) {
|
|
415
413
|
if (entry.timestamp < oldestTime) {
|
|
416
414
|
oldestTime = entry.timestamp;
|
|
417
415
|
oldest = key;
|
|
418
416
|
}
|
|
419
417
|
}
|
|
420
|
-
|
|
418
|
+
|
|
421
419
|
return oldest;
|
|
422
420
|
}
|
|
423
|
-
|
|
421
|
+
|
|
424
422
|
/**
|
|
425
423
|
* Clear cache
|
|
426
424
|
*/
|
|
@@ -428,7 +426,7 @@ class MCPContextProvider extends EventEmitter {
|
|
|
428
426
|
this.cache.clear();
|
|
429
427
|
this.emit('cache:cleared');
|
|
430
428
|
}
|
|
431
|
-
|
|
429
|
+
|
|
432
430
|
/**
|
|
433
431
|
* Get provider statistics
|
|
434
432
|
* @returns {Object}
|
|
@@ -439,22 +437,22 @@ class MCPContextProvider extends EventEmitter {
|
|
|
439
437
|
total: this.getAllResources().length,
|
|
440
438
|
byServer: Object.fromEntries(
|
|
441
439
|
Array.from(this.resources.entries()).map(([s, r]) => [s, r.length])
|
|
442
|
-
)
|
|
440
|
+
),
|
|
443
441
|
},
|
|
444
442
|
prompts: {
|
|
445
443
|
total: this.getAllPrompts().length,
|
|
446
444
|
byServer: Object.fromEntries(
|
|
447
445
|
Array.from(this.prompts.entries()).map(([s, p]) => [s, p.length])
|
|
448
|
-
)
|
|
446
|
+
),
|
|
449
447
|
},
|
|
450
448
|
cache: {
|
|
451
449
|
size: this.cache.size,
|
|
452
|
-
maxSize: this.maxCacheSize
|
|
450
|
+
maxSize: this.maxCacheSize,
|
|
453
451
|
},
|
|
454
|
-
subscriptions: this.subscriptions.size
|
|
452
|
+
subscriptions: this.subscriptions.size,
|
|
455
453
|
};
|
|
456
454
|
}
|
|
457
|
-
|
|
455
|
+
|
|
458
456
|
/**
|
|
459
457
|
* Clear all data
|
|
460
458
|
*/
|
|
@@ -468,5 +466,5 @@ class MCPContextProvider extends EventEmitter {
|
|
|
468
466
|
}
|
|
469
467
|
|
|
470
468
|
module.exports = {
|
|
471
|
-
MCPContextProvider
|
|
469
|
+
MCPContextProvider,
|
|
472
470
|
};
|