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,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ErrorHandler - Comprehensive error handling patterns
|
|
3
3
|
* Sprint 3.5: Advanced Workflows
|
|
4
|
-
*
|
|
4
|
+
*
|
|
5
5
|
* Provides:
|
|
6
6
|
* - Error classification and categorization
|
|
7
7
|
* - Recovery strategies
|
|
@@ -19,7 +19,7 @@ const ErrorSeverity = {
|
|
|
19
19
|
LOW: 'low',
|
|
20
20
|
MEDIUM: 'medium',
|
|
21
21
|
HIGH: 'high',
|
|
22
|
-
CRITICAL: 'critical'
|
|
22
|
+
CRITICAL: 'critical',
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
/**
|
|
@@ -38,7 +38,7 @@ const ErrorCategory = {
|
|
|
38
38
|
EXTERNAL_SERVICE: 'external-service',
|
|
39
39
|
CONFIGURATION: 'configuration',
|
|
40
40
|
USER_INPUT: 'user-input',
|
|
41
|
-
UNKNOWN: 'unknown'
|
|
41
|
+
UNKNOWN: 'unknown',
|
|
42
42
|
};
|
|
43
43
|
|
|
44
44
|
/**
|
|
@@ -47,7 +47,7 @@ const ErrorCategory = {
|
|
|
47
47
|
const CircuitState = {
|
|
48
48
|
CLOSED: 'closed',
|
|
49
49
|
OPEN: 'open',
|
|
50
|
-
HALF_OPEN: 'half-open'
|
|
50
|
+
HALF_OPEN: 'half-open',
|
|
51
51
|
};
|
|
52
52
|
|
|
53
53
|
/**
|
|
@@ -80,7 +80,7 @@ class WorkflowError extends Error {
|
|
|
80
80
|
context: this.context,
|
|
81
81
|
timestamp: this.timestamp,
|
|
82
82
|
suggestions: this.suggestions,
|
|
83
|
-
stack: this.stack
|
|
83
|
+
stack: this.stack,
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
86
|
}
|
|
@@ -106,32 +106,22 @@ class ErrorClassifier {
|
|
|
106
106
|
/ENOTFOUND/i,
|
|
107
107
|
/network/i,
|
|
108
108
|
/connection failed/i,
|
|
109
|
-
/socket hang up/i
|
|
110
|
-
]
|
|
109
|
+
/socket hang up/i,
|
|
110
|
+
],
|
|
111
111
|
},
|
|
112
112
|
// Timeout errors
|
|
113
113
|
{
|
|
114
114
|
category: ErrorCategory.TIMEOUT,
|
|
115
115
|
severity: ErrorSeverity.MEDIUM,
|
|
116
116
|
retryable: true,
|
|
117
|
-
patterns: [
|
|
118
|
-
/timeout/i,
|
|
119
|
-
/ETIMEDOUT/i,
|
|
120
|
-
/timed out/i,
|
|
121
|
-
/deadline exceeded/i
|
|
122
|
-
]
|
|
117
|
+
patterns: [/timeout/i, /ETIMEDOUT/i, /timed out/i, /deadline exceeded/i],
|
|
123
118
|
},
|
|
124
119
|
// Rate limit errors
|
|
125
120
|
{
|
|
126
121
|
category: ErrorCategory.RATE_LIMIT,
|
|
127
122
|
severity: ErrorSeverity.LOW,
|
|
128
123
|
retryable: true,
|
|
129
|
-
patterns: [
|
|
130
|
-
/rate limit/i,
|
|
131
|
-
/too many requests/i,
|
|
132
|
-
/429/,
|
|
133
|
-
/throttl/i
|
|
134
|
-
]
|
|
124
|
+
patterns: [/rate limit/i, /too many requests/i, /429/, /throttl/i],
|
|
135
125
|
},
|
|
136
126
|
// Authentication errors
|
|
137
127
|
{
|
|
@@ -143,71 +133,44 @@ class ErrorClassifier {
|
|
|
143
133
|
/authentication failed/i,
|
|
144
134
|
/invalid token/i,
|
|
145
135
|
/401/,
|
|
146
|
-
/not authenticated/i
|
|
147
|
-
]
|
|
136
|
+
/not authenticated/i,
|
|
137
|
+
],
|
|
148
138
|
},
|
|
149
139
|
// Authorization errors
|
|
150
140
|
{
|
|
151
141
|
category: ErrorCategory.AUTHORIZATION,
|
|
152
142
|
severity: ErrorSeverity.HIGH,
|
|
153
143
|
retryable: false,
|
|
154
|
-
patterns: [
|
|
155
|
-
/forbidden/i,
|
|
156
|
-
/access denied/i,
|
|
157
|
-
/permission denied/i,
|
|
158
|
-
/403/,
|
|
159
|
-
/not authorized/i
|
|
160
|
-
]
|
|
144
|
+
patterns: [/forbidden/i, /access denied/i, /permission denied/i, /403/, /not authorized/i],
|
|
161
145
|
},
|
|
162
146
|
// Resource not found
|
|
163
147
|
{
|
|
164
148
|
category: ErrorCategory.RESOURCE_NOT_FOUND,
|
|
165
149
|
severity: ErrorSeverity.MEDIUM,
|
|
166
150
|
retryable: false,
|
|
167
|
-
patterns: [
|
|
168
|
-
/not found/i,
|
|
169
|
-
/404/,
|
|
170
|
-
/does not exist/i,
|
|
171
|
-
/no such/i
|
|
172
|
-
]
|
|
151
|
+
patterns: [/not found/i, /404/, /does not exist/i, /no such/i],
|
|
173
152
|
},
|
|
174
153
|
// Validation errors
|
|
175
154
|
{
|
|
176
155
|
category: ErrorCategory.VALIDATION,
|
|
177
156
|
severity: ErrorSeverity.LOW,
|
|
178
157
|
retryable: false,
|
|
179
|
-
patterns: [
|
|
180
|
-
/validation/i,
|
|
181
|
-
/invalid/i,
|
|
182
|
-
/required field/i,
|
|
183
|
-
/must be/i,
|
|
184
|
-
/expected/i
|
|
185
|
-
]
|
|
158
|
+
patterns: [/validation/i, /invalid/i, /required field/i, /must be/i, /expected/i],
|
|
186
159
|
},
|
|
187
160
|
// Conflict errors
|
|
188
161
|
{
|
|
189
162
|
category: ErrorCategory.CONFLICT,
|
|
190
163
|
severity: ErrorSeverity.MEDIUM,
|
|
191
164
|
retryable: false,
|
|
192
|
-
patterns: [
|
|
193
|
-
/conflict/i,
|
|
194
|
-
/already exists/i,
|
|
195
|
-
/duplicate/i,
|
|
196
|
-
/409/
|
|
197
|
-
]
|
|
165
|
+
patterns: [/conflict/i, /already exists/i, /duplicate/i, /409/],
|
|
198
166
|
},
|
|
199
167
|
// Configuration errors
|
|
200
168
|
{
|
|
201
169
|
category: ErrorCategory.CONFIGURATION,
|
|
202
170
|
severity: ErrorSeverity.HIGH,
|
|
203
171
|
retryable: false,
|
|
204
|
-
patterns: [
|
|
205
|
-
|
|
206
|
-
/config/i,
|
|
207
|
-
/missing setting/i,
|
|
208
|
-
/not configured/i
|
|
209
|
-
]
|
|
210
|
-
}
|
|
172
|
+
patterns: [/configuration/i, /config/i, /missing setting/i, /not configured/i],
|
|
173
|
+
},
|
|
211
174
|
];
|
|
212
175
|
}
|
|
213
176
|
|
|
@@ -216,7 +179,7 @@ class ErrorClassifier {
|
|
|
216
179
|
*/
|
|
217
180
|
classify(error) {
|
|
218
181
|
const errorString = `${error.message} ${error.code || ''} ${error.name || ''}`;
|
|
219
|
-
|
|
182
|
+
|
|
220
183
|
for (const pattern of this.patterns) {
|
|
221
184
|
for (const regex of pattern.patterns) {
|
|
222
185
|
if (regex.test(errorString)) {
|
|
@@ -224,7 +187,7 @@ class ErrorClassifier {
|
|
|
224
187
|
category: pattern.category,
|
|
225
188
|
severity: pattern.severity,
|
|
226
189
|
retryable: pattern.retryable,
|
|
227
|
-
recoverable: pattern.severity !== ErrorSeverity.CRITICAL
|
|
190
|
+
recoverable: pattern.severity !== ErrorSeverity.CRITICAL,
|
|
228
191
|
};
|
|
229
192
|
}
|
|
230
193
|
}
|
|
@@ -234,7 +197,7 @@ class ErrorClassifier {
|
|
|
234
197
|
category: ErrorCategory.UNKNOWN,
|
|
235
198
|
severity: ErrorSeverity.MEDIUM,
|
|
236
199
|
retryable: false,
|
|
237
|
-
recoverable: true
|
|
200
|
+
recoverable: true,
|
|
238
201
|
};
|
|
239
202
|
}
|
|
240
203
|
|
|
@@ -247,7 +210,7 @@ class ErrorClassifier {
|
|
|
247
210
|
}
|
|
248
211
|
|
|
249
212
|
const classification = this.classify(error);
|
|
250
|
-
|
|
213
|
+
|
|
251
214
|
return new WorkflowError(error.message, {
|
|
252
215
|
code: error.code || 'UNKNOWN_ERROR',
|
|
253
216
|
category: classification.category,
|
|
@@ -255,7 +218,7 @@ class ErrorClassifier {
|
|
|
255
218
|
retryable: classification.retryable,
|
|
256
219
|
recoverable: classification.recoverable,
|
|
257
220
|
cause: error,
|
|
258
|
-
context: { originalName: error.name }
|
|
221
|
+
context: { originalName: error.name },
|
|
259
222
|
});
|
|
260
223
|
}
|
|
261
224
|
|
|
@@ -300,7 +263,7 @@ class CircuitBreaker extends EventEmitter {
|
|
|
300
263
|
category: ErrorCategory.EXTERNAL_SERVICE,
|
|
301
264
|
severity: ErrorSeverity.HIGH,
|
|
302
265
|
retryable: true,
|
|
303
|
-
context: { circuitName: this.name }
|
|
266
|
+
context: { circuitName: this.name },
|
|
304
267
|
});
|
|
305
268
|
}
|
|
306
269
|
}
|
|
@@ -311,7 +274,7 @@ class CircuitBreaker extends EventEmitter {
|
|
|
311
274
|
code: 'CIRCUIT_HALF_OPEN_LIMIT',
|
|
312
275
|
category: ErrorCategory.EXTERNAL_SERVICE,
|
|
313
276
|
severity: ErrorSeverity.MEDIUM,
|
|
314
|
-
retryable: true
|
|
277
|
+
retryable: true,
|
|
315
278
|
});
|
|
316
279
|
}
|
|
317
280
|
this.halfOpenCalls++;
|
|
@@ -329,7 +292,7 @@ class CircuitBreaker extends EventEmitter {
|
|
|
329
292
|
|
|
330
293
|
_onSuccess() {
|
|
331
294
|
this.failures = 0;
|
|
332
|
-
|
|
295
|
+
|
|
333
296
|
if (this.state === CircuitState.HALF_OPEN) {
|
|
334
297
|
this.successes++;
|
|
335
298
|
if (this.successes >= this.successThreshold) {
|
|
@@ -342,7 +305,7 @@ class CircuitBreaker extends EventEmitter {
|
|
|
342
305
|
this.failures++;
|
|
343
306
|
this.lastFailureTime = Date.now();
|
|
344
307
|
this.successes = 0;
|
|
345
|
-
|
|
308
|
+
|
|
346
309
|
if (this.state === CircuitState.HALF_OPEN) {
|
|
347
310
|
this._transitionTo(CircuitState.OPEN);
|
|
348
311
|
} else if (this.failures >= this.failureThreshold) {
|
|
@@ -355,7 +318,7 @@ class CircuitBreaker extends EventEmitter {
|
|
|
355
318
|
_transitionTo(newState) {
|
|
356
319
|
const oldState = this.state;
|
|
357
320
|
this.state = newState;
|
|
358
|
-
|
|
321
|
+
|
|
359
322
|
if (newState === CircuitState.CLOSED) {
|
|
360
323
|
this.failures = 0;
|
|
361
324
|
this.successes = 0;
|
|
@@ -372,7 +335,7 @@ class CircuitBreaker extends EventEmitter {
|
|
|
372
335
|
state: this.state,
|
|
373
336
|
failures: this.failures,
|
|
374
337
|
successes: this.successes,
|
|
375
|
-
lastFailureTime: this.lastFailureTime
|
|
338
|
+
lastFailureTime: this.lastFailureTime,
|
|
376
339
|
};
|
|
377
340
|
}
|
|
378
341
|
|
|
@@ -396,17 +359,16 @@ class ErrorAggregator {
|
|
|
396
359
|
* Add an error to the aggregator
|
|
397
360
|
*/
|
|
398
361
|
add(error, context = {}) {
|
|
399
|
-
const enhanced = error instanceof WorkflowError ? error :
|
|
400
|
-
new ErrorClassifier().enhance(error);
|
|
362
|
+
const enhanced = error instanceof WorkflowError ? error : new ErrorClassifier().enhance(error);
|
|
401
363
|
|
|
402
364
|
const entry = {
|
|
403
365
|
error: enhanced.toJSON(),
|
|
404
366
|
context,
|
|
405
|
-
timestamp: new Date().toISOString()
|
|
367
|
+
timestamp: new Date().toISOString(),
|
|
406
368
|
};
|
|
407
369
|
|
|
408
370
|
this.errors.push(entry);
|
|
409
|
-
|
|
371
|
+
|
|
410
372
|
// Trim if necessary
|
|
411
373
|
if (this.errors.length > this.maxErrors) {
|
|
412
374
|
this.errors = this.errors.slice(-this.maxErrors);
|
|
@@ -433,7 +395,7 @@ class ErrorAggregator {
|
|
|
433
395
|
bySeverity: Object.fromEntries(this.severityCounts),
|
|
434
396
|
recentErrors: this.errors.slice(-10),
|
|
435
397
|
mostCommonCategory: this._getMostCommon(this.categoryCounts),
|
|
436
|
-
criticalCount: this.severityCounts.get(ErrorSeverity.CRITICAL) || 0
|
|
398
|
+
criticalCount: this.severityCounts.get(ErrorSeverity.CRITICAL) || 0,
|
|
437
399
|
};
|
|
438
400
|
}
|
|
439
401
|
|
|
@@ -484,24 +446,24 @@ class ErrorAggregator {
|
|
|
484
446
|
*/
|
|
485
447
|
generateReport() {
|
|
486
448
|
const stats = this.getStats();
|
|
487
|
-
|
|
449
|
+
|
|
488
450
|
return {
|
|
489
451
|
summary: {
|
|
490
452
|
total: stats.totalErrors,
|
|
491
453
|
critical: stats.criticalCount,
|
|
492
|
-
mostCommonCategory: stats.mostCommonCategory
|
|
454
|
+
mostCommonCategory: stats.mostCommonCategory,
|
|
493
455
|
},
|
|
494
456
|
breakdown: {
|
|
495
457
|
byCategory: stats.byCategory,
|
|
496
|
-
bySeverity: stats.bySeverity
|
|
458
|
+
bySeverity: stats.bySeverity,
|
|
497
459
|
},
|
|
498
460
|
recentErrors: stats.recentErrors.map(e => ({
|
|
499
461
|
message: e.error.message,
|
|
500
462
|
category: e.error.category,
|
|
501
463
|
severity: e.error.severity,
|
|
502
|
-
timestamp: e.timestamp
|
|
464
|
+
timestamp: e.timestamp,
|
|
503
465
|
})),
|
|
504
|
-
recommendations: this._generateRecommendations(stats)
|
|
466
|
+
recommendations: this._generateRecommendations(stats),
|
|
505
467
|
};
|
|
506
468
|
}
|
|
507
469
|
|
|
@@ -511,7 +473,7 @@ class ErrorAggregator {
|
|
|
511
473
|
if (stats.criticalCount > 0) {
|
|
512
474
|
recommendations.push({
|
|
513
475
|
priority: 'high',
|
|
514
|
-
message: `${stats.criticalCount} critical errors require immediate attention
|
|
476
|
+
message: `${stats.criticalCount} critical errors require immediate attention`,
|
|
515
477
|
});
|
|
516
478
|
}
|
|
517
479
|
|
|
@@ -519,7 +481,7 @@ class ErrorAggregator {
|
|
|
519
481
|
if (networkErrors > 5) {
|
|
520
482
|
recommendations.push({
|
|
521
483
|
priority: 'medium',
|
|
522
|
-
message: 'Multiple network errors detected. Check connectivity and service availability.'
|
|
484
|
+
message: 'Multiple network errors detected. Check connectivity and service availability.',
|
|
523
485
|
});
|
|
524
486
|
}
|
|
525
487
|
|
|
@@ -527,7 +489,7 @@ class ErrorAggregator {
|
|
|
527
489
|
if (authErrors > 0) {
|
|
528
490
|
recommendations.push({
|
|
529
491
|
priority: 'high',
|
|
530
|
-
message: 'Authentication errors detected. Verify credentials and tokens.'
|
|
492
|
+
message: 'Authentication errors detected. Verify credentials and tokens.',
|
|
531
493
|
});
|
|
532
494
|
}
|
|
533
495
|
|
|
@@ -535,7 +497,8 @@ class ErrorAggregator {
|
|
|
535
497
|
if (rateLimitErrors > 3) {
|
|
536
498
|
recommendations.push({
|
|
537
499
|
priority: 'medium',
|
|
538
|
-
message:
|
|
500
|
+
message:
|
|
501
|
+
'Rate limiting detected. Consider implementing backoff or reducing request frequency.',
|
|
539
502
|
});
|
|
540
503
|
}
|
|
541
504
|
|
|
@@ -560,34 +523,33 @@ class GracefulDegradation {
|
|
|
560
523
|
fn: fallbackFn,
|
|
561
524
|
ttl: options.ttl || 60000, // 1 minute default cache
|
|
562
525
|
lastResult: null,
|
|
563
|
-
lastResultTime: null
|
|
526
|
+
lastResultTime: null,
|
|
564
527
|
});
|
|
565
528
|
}
|
|
566
529
|
|
|
567
530
|
/**
|
|
568
531
|
* Execute with graceful degradation
|
|
569
532
|
*/
|
|
570
|
-
async execute(serviceName, primaryFn,
|
|
533
|
+
async execute(serviceName, primaryFn, _options = {}) {
|
|
571
534
|
try {
|
|
572
535
|
const result = await primaryFn();
|
|
573
|
-
|
|
536
|
+
|
|
574
537
|
// Service recovered
|
|
575
538
|
if (this.degradedServices.has(serviceName)) {
|
|
576
539
|
this.degradedServices.delete(serviceName);
|
|
577
540
|
}
|
|
578
|
-
|
|
541
|
+
|
|
579
542
|
// Cache successful result for fallback
|
|
580
543
|
const fallback = this.fallbacks.get(serviceName);
|
|
581
544
|
if (fallback) {
|
|
582
545
|
fallback.lastResult = result;
|
|
583
546
|
fallback.lastResultTime = Date.now();
|
|
584
547
|
}
|
|
585
|
-
|
|
548
|
+
|
|
586
549
|
return { result, degraded: false };
|
|
587
|
-
|
|
588
550
|
} catch (error) {
|
|
589
551
|
const fallback = this.fallbacks.get(serviceName);
|
|
590
|
-
|
|
552
|
+
|
|
591
553
|
if (!fallback) {
|
|
592
554
|
throw error;
|
|
593
555
|
}
|
|
@@ -595,13 +557,12 @@ class GracefulDegradation {
|
|
|
595
557
|
this.degradedServices.add(serviceName);
|
|
596
558
|
|
|
597
559
|
// Try cached result first
|
|
598
|
-
if (fallback.lastResult &&
|
|
599
|
-
(Date.now() - fallback.lastResultTime) < fallback.ttl) {
|
|
560
|
+
if (fallback.lastResult && Date.now() - fallback.lastResultTime < fallback.ttl) {
|
|
600
561
|
return {
|
|
601
562
|
result: fallback.lastResult,
|
|
602
563
|
degraded: true,
|
|
603
564
|
source: 'cache',
|
|
604
|
-
error: error.message
|
|
565
|
+
error: error.message,
|
|
605
566
|
};
|
|
606
567
|
}
|
|
607
568
|
|
|
@@ -612,7 +573,7 @@ class GracefulDegradation {
|
|
|
612
573
|
result: fallbackResult,
|
|
613
574
|
degraded: true,
|
|
614
575
|
source: 'fallback',
|
|
615
|
-
error: error.message
|
|
576
|
+
error: error.message,
|
|
616
577
|
};
|
|
617
578
|
} catch (fallbackError) {
|
|
618
579
|
// Both primary and fallback failed
|
|
@@ -624,8 +585,8 @@ class GracefulDegradation {
|
|
|
624
585
|
context: {
|
|
625
586
|
serviceName,
|
|
626
587
|
primaryError: error.message,
|
|
627
|
-
fallbackError: fallbackError.message
|
|
628
|
-
}
|
|
588
|
+
fallbackError: fallbackError.message,
|
|
589
|
+
},
|
|
629
590
|
});
|
|
630
591
|
}
|
|
631
592
|
}
|
|
@@ -660,7 +621,7 @@ class ErrorHandler extends EventEmitter {
|
|
|
660
621
|
maxRetries: 3,
|
|
661
622
|
backoffMs: 1000,
|
|
662
623
|
backoffMultiplier: 2,
|
|
663
|
-
maxBackoffMs: 30000
|
|
624
|
+
maxBackoffMs: 30000,
|
|
664
625
|
};
|
|
665
626
|
}
|
|
666
627
|
|
|
@@ -670,7 +631,7 @@ class ErrorHandler extends EventEmitter {
|
|
|
670
631
|
getCircuitBreaker(serviceName, options = {}) {
|
|
671
632
|
if (!this.circuitBreakers.has(serviceName)) {
|
|
672
633
|
const breaker = new CircuitBreaker({ name: serviceName, ...options });
|
|
673
|
-
breaker.on('state-change',
|
|
634
|
+
breaker.on('state-change', event => {
|
|
674
635
|
this.emit('circuit-state-change', { service: serviceName, ...event });
|
|
675
636
|
});
|
|
676
637
|
this.circuitBreakers.set(serviceName, breaker);
|
|
@@ -684,10 +645,10 @@ class ErrorHandler extends EventEmitter {
|
|
|
684
645
|
handle(error, context = {}) {
|
|
685
646
|
// Classify and enhance error
|
|
686
647
|
const enhanced = this.classifier.enhance(error);
|
|
687
|
-
|
|
648
|
+
|
|
688
649
|
// Add to aggregator
|
|
689
650
|
this.aggregator.add(enhanced, context);
|
|
690
|
-
|
|
651
|
+
|
|
691
652
|
// Emit error event
|
|
692
653
|
this.emit('error', { error: enhanced, context });
|
|
693
654
|
|
|
@@ -698,7 +659,7 @@ class ErrorHandler extends EventEmitter {
|
|
|
698
659
|
return {
|
|
699
660
|
error: enhanced,
|
|
700
661
|
handled: true,
|
|
701
|
-
suggestions: this._getSuggestions(enhanced)
|
|
662
|
+
suggestions: this._getSuggestions(enhanced),
|
|
702
663
|
};
|
|
703
664
|
}
|
|
704
665
|
|
|
@@ -707,7 +668,7 @@ class ErrorHandler extends EventEmitter {
|
|
|
707
668
|
message: error.message,
|
|
708
669
|
category: error.category,
|
|
709
670
|
severity: error.severity,
|
|
710
|
-
context: { ...error.context, ...context }
|
|
671
|
+
context: { ...error.context, ...context },
|
|
711
672
|
};
|
|
712
673
|
|
|
713
674
|
switch (error.severity) {
|
|
@@ -778,18 +739,15 @@ class ErrorHandler extends EventEmitter {
|
|
|
778
739
|
throw enhanced;
|
|
779
740
|
}
|
|
780
741
|
|
|
781
|
-
this.emit('retry', {
|
|
782
|
-
attempt: attempt + 1,
|
|
742
|
+
this.emit('retry', {
|
|
743
|
+
attempt: attempt + 1,
|
|
783
744
|
maxRetries: policy.maxRetries,
|
|
784
745
|
backoffMs: currentBackoff,
|
|
785
|
-
error: enhanced.message
|
|
746
|
+
error: enhanced.message,
|
|
786
747
|
});
|
|
787
748
|
|
|
788
749
|
await this._sleep(currentBackoff);
|
|
789
|
-
currentBackoff = Math.min(
|
|
790
|
-
currentBackoff * policy.backoffMultiplier,
|
|
791
|
-
policy.maxBackoffMs
|
|
792
|
-
);
|
|
750
|
+
currentBackoff = Math.min(currentBackoff * policy.backoffMultiplier, policy.maxBackoffMs);
|
|
793
751
|
}
|
|
794
752
|
}
|
|
795
753
|
|
|
@@ -805,7 +763,7 @@ class ErrorHandler extends EventEmitter {
|
|
|
805
763
|
circuitBreakers: Object.fromEntries(
|
|
806
764
|
[...this.circuitBreakers].map(([name, breaker]) => [name, breaker.getState()])
|
|
807
765
|
),
|
|
808
|
-
degradedServices: this.degradation.getDegradedServices()
|
|
766
|
+
degradedServices: this.degradation.getDegradedServices(),
|
|
809
767
|
};
|
|
810
768
|
}
|
|
811
769
|
|
|
@@ -823,5 +781,5 @@ module.exports = {
|
|
|
823
781
|
WorkflowError,
|
|
824
782
|
ErrorSeverity,
|
|
825
783
|
ErrorCategory,
|
|
826
|
-
CircuitState
|
|
784
|
+
CircuitState,
|
|
827
785
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview Base Guardrail class for MUSUBI Orchestration
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Guardrails provide safety checks for agent inputs and outputs.
|
|
5
5
|
* Inspired by OpenAI Agents SDK guardrails pattern.
|
|
6
|
-
*
|
|
6
|
+
*
|
|
7
7
|
* @module orchestration/guardrails/base-guardrail
|
|
8
8
|
* @version 3.9.0
|
|
9
9
|
*/
|
|
@@ -77,7 +77,7 @@ class BaseGuardrail {
|
|
|
77
77
|
this.failFast = config.failFast || false;
|
|
78
78
|
this.defaultSeverity = config.severity || 'error';
|
|
79
79
|
this.options = config.options || {};
|
|
80
|
-
|
|
80
|
+
|
|
81
81
|
// Tripwire: if true, throws exception on failure instead of returning result
|
|
82
82
|
this.tripwireEnabled = config.tripwireEnabled || false;
|
|
83
83
|
}
|
|
@@ -89,7 +89,7 @@ class BaseGuardrail {
|
|
|
89
89
|
* @param {Object} [context] - Execution context
|
|
90
90
|
* @returns {Promise<GuardrailResult>}
|
|
91
91
|
*/
|
|
92
|
-
async check(input,
|
|
92
|
+
async check(input, _context = {}) {
|
|
93
93
|
throw new Error('Subclasses must implement check() method');
|
|
94
94
|
}
|
|
95
95
|
|
|
@@ -105,12 +105,12 @@ class BaseGuardrail {
|
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
const startTime = Date.now();
|
|
108
|
-
|
|
108
|
+
|
|
109
109
|
try {
|
|
110
110
|
const result = await this.check(input, context);
|
|
111
111
|
result.executionTimeMs = Date.now() - startTime;
|
|
112
112
|
result.guardrailName = this.name;
|
|
113
|
-
|
|
113
|
+
|
|
114
114
|
// Handle tripwire
|
|
115
115
|
if (this.tripwireEnabled && !result.passed) {
|
|
116
116
|
throw new GuardrailTripwireException(
|
|
@@ -118,22 +118,24 @@ class BaseGuardrail {
|
|
|
118
118
|
result
|
|
119
119
|
);
|
|
120
120
|
}
|
|
121
|
-
|
|
121
|
+
|
|
122
122
|
return result;
|
|
123
123
|
} catch (error) {
|
|
124
124
|
if (error instanceof GuardrailTripwireException) {
|
|
125
125
|
throw error; // Re-throw tripwire exceptions
|
|
126
126
|
}
|
|
127
|
-
|
|
127
|
+
|
|
128
128
|
// Wrap unexpected errors
|
|
129
129
|
return this.createResult(
|
|
130
130
|
false,
|
|
131
|
-
[
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
131
|
+
[
|
|
132
|
+
{
|
|
133
|
+
code: 'GUARDRAIL_ERROR',
|
|
134
|
+
message: error.message,
|
|
135
|
+
severity: 'error',
|
|
136
|
+
context: { errorName: error.name, stack: error.stack },
|
|
137
|
+
},
|
|
138
|
+
],
|
|
137
139
|
`Guardrail execution failed: ${error.message}`,
|
|
138
140
|
Date.now() - startTime
|
|
139
141
|
);
|
|
@@ -157,7 +159,7 @@ class BaseGuardrail {
|
|
|
157
159
|
message,
|
|
158
160
|
violations,
|
|
159
161
|
metadata,
|
|
160
|
-
executionTimeMs
|
|
162
|
+
executionTimeMs,
|
|
161
163
|
};
|
|
162
164
|
}
|
|
163
165
|
|
|
@@ -175,7 +177,7 @@ class BaseGuardrail {
|
|
|
175
177
|
code,
|
|
176
178
|
message,
|
|
177
179
|
severity: severity || this.defaultSeverity,
|
|
178
|
-
context
|
|
180
|
+
context,
|
|
179
181
|
};
|
|
180
182
|
}
|
|
181
183
|
|
|
@@ -218,7 +220,7 @@ class BaseGuardrail {
|
|
|
218
220
|
enabled: this.enabled,
|
|
219
221
|
failFast: this.failFast,
|
|
220
222
|
tripwireEnabled: this.tripwireEnabled,
|
|
221
|
-
defaultSeverity: this.defaultSeverity
|
|
223
|
+
defaultSeverity: this.defaultSeverity,
|
|
222
224
|
};
|
|
223
225
|
}
|
|
224
226
|
}
|
|
@@ -278,16 +280,16 @@ class GuardrailChain {
|
|
|
278
280
|
if (this.parallel) {
|
|
279
281
|
// Parallel execution with optional early termination
|
|
280
282
|
const promises = this.guardrails.map(g => g.run(input, context));
|
|
281
|
-
|
|
283
|
+
|
|
282
284
|
if (this.stopOnFirstFailure) {
|
|
283
285
|
// Use Promise.race pattern for early termination
|
|
284
286
|
const settledResults = await Promise.allSettled(promises);
|
|
285
|
-
|
|
287
|
+
|
|
286
288
|
for (const settled of settledResults) {
|
|
287
289
|
if (settled.status === 'fulfilled') {
|
|
288
290
|
const result = settled.value;
|
|
289
291
|
results.push(result);
|
|
290
|
-
|
|
292
|
+
|
|
291
293
|
if (!result.passed) {
|
|
292
294
|
overallPassed = false;
|
|
293
295
|
allViolations.push(...result.violations);
|
|
@@ -312,11 +314,11 @@ class GuardrailChain {
|
|
|
312
314
|
for (const guardrail of this.guardrails) {
|
|
313
315
|
const result = await guardrail.run(input, context);
|
|
314
316
|
results.push(result);
|
|
315
|
-
|
|
317
|
+
|
|
316
318
|
if (!result.passed) {
|
|
317
319
|
overallPassed = false;
|
|
318
320
|
allViolations.push(...result.violations);
|
|
319
|
-
|
|
321
|
+
|
|
320
322
|
if (this.stopOnFirstFailure) {
|
|
321
323
|
break;
|
|
322
324
|
}
|
|
@@ -331,7 +333,7 @@ class GuardrailChain {
|
|
|
331
333
|
violations: allViolations,
|
|
332
334
|
guardrailCount: this.guardrails.length,
|
|
333
335
|
executedCount: results.length,
|
|
334
|
-
executionTimeMs: Date.now() - startTime
|
|
336
|
+
executionTimeMs: Date.now() - startTime,
|
|
335
337
|
};
|
|
336
338
|
}
|
|
337
339
|
|
|
@@ -354,5 +356,5 @@ class GuardrailChain {
|
|
|
354
356
|
module.exports = {
|
|
355
357
|
BaseGuardrail,
|
|
356
358
|
GuardrailChain,
|
|
357
|
-
GuardrailTripwireException
|
|
359
|
+
GuardrailTripwireException,
|
|
358
360
|
};
|