( skill: Skill, llmContext: LlmCallContext, logger?: LoggerLike, )
| 552 | } |
| 553 | |
| 554 | async function scanSkillMetadata( |
| 555 | skill: Skill, |
| 556 | llmContext: LlmCallContext, |
| 557 | logger?: LoggerLike, |
| 558 | ): Promise<{ metadataSummary: string; warning: Warning | null }> { |
| 559 | const metadataDetection = await detectSkillMetadataRisk(skill, llmContext, logger); |
| 560 | if (!metadataDetection) { |
| 561 | return { metadataSummary: "", warning: null }; |
| 562 | } |
| 563 | |
| 564 | if (metadataDetection.metadataRisk) { |
| 565 | logger?.warn(`[FoundationScan] metadata blocked: skill=${skill.name ?? "(unknown)"}, reason=${metadataDetection.reason || "metadata judged as risky"}`); |
| 566 | return { |
| 567 | metadataSummary: "", |
| 568 | warning: createMaliciousWarning( |
| 569 | `[METADATA ANALYSIS] Skill '${skill.name}' contains malicious intent in its definition.\n` + |
| 570 | `📋 Skill File: ${skill.filePath}\n` + |
| 571 | `⚠️ Detection Type: Metadata Risk (Semantic Analysis)\n` + |
| 572 | `🔍 Specific Reason: ${metadataDetection.reason || "Unspecified malicious intent detected in skill metadata"}\n` + |
| 573 | `💡 Impact: This skill's definition suggests it may attempt to bypass security controls or perform unauthorized actions.` |
| 574 | ), |
| 575 | }; |
| 576 | } |
| 577 | |
| 578 | const metadataSummary = metadataDetection.capabilitySummary || ""; |
| 579 | logger?.info(`[FoundationScan] metadata summary generated: skill=${skill.name ?? "(unknown)"}, summaryLength=${metadataSummary.length}`); |
| 580 | return { metadataSummary, warning: null }; |
| 581 | } |
| 582 | |
| 583 | async function scanSkillFile( |
| 584 | skill: Skill, |
no test coverage detected