autosnippet 3.3.0 → 3.3.3
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/dashboard/dist/assets/icons-BJ2mUBi8.js +1 -0
- package/dashboard/dist/assets/index-B659K9t5.js +128 -0
- package/dashboard/dist/assets/index-NCm40PMD.css +1 -0
- package/dashboard/dist/index.html +3 -3
- package/dist/bin/cli.d.ts +1 -0
- package/dist/bin/cli.js +284 -142
- package/dist/lib/agent/context/ExplorationTracker.d.ts +2 -0
- package/dist/lib/agent/context/ExplorationTracker.js +21 -3
- package/dist/lib/agent/core/ToolExecutionPipeline.d.ts +3 -1
- package/dist/lib/agent/core/ToolExecutionPipeline.js +8 -1
- package/dist/lib/agent/forge/DynamicComposer.d.ts +58 -0
- package/dist/lib/agent/forge/DynamicComposer.js +99 -0
- package/dist/lib/agent/forge/SandboxRunner.d.ts +60 -0
- package/dist/lib/agent/forge/SandboxRunner.js +251 -0
- package/dist/lib/agent/forge/TemporaryToolRegistry.d.ts +76 -0
- package/dist/lib/agent/forge/TemporaryToolRegistry.js +154 -0
- package/dist/lib/agent/forge/ToolForge.d.ts +92 -0
- package/dist/lib/agent/forge/ToolForge.js +239 -0
- package/dist/lib/agent/forge/ToolRequirementAnalyzer.d.ts +44 -0
- package/dist/lib/agent/forge/ToolRequirementAnalyzer.js +119 -0
- package/dist/lib/agent/tools/ToolRegistry.d.ts +2 -0
- package/dist/lib/agent/tools/ToolRegistry.js +4 -0
- package/dist/lib/agent/tools/composite.js +0 -1
- package/dist/lib/agent/tools/index.d.ts +2 -50
- package/dist/lib/agent/tools/index.js +2 -3
- package/dist/lib/agent/tools/lifecycle.d.ts +1 -58
- package/dist/lib/agent/tools/lifecycle.js +2 -75
- package/dist/lib/cli/KnowledgeSyncService.d.ts +26 -0
- package/dist/lib/cli/KnowledgeSyncService.js +33 -1
- package/dist/lib/cli/deploy/FileManifest.d.ts +0 -21
- package/dist/lib/cli/deploy/FileManifest.js +0 -11
- package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +10 -0
- package/dist/lib/domain/knowledge/KnowledgeEntry.js +2 -0
- package/dist/lib/domain/knowledge/Lifecycle.d.ts +19 -2
- package/dist/lib/domain/knowledge/Lifecycle.js +32 -6
- package/dist/lib/domain/knowledge/UnifiedValidator.d.ts +1 -5
- package/dist/lib/domain/knowledge/UnifiedValidator.js +7 -44
- package/dist/lib/domain/knowledge/values/Stats.d.ts +29 -0
- package/dist/lib/domain/knowledge/values/Stats.js +41 -0
- package/dist/lib/external/mcp/McpServer.d.ts +19 -38
- package/dist/lib/external/mcp/McpServer.js +145 -117
- package/dist/lib/external/mcp/autoApproveInjector.js +0 -2
- package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +26 -1
- package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +41 -0
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +49 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +3 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +27 -0
- package/dist/lib/external/mcp/handlers/bootstrap/skills.js +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap-external.js +1 -0
- package/dist/lib/external/mcp/handlers/bootstrap-internal.js +2 -0
- package/dist/lib/external/mcp/handlers/browse.d.ts +1 -0
- package/dist/lib/external/mcp/handlers/browse.js +2 -1
- package/dist/lib/external/mcp/handlers/consolidated.d.ts +117 -6
- package/dist/lib/external/mcp/handlers/consolidated.js +251 -71
- package/dist/lib/external/mcp/handlers/guard.d.ts +150 -0
- package/dist/lib/external/mcp/handlers/guard.js +239 -5
- package/dist/lib/external/mcp/handlers/knowledge.d.ts +0 -29
- package/dist/lib/external/mcp/handlers/knowledge.js +1 -76
- package/dist/lib/external/mcp/handlers/panorama.d.ts +36 -0
- package/dist/lib/external/mcp/handlers/panorama.js +156 -0
- package/dist/lib/external/mcp/handlers/system.d.ts +2 -54
- package/dist/lib/external/mcp/handlers/system.js +3 -113
- package/dist/lib/external/mcp/handlers/task.d.ts +13 -24
- package/dist/lib/external/mcp/handlers/task.js +218 -557
- package/dist/lib/external/mcp/handlers/types.d.ts +91 -8
- package/dist/lib/external/mcp/handlers/types.js +18 -1
- package/dist/lib/external/mcp/handlers/wiki-external.d.ts +18 -1
- package/dist/lib/external/mcp/handlers/wiki-external.js +16 -1
- package/dist/lib/external/mcp/tools.d.ts +18 -24
- package/dist/lib/external/mcp/tools.js +132 -159
- package/dist/lib/http/HttpServer.js +52 -0
- package/dist/lib/http/middleware/validate.js +7 -3
- package/dist/lib/http/routes/audit.d.ts +8 -0
- package/dist/lib/http/routes/audit.js +51 -0
- package/dist/lib/http/routes/guardReport.d.ts +10 -0
- package/dist/lib/http/routes/guardReport.js +143 -0
- package/dist/lib/http/routes/knowledge.js +32 -1
- package/dist/lib/http/routes/panorama.d.ts +11 -0
- package/dist/lib/http/routes/panorama.js +322 -0
- package/dist/lib/http/routes/signals.d.ts +10 -0
- package/dist/lib/http/routes/signals.js +104 -0
- package/dist/lib/http/routes/task.d.ts +2 -3
- package/dist/lib/http/routes/task.js +17 -347
- package/dist/lib/http/routes/violations.js +1 -1
- package/dist/lib/infrastructure/audit/AuditLogger.d.ts +6 -1
- package/dist/lib/infrastructure/audit/AuditLogger.js +14 -1
- package/dist/lib/infrastructure/database/drizzle/schema.d.ts +202 -504
- package/dist/lib/infrastructure/database/drizzle/schema.js +38 -69
- package/dist/lib/infrastructure/database/migrations/004_evolution_proposals.d.ts +8 -0
- package/dist/lib/infrastructure/database/migrations/004_evolution_proposals.js +43 -0
- package/dist/lib/infrastructure/database/migrations/005_recipe_source_refs.d.ts +9 -0
- package/dist/lib/infrastructure/database/migrations/005_recipe_source_refs.js +24 -0
- package/dist/lib/infrastructure/logging/Logger.d.ts +2 -0
- package/dist/lib/infrastructure/logging/Logger.js +34 -7
- package/dist/lib/infrastructure/monitoring/ErrorTracker.js +3 -1
- package/dist/lib/infrastructure/monitoring/PerformanceMonitor.d.ts +2 -2
- package/dist/lib/infrastructure/monitoring/PerformanceMonitor.js +12 -10
- package/dist/lib/infrastructure/notification/LarkNotifier.d.ts +24 -0
- package/dist/lib/infrastructure/notification/LarkNotifier.js +97 -0
- package/dist/lib/infrastructure/report/ReportStore.d.ts +45 -0
- package/dist/lib/infrastructure/report/ReportStore.js +133 -0
- package/dist/lib/infrastructure/signal/SignalAggregator.d.ts +18 -0
- package/dist/lib/infrastructure/signal/SignalAggregator.js +84 -0
- package/dist/lib/infrastructure/signal/SignalBridge.d.ts +13 -0
- package/dist/lib/infrastructure/signal/SignalBridge.js +20 -0
- package/dist/lib/infrastructure/signal/SignalBus.d.ts +63 -0
- package/dist/lib/infrastructure/signal/SignalBus.js +106 -0
- package/dist/lib/infrastructure/signal/SignalTraceWriter.d.ts +36 -0
- package/dist/lib/infrastructure/signal/SignalTraceWriter.js +130 -0
- package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +18 -2
- package/dist/lib/injection/ServiceContainer.js +8 -0
- package/dist/lib/injection/ServiceMap.d.ts +16 -10
- package/dist/lib/injection/modules/AgentModule.d.ts +1 -1
- package/dist/lib/injection/modules/AgentModule.js +7 -1
- package/dist/lib/injection/modules/AppModule.d.ts +1 -1
- package/dist/lib/injection/modules/AppModule.js +4 -13
- package/dist/lib/injection/modules/GuardModule.js +27 -2
- package/dist/lib/injection/modules/InfraModule.d.ts +0 -1
- package/dist/lib/injection/modules/InfraModule.js +9 -7
- package/dist/lib/injection/modules/KnowledgeModule.d.ts +5 -0
- package/dist/lib/injection/modules/KnowledgeModule.js +131 -0
- package/dist/lib/injection/modules/PanoramaModule.d.ts +18 -0
- package/dist/lib/injection/modules/PanoramaModule.js +76 -0
- package/dist/lib/injection/modules/SignalModule.d.ts +10 -0
- package/dist/lib/injection/modules/SignalModule.js +84 -0
- package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +1 -0
- package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +6 -0
- package/dist/lib/service/bootstrap/BootstrapTaskManager.d.ts +3 -1
- package/dist/lib/service/bootstrap/BootstrapTaskManager.js +20 -1
- package/dist/lib/service/bootstrap/UiStartupTasks.d.ts +45 -0
- package/dist/lib/service/bootstrap/UiStartupTasks.js +101 -0
- package/dist/lib/service/delivery/AgentInstructionsGenerator.js +4 -5
- package/dist/lib/service/delivery/CursorDeliveryPipeline.d.ts +3 -1
- package/dist/lib/service/delivery/CursorDeliveryPipeline.js +13 -10
- package/dist/lib/service/delivery/RulesGenerator.js +3 -2
- package/dist/lib/service/evolution/ConsolidationAdvisor.d.ts +114 -0
- package/dist/lib/service/evolution/ConsolidationAdvisor.js +542 -0
- package/dist/lib/service/evolution/ContradictionDetector.d.ts +54 -0
- package/dist/lib/service/evolution/ContradictionDetector.js +253 -0
- package/dist/lib/service/evolution/DecayDetector.d.ts +71 -0
- package/dist/lib/service/evolution/DecayDetector.js +244 -0
- package/dist/lib/service/evolution/EnhancementSuggester.d.ts +38 -0
- package/dist/lib/service/evolution/EnhancementSuggester.js +220 -0
- package/dist/lib/service/evolution/KnowledgeMetabolism.d.ts +82 -0
- package/dist/lib/service/evolution/KnowledgeMetabolism.js +167 -0
- package/dist/lib/service/evolution/RedundancyAnalyzer.d.ts +53 -0
- package/dist/lib/service/evolution/RedundancyAnalyzer.js +210 -0
- package/dist/lib/service/evolution/StagingManager.d.ts +57 -0
- package/dist/lib/service/evolution/StagingManager.js +201 -0
- package/dist/lib/service/guard/ComplianceReporter.d.ts +42 -2
- package/dist/lib/service/guard/ComplianceReporter.js +43 -5
- package/dist/lib/service/guard/CoverageAnalyzer.d.ts +54 -0
- package/dist/lib/service/guard/CoverageAnalyzer.js +149 -0
- package/dist/lib/service/guard/GuardCheckEngine.d.ts +42 -0
- package/dist/lib/service/guard/GuardCheckEngine.js +465 -14
- package/dist/lib/service/guard/GuardFeedbackLoop.d.ts +3 -0
- package/dist/lib/service/guard/GuardFeedbackLoop.js +9 -0
- package/dist/lib/service/guard/ReverseGuard.d.ts +73 -0
- package/dist/lib/service/guard/ReverseGuard.js +256 -0
- package/dist/lib/service/guard/RuleLearner.d.ts +12 -0
- package/dist/lib/service/guard/RuleLearner.js +38 -0
- package/dist/lib/service/guard/UncertaintyCollector.d.ts +83 -0
- package/dist/lib/service/guard/UncertaintyCollector.js +149 -0
- package/dist/lib/service/guard/ViolationsStore.d.ts +1 -0
- package/dist/lib/service/guard/ViolationsStore.js +33 -3
- package/dist/lib/service/knowledge/ConfidenceRouter.d.ts +13 -0
- package/dist/lib/service/knowledge/ConfidenceRouter.js +14 -0
- package/dist/lib/service/knowledge/KnowledgeService.js +22 -4
- package/dist/lib/service/knowledge/SourceRefReconciler.d.ts +68 -0
- package/dist/lib/service/knowledge/SourceRefReconciler.js +309 -0
- package/dist/lib/service/panorama/CouplingAnalyzer.d.ts +27 -0
- package/dist/lib/service/panorama/CouplingAnalyzer.js +192 -0
- package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +28 -0
- package/dist/lib/service/panorama/DimensionAnalyzer.js +320 -0
- package/dist/lib/service/panorama/LayerInferrer.d.ts +19 -0
- package/dist/lib/service/panorama/LayerInferrer.js +182 -0
- package/dist/lib/service/panorama/ModuleDiscoverer.d.ts +24 -0
- package/dist/lib/service/panorama/ModuleDiscoverer.js +185 -0
- package/dist/lib/service/panorama/PanoramaAggregator.d.ts +29 -0
- package/dist/lib/service/panorama/PanoramaAggregator.js +228 -0
- package/dist/lib/service/panorama/PanoramaScanner.d.ts +52 -0
- package/dist/lib/service/panorama/PanoramaScanner.js +188 -0
- package/dist/lib/service/panorama/PanoramaService.d.ts +125 -0
- package/dist/lib/service/panorama/PanoramaService.js +363 -0
- package/dist/lib/service/panorama/PanoramaTypes.d.ts +134 -0
- package/dist/lib/service/panorama/PanoramaTypes.js +6 -0
- package/dist/lib/service/panorama/RoleRefiner.d.ts +48 -0
- package/dist/lib/service/panorama/RoleRefiner.js +535 -0
- package/dist/lib/service/search/BM25Scorer.d.ts +2 -2
- package/dist/lib/service/search/CoarseRanker.d.ts +7 -6
- package/dist/lib/service/search/CoarseRanker.js +11 -10
- package/dist/lib/service/search/FieldWeightedScorer.d.ts +81 -0
- package/dist/lib/service/search/FieldWeightedScorer.js +318 -0
- package/dist/lib/service/search/MultiSignalRanker.d.ts +3 -2
- package/dist/lib/service/search/MultiSignalRanker.js +17 -1
- package/dist/lib/service/search/SearchEngine.d.ts +9 -7
- package/dist/lib/service/search/SearchEngine.js +67 -10
- package/dist/lib/service/search/SearchTypes.d.ts +25 -3
- package/dist/lib/service/search/SearchTypes.js +6 -1
- package/dist/lib/service/signal/HitRecorder.d.ts +68 -0
- package/dist/lib/service/signal/HitRecorder.js +173 -0
- package/dist/lib/service/skills/SignalCollector.d.ts +3 -1
- package/dist/lib/service/skills/SignalCollector.js +31 -1
- package/dist/lib/service/task/IntentExtractor.d.ts +66 -0
- package/dist/lib/service/task/IntentExtractor.js +256 -0
- package/dist/lib/service/task/PrimeSearchPipeline.d.ts +54 -0
- package/dist/lib/service/task/PrimeSearchPipeline.js +113 -0
- package/dist/lib/service/vector/VectorService.d.ts +3 -0
- package/dist/lib/service/vector/VectorService.js +38 -4
- package/dist/lib/shared/schemas/mcp-tools.d.ts +41 -96
- package/dist/lib/shared/schemas/mcp-tools.js +59 -119
- package/dist/scripts/analyze-signals.d.ts +20 -0
- package/dist/scripts/analyze-signals.js +155 -0
- package/dist/scripts/diagnose-mcp.js +1 -1
- package/package.json +1 -1
- package/skills/autosnippet-create/SKILL.md +98 -89
- package/skills/autosnippet-devdocs/SKILL.md +55 -57
- package/templates/claude-code/hooks/autosnippet-session.sh +10 -15
- package/templates/cursor-hooks/hooks/session-start.sh +1 -1
- package/templates/guard-ci.yml +2 -2
- package/templates/instructions/agent-static.md +2 -1
- package/templates/instructions/conventions.md +5 -6
- package/templates/recipes-setup/README.md +1 -2
- package/templates/recipes-setup/_template.md +39 -39
- package/dashboard/dist/assets/icons-BofcEZ3f.js +0 -1
- package/dashboard/dist/assets/index-D0whuycy.css +0 -1
- package/dashboard/dist/assets/index-SiN1GChm.js +0 -128
- package/dist/lib/domain/task/Task.d.ts +0 -140
- package/dist/lib/domain/task/Task.js +0 -254
- package/dist/lib/domain/task/TaskDependency.d.ts +0 -23
- package/dist/lib/domain/task/TaskDependency.js +0 -34
- package/dist/lib/domain/task/TaskIdGenerator.d.ts +0 -40
- package/dist/lib/domain/task/TaskIdGenerator.js +0 -75
- package/dist/lib/domain/task/index.d.ts +0 -4
- package/dist/lib/domain/task/index.js +0 -4
- package/dist/lib/infrastructure/database/migrations/002_add_tasks.d.ts +0 -11
- package/dist/lib/infrastructure/database/migrations/002_add_tasks.js +0 -86
- package/dist/lib/repository/task/TaskRepository.impl.d.ts +0 -171
- package/dist/lib/repository/task/TaskRepository.impl.js +0 -347
- package/dist/lib/service/task/TaskGraphService.d.ts +0 -222
- package/dist/lib/service/task/TaskGraphService.js +0 -597
- package/dist/lib/service/task/TaskKnowledgeBridge.d.ts +0 -95
- package/dist/lib/service/task/TaskKnowledgeBridge.js +0 -298
- package/dist/lib/service/task/TaskReadyEngine.d.ts +0 -84
- package/dist/lib/service/task/TaskReadyEngine.js +0 -115
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
* autosnippet_bootstrap 已迁移到 bootstrap-external.js(外部 Agent 路径)。
|
|
10
10
|
*/
|
|
11
11
|
import { getRequiredFieldsDescription } from '#domain/knowledge/FieldSpec.js';
|
|
12
|
+
import { envelope } from '../envelope.js';
|
|
12
13
|
import * as browseHandlers from './browse.js';
|
|
13
|
-
import * as candidateHandlers from './candidate.js';
|
|
14
14
|
import * as guardHandlers from './guard.js';
|
|
15
15
|
import * as searchHandlers from './search.js';
|
|
16
16
|
import * as skillHandlers from './skill.js';
|
|
@@ -123,11 +123,24 @@ export async function consolidatedGraph(ctx, args) {
|
|
|
123
123
|
// ─── autosnippet_guard (整合 3 → 1) ─────────────────────────
|
|
124
124
|
/**
|
|
125
125
|
* Guard 检查:按参数自动路由
|
|
126
|
+
* operation: 'reverse_audit' → guardReverseAudit() (Recipe→Code 反向验证)
|
|
127
|
+
* operation: 'coverage_matrix' → guardCoverageMatrix() (模块覆盖率矩阵)
|
|
128
|
+
* operation: 'compliance_report' → guardComplianceReport() (3D 合规报告)
|
|
126
129
|
* 无参数 → guardReview() (自动 git diff 检测 + inline recipe)
|
|
127
130
|
* 有 files → guardReview() (指定文件 + inline recipe) — files 为 string[] 或 {path}[]
|
|
128
131
|
* 有 code → guardCheck() (单文件内联检查)
|
|
129
132
|
*/
|
|
130
133
|
export async function consolidatedGuard(ctx, args) {
|
|
134
|
+
// operation 显式路由
|
|
135
|
+
if (args.operation === 'reverse_audit') {
|
|
136
|
+
return guardHandlers.guardReverseAudit(ctx, args);
|
|
137
|
+
}
|
|
138
|
+
if (args.operation === 'coverage_matrix') {
|
|
139
|
+
return guardHandlers.guardCoverageMatrix(ctx, args);
|
|
140
|
+
}
|
|
141
|
+
if (args.operation === 'compliance_report') {
|
|
142
|
+
return guardHandlers.guardComplianceReport(ctx, args);
|
|
143
|
+
}
|
|
131
144
|
// 有 code → 单文件检查(旧模式)
|
|
132
145
|
if (args.code) {
|
|
133
146
|
return guardHandlers.guardCheck(ctx, args);
|
|
@@ -174,116 +187,283 @@ export async function consolidatedSkill(ctx, args) {
|
|
|
174
187
|
throw new Error(`Unknown skill operation: ${op}. Expected: list, load, create, update, delete, suggest, feedback`);
|
|
175
188
|
}
|
|
176
189
|
}
|
|
177
|
-
// ─── autosnippet_submit_knowledge (
|
|
190
|
+
// ─── autosnippet_submit_knowledge (unified pipeline) ──────────────────────
|
|
178
191
|
/**
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
192
|
+
* 统一提交管线:单条与批量走同一代码路径。
|
|
193
|
+
*
|
|
194
|
+
* 流程:
|
|
195
|
+
* 1. 解析 items[] → 限流
|
|
196
|
+
* 2. 严格校验所有条目(UnifiedValidator)→ valid[] + rejected[]
|
|
197
|
+
* 3. 融合分析(ConsolidationAdvisor.analyzeBatch)→ submittable[] + blocked[]
|
|
198
|
+
* 4. 提交 submittable → enrich + service.create()
|
|
199
|
+
* 5. 返回统一结果
|
|
182
200
|
*
|
|
183
201
|
* 设计原则:
|
|
184
202
|
* - 不降级:缺字段不自动补全,要求 Agent 一次性生成完整数据
|
|
185
|
-
* -
|
|
203
|
+
* - 不碎片化:优先增强已有 Recipe,而非总新建
|
|
204
|
+
* - 不重复提交:拒绝时不创建任何记录
|
|
205
|
+
* - 单条/批量完全一致的校验与融合逻辑
|
|
186
206
|
*/
|
|
187
207
|
export async function enhancedSubmitKnowledge(ctx, args) {
|
|
188
208
|
const { submitKnowledge } = await import('./knowledge.js');
|
|
189
209
|
const { UnifiedValidator } = await import('#domain/knowledge/UnifiedValidator.js');
|
|
190
|
-
const
|
|
191
|
-
|
|
192
|
-
|
|
210
|
+
const items = args.items;
|
|
211
|
+
if (!items || !Array.isArray(items) || items.length === 0) {
|
|
212
|
+
return envelope({
|
|
213
|
+
success: false,
|
|
214
|
+
errorCode: 'INVALID_INPUT',
|
|
215
|
+
message: 'items 数组是必需的且不能为空。请传入 items: [{ title, language, ... }]',
|
|
216
|
+
meta: { tool: 'autosnippet_submit_knowledge' },
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
const skipConsolidation = args.skipConsolidation === true;
|
|
220
|
+
const source = args.source || 'mcp';
|
|
221
|
+
const dimensionId = args.dimensionId;
|
|
222
|
+
const clientId = args.client_id;
|
|
223
|
+
// ── Step 1: 限流 ──
|
|
224
|
+
const { checkRecipeSave } = await import('#http/middleware/RateLimiter.js');
|
|
225
|
+
const { resolveProjectRoot } = await import('#shared/resolveProjectRoot.js');
|
|
226
|
+
const projectRoot = resolveProjectRoot(ctx.container);
|
|
227
|
+
const limitCheck = checkRecipeSave(projectRoot, clientId || process.env.USER || 'mcp-client');
|
|
228
|
+
if (!limitCheck.allowed) {
|
|
229
|
+
return envelope({
|
|
230
|
+
success: false,
|
|
231
|
+
message: `提交过于频繁,请 ${limitCheck.retryAfter}s 后再试。`,
|
|
232
|
+
errorCode: 'RATE_LIMIT',
|
|
233
|
+
meta: { tool: 'autosnippet_submit_knowledge' },
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
// ── Step 2: 严格校验所有条目 ──
|
|
193
237
|
const validator = new UnifiedValidator();
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
//
|
|
199
|
-
|
|
238
|
+
const validItems = [];
|
|
239
|
+
const rejectedItems = [];
|
|
240
|
+
for (let i = 0; i < items.length; i++) {
|
|
241
|
+
const item = items[i];
|
|
242
|
+
// 合并批次级选项到条目
|
|
243
|
+
if (!item.source) {
|
|
244
|
+
item.source = source;
|
|
245
|
+
}
|
|
246
|
+
if (dimensionId && !item.dimensionId) {
|
|
247
|
+
item.dimensionId = dimensionId;
|
|
248
|
+
}
|
|
249
|
+
const validation = validator.validate(item, { skipUniqueness: false });
|
|
250
|
+
if (validation.pass) {
|
|
251
|
+
validItems.push({ index: i, item });
|
|
252
|
+
// 记录标题/指纹供后续去重检测
|
|
253
|
+
validator.recordSubmission(item.title, item.content?.pattern);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
rejectedItems.push({
|
|
257
|
+
index: i,
|
|
258
|
+
title: item.title || '(untitled)',
|
|
259
|
+
errors: validation.errors,
|
|
260
|
+
warnings: validation.warnings,
|
|
261
|
+
});
|
|
262
|
+
// 记录拒绝到 BootstrapSession tracker
|
|
263
|
+
_trackRejection(ctx, item, dimensionId);
|
|
264
|
+
// 仍然记录标题/指纹防止后续条目重复
|
|
265
|
+
validator.recordSubmission(item.title, item.content?.pattern);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// 全部被拒绝
|
|
269
|
+
if (validItems.length === 0) {
|
|
270
|
+
const allMissing = [...new Set(rejectedItems.flatMap((it) => it.errors))];
|
|
200
271
|
return envelope({
|
|
201
272
|
success: false,
|
|
202
|
-
message: `提交被拒绝:${validResult.errors.join('; ')}。请在单次调用中补齐所有字段后重新提交,不要分步提交或先提交再补全。`,
|
|
203
273
|
errorCode: 'INCOMPLETE_SUBMISSION',
|
|
274
|
+
message: `全部 ${items.length} 条知识条目被拒绝。请在单次调用中补齐所有字段后重新提交。`,
|
|
204
275
|
data: {
|
|
205
|
-
|
|
206
|
-
warnings: validResult.warnings,
|
|
276
|
+
rejectedItems,
|
|
207
277
|
requiredFields: getRequiredFieldsDescription(),
|
|
278
|
+
commonErrors: allMissing,
|
|
208
279
|
},
|
|
209
280
|
meta: { tool: 'autosnippet_submit_knowledge' },
|
|
210
281
|
});
|
|
211
282
|
}
|
|
212
|
-
// ──
|
|
213
|
-
const
|
|
214
|
-
|
|
215
|
-
if (
|
|
216
|
-
|
|
283
|
+
// ── Step 3: 融合分析(统一对所有有效条目运行) ──
|
|
284
|
+
const submittableItems = [];
|
|
285
|
+
const blockedItems = [];
|
|
286
|
+
if (skipConsolidation) {
|
|
287
|
+
submittableItems.push(...validItems);
|
|
217
288
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
289
|
+
else {
|
|
290
|
+
const advisor = ctx.container.get('consolidationAdvisor');
|
|
291
|
+
if (!advisor || typeof advisor.analyzeBatch !== 'function') {
|
|
292
|
+
// DI 未注册时降级放行
|
|
293
|
+
submittableItems.push(...validItems);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
try {
|
|
297
|
+
const candidates = validItems.map((v) => ({
|
|
298
|
+
title: v.item.title || '',
|
|
299
|
+
description: v.item.description || '',
|
|
300
|
+
doClause: v.item.doClause,
|
|
301
|
+
dontClause: v.item.dontClause,
|
|
302
|
+
coreCode: v.item.coreCode,
|
|
303
|
+
category: v.item.category,
|
|
304
|
+
trigger: v.item.trigger,
|
|
305
|
+
whenClause: v.item.whenClause,
|
|
306
|
+
kind: v.item.kind,
|
|
307
|
+
content: v.item.content,
|
|
308
|
+
}));
|
|
309
|
+
const batchAdvice = advisor.analyzeBatch(candidates);
|
|
310
|
+
for (const { index: adviceIdx, advice } of batchAdvice.items) {
|
|
311
|
+
const validEntry = validItems[adviceIdx];
|
|
312
|
+
if (advice.action === 'create') {
|
|
313
|
+
submittableItems.push(validEntry);
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
blockedItems.push({
|
|
317
|
+
index: validEntry.index,
|
|
318
|
+
title: validEntry.item.title || '(untitled)',
|
|
319
|
+
consolidation: advice,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// 将批次内重叠信息附加到 blockedItems
|
|
324
|
+
if (batchAdvice.internalOverlaps.length > 0) {
|
|
325
|
+
for (const overlap of batchAdvice.internalOverlaps) {
|
|
326
|
+
const entryB = validItems[overlap.indexB];
|
|
327
|
+
// 如果 B 已经被放行,降级为 blocked(批次内碎片化警告)
|
|
328
|
+
const alreadyBlocked = blockedItems.some((b) => b.index === entryB.index);
|
|
329
|
+
if (!alreadyBlocked) {
|
|
330
|
+
const entryA = validItems[overlap.indexA];
|
|
331
|
+
blockedItems.push({
|
|
332
|
+
index: entryB.index,
|
|
333
|
+
title: entryB.item.title || '(untitled)',
|
|
334
|
+
consolidation: {
|
|
335
|
+
action: 'merge',
|
|
336
|
+
reason: `与同批次候选「${entryA.item.title || ''}」高度重叠(${(overlap.similarity * 100).toFixed(0)}%),建议合并后再提交。`,
|
|
337
|
+
internalOverlap: true,
|
|
338
|
+
overlapWith: {
|
|
339
|
+
index: entryA.index,
|
|
340
|
+
title: entryA.item.title,
|
|
341
|
+
similarity: overlap.similarity,
|
|
342
|
+
},
|
|
343
|
+
},
|
|
344
|
+
});
|
|
345
|
+
// 从 submittable 中移除
|
|
346
|
+
const subIdx = submittableItems.findIndex((s) => s.index === entryB.index);
|
|
347
|
+
if (subIdx >= 0) {
|
|
348
|
+
submittableItems.splice(subIdx, 1);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
// 分析失败时静默降级放行
|
|
356
|
+
submittableItems.push(...validItems.filter((v) => !submittableItems.some((s) => s.index === v.index)));
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
// ── Step 4: 提交所有通过的条目 ──
|
|
361
|
+
let successCount = 0;
|
|
362
|
+
const successIds = [];
|
|
363
|
+
const submitErrors = [];
|
|
364
|
+
for (const { index, item } of submittableItems) {
|
|
221
365
|
try {
|
|
222
|
-
const
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
};
|
|
227
|
-
const dedupResult = await candidateHandlers.checkDuplicate(ctx, {
|
|
228
|
-
candidate: dedupCandidate,
|
|
229
|
-
threshold: 0.7,
|
|
230
|
-
topK: 3,
|
|
366
|
+
const result = await submitKnowledge(ctx, {
|
|
367
|
+
...item,
|
|
368
|
+
source: item.source || source,
|
|
369
|
+
client_id: clientId,
|
|
231
370
|
});
|
|
232
|
-
if (
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
371
|
+
if (result?.success && result.data?.id) {
|
|
372
|
+
successCount++;
|
|
373
|
+
const recipeId = result.data.id;
|
|
374
|
+
successIds.push(recipeId);
|
|
375
|
+
_trackSubmission(ctx, item, dimensionId, recipeId);
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
submitErrors.push({
|
|
379
|
+
index,
|
|
380
|
+
title: item.title || '(untitled)',
|
|
381
|
+
error: result?.message || 'unknown error',
|
|
382
|
+
});
|
|
237
383
|
}
|
|
238
384
|
}
|
|
239
|
-
catch {
|
|
240
|
-
|
|
385
|
+
catch (err) {
|
|
386
|
+
submitErrors.push({
|
|
387
|
+
index,
|
|
388
|
+
title: item.title || '(untitled)',
|
|
389
|
+
error: err instanceof Error ? err.message : String(err),
|
|
390
|
+
});
|
|
241
391
|
}
|
|
242
392
|
}
|
|
243
|
-
//
|
|
244
|
-
|
|
245
|
-
|
|
393
|
+
// ── Step 5: 构建统一响应 ──
|
|
394
|
+
const data = {
|
|
395
|
+
count: successCount,
|
|
396
|
+
total: items.length,
|
|
397
|
+
};
|
|
398
|
+
if (successIds.length > 0) {
|
|
399
|
+
data.ids = successIds;
|
|
400
|
+
}
|
|
401
|
+
if (submitErrors.length > 0) {
|
|
402
|
+
data.errors = submitErrors;
|
|
246
403
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
404
|
+
if (rejectedItems.length > 0) {
|
|
405
|
+
const allMissing = [...new Set(rejectedItems.flatMap((it) => it.errors))];
|
|
406
|
+
data.rejectedItems = rejectedItems;
|
|
407
|
+
data.rejectedSummary = {
|
|
408
|
+
rejectedCount: rejectedItems.length,
|
|
409
|
+
commonErrors: allMissing,
|
|
410
|
+
message: `${rejectedItems.length}/${items.length} 条知识条目因校验未通过被拒绝。`,
|
|
411
|
+
};
|
|
250
412
|
}
|
|
251
|
-
|
|
413
|
+
if (blockedItems.length > 0) {
|
|
414
|
+
data.blockedItems = blockedItems;
|
|
415
|
+
data.blockedSummary = {
|
|
416
|
+
blockedCount: blockedItems.length,
|
|
417
|
+
message: `${blockedItems.length} 条因融合分析被阻塞(与已有 Recipe 重叠或实质性不足)。设 skipConsolidation: true 可跳过。`,
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
const allOk = successCount === items.length;
|
|
421
|
+
return envelope({
|
|
422
|
+
success: successCount > 0,
|
|
423
|
+
data,
|
|
424
|
+
message: allOk
|
|
425
|
+
? `已提交 ${successCount} 条知识条目。`
|
|
426
|
+
: `已提交 ${successCount}/${items.length} 条知识条目。`,
|
|
427
|
+
meta: { tool: 'autosnippet_submit_knowledge' },
|
|
428
|
+
});
|
|
252
429
|
}
|
|
253
|
-
|
|
254
|
-
/**
|
|
255
|
-
* 记录成功提交到活跃 BootstrapSession 的 submissionTracker
|
|
256
|
-
* 静默失败 — tracker 不可用时不影响提交本身
|
|
257
|
-
*/
|
|
258
|
-
function _trackSubmission(ctx, args, recipeId) {
|
|
430
|
+
function _getSession(ctx) {
|
|
259
431
|
try {
|
|
260
432
|
const sessionManager = ctx.container.get('bootstrapSessionManager');
|
|
261
433
|
const session = sessionManager?.getSession?.();
|
|
262
434
|
if (!session?.submissionTracker) {
|
|
263
|
-
return;
|
|
435
|
+
return null;
|
|
264
436
|
}
|
|
265
|
-
// 推断当前维度: 优先使用 Agent 显式传递的 dimensionId,其次推断 remainingDimIds[0]
|
|
266
437
|
const progress = session.getProgress();
|
|
267
|
-
|
|
268
|
-
|
|
438
|
+
return { session, dimId: progress.remainingDimIds[0] || 'unknown' };
|
|
439
|
+
}
|
|
440
|
+
catch {
|
|
441
|
+
return null;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
function _trackSubmission(ctx, item, dimensionId, recipeId) {
|
|
445
|
+
const s = _getSession(ctx);
|
|
446
|
+
if (!s) {
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
try {
|
|
450
|
+
const dimId = dimensionId || item.dimensionId || s.dimId;
|
|
451
|
+
s.session.submissionTracker?.recordSubmission(dimId, item, recipeId);
|
|
269
452
|
}
|
|
270
453
|
catch {
|
|
271
|
-
|
|
454
|
+
/* best effort */
|
|
272
455
|
}
|
|
273
456
|
}
|
|
274
|
-
|
|
275
|
-
|
|
457
|
+
function _trackRejection(ctx, item, dimensionId) {
|
|
458
|
+
const s = _getSession(ctx);
|
|
459
|
+
if (!s) {
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
276
462
|
try {
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
if (!session?.submissionTracker) {
|
|
280
|
-
return;
|
|
281
|
-
}
|
|
282
|
-
const progress = session.getProgress();
|
|
283
|
-
const currentDimId = args?.dimensionId || progress.remainingDimIds[0] || 'unknown';
|
|
284
|
-
session.submissionTracker.recordRejection(currentDimId, args?.title || '(untitled)', 'validation failed');
|
|
463
|
+
const dimId = dimensionId || item.dimensionId || s.dimId;
|
|
464
|
+
s.session.submissionTracker?.recordRejection(dimId, item.title || '(untitled)', 'validation failed');
|
|
285
465
|
}
|
|
286
466
|
catch {
|
|
287
|
-
|
|
467
|
+
/* best effort */
|
|
288
468
|
}
|
|
289
469
|
}
|
|
@@ -113,6 +113,29 @@ export declare function guardAuditFiles(ctx: McpContext, args: GuardAuditArgs):
|
|
|
113
113
|
errorCode: string | null;
|
|
114
114
|
message: string;
|
|
115
115
|
data: {
|
|
116
|
+
capabilityReport?: {
|
|
117
|
+
executedChecks: Record<string, {
|
|
118
|
+
total: number;
|
|
119
|
+
executed: number;
|
|
120
|
+
skipped: number;
|
|
121
|
+
}>;
|
|
122
|
+
skippedChecks: unknown[];
|
|
123
|
+
boundaries: unknown[];
|
|
124
|
+
uncertainResults: Array<{
|
|
125
|
+
ruleId: string;
|
|
126
|
+
message: string;
|
|
127
|
+
layer: string;
|
|
128
|
+
reason: string;
|
|
129
|
+
detail: string;
|
|
130
|
+
}>;
|
|
131
|
+
checkCoverage: number;
|
|
132
|
+
} | undefined;
|
|
133
|
+
uncertainSummary?: {
|
|
134
|
+
total: number;
|
|
135
|
+
byLayer: Record<string, number>;
|
|
136
|
+
byReason: Record<string, number>;
|
|
137
|
+
} | undefined;
|
|
138
|
+
boundaries?: unknown[] | undefined;
|
|
116
139
|
crossFileViolations?: unknown[] | undefined;
|
|
117
140
|
summary: {
|
|
118
141
|
[key: string]: unknown;
|
|
@@ -128,6 +151,7 @@ export declare function guardAuditFiles(ctx: McpContext, args: GuardAuditArgs):
|
|
|
128
151
|
total: number;
|
|
129
152
|
errors: number;
|
|
130
153
|
warnings: number;
|
|
154
|
+
uncertain?: number;
|
|
131
155
|
};
|
|
132
156
|
}[];
|
|
133
157
|
} | null;
|
|
@@ -190,6 +214,12 @@ export declare function guardReview(ctx: McpContext, args: GuardReviewArgs): Pro
|
|
|
190
214
|
errorCode: string | null;
|
|
191
215
|
message: string;
|
|
192
216
|
data: {
|
|
217
|
+
uncertainSummary?: {
|
|
218
|
+
total: number;
|
|
219
|
+
byLayer: Record<string, number>;
|
|
220
|
+
byReason: Record<string, number>;
|
|
221
|
+
} | undefined;
|
|
222
|
+
uncertainResults?: unknown[] | undefined;
|
|
193
223
|
passed: boolean;
|
|
194
224
|
reviewRound: any;
|
|
195
225
|
fileSource: string;
|
|
@@ -260,6 +290,7 @@ export declare function scanProject(ctx: McpContext, args: ScanProjectArgs): Pro
|
|
|
260
290
|
total: number;
|
|
261
291
|
errors: number;
|
|
262
292
|
warnings: number;
|
|
293
|
+
uncertain?: number;
|
|
263
294
|
};
|
|
264
295
|
}[];
|
|
265
296
|
} | null;
|
|
@@ -271,4 +302,123 @@ export declare function scanProject(ctx: McpContext, args: ScanProjectArgs): Pro
|
|
|
271
302
|
tool?: string | undefined;
|
|
272
303
|
};
|
|
273
304
|
}>;
|
|
305
|
+
interface ReverseAuditArgs {
|
|
306
|
+
maxFiles?: number;
|
|
307
|
+
[key: string]: unknown;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* 对所有 active rule Recipe 执行反向验证:
|
|
311
|
+
* - 检查 coreCode 引用的符号是否还存在
|
|
312
|
+
* - 检查 guard pattern 匹配率是否骤降
|
|
313
|
+
*/
|
|
314
|
+
export declare function guardReverseAudit(ctx: McpContext, args: ReverseAuditArgs): Promise<{
|
|
315
|
+
success: boolean;
|
|
316
|
+
errorCode: string | null;
|
|
317
|
+
message: string;
|
|
318
|
+
data: {
|
|
319
|
+
totalRecipes: number;
|
|
320
|
+
healthy: number;
|
|
321
|
+
investigate: number;
|
|
322
|
+
decay: number;
|
|
323
|
+
drifts: {
|
|
324
|
+
recipeId: string;
|
|
325
|
+
title: string;
|
|
326
|
+
recommendation: import("#service/guard/ReverseGuard.js").ReverseRecommendation;
|
|
327
|
+
signals: import("#service/guard/ReverseGuard.js").PatternDriftSignal[];
|
|
328
|
+
}[];
|
|
329
|
+
allResults: {
|
|
330
|
+
recipeId: string;
|
|
331
|
+
title: string;
|
|
332
|
+
recommendation: import("#service/guard/ReverseGuard.js").ReverseRecommendation;
|
|
333
|
+
signalCount: number;
|
|
334
|
+
}[];
|
|
335
|
+
} | null;
|
|
336
|
+
meta: {
|
|
337
|
+
source?: string | undefined;
|
|
338
|
+
responseTimeMs?: number | undefined;
|
|
339
|
+
version: string;
|
|
340
|
+
tool?: string | undefined;
|
|
341
|
+
};
|
|
342
|
+
}>;
|
|
343
|
+
interface CoverageMatrixArgs {
|
|
344
|
+
[key: string]: unknown;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* 计算模块级 Guard 规则覆盖率矩阵
|
|
348
|
+
*/
|
|
349
|
+
export declare function guardCoverageMatrix(ctx: McpContext, _args: CoverageMatrixArgs): Promise<{
|
|
350
|
+
success: boolean;
|
|
351
|
+
errorCode: string | null;
|
|
352
|
+
message: string;
|
|
353
|
+
data: {
|
|
354
|
+
overallCoverage: number;
|
|
355
|
+
zeroModules: string[];
|
|
356
|
+
lowModules: string[];
|
|
357
|
+
modules: import("#service/guard/CoverageAnalyzer.js").ModuleCoverage[];
|
|
358
|
+
} | null;
|
|
359
|
+
meta: {
|
|
360
|
+
source?: string | undefined;
|
|
361
|
+
responseTimeMs?: number | undefined;
|
|
362
|
+
version: string;
|
|
363
|
+
tool?: string | undefined;
|
|
364
|
+
};
|
|
365
|
+
}>;
|
|
366
|
+
interface ComplianceReportArgs {
|
|
367
|
+
[key: string]: unknown;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* 生成 3D 合规报告(compliance + coverage + confidence)
|
|
371
|
+
* 包含完整 uncertain 消费数据
|
|
372
|
+
*/
|
|
373
|
+
export declare function guardComplianceReport(ctx: McpContext, _args: ComplianceReportArgs): Promise<{
|
|
374
|
+
success: boolean;
|
|
375
|
+
errorCode: string | null;
|
|
376
|
+
message: string;
|
|
377
|
+
data: {
|
|
378
|
+
scores: {
|
|
379
|
+
compliance: number;
|
|
380
|
+
coverage: number;
|
|
381
|
+
confidence: number;
|
|
382
|
+
};
|
|
383
|
+
qualityGate: {
|
|
384
|
+
status: string;
|
|
385
|
+
score: number;
|
|
386
|
+
thresholds: {
|
|
387
|
+
maxErrors: number;
|
|
388
|
+
maxWarnings: number;
|
|
389
|
+
minScore: number;
|
|
390
|
+
};
|
|
391
|
+
};
|
|
392
|
+
summary: {
|
|
393
|
+
filesScanned: number;
|
|
394
|
+
totalViolations: number;
|
|
395
|
+
errors: number;
|
|
396
|
+
warnings: number;
|
|
397
|
+
infos: number;
|
|
398
|
+
};
|
|
399
|
+
uncertainSummary: {
|
|
400
|
+
total: number;
|
|
401
|
+
byLayer: Record<string, number>;
|
|
402
|
+
byReason: Record<string, number>;
|
|
403
|
+
};
|
|
404
|
+
boundaries: {
|
|
405
|
+
type: string;
|
|
406
|
+
description: string;
|
|
407
|
+
affectedRules: string[];
|
|
408
|
+
suggestedAction: string;
|
|
409
|
+
}[];
|
|
410
|
+
topViolations: any[];
|
|
411
|
+
trend: {
|
|
412
|
+
errorsChange: number;
|
|
413
|
+
warningsChange: number;
|
|
414
|
+
hasHistory: boolean;
|
|
415
|
+
};
|
|
416
|
+
} | null;
|
|
417
|
+
meta: {
|
|
418
|
+
source?: string | undefined;
|
|
419
|
+
responseTimeMs?: number | undefined;
|
|
420
|
+
version: string;
|
|
421
|
+
tool?: string | undefined;
|
|
422
|
+
};
|
|
423
|
+
}>;
|
|
274
424
|
export {};
|