autosnippet 3.3.5 → 3.3.7
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-FHns2ypa.js +1 -0
- package/dashboard/dist/assets/index-BRJv5Y3r.js +135 -0
- package/dashboard/dist/assets/index-DzoB7kxK.css +1 -0
- package/dashboard/dist/index.html +3 -3
- package/dist/bin/api-server.js +1 -0
- package/dist/bin/cli.d.ts +1 -0
- package/dist/bin/cli.js +137 -9
- package/dist/lib/agent/AgentFactory.d.ts +0 -17
- package/dist/lib/agent/AgentFactory.js +1 -25
- package/dist/lib/agent/AgentRuntime.d.ts +2 -2
- package/dist/lib/agent/AgentRuntime.js +26 -18
- package/dist/lib/agent/capabilities.d.ts +11 -0
- package/dist/lib/agent/capabilities.js +29 -5
- package/dist/lib/agent/context/ExplorationTracker.js +10 -1
- package/dist/lib/agent/context/exploration/ExplorationStrategies.d.ts +2 -0
- package/dist/lib/agent/context/exploration/ExplorationStrategies.js +2 -2
- package/dist/lib/agent/domain/ChatAgentTasks.js +4 -0
- package/dist/lib/agent/domain/insight-analyst.d.ts +47 -3
- package/dist/lib/agent/domain/insight-analyst.js +111 -11
- package/dist/lib/agent/domain/insight-evolver.d.ts +69 -0
- package/dist/lib/agent/domain/insight-evolver.js +230 -0
- package/dist/lib/agent/domain/insight-gate.d.ts +42 -0
- package/dist/lib/agent/domain/insight-gate.js +41 -0
- package/dist/lib/agent/domain/insight-producer.d.ts +27 -2
- package/dist/lib/agent/domain/insight-producer.js +60 -5
- package/dist/lib/agent/domain/scan-prompts.js +10 -7
- package/dist/lib/agent/forced-summary.js +7 -2
- package/dist/lib/agent/memory/ActiveContext.d.ts +2 -28
- package/dist/lib/agent/memory/MemoryCoordinator.d.ts +2 -2
- package/dist/lib/agent/memory/SessionStore.d.ts +6 -12
- package/dist/lib/agent/memory/SessionStore.js +9 -15
- package/dist/lib/agent/memory/memory-flush-contract.d.ts +49 -0
- package/dist/lib/agent/memory/memory-flush-contract.js +16 -0
- package/dist/lib/agent/memory/session-store-schema.d.ts +20 -0
- package/dist/lib/agent/memory/session-store-schema.js +41 -0
- package/dist/lib/agent/presets.d.ts +89 -1
- package/dist/lib/agent/presets.js +53 -5
- package/dist/lib/agent/tools/_shared.d.ts +7 -15
- package/dist/lib/agent/tools/_shared.js +20 -21
- package/dist/lib/agent/tools/composite.d.ts +25 -22
- package/dist/lib/agent/tools/composite.js +108 -109
- package/dist/lib/agent/tools/evolution-tools.d.ts +145 -0
- package/dist/lib/agent/tools/evolution-tools.js +161 -0
- package/dist/lib/agent/tools/index.d.ts +163 -92
- package/dist/lib/agent/tools/index.js +9 -1
- package/dist/lib/agent/tools/lifecycle.d.ts +7 -1
- package/dist/lib/agent/tools/lifecycle.js +59 -75
- package/dist/lib/cli/AiScanService.js +5 -5
- package/dist/lib/cli/KnowledgeSyncService.js +1 -1
- package/dist/lib/core/AstAnalyzer.d.ts +1 -0
- package/dist/lib/core/discovery/ConfigWatcher.d.ts +64 -0
- package/dist/lib/core/discovery/ConfigWatcher.js +336 -0
- package/dist/lib/core/discovery/CustomConfigDiscoverer.d.ts +30 -0
- package/dist/lib/core/discovery/CustomConfigDiscoverer.js +1305 -0
- package/dist/lib/core/discovery/DiscovererPreference.d.ts +44 -0
- package/dist/lib/core/discovery/DiscovererPreference.js +141 -0
- package/dist/lib/core/discovery/DiscovererRegistry.d.ts +10 -1
- package/dist/lib/core/discovery/DiscovererRegistry.js +42 -2
- package/dist/lib/core/discovery/ProjectDiscoverer.d.ts +19 -0
- package/dist/lib/core/discovery/index.d.ts +2 -0
- package/dist/lib/core/discovery/index.js +4 -0
- package/dist/lib/core/discovery/parsers/CMakeParser.d.ts +32 -0
- package/dist/lib/core/discovery/parsers/CMakeParser.js +148 -0
- package/dist/lib/core/discovery/parsers/GradleDslParser.d.ts +43 -0
- package/dist/lib/core/discovery/parsers/GradleDslParser.js +171 -0
- package/dist/lib/core/discovery/parsers/JsonConfigParser.d.ts +45 -0
- package/dist/lib/core/discovery/parsers/JsonConfigParser.js +122 -0
- package/dist/lib/core/discovery/parsers/RubyDslParser.d.ts +49 -0
- package/dist/lib/core/discovery/parsers/RubyDslParser.js +282 -0
- package/dist/lib/core/discovery/parsers/StarlarkParser.d.ts +33 -0
- package/dist/lib/core/discovery/parsers/StarlarkParser.js +229 -0
- package/dist/lib/core/discovery/parsers/YamlConfigParser.d.ts +37 -0
- package/dist/lib/core/discovery/parsers/YamlConfigParser.js +212 -0
- package/dist/lib/{service/bootstrap/DimensionCopyRegistry.d.ts → domain/dimension/DimensionCopy.d.ts} +2 -2
- package/dist/lib/{service/bootstrap/DimensionCopyRegistry.js → domain/dimension/DimensionCopy.js} +22 -72
- package/dist/lib/domain/dimension/DimensionRegistry.d.ts +54 -0
- package/dist/lib/domain/dimension/DimensionRegistry.js +620 -0
- package/dist/lib/domain/dimension/DimensionSop.d.ts +55 -0
- package/dist/lib/domain/dimension/DimensionSop.js +1604 -0
- package/dist/lib/domain/dimension/UnifiedDimension.d.ts +61 -0
- package/dist/lib/domain/dimension/UnifiedDimension.js +53 -0
- package/dist/lib/domain/dimension/index.d.ts +10 -0
- package/dist/lib/domain/dimension/index.js +9 -0
- package/dist/lib/domain/knowledge/FieldSpec.d.ts +1 -1
- package/dist/lib/domain/knowledge/FieldSpec.js +29 -16
- package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +40 -112
- package/dist/lib/domain/knowledge/KnowledgeEntry.js +44 -9
- package/dist/lib/domain/knowledge/KnowledgeRepository.d.ts +1 -0
- package/dist/lib/domain/knowledge/KnowledgeRepository.js +3 -0
- package/dist/lib/domain/knowledge/Lifecycle.js +1 -1
- package/dist/lib/domain/knowledge/StyleGuide.d.ts +1 -1
- package/dist/lib/domain/knowledge/StyleGuide.js +1 -1
- package/dist/lib/domain/knowledge/UnifiedValidator.js +15 -0
- package/dist/lib/external/ai/AiProvider.d.ts +12 -0
- package/dist/lib/external/ai/AiProvider.js +24 -0
- package/dist/lib/external/ai/AiProviderManager.d.ts +101 -0
- package/dist/lib/external/ai/AiProviderManager.js +193 -0
- package/dist/lib/external/ai/providers/ClaudeProvider.js +11 -0
- package/dist/lib/external/ai/providers/GoogleGeminiProvider.js +18 -0
- package/dist/lib/external/ai/providers/MockProvider.d.ts +21 -3
- package/dist/lib/external/ai/providers/MockProvider.js +290 -14
- package/dist/lib/external/ai/providers/OpenAiProvider.js +16 -0
- package/dist/lib/external/lark/LarkTransport.d.ts +5 -1
- package/dist/lib/external/lark/LarkTransport.js +10 -2
- package/dist/lib/external/mcp/McpServer.js +4 -0
- package/dist/lib/external/mcp/handlers/TargetClassifier.d.ts +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.d.ts +8 -16
- package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.js +10 -10
- package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.d.ts +7 -0
- package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.js +20 -0
- package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +52 -132
- package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +204 -17
- package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.d.ts +11 -75
- package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.js +40 -191
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.d.ts +13 -78
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.js +30 -52
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.d.ts +0 -1
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/mock-pipeline.d.ts +20 -0
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/mock-pipeline.js +432 -0
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.d.ts +99 -12
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +188 -169
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +7 -17
- package/dist/lib/external/mcp/handlers/bootstrap/refine.js +8 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.d.ts +46 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.js +58 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.d.ts +25 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.js +47 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +50 -12
- package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +30 -10
- package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-text.js +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.d.ts +24 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.js +14 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.d.ts +14 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.js +48 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.d.ts +21 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.js +45 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/skill-generator.d.ts +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.d.ts +27 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.js +44 -0
- package/dist/lib/external/mcp/handlers/bootstrap-external.d.ts +23 -10
- package/dist/lib/external/mcp/handlers/bootstrap-external.js +41 -51
- package/dist/lib/external/mcp/handlers/bootstrap-internal.d.ts +2 -0
- package/dist/lib/external/mcp/handlers/bootstrap-internal.js +117 -82
- package/dist/lib/external/mcp/handlers/consolidated.d.ts +4 -4
- package/dist/lib/external/mcp/handlers/consolidated.js +108 -332
- package/dist/lib/external/mcp/handlers/dimension-complete-external.js +71 -2
- package/dist/lib/external/mcp/handlers/evolve-external.d.ts +54 -0
- package/dist/lib/external/mcp/handlers/evolve-external.js +229 -0
- package/dist/lib/external/mcp/handlers/knowledge.js +30 -5
- package/dist/lib/external/mcp/handlers/rescan-external.d.ts +76 -0
- package/dist/lib/external/mcp/handlers/rescan-external.js +335 -0
- package/dist/lib/external/mcp/handlers/rescan-internal.d.ts +120 -0
- package/dist/lib/external/mcp/handlers/rescan-internal.js +359 -0
- package/dist/lib/external/mcp/handlers/search.d.ts +6 -5
- package/dist/lib/external/mcp/handlers/search.js +6 -5
- package/dist/lib/external/mcp/handlers/types.d.ts +2 -1
- package/dist/lib/external/mcp/handlers/wiki-external.js +2 -2
- package/dist/lib/external/mcp/tools.d.ts +8 -18
- package/dist/lib/external/mcp/tools.js +58 -2
- package/dist/lib/http/routes/ai.js +111 -30
- package/dist/lib/http/routes/candidates.js +11 -4
- package/dist/lib/http/routes/commands.js +10 -1
- package/dist/lib/http/routes/health.js +11 -0
- package/dist/lib/http/routes/knowledge.js +122 -1
- package/dist/lib/http/routes/modules.js +52 -3
- package/dist/lib/http/routes/panorama.js +16 -4
- package/dist/lib/http/routes/recipes.js +7 -0
- package/dist/lib/http/utils/routeHelpers.js +2 -1
- package/dist/lib/infrastructure/cache/CacheCoordinator.d.ts +41 -0
- package/dist/lib/infrastructure/cache/CacheCoordinator.js +105 -0
- package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.d.ts +7 -0
- package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.js +28 -0
- package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +1 -1
- package/dist/lib/injection/ServiceContainer.d.ts +6 -5
- package/dist/lib/injection/ServiceContainer.js +64 -25
- package/dist/lib/injection/ServiceMap.d.ts +10 -1
- package/dist/lib/injection/modules/AiModule.d.ts +6 -9
- package/dist/lib/injection/modules/AiModule.js +82 -39
- package/dist/lib/injection/modules/KnowledgeModule.js +15 -1
- package/dist/lib/injection/modules/PanoramaModule.js +1 -1
- package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +4 -0
- package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +16 -1
- package/dist/lib/service/bootstrap/BootstrapEventEmitter.d.ts +3 -2
- package/dist/lib/service/bootstrap/BootstrapEventEmitter.js +1 -1
- package/dist/lib/service/bootstrap/DeliveryVerifier.d.ts +51 -0
- package/dist/lib/service/bootstrap/DeliveryVerifier.js +163 -0
- package/dist/lib/service/bootstrap/UiStartupTasks.d.ts +5 -0
- package/dist/lib/service/bootstrap/UiStartupTasks.js +20 -0
- package/dist/lib/service/bootstrap/bootstrap-event-types.d.ts +54 -0
- package/dist/lib/service/bootstrap/bootstrap-event-types.js +10 -0
- package/dist/lib/service/cleanup/CleanupService.d.ts +132 -0
- package/dist/lib/service/cleanup/CleanupService.js +571 -0
- package/dist/lib/service/delivery/AgentInstructionsGenerator.js +39 -43
- package/dist/lib/service/delivery/FileProtection.d.ts +20 -0
- package/dist/lib/service/delivery/FileProtection.js +54 -0
- package/dist/lib/service/delivery/SkillsSyncer.js +16 -21
- package/dist/lib/service/evolution/ContentPatcher.d.ts +44 -0
- package/dist/lib/service/evolution/ContentPatcher.js +310 -0
- package/dist/lib/service/evolution/ProposalExecutor.d.ts +4 -0
- package/dist/lib/service/evolution/ProposalExecutor.js +77 -13
- package/dist/lib/service/evolution/RecipeLifecycleSupervisor.d.ts +64 -0
- package/dist/lib/service/evolution/RecipeLifecycleSupervisor.js +458 -0
- package/dist/lib/service/evolution/RecipeRelevanceAuditor.d.ts +89 -0
- package/dist/lib/service/evolution/RecipeRelevanceAuditor.js +492 -0
- package/dist/lib/service/evolution/createSupersedeProposal.d.ts +44 -0
- package/dist/lib/service/evolution/createSupersedeProposal.js +81 -0
- package/dist/lib/service/guard/ComplianceReporter.d.ts +4 -0
- package/dist/lib/service/guard/ComplianceReporter.js +51 -0
- package/dist/lib/service/guard/GuardCheckEngine.js +5 -4
- package/dist/lib/service/knowledge/CodeEntityGraph.d.ts +6 -0
- package/dist/lib/service/knowledge/CodeEntityGraph.js +16 -0
- package/dist/lib/service/knowledge/ConfidenceRouter.js +1 -1
- package/dist/lib/service/knowledge/KnowledgeService.d.ts +11 -1
- package/dist/lib/service/knowledge/KnowledgeService.js +67 -14
- package/dist/lib/service/knowledge/RecipeProductionGateway.d.ts +225 -0
- package/dist/lib/service/knowledge/RecipeProductionGateway.js +384 -0
- package/dist/lib/service/module/ModuleService.js +10 -19
- package/dist/lib/service/panorama/CouplingAnalyzer.d.ts +10 -1
- package/dist/lib/service/panorama/CouplingAnalyzer.js +44 -2
- package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +4 -3
- package/dist/lib/service/panorama/DimensionAnalyzer.js +40 -151
- package/dist/lib/service/panorama/LayerInferrer.d.ts +16 -1
- package/dist/lib/service/panorama/LayerInferrer.js +118 -1
- package/dist/lib/service/panorama/ModuleDiscoverer.d.ts +9 -0
- package/dist/lib/service/panorama/ModuleDiscoverer.js +58 -2
- package/dist/lib/service/panorama/PanoramaAggregator.d.ts +6 -2
- package/dist/lib/service/panorama/PanoramaAggregator.js +84 -6
- package/dist/lib/service/panorama/PanoramaScanner.js +28 -0
- package/dist/lib/service/panorama/PanoramaService.js +10 -5
- package/dist/lib/service/panorama/PanoramaTypes.d.ts +38 -0
- package/dist/lib/service/panorama/RoleRefiner.d.ts +2 -0
- package/dist/lib/service/panorama/RoleRefiner.js +41 -0
- package/dist/lib/service/panorama/TechStackProfiler.d.ts +13 -0
- package/dist/lib/service/panorama/TechStackProfiler.js +191 -0
- package/dist/lib/service/search/BM25Scorer.d.ts +2 -2
- package/dist/lib/service/search/SearchEngine.d.ts +11 -10
- package/dist/lib/service/search/SearchEngine.js +38 -36
- package/dist/lib/service/search/SearchTypes.d.ts +14 -8
- package/dist/lib/service/search/SearchTypes.js +1 -1
- package/dist/lib/service/search/tokenizer.d.ts +1 -1
- package/dist/lib/service/search/tokenizer.js +2 -2
- package/dist/lib/service/skills/SignalCollector.d.ts +1 -0
- package/dist/lib/service/skills/SignalCollector.js +6 -5
- package/dist/lib/service/vector/ContextualEnricher.d.ts +1 -0
- package/dist/lib/service/vector/ContextualEnricher.js +4 -0
- package/dist/lib/shared/LanguageService.js +3 -0
- package/dist/lib/shared/developer-identity.d.ts +18 -0
- package/dist/lib/shared/developer-identity.js +62 -0
- package/dist/lib/shared/schemas/common.d.ts +4 -4
- package/dist/lib/shared/schemas/http-requests.d.ts +20 -18
- package/dist/lib/shared/schemas/http-requests.js +17 -6
- package/dist/lib/shared/schemas/mcp-tools.d.ts +32 -2
- package/dist/lib/shared/schemas/mcp-tools.js +38 -0
- package/dist/lib/types/evolution.d.ts +135 -0
- package/dist/lib/types/evolution.js +6 -0
- package/dist/lib/types/graph-shared.d.ts +25 -0
- package/dist/lib/types/graph-shared.js +7 -0
- package/dist/lib/types/knowledge-wire.d.ts +132 -0
- package/dist/lib/types/knowledge-wire.js +7 -0
- package/dist/lib/types/project-snapshot-builder.d.ts +19 -0
- package/dist/lib/types/project-snapshot-builder.js +189 -0
- package/dist/lib/types/project-snapshot.d.ts +399 -0
- package/dist/lib/types/project-snapshot.js +17 -0
- package/dist/lib/types/search-wire.d.ts +46 -0
- package/dist/lib/types/search-wire.js +7 -0
- package/dist/lib/types/snapshot-views.d.ts +58 -0
- package/dist/lib/types/snapshot-views.js +103 -0
- package/package.json +1 -1
- package/skills/autosnippet-recipes/SKILL.md +1 -1
- package/templates/instructions/agent-static.md +2 -0
- package/templates/instructions/conventions.md +3 -1
- package/templates/recipes-setup/README.md +2 -2
- package/dashboard/dist/assets/icons-BJ2mUBi8.js +0 -1
- package/dashboard/dist/assets/index-B659K9t5.js +0 -128
- package/dashboard/dist/assets/index-NCm40PMD.css +0 -1
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.d.ts +0 -169
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.js +0 -727
- package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.d.ts +0 -370
- package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.js +0 -821
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SearchEngine - 统一搜索引擎
|
|
3
3
|
*
|
|
4
|
-
* 三级搜索策略: keyword →
|
|
4
|
+
* 三级搜索策略: keyword → FieldWeighted ranking → semantic(可选)
|
|
5
5
|
* 从 V1 SearchServiceV2 迁移,适配 V2 架构
|
|
6
6
|
*/
|
|
7
7
|
import Logger from '../../infrastructure/logging/Logger.js';
|
|
@@ -129,22 +129,22 @@ export class SearchEngine {
|
|
|
129
129
|
let actualMode = mode;
|
|
130
130
|
switch (mode) {
|
|
131
131
|
case 'auto': {
|
|
132
|
-
// 缓存
|
|
133
|
-
let
|
|
134
|
-
const
|
|
135
|
-
if (!
|
|
136
|
-
|
|
132
|
+
// 缓存 FieldWeighted 结果, 避免 RRF 降级时重复计算
|
|
133
|
+
let cachedScorerItems = null;
|
|
134
|
+
const getScorerResults = () => {
|
|
135
|
+
if (!cachedScorerItems) {
|
|
136
|
+
cachedScorerItems = this._scorerSearch(query, type, recallLimit);
|
|
137
137
|
}
|
|
138
|
-
return
|
|
138
|
+
return cachedScorerItems;
|
|
139
139
|
};
|
|
140
140
|
// 优先使用 VectorService 的 hybridSearch (统一 RRF 融合)
|
|
141
141
|
if (this.vectorService) {
|
|
142
142
|
try {
|
|
143
|
-
const
|
|
143
|
+
const sparseItems = getScorerResults();
|
|
144
144
|
const rrfResults = await this.vectorService.hybridSearch(query, {
|
|
145
145
|
topK: recallLimit,
|
|
146
146
|
alpha: this._fusionSemanticWeight,
|
|
147
|
-
sparseSearchFn: () =>
|
|
147
|
+
sparseSearchFn: () => sparseItems,
|
|
148
148
|
});
|
|
149
149
|
if (rrfResults.length > 0) {
|
|
150
150
|
results = rrfResults.map((r) => {
|
|
@@ -178,15 +178,16 @@ export class SearchEngine {
|
|
|
178
178
|
// VectorService RRF 失败, 降级到 min-max 融合
|
|
179
179
|
}
|
|
180
180
|
}
|
|
181
|
-
// 降级: VectorService 不可用或 RRF 零结果 → 纯
|
|
181
|
+
// 降级: VectorService 不可用或 RRF 零结果 → 纯 FieldWeighted
|
|
182
182
|
// 旧版在此做 BM25+semantic min-max 融合,但当 VectorService 不可用时
|
|
183
|
-
// semantic 通常也会失败,最终退化为纯
|
|
184
|
-
results =
|
|
185
|
-
actualMode = 'auto(
|
|
183
|
+
// semantic 通常也会失败,最终退化为纯 FieldWeighted。简化为直接走 scorer。
|
|
184
|
+
results = getScorerResults();
|
|
185
|
+
actualMode = 'auto(weighted-only)';
|
|
186
186
|
break;
|
|
187
187
|
}
|
|
188
|
+
case 'weighted':
|
|
188
189
|
case 'bm25':
|
|
189
|
-
results = this.
|
|
190
|
+
results = this._scorerSearch(query, type, recallLimit);
|
|
190
191
|
break;
|
|
191
192
|
case 'semantic': {
|
|
192
193
|
const semResult = await this._semanticSearch(query, type, recallLimit);
|
|
@@ -300,7 +301,7 @@ export class SearchEngine {
|
|
|
300
301
|
/**
|
|
301
302
|
* 关键词搜索 - 直接 SQL LIKE
|
|
302
303
|
* 返回包含 kind 字段的完整结果,使用 ESCAPE 防止通配符注入
|
|
303
|
-
* 当 SQL LIKE 无结果时,降级到
|
|
304
|
+
* 当 SQL LIKE 无结果时,降级到 FieldWeighted 搜索以提升自然语言查询的召回率
|
|
304
305
|
*/
|
|
305
306
|
_keywordSearch(query, type, limit) {
|
|
306
307
|
const results = [];
|
|
@@ -351,23 +352,23 @@ export class SearchEngine {
|
|
|
351
352
|
/* table may not exist */
|
|
352
353
|
}
|
|
353
354
|
}
|
|
354
|
-
// 补充排序信号字段(whenClause/doClause/tags 等),与
|
|
355
|
+
// 补充排序信号字段(whenClause/doClause/tags 等),与 scorer/semantic 路径一致
|
|
355
356
|
this._supplementDetails(results);
|
|
356
|
-
// 当 SQL LIKE 无结果时,降级到
|
|
357
|
+
// 当 SQL LIKE 无结果时,降级到 FieldWeighted 搜索
|
|
357
358
|
// 这让自然语言查询(如 "如何处理网络错误")在 keyword 模式下也能返回结果
|
|
358
359
|
if (results.length === 0) {
|
|
359
360
|
this.ensureIndex();
|
|
360
|
-
const
|
|
361
|
-
return
|
|
361
|
+
const scorerResults = this._scorerSearch(query, type, limit);
|
|
362
|
+
return scorerResults;
|
|
362
363
|
}
|
|
363
364
|
return results.slice(0, limit);
|
|
364
365
|
}
|
|
365
366
|
/**
|
|
366
|
-
*
|
|
367
|
+
* 加权字段搜索(FieldWeightedScorer)
|
|
367
368
|
* 增加 Title/Trigger 精确匹配 bonus — 当 query 出现在标题/触发词中时
|
|
368
|
-
*
|
|
369
|
+
* 给予额外分数加成,确保精确匹配的条目排名靠前
|
|
369
370
|
*/
|
|
370
|
-
|
|
371
|
+
_scorerSearch(query, type, limit) {
|
|
371
372
|
let results = this.scorer.search(query, limit * 2);
|
|
372
373
|
if (type !== 'all') {
|
|
373
374
|
// All types now map to 'recipe' since everything is unified
|
|
@@ -379,7 +380,7 @@ export class SearchEngine {
|
|
|
379
380
|
});
|
|
380
381
|
}
|
|
381
382
|
// ── Title/Trigger exact-match bonus ──
|
|
382
|
-
// 当 query
|
|
383
|
+
// 当 query 精确出现在标题或触发词中时,增加分数
|
|
383
384
|
// 这解决了 "BaseRequest" 被 "BD前缀类名命名规范" 排在 "BDBaseRequest 继承请求模式" 前面的问题
|
|
384
385
|
const lowerQuery = query.toLowerCase();
|
|
385
386
|
const maxScore = results.length > 0 ? results[0].score : 1;
|
|
@@ -432,7 +433,7 @@ export class SearchEngine {
|
|
|
432
433
|
}
|
|
433
434
|
/**
|
|
434
435
|
* 语义搜索 - 需要 AI Provider 的 embed 功能
|
|
435
|
-
*
|
|
436
|
+
* 不可用时降级到 FieldWeighted 搜索
|
|
436
437
|
* @returns >}
|
|
437
438
|
*/
|
|
438
439
|
async _semanticSearch(query, type, limit) {
|
|
@@ -474,13 +475,13 @@ export class SearchEngine {
|
|
|
474
475
|
}
|
|
475
476
|
// Legacy fallback: 直接使用 aiProvider embed + vectorStore
|
|
476
477
|
if (!this.aiProvider) {
|
|
477
|
-
this.logger.debug('AI provider not available, falling back to
|
|
478
|
-
return { items: this.
|
|
478
|
+
this.logger.debug('AI provider not available, falling back to FieldWeighted search');
|
|
479
|
+
return { items: this._scorerSearch(query, type, limit), actualMode: 'weighted' };
|
|
479
480
|
}
|
|
480
481
|
try {
|
|
481
482
|
const queryEmbedding = await this.aiProvider.embed(query);
|
|
482
483
|
if (!queryEmbedding || queryEmbedding.length === 0) {
|
|
483
|
-
return { items: this.
|
|
484
|
+
return { items: this._scorerSearch(query, type, limit), actualMode: 'weighted' };
|
|
484
485
|
}
|
|
485
486
|
if (this.vectorStore) {
|
|
486
487
|
try {
|
|
@@ -523,24 +524,24 @@ export class SearchEngine {
|
|
|
523
524
|
}
|
|
524
525
|
}
|
|
525
526
|
catch (vecErr) {
|
|
526
|
-
this.logger.warn('Vector store query failed, falling back to
|
|
527
|
+
this.logger.warn('Vector store query failed, falling back to FieldWeighted', {
|
|
527
528
|
error: vecErr.message,
|
|
528
529
|
});
|
|
529
530
|
}
|
|
530
531
|
}
|
|
531
|
-
this.logger.debug('Vector search fallback to
|
|
532
|
-
return { items: this.
|
|
532
|
+
this.logger.debug('Vector search fallback to FieldWeighted');
|
|
533
|
+
return { items: this._scorerSearch(query, type, limit), actualMode: 'weighted' };
|
|
533
534
|
}
|
|
534
535
|
catch (err) {
|
|
535
|
-
this.logger.warn('Semantic search failed, falling back to
|
|
536
|
+
this.logger.warn('Semantic search failed, falling back to FieldWeighted', {
|
|
536
537
|
error: err.message,
|
|
537
538
|
});
|
|
538
|
-
return { items: this.
|
|
539
|
+
return { items: this._scorerSearch(query, type, limit), actualMode: 'weighted' };
|
|
539
540
|
}
|
|
540
541
|
}
|
|
541
542
|
/**
|
|
542
543
|
* 补充详细字段(content / description / trigger / delivery 字段)— 批量 IN 查询
|
|
543
|
-
* 用于向量搜索结果与
|
|
544
|
+
* 用于向量搜索结果与 FieldWeighted 结果的一致性
|
|
544
545
|
*/
|
|
545
546
|
_supplementDetails(items) {
|
|
546
547
|
if (!items || items.length === 0) {
|
|
@@ -730,9 +731,10 @@ export class SearchEngine {
|
|
|
730
731
|
/**
|
|
731
732
|
* 从 DB 行构建索引文本
|
|
732
733
|
*
|
|
733
|
-
*
|
|
734
|
+
* 高价值字段(title, trigger)通过重复出现提升 TF 权重
|
|
734
735
|
* — title ×3, trigger ×2, description ×1.5(通过重复 token 实现)
|
|
735
|
-
*
|
|
736
|
+
* 这确保标题匹配的文档获得显著更高的分数
|
|
737
|
+
* 注:此逻辑主要服务于 BM25Scorer,FieldWeightedScorer 内部已有字段权重机制
|
|
736
738
|
*/
|
|
737
739
|
_buildDocText(r) {
|
|
738
740
|
let contentText = '';
|
|
@@ -752,7 +754,7 @@ export class SearchEngine {
|
|
|
752
754
|
catch {
|
|
753
755
|
/* ignore */
|
|
754
756
|
}
|
|
755
|
-
//
|
|
757
|
+
// Field boosting via token repetition:
|
|
756
758
|
// title ×2, trigger ×2, description ×1, others ×1
|
|
757
759
|
// 使用较温和的 boost 避免长文档 avgLength 膨胀导致 content 匹配被过度稀释
|
|
758
760
|
const title = r.title || '';
|
|
@@ -2,26 +2,30 @@
|
|
|
2
2
|
* SearchTypes — SearchEngine 共享类型定义
|
|
3
3
|
*
|
|
4
4
|
* 从 SearchEngine.ts 提取的所有接口和类型,
|
|
5
|
-
* 供 SearchEngine、BM25Scorer 及测试文件独立消费。
|
|
5
|
+
* 供 SearchEngine、FieldWeightedScorer、BM25Scorer 及测试文件独立消费。
|
|
6
6
|
*
|
|
7
7
|
* @module SearchTypes
|
|
8
8
|
*/
|
|
9
|
-
/** Internal
|
|
10
|
-
export interface
|
|
9
|
+
/** Internal scorer document representation */
|
|
10
|
+
export interface ScorerDocument {
|
|
11
11
|
id: string;
|
|
12
12
|
tokens: string[];
|
|
13
13
|
tokenFreq: Record<string, number>;
|
|
14
14
|
length: number;
|
|
15
15
|
meta: Record<string, unknown>;
|
|
16
16
|
}
|
|
17
|
-
/**
|
|
18
|
-
export interface
|
|
17
|
+
/** Scorer search result */
|
|
18
|
+
export interface ScorerResult {
|
|
19
19
|
id: string;
|
|
20
20
|
score: number;
|
|
21
21
|
meta: Record<string, unknown>;
|
|
22
22
|
}
|
|
23
|
+
/** @deprecated Use ScorerDocument */
|
|
24
|
+
export type BM25Document = ScorerDocument;
|
|
25
|
+
/** @deprecated Use ScorerResult */
|
|
26
|
+
export type BM25SearchResult = ScorerResult;
|
|
23
27
|
/**
|
|
24
|
-
* Scorer 通用接口 — BM25Scorer
|
|
28
|
+
* Scorer 通用接口 — FieldWeightedScorer(默认)与 BM25Scorer 共同实现
|
|
25
29
|
*
|
|
26
30
|
* SearchEngine 通过此接口与具体评分器解耦,可在运行时切换。
|
|
27
31
|
*/
|
|
@@ -36,11 +40,11 @@ export interface Scorer {
|
|
|
36
40
|
removeDocument(id: string): boolean;
|
|
37
41
|
updateDocument(id: string, text: string, meta: Record<string, unknown>): void;
|
|
38
42
|
hasDocument(id: string): boolean;
|
|
39
|
-
search(query: string, limit?: number):
|
|
43
|
+
search(query: string, limit?: number): ScorerResult[];
|
|
40
44
|
clear(): void;
|
|
41
45
|
}
|
|
42
46
|
/** Meta structure produced by _buildDocMeta */
|
|
43
|
-
export interface
|
|
47
|
+
export interface DocMeta {
|
|
44
48
|
type: string;
|
|
45
49
|
title: string;
|
|
46
50
|
trigger: string;
|
|
@@ -58,6 +62,8 @@ export interface BM25DocMeta {
|
|
|
58
62
|
qualityScore: number;
|
|
59
63
|
[key: string]: unknown;
|
|
60
64
|
}
|
|
65
|
+
/** @deprecated Use DocMeta */
|
|
66
|
+
export type BM25DocMeta = DocMeta;
|
|
61
67
|
/** Unified search result item flowing through the ranking pipeline */
|
|
62
68
|
export interface SearchResultItem {
|
|
63
69
|
id: string;
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module tokenizer
|
|
8
8
|
*/
|
|
9
|
-
/** BM25
|
|
9
|
+
/** 评分调参常量(原 BM25 k1/b 参数,BM25Scorer 仍在使用) */
|
|
10
10
|
export const BM25_K1 = 1.2;
|
|
11
11
|
export const BM25_B = 0.75;
|
|
12
12
|
/**
|
|
13
|
-
* 中文停用词表 —
|
|
13
|
+
* 中文停用词表 — 过滤常见虚词/助词/代词/连词,减少搜索噪声
|
|
14
14
|
* 参考 jieba / Elasticsearch smartcn_stop / 百度停用词表
|
|
15
15
|
*/
|
|
16
16
|
const CJK_STOPWORDS = new Set([
|
|
@@ -112,8 +112,8 @@ export class SignalCollector {
|
|
|
112
112
|
this.#logger.info('[SignalCollector] mode=off, skipping start');
|
|
113
113
|
return;
|
|
114
114
|
}
|
|
115
|
-
const
|
|
116
|
-
if (
|
|
115
|
+
const manager = this.#container?.singletons?._aiProviderManager;
|
|
116
|
+
if (manager?.isMock) {
|
|
117
117
|
this.#logger.info('[SignalCollector] no AI provider available, starting in rule-fallback mode');
|
|
118
118
|
}
|
|
119
119
|
if (this.#timer) {
|
|
@@ -217,8 +217,9 @@ export class SignalCollector {
|
|
|
217
217
|
codeChanges: this.#collectCodeChangeSignals(),
|
|
218
218
|
};
|
|
219
219
|
// ── 离线 Fallback: 当 AI 不可用时,降级到 SkillAdvisor 规则引擎 ──
|
|
220
|
-
const
|
|
221
|
-
|
|
220
|
+
const isMock = this.#container?.singletons?._aiProviderManager
|
|
221
|
+
?.isMock ?? true;
|
|
222
|
+
if (!this.#agentFactory || isMock) {
|
|
222
223
|
this.#logger.info('[SignalCollector] AI unavailable, falling back to rule-based analysis');
|
|
223
224
|
return this.#ruleFallback();
|
|
224
225
|
}
|
|
@@ -226,7 +227,7 @@ export class SignalCollector {
|
|
|
226
227
|
const prompt = this.#buildAnalysisPrompt(signals);
|
|
227
228
|
// 3. 调用 Agent 系统进行 AI 分析
|
|
228
229
|
this.#logger.debug('[SignalCollector] invoking Agent for analysis...');
|
|
229
|
-
const agent = this.#agentFactory
|
|
230
|
+
const agent = this.#agentFactory?.createChat({ lang: 'en' });
|
|
230
231
|
const { AgentMessage } = await import('#agent/AgentMessage.js');
|
|
231
232
|
const message = AgentMessage.internal(prompt, { source: 'signal_collector' });
|
|
232
233
|
const result = await agent.execute(message);
|
|
@@ -40,6 +40,10 @@ export class ContextualEnricher {
|
|
|
40
40
|
if (chunks.length === 0) {
|
|
41
41
|
return [];
|
|
42
42
|
}
|
|
43
|
+
// Mock 模式下跳过 AI enrichment,直接返回原始 chunks
|
|
44
|
+
if (this.#aiProvider.name === 'mock') {
|
|
45
|
+
return chunks;
|
|
46
|
+
}
|
|
43
47
|
const systemPrompt = this.#buildSystemPrompt(document);
|
|
44
48
|
const enriched = [];
|
|
45
49
|
for (const chunk of chunks) {
|
|
@@ -206,6 +206,7 @@ const LANG_ALIASES = Object.freeze({
|
|
|
206
206
|
// ═══════════════════════════════════════════════════════════
|
|
207
207
|
const ECO_TO_LANGS = Object.freeze({
|
|
208
208
|
spm: Object.freeze(['swift', 'objectivec']),
|
|
209
|
+
xcode: Object.freeze(['swift', 'objectivec']),
|
|
209
210
|
node: Object.freeze(['javascript', 'typescript']),
|
|
210
211
|
go: Object.freeze(['go']),
|
|
211
212
|
jvm: Object.freeze(['java', 'kotlin']),
|
|
@@ -223,6 +224,8 @@ const BUILD_SYSTEM_MARKERS = Object.freeze([
|
|
|
223
224
|
// Apple / iOS
|
|
224
225
|
{ file: 'Package.swift', eco: 'spm', buildTool: 'SPM' },
|
|
225
226
|
{ file: 'Podfile', eco: 'spm', buildTool: 'CocoaPods' },
|
|
227
|
+
{ file: '*.xcodeproj', eco: 'xcode', buildTool: 'Xcode' },
|
|
228
|
+
{ file: '*.xcworkspace', eco: 'xcode', buildTool: 'Xcode' },
|
|
226
229
|
// JS / TS (lock files before package.json to detect specific tool)
|
|
227
230
|
{ file: 'yarn.lock', eco: 'node', buildTool: 'Yarn' },
|
|
228
231
|
{ file: 'pnpm-lock.yaml', eco: 'node', buildTool: 'pnpm' },
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 开发者身份解析
|
|
3
|
+
*
|
|
4
|
+
* 优先级链:
|
|
5
|
+
* 1. 环境变量 AUTOSNIPPET_USER
|
|
6
|
+
* 2. git config user.name(项目级 → 全局)
|
|
7
|
+
* 3. 操作系统用户名
|
|
8
|
+
* 4. 'unknown'
|
|
9
|
+
*
|
|
10
|
+
* 结果在进程级缓存,避免重复 exec。
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* 同步获取当前开发者标识(缓存)。
|
|
14
|
+
* @param cwd — 用于解析 git config 的工作目录(默认 process.cwd())
|
|
15
|
+
*/
|
|
16
|
+
export declare function getDeveloperIdentity(cwd?: string): string;
|
|
17
|
+
/** 清除缓存(测试用) */
|
|
18
|
+
export declare function clearDeveloperIdentityCache(): void;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 开发者身份解析
|
|
3
|
+
*
|
|
4
|
+
* 优先级链:
|
|
5
|
+
* 1. 环境变量 AUTOSNIPPET_USER
|
|
6
|
+
* 2. git config user.name(项目级 → 全局)
|
|
7
|
+
* 3. 操作系统用户名
|
|
8
|
+
* 4. 'unknown'
|
|
9
|
+
*
|
|
10
|
+
* 结果在进程级缓存,避免重复 exec。
|
|
11
|
+
*/
|
|
12
|
+
import { execSync } from 'node:child_process';
|
|
13
|
+
import { userInfo } from 'node:os';
|
|
14
|
+
let _cached = null;
|
|
15
|
+
/**
|
|
16
|
+
* 同步获取当前开发者标识(缓存)。
|
|
17
|
+
* @param cwd — 用于解析 git config 的工作目录(默认 process.cwd())
|
|
18
|
+
*/
|
|
19
|
+
export function getDeveloperIdentity(cwd) {
|
|
20
|
+
if (_cached) {
|
|
21
|
+
return _cached;
|
|
22
|
+
}
|
|
23
|
+
_cached = resolveDeveloperIdentity(cwd);
|
|
24
|
+
return _cached;
|
|
25
|
+
}
|
|
26
|
+
/** 清除缓存(测试用) */
|
|
27
|
+
export function clearDeveloperIdentityCache() {
|
|
28
|
+
_cached = null;
|
|
29
|
+
}
|
|
30
|
+
function resolveDeveloperIdentity(cwd) {
|
|
31
|
+
// 1. 环境变量
|
|
32
|
+
const envUser = process.env['AUTOSNIPPET_USER'];
|
|
33
|
+
if (envUser?.trim()) {
|
|
34
|
+
return envUser.trim();
|
|
35
|
+
}
|
|
36
|
+
// 2. git config user.name
|
|
37
|
+
try {
|
|
38
|
+
const name = execSync('git config user.name', {
|
|
39
|
+
cwd: cwd || process.cwd(),
|
|
40
|
+
encoding: 'utf-8',
|
|
41
|
+
timeout: 3000,
|
|
42
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
43
|
+
}).trim();
|
|
44
|
+
if (name) {
|
|
45
|
+
return name;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// git 未安装或不在 git repo 中
|
|
50
|
+
}
|
|
51
|
+
// 3. OS 用户名
|
|
52
|
+
try {
|
|
53
|
+
const info = userInfo();
|
|
54
|
+
if (info.username) {
|
|
55
|
+
return info.username;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// 极罕见:userInfo() 在某些容器环境可能失败
|
|
60
|
+
}
|
|
61
|
+
return 'unknown';
|
|
62
|
+
}
|
|
@@ -25,20 +25,20 @@ export declare const KnowledgeTypeEnum: z.ZodEnum<{
|
|
|
25
25
|
"code-pattern": "code-pattern";
|
|
26
26
|
architecture: "architecture";
|
|
27
27
|
"best-practice": "best-practice";
|
|
28
|
-
"
|
|
28
|
+
"module-dependency": "module-dependency";
|
|
29
|
+
"boundary-constraint": "boundary-constraint";
|
|
29
30
|
"code-standard": "code-standard";
|
|
30
31
|
"code-style": "code-style";
|
|
31
32
|
"code-relation": "code-relation";
|
|
32
|
-
"module-dependency": "module-dependency";
|
|
33
|
-
"boundary-constraint": "boundary-constraint";
|
|
34
33
|
"data-flow": "data-flow";
|
|
34
|
+
"event-and-data-flow": "event-and-data-flow";
|
|
35
35
|
solution: "solution";
|
|
36
36
|
"anti-pattern": "anti-pattern";
|
|
37
37
|
}>;
|
|
38
38
|
export declare const ComplexityEnum: z.ZodEnum<{
|
|
39
39
|
intermediate: "intermediate";
|
|
40
|
-
beginner: "beginner";
|
|
41
40
|
advanced: "advanced";
|
|
41
|
+
beginner: "beginner";
|
|
42
42
|
}>;
|
|
43
43
|
export declare const ScopeEnum: z.ZodEnum<{
|
|
44
44
|
universal: "universal";
|
|
@@ -23,51 +23,49 @@ export declare const CreateKnowledgeBody: z.ZodObject<{
|
|
|
23
23
|
title: z.ZodString;
|
|
24
24
|
content: z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>]>;
|
|
25
25
|
description: z.ZodOptional<z.ZodString>;
|
|
26
|
-
kind: z.ZodOptional<z.ZodEnum<{
|
|
26
|
+
kind: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
27
27
|
pattern: "pattern";
|
|
28
28
|
rule: "rule";
|
|
29
29
|
fact: "fact";
|
|
30
|
-
}
|
|
30
|
+
}>>>;
|
|
31
31
|
language: z.ZodOptional<z.ZodString>;
|
|
32
32
|
category: z.ZodOptional<z.ZodString>;
|
|
33
33
|
knowledgeType: z.ZodOptional<z.ZodString>;
|
|
34
|
-
complexity: z.ZodOptional<z.
|
|
35
|
-
|
|
36
|
-
basic: "basic";
|
|
37
|
-
advanced: "advanced";
|
|
38
|
-
}>>;
|
|
39
|
-
scope: z.ZodOptional<z.ZodEnum<{
|
|
40
|
-
universal: "universal";
|
|
41
|
-
project: "project";
|
|
42
|
-
team: "team";
|
|
43
|
-
personal: "personal";
|
|
44
|
-
}>>;
|
|
34
|
+
complexity: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
35
|
+
scope: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
45
36
|
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
46
|
-
}, z.core.$
|
|
37
|
+
}, z.core.$loose>;
|
|
47
38
|
export declare const UpdateKnowledgeBody: z.ZodObject<{
|
|
48
39
|
title: z.ZodOptional<z.ZodString>;
|
|
49
40
|
description: z.ZodOptional<z.ZodString>;
|
|
50
41
|
content: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>]>>;
|
|
51
|
-
kind: z.ZodOptional<z.ZodEnum<{
|
|
42
|
+
kind: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
52
43
|
pattern: "pattern";
|
|
53
44
|
rule: "rule";
|
|
54
45
|
fact: "fact";
|
|
55
|
-
}
|
|
46
|
+
}>>>;
|
|
56
47
|
language: z.ZodOptional<z.ZodString>;
|
|
57
48
|
category: z.ZodOptional<z.ZodString>;
|
|
58
49
|
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
59
|
-
}, z.core.$
|
|
50
|
+
}, z.core.$loose>;
|
|
60
51
|
export declare const DeprecateKnowledgeBody: z.ZodObject<{
|
|
61
52
|
reason: z.ZodString;
|
|
62
53
|
}, z.core.$strip>;
|
|
63
54
|
export declare const BatchPublishBody: z.ZodObject<{
|
|
64
55
|
ids: z.ZodArray<z.ZodString>;
|
|
65
56
|
}, z.core.$strip>;
|
|
57
|
+
export declare const BatchDeleteBody: z.ZodObject<{
|
|
58
|
+
ids: z.ZodArray<z.ZodString>;
|
|
59
|
+
}, z.core.$strip>;
|
|
60
|
+
export declare const BatchDeprecateBody: z.ZodObject<{
|
|
61
|
+
ids: z.ZodArray<z.ZodString>;
|
|
62
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
63
|
+
}, z.core.$strip>;
|
|
66
64
|
export declare const KnowledgeUsageBody: z.ZodObject<{
|
|
67
65
|
type: z.ZodDefault<z.ZodEnum<{
|
|
66
|
+
view: "view";
|
|
68
67
|
feedback: "feedback";
|
|
69
68
|
adoption: "adoption";
|
|
70
|
-
view: "view";
|
|
71
69
|
}>>;
|
|
72
70
|
feedback: z.ZodOptional<z.ZodUnknown>;
|
|
73
71
|
}, z.core.$strip>;
|
|
@@ -240,6 +238,10 @@ export declare const ModuleBootstrapBody: z.ZodObject<{
|
|
|
240
238
|
skipGuard: z.ZodDefault<z.ZodBoolean>;
|
|
241
239
|
contentMaxLines: z.ZodDefault<z.ZodNumber>;
|
|
242
240
|
}, z.core.$strip>;
|
|
241
|
+
export declare const ModuleRescanBody: z.ZodObject<{
|
|
242
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
243
|
+
dimensions: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
244
|
+
}, z.core.$strip>;
|
|
243
245
|
export declare const GraphQuery: z.ZodObject<{
|
|
244
246
|
nodeId: z.ZodString;
|
|
245
247
|
nodeType: z.ZodString;
|
|
@@ -30,28 +30,31 @@ const PaginationQuery = z.object({
|
|
|
30
30
|
limit: z.coerce.number().int().min(1).max(1000).default(20),
|
|
31
31
|
});
|
|
32
32
|
// ═══ Knowledge ═══════════════════════════════════
|
|
33
|
-
export const CreateKnowledgeBody = z
|
|
33
|
+
export const CreateKnowledgeBody = z
|
|
34
|
+
.object({
|
|
34
35
|
title: z.string().min(1, 'title is required'),
|
|
35
36
|
content: z.union([z.string().min(1), z.record(z.string(), z.unknown())]),
|
|
36
37
|
description: z.string().optional(),
|
|
37
|
-
kind: z.enum(['rule', 'pattern', 'fact']).
|
|
38
|
+
kind: z.enum(['rule', 'pattern', 'fact']).nullish(),
|
|
38
39
|
language: z.string().optional(),
|
|
39
40
|
category: z.string().optional(),
|
|
40
41
|
knowledgeType: z.string().optional(),
|
|
41
|
-
complexity: z.
|
|
42
|
-
scope: z.
|
|
42
|
+
complexity: z.string().nullish(),
|
|
43
|
+
scope: z.string().nullish(),
|
|
43
44
|
tags: z.array(z.string()).optional(),
|
|
44
|
-
})
|
|
45
|
+
})
|
|
46
|
+
.loose();
|
|
45
47
|
export const UpdateKnowledgeBody = z
|
|
46
48
|
.object({
|
|
47
49
|
title: z.string().min(1).optional(),
|
|
48
50
|
description: z.string().optional(),
|
|
49
51
|
content: z.union([z.string(), z.record(z.string(), z.unknown())]).optional(),
|
|
50
|
-
kind: z.enum(['rule', 'pattern', 'fact']).
|
|
52
|
+
kind: z.enum(['rule', 'pattern', 'fact']).nullish(),
|
|
51
53
|
language: z.string().optional(),
|
|
52
54
|
category: z.string().optional(),
|
|
53
55
|
tags: z.array(z.string()).optional(),
|
|
54
56
|
})
|
|
57
|
+
.loose()
|
|
55
58
|
.refine((data) => Object.keys(data).length > 0, {
|
|
56
59
|
message: 'At least one field must be provided for update',
|
|
57
60
|
});
|
|
@@ -59,6 +62,10 @@ export const DeprecateKnowledgeBody = z.object({
|
|
|
59
62
|
reason: z.string().min(1, 'reason is required'),
|
|
60
63
|
});
|
|
61
64
|
export const BatchPublishBody = BatchIds;
|
|
65
|
+
export const BatchDeleteBody = BatchIds;
|
|
66
|
+
export const BatchDeprecateBody = BatchIds.extend({
|
|
67
|
+
reason: z.string().optional(),
|
|
68
|
+
});
|
|
62
69
|
export const KnowledgeUsageBody = z.object({
|
|
63
70
|
type: z.enum(['adoption', 'view', 'feedback']).default('adoption'),
|
|
64
71
|
feedback: z.unknown().optional(),
|
|
@@ -236,6 +243,10 @@ export const ModuleBootstrapBody = z.object({
|
|
|
236
243
|
skipGuard: z.boolean().default(false),
|
|
237
244
|
contentMaxLines: z.number().int().min(1).max(10000).default(120),
|
|
238
245
|
});
|
|
246
|
+
export const ModuleRescanBody = z.object({
|
|
247
|
+
reason: z.string().optional(),
|
|
248
|
+
dimensions: z.array(z.string()).optional(),
|
|
249
|
+
});
|
|
239
250
|
// ═══ Graph Search ════════════════════════════════
|
|
240
251
|
export const GraphQuery = z.object({
|
|
241
252
|
nodeId: z.string().min(1, 'nodeId is required'),
|