musubi-sdd 5.1.0 → 5.6.2
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 +158 -146
- package/src/analyzers/codegraph-auto-update.js +858 -0
- package/src/analyzers/complexity-analyzer.js +536 -0
- package/src/analyzers/context-optimizer.js +241 -126
- package/src/analyzers/impact-analyzer.js +1 -1
- package/src/analyzers/large-project-analyzer.js +766 -0
- package/src/analyzers/repository-map.js +77 -81
- 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 +48 -46
- package/src/monitoring/incident-manager.js +116 -106
- package/src/monitoring/index.js +144 -134
- package/src/monitoring/observability.js +75 -62
- package/src/monitoring/quality-dashboard.js +45 -41
- package/src/monitoring/release-manager.js +63 -53
- 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
|
* @fileoverview Output Guardrail for validating agent outputs
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* OutputGuardrail validates and filters agent outputs before they reach users.
|
|
5
5
|
* Inspired by OpenAI Agents SDK guardrails pattern.
|
|
6
|
-
*
|
|
6
|
+
*
|
|
7
7
|
* @module orchestration/guardrails/output-guardrail
|
|
8
8
|
* @version 3.9.0
|
|
9
9
|
*/
|
|
@@ -11,7 +11,12 @@
|
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
13
|
const { BaseGuardrail } = require('./base-guardrail');
|
|
14
|
-
const {
|
|
14
|
+
const {
|
|
15
|
+
RuleBuilder: _RuleBuilder,
|
|
16
|
+
rules,
|
|
17
|
+
globalRuleRegistry,
|
|
18
|
+
SecurityPatterns,
|
|
19
|
+
} = require('./guardrail-rules');
|
|
15
20
|
|
|
16
21
|
/**
|
|
17
22
|
* Output guardrail configuration
|
|
@@ -46,7 +51,7 @@ const SecretPatterns = {
|
|
|
46
51
|
TOKEN: /\b(token|bearer|auth)\s*[:=]\s*['"]?[\w.-]{20,}['"]?/gi,
|
|
47
52
|
AWS_KEY: /\b(AKIA[0-9A-Z]{16})\b/g,
|
|
48
53
|
PRIVATE_KEY: /-----BEGIN\s+(RSA\s+)?PRIVATE KEY-----/g,
|
|
49
|
-
CONNECTION_STRING: /\b(mongodb|mysql|postgres|redis):\/\/[^\s]+/gi
|
|
54
|
+
CONNECTION_STRING: /\b(mongodb|mysql|postgres|redis):\/\/[^\s]+/gi,
|
|
50
55
|
};
|
|
51
56
|
|
|
52
57
|
/**
|
|
@@ -65,7 +70,7 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
65
70
|
failFast: config.failFast,
|
|
66
71
|
severity: config.severity,
|
|
67
72
|
tripwireEnabled: config.tripwireEnabled,
|
|
68
|
-
options: config.options
|
|
73
|
+
options: config.options,
|
|
69
74
|
});
|
|
70
75
|
|
|
71
76
|
// Load rules from config, rule set, or default
|
|
@@ -84,7 +89,7 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
84
89
|
redactSecrets: true,
|
|
85
90
|
replacement: '[REDACTED]',
|
|
86
91
|
customPatterns: [],
|
|
87
|
-
...config.redactOptions
|
|
92
|
+
...config.redactOptions,
|
|
88
93
|
};
|
|
89
94
|
|
|
90
95
|
this.enforceTone = config.enforceTone || false;
|
|
@@ -111,7 +116,7 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
111
116
|
this.contentPolicies.push({
|
|
112
117
|
name: policy.name,
|
|
113
118
|
check: policy.check,
|
|
114
|
-
severity: policy.severity || 'error'
|
|
119
|
+
severity: policy.severity || 'error',
|
|
115
120
|
});
|
|
116
121
|
return this;
|
|
117
122
|
}
|
|
@@ -128,7 +133,7 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
128
133
|
this.qualityChecks.push({
|
|
129
134
|
name: check.name,
|
|
130
135
|
check: check.check,
|
|
131
|
-
threshold: check.threshold || 0.5
|
|
136
|
+
threshold: check.threshold || 0.5,
|
|
132
137
|
});
|
|
133
138
|
return this;
|
|
134
139
|
}
|
|
@@ -148,12 +153,14 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
148
153
|
try {
|
|
149
154
|
processedOutput = await this.customTransformer(output, context);
|
|
150
155
|
} catch (error) {
|
|
151
|
-
violations.push(
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
156
|
+
violations.push(
|
|
157
|
+
this.createViolation(
|
|
158
|
+
'TRANSFORMER_ERROR',
|
|
159
|
+
`Output transformer error: ${error.message}`,
|
|
160
|
+
'error',
|
|
161
|
+
{ error: error.message }
|
|
162
|
+
)
|
|
163
|
+
);
|
|
157
164
|
}
|
|
158
165
|
}
|
|
159
166
|
|
|
@@ -162,20 +169,24 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
162
169
|
try {
|
|
163
170
|
const customResult = await this.customValidator(processedOutput, context);
|
|
164
171
|
if (customResult === false || (customResult && customResult.passed === false)) {
|
|
165
|
-
violations.push(
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
172
|
+
violations.push(
|
|
173
|
+
this.createViolation(
|
|
174
|
+
'CUSTOM_VALIDATION_FAILED',
|
|
175
|
+
customResult.message || 'Custom validation failed',
|
|
176
|
+
'error',
|
|
177
|
+
{ custom: true }
|
|
178
|
+
)
|
|
179
|
+
);
|
|
171
180
|
}
|
|
172
181
|
} catch (error) {
|
|
173
|
-
violations.push(
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
182
|
+
violations.push(
|
|
183
|
+
this.createViolation(
|
|
184
|
+
'CUSTOM_VALIDATOR_ERROR',
|
|
185
|
+
`Custom validator error: ${error.message}`,
|
|
186
|
+
'error',
|
|
187
|
+
{ error: error.message }
|
|
188
|
+
)
|
|
189
|
+
);
|
|
179
190
|
}
|
|
180
191
|
}
|
|
181
192
|
|
|
@@ -191,20 +202,24 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
191
202
|
try {
|
|
192
203
|
const result = await policy.check(contentToValidate, context);
|
|
193
204
|
if (!result.passed) {
|
|
194
|
-
violations.push(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
205
|
+
violations.push(
|
|
206
|
+
this.createViolation(
|
|
207
|
+
`POLICY_${policy.name.toUpperCase()}`,
|
|
208
|
+
result.message || `Content policy '${policy.name}' violated`,
|
|
209
|
+
policy.severity,
|
|
210
|
+
{ policy: policy.name }
|
|
211
|
+
)
|
|
212
|
+
);
|
|
200
213
|
}
|
|
201
214
|
} catch (error) {
|
|
202
|
-
violations.push(
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
215
|
+
violations.push(
|
|
216
|
+
this.createViolation(
|
|
217
|
+
'POLICY_ERROR',
|
|
218
|
+
`Policy '${policy.name}' error: ${error.message}`,
|
|
219
|
+
'error',
|
|
220
|
+
{ policy: policy.name, error: error.message }
|
|
221
|
+
)
|
|
222
|
+
);
|
|
208
223
|
}
|
|
209
224
|
}
|
|
210
225
|
|
|
@@ -214,23 +229,27 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
214
229
|
try {
|
|
215
230
|
const result = await qualityCheck.check(contentToValidate, context);
|
|
216
231
|
qualityScores[qualityCheck.name] = result.score;
|
|
217
|
-
|
|
232
|
+
|
|
218
233
|
if (result.score < qualityCheck.threshold) {
|
|
219
|
-
violations.push(
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
234
|
+
violations.push(
|
|
235
|
+
this.createViolation(
|
|
236
|
+
`QUALITY_${qualityCheck.name.toUpperCase()}`,
|
|
237
|
+
result.message || `Quality check '${qualityCheck.name}' below threshold`,
|
|
238
|
+
'warning',
|
|
239
|
+
{ check: qualityCheck.name, score: result.score, threshold: qualityCheck.threshold }
|
|
240
|
+
)
|
|
241
|
+
);
|
|
225
242
|
}
|
|
226
243
|
} catch (error) {
|
|
227
244
|
// Quality check errors are warnings, not failures
|
|
228
|
-
violations.push(
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
245
|
+
violations.push(
|
|
246
|
+
this.createViolation(
|
|
247
|
+
'QUALITY_ERROR',
|
|
248
|
+
`Quality check '${qualityCheck.name}' error: ${error.message}`,
|
|
249
|
+
'warning',
|
|
250
|
+
{ check: qualityCheck.name, error: error.message }
|
|
251
|
+
)
|
|
252
|
+
);
|
|
234
253
|
}
|
|
235
254
|
}
|
|
236
255
|
|
|
@@ -250,8 +269,8 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
250
269
|
return this.createResult(
|
|
251
270
|
passed,
|
|
252
271
|
violations,
|
|
253
|
-
passed
|
|
254
|
-
? 'Output validation passed'
|
|
272
|
+
passed
|
|
273
|
+
? 'Output validation passed'
|
|
255
274
|
: `Output validation failed with ${errorViolations.length} error(s)`,
|
|
256
275
|
0,
|
|
257
276
|
{
|
|
@@ -260,7 +279,7 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
260
279
|
redactionApplied: this.redact,
|
|
261
280
|
redactionCount: redactions.length,
|
|
262
281
|
redactions: redactions.length > 0 ? redactions : undefined,
|
|
263
|
-
qualityScores: Object.keys(qualityScores).length > 0 ? qualityScores : undefined
|
|
282
|
+
qualityScores: Object.keys(qualityScores).length > 0 ? qualityScores : undefined,
|
|
264
283
|
}
|
|
265
284
|
);
|
|
266
285
|
}
|
|
@@ -275,7 +294,7 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
275
294
|
if (typeof output === 'string') {
|
|
276
295
|
return output;
|
|
277
296
|
}
|
|
278
|
-
|
|
297
|
+
|
|
279
298
|
if (typeof output === 'object' && output !== null) {
|
|
280
299
|
// Look for common output fields
|
|
281
300
|
if (output.content) return output.content;
|
|
@@ -286,10 +305,10 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
286
305
|
if (output.result) {
|
|
287
306
|
return typeof output.result === 'string' ? output.result : JSON.stringify(output.result);
|
|
288
307
|
}
|
|
289
|
-
|
|
308
|
+
|
|
290
309
|
return JSON.stringify(output);
|
|
291
310
|
}
|
|
292
|
-
|
|
311
|
+
|
|
293
312
|
return String(output);
|
|
294
313
|
}
|
|
295
314
|
|
|
@@ -305,7 +324,7 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
305
324
|
for (const rule of this.rules) {
|
|
306
325
|
try {
|
|
307
326
|
const result = await Promise.resolve(rule.check(content));
|
|
308
|
-
|
|
327
|
+
|
|
309
328
|
let passed = result;
|
|
310
329
|
let additionalContext = {};
|
|
311
330
|
|
|
@@ -316,24 +335,28 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
316
335
|
}
|
|
317
336
|
|
|
318
337
|
if (!passed) {
|
|
319
|
-
violations.push(
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
338
|
+
violations.push(
|
|
339
|
+
this.createViolation(
|
|
340
|
+
rule.id.toUpperCase(),
|
|
341
|
+
rule.message,
|
|
342
|
+
rule.severity || this.defaultSeverity,
|
|
343
|
+
{ rule: rule.id, ...additionalContext }
|
|
344
|
+
)
|
|
345
|
+
);
|
|
325
346
|
|
|
326
347
|
if (this.failFast) {
|
|
327
348
|
break;
|
|
328
349
|
}
|
|
329
350
|
}
|
|
330
351
|
} catch (error) {
|
|
331
|
-
violations.push(
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
352
|
+
violations.push(
|
|
353
|
+
this.createViolation(
|
|
354
|
+
'RULE_ERROR',
|
|
355
|
+
`Rule '${rule.id}' execution error: ${error.message}`,
|
|
356
|
+
'error',
|
|
357
|
+
{ rule: rule.id, error: error.message }
|
|
358
|
+
)
|
|
359
|
+
);
|
|
337
360
|
}
|
|
338
361
|
}
|
|
339
362
|
|
|
@@ -375,7 +398,7 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
375
398
|
{ name: 'phone_us', pattern: SecurityPatterns.PHONE_US },
|
|
376
399
|
{ name: 'phone_jp', pattern: SecurityPatterns.PHONE_JP },
|
|
377
400
|
{ name: 'ssn', pattern: SecurityPatterns.SSN },
|
|
378
|
-
{ name: 'credit_card', pattern: SecurityPatterns.CREDIT_CARD }
|
|
401
|
+
{ name: 'credit_card', pattern: SecurityPatterns.CREDIT_CARD },
|
|
379
402
|
];
|
|
380
403
|
|
|
381
404
|
for (const { name, pattern } of piiPatterns) {
|
|
@@ -424,7 +447,7 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
424
447
|
redactObject(obj) {
|
|
425
448
|
const allRedactions = [];
|
|
426
449
|
|
|
427
|
-
const redactValue =
|
|
450
|
+
const redactValue = value => {
|
|
428
451
|
if (typeof value === 'string') {
|
|
429
452
|
const { content, redactions } = this.redactString(value);
|
|
430
453
|
allRedactions.push(...redactions);
|
|
@@ -459,7 +482,7 @@ class OutputGuardrail extends BaseGuardrail {
|
|
|
459
482
|
contentPoliciesCount: this.contentPolicies.length,
|
|
460
483
|
qualityChecksCount: this.qualityChecks.length,
|
|
461
484
|
redact: this.redact,
|
|
462
|
-
rules: this.rules.map(r => ({ id: r.id, type: r.type, severity: r.severity }))
|
|
485
|
+
rules: this.rules.map(r => ({ id: r.id, type: r.type, severity: r.severity })),
|
|
463
486
|
};
|
|
464
487
|
}
|
|
465
488
|
}
|
|
@@ -476,19 +499,19 @@ function createOutputGuardrail(preset = 'safe', overrides = {}) {
|
|
|
476
499
|
name: 'SecurityOutputGuardrail',
|
|
477
500
|
description: 'Security-focused output validation',
|
|
478
501
|
ruleSet: 'security',
|
|
479
|
-
tripwireEnabled: true
|
|
502
|
+
tripwireEnabled: true,
|
|
480
503
|
},
|
|
481
504
|
safe: {
|
|
482
505
|
name: 'SafeOutputGuardrail',
|
|
483
506
|
description: 'Safe output validation with PII check',
|
|
484
|
-
ruleSet: 'agentOutput'
|
|
507
|
+
ruleSet: 'agentOutput',
|
|
485
508
|
},
|
|
486
509
|
strict: {
|
|
487
510
|
name: 'StrictOutputGuardrail',
|
|
488
511
|
description: 'Strict output validation',
|
|
489
512
|
ruleSet: 'strictContent',
|
|
490
513
|
tripwireEnabled: true,
|
|
491
|
-
failFast: true
|
|
514
|
+
failFast: true,
|
|
492
515
|
},
|
|
493
516
|
redact: {
|
|
494
517
|
name: 'RedactingOutputGuardrail',
|
|
@@ -498,17 +521,17 @@ function createOutputGuardrail(preset = 'safe', overrides = {}) {
|
|
|
498
521
|
redactOptions: {
|
|
499
522
|
redactPII: true,
|
|
500
523
|
redactSecrets: true,
|
|
501
|
-
replacement: '[REDACTED]'
|
|
502
|
-
}
|
|
503
|
-
}
|
|
524
|
+
replacement: '[REDACTED]',
|
|
525
|
+
},
|
|
526
|
+
},
|
|
504
527
|
};
|
|
505
528
|
|
|
506
|
-
const config = { ...presets[preset] || presets.safe, ...overrides };
|
|
529
|
+
const config = { ...(presets[preset] || presets.safe), ...overrides };
|
|
507
530
|
return new OutputGuardrail(config);
|
|
508
531
|
}
|
|
509
532
|
|
|
510
533
|
module.exports = {
|
|
511
534
|
OutputGuardrail,
|
|
512
535
|
createOutputGuardrail,
|
|
513
|
-
SecretPatterns
|
|
536
|
+
SecretPatterns,
|
|
514
537
|
};
|