@aigrc/core 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/detection/patterns/registry.ts","../src/detection/patterns/python.ts","../src/detection/patterns/javascript.ts","../src/detection/patterns/model-files.ts","../src/detection/patterns/risk-indicators.ts","../src/index.ts","../src/schemas/index.ts","../src/classification.ts","../src/asset-card.ts","../src/golden-thread.ts","../src/detection/types.ts","../src/detection/scanner.ts","../src/detection/patterns/index.ts","../src/detection/strategies/pattern-matcher.ts","../src/detection/strategies/import-analyzer.ts","../src/detection/strategies/file-scanner.ts","../src/detection/strategies/annotation-detector.ts","../src/detection/risk-inference.ts","../src/detection/asset-suggestion.ts","../src/detection/index.ts","../src/utils.ts"],"sourcesContent":["import type { PatternDefinition, RiskImplication, FrameworkCategory, PatternLanguage } from \"../types\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// PATTERN REGISTRY\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nconst registry: Map<string, PatternDefinition> = new Map();\r\n\r\nexport function registerPattern(pattern: PatternDefinition): void {\r\n if (registry.has(pattern.id)) {\r\n throw new Error(`Pattern with ID \"${pattern.id}\" already registered`);\r\n }\r\n registry.set(pattern.id, pattern);\r\n}\r\n\r\nexport function getPattern(id: string): PatternDefinition | undefined {\r\n return registry.get(id);\r\n}\r\n\r\nexport function getAllPatterns(): PatternDefinition[] {\r\n return Array.from(registry.values());\r\n}\r\n\r\nexport function getPatternsByCategory(category: FrameworkCategory): PatternDefinition[] {\r\n return getAllPatterns().filter((p) => p.category === category);\r\n}\r\n\r\nexport function getPatternsByLanguage(language: PatternLanguage): PatternDefinition[] {\r\n return getAllPatterns().filter((p) => p.language === language || p.language === \"any\");\r\n}\r\n\r\nexport function clearRegistry(): void {\r\n registry.clear();\r\n}\r\n\r\nexport function isRegistryInitialized(): boolean {\r\n return registry.size > 0;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// IMPLICATION HELPERS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport function createImplication(\r\n factor: RiskImplication[\"factor\"],\r\n value: RiskImplication[\"value\"],\r\n reason: string\r\n): RiskImplication {\r\n return { factor, value, reason };\r\n}\r\n","import type { PatternDefinition } from \"../types\";\r\nimport { registerPattern, createImplication } from \"./registry\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// PYTHON AI FRAMEWORK PATTERNS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nconst pythonPatterns: PatternDefinition[] = [\r\n // ─────────────────────────────────────────────────────────────────\r\n // ML FRAMEWORKS\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"pytorch\",\r\n name: \"PyTorch\",\r\n category: \"ml_framework\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"import torch\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"from torch\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"torch\\\\.nn\\\\.\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"torch\\\\.tensor\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"torch\\\\.cuda\", confidence: \"medium\" },\r\n ],\r\n implies: [],\r\n },\r\n {\r\n id: \"tensorflow\",\r\n name: \"TensorFlow\",\r\n category: \"ml_framework\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"import tensorflow\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"from tensorflow\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"tf\\\\.keras\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"tf\\\\.data\", confidence: \"medium\" },\r\n ],\r\n implies: [],\r\n },\r\n {\r\n id: \"keras\",\r\n name: \"Keras\",\r\n category: \"ml_framework\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"import keras\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"from keras\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"Sequential\\\\(\", confidence: \"medium\" },\r\n ],\r\n implies: [],\r\n },\r\n {\r\n id: \"scikit-learn\",\r\n name: \"Scikit-learn\",\r\n category: \"ml_framework\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"import sklearn\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"from sklearn\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"\\\\.fit\\\\(\", confidence: \"low\" },\r\n { type: \"regex\", pattern: \"\\\\.predict\\\\(\", confidence: \"low\" },\r\n ],\r\n implies: [],\r\n },\r\n\r\n // ─────────────────────────────────────────────────────────────────\r\n // LLM PROVIDERS\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"openai-python\",\r\n name: \"OpenAI Python SDK\",\r\n category: \"llm_provider\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"from openai\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"import openai\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"OpenAI\\\\s*\\\\(\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"client\\\\.chat\\\\.completions\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"ChatCompletion\\\\.create\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"OpenAI SDK calls external API\"),\r\n ],\r\n },\r\n {\r\n id: \"anthropic-python\",\r\n name: \"Anthropic Python SDK\",\r\n category: \"llm_provider\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"from anthropic\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"import anthropic\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"Anthropic\\\\s*\\\\(\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"client\\\\.messages\\\\.create\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"Anthropic SDK calls external API\"),\r\n ],\r\n },\r\n {\r\n id: \"cohere-python\",\r\n name: \"Cohere Python SDK\",\r\n category: \"llm_provider\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"import cohere\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"from cohere\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"cohere\\\\.Client\", confidence: \"high\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"Cohere SDK calls external API\"),\r\n ],\r\n },\r\n {\r\n id: \"google-genai\",\r\n name: \"Google Generative AI\",\r\n category: \"llm_provider\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"import google.generativeai\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"from google.generativeai\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"genai\\\\.GenerativeModel\", confidence: \"high\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"Google GenAI SDK calls external API\"),\r\n ],\r\n },\r\n\r\n // ─────────────────────────────────────────────────────────────────\r\n // FRAMEWORKS\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"huggingface-transformers\",\r\n name: \"Hugging Face Transformers\",\r\n category: \"framework\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"from transformers\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"import transformers\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"AutoModel\\\\.from_pretrained\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"AutoTokenizer\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"pipeline\\\\s*\\\\(\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"Hugging Face typically loads models from Hub\"),\r\n ],\r\n },\r\n {\r\n id: \"langchain-python\",\r\n name: \"LangChain\",\r\n category: \"framework\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"from langchain\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"import langchain\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"from langchain_core\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"from langchain_openai\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"from langchain_anthropic\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"from langchain_community\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"LLMChain\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"ChatPromptTemplate\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"\\\\.invoke\\\\s*\\\\(\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"toolExecution\", true, \"LangChain supports tool/function calling\"),\r\n createImplication(\"externalDataAccess\", true, \"LangChain chains often access external data\"),\r\n ],\r\n },\r\n {\r\n id: \"llamaindex\",\r\n name: \"LlamaIndex\",\r\n category: \"framework\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"from llama_index\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"import llama_index\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"VectorStoreIndex\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"ServiceContext\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"SimpleDirectoryReader\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"LlamaIndex typically ingests external data\"),\r\n ],\r\n },\r\n\r\n // ─────────────────────────────────────────────────────────────────\r\n // AGENT FRAMEWORKS\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"crewai\",\r\n name: \"CrewAI\",\r\n category: \"agent_framework\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"from crewai\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"import crewai\", confidence: \"high\" },\r\n { type: \"decorator\", pattern: \"@agent\", confidence: \"high\" },\r\n { type: \"decorator\", pattern: \"@task\", confidence: \"high\" },\r\n { type: \"decorator\", pattern: \"@crew\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"Crew\\\\s*\\\\(\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"Agent\\\\s*\\\\(\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"autonomousDecisions\", true, \"CrewAI enables autonomous agent orchestration\"),\r\n createImplication(\"toolExecution\", true, \"CrewAI agents execute tools autonomously\"),\r\n ],\r\n },\r\n {\r\n id: \"autogen\",\r\n name: \"AutoGen\",\r\n category: \"agent_framework\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"from autogen\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"import autogen\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"AssistantAgent\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"UserProxyAgent\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"GroupChat\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"autonomousDecisions\", true, \"AutoGen enables multi-agent autonomous systems\"),\r\n createImplication(\"toolExecution\", true, \"AutoGen agents can execute code and tools\"),\r\n ],\r\n },\r\n {\r\n id: \"langgraph\",\r\n name: \"LangGraph\",\r\n category: \"agent_framework\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"from langgraph\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"import langgraph\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"StateGraph\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"add_node\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"add_edge\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"autonomousDecisions\", true, \"LangGraph enables stateful agent workflows\"),\r\n createImplication(\"toolExecution\", true, \"LangGraph agents execute tools in graph nodes\"),\r\n ],\r\n },\r\n {\r\n id: \"agency-swarm\",\r\n name: \"Agency Swarm\",\r\n category: \"agent_framework\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"from agency_swarm\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"Agency\\\\s*\\\\(\", confidence: \"high\" },\r\n ],\r\n implies: [\r\n createImplication(\"autonomousDecisions\", true, \"Agency Swarm enables multi-agent systems\"),\r\n createImplication(\"toolExecution\", true, \"Agency Swarm agents execute tools\"),\r\n ],\r\n },\r\n\r\n // ─────────────────────────────────────────────────────────────────\r\n // ML OPS\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"mlflow\",\r\n name: \"MLflow\",\r\n category: \"ml_ops\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"import mlflow\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"from mlflow\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"mlflow\\\\.log_\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"mlflow\\\\.start_run\", confidence: \"medium\" },\r\n ],\r\n implies: [],\r\n },\r\n {\r\n id: \"wandb\",\r\n name: \"Weights & Biases\",\r\n category: \"ml_ops\",\r\n language: \"python\",\r\n patterns: [\r\n { type: \"import\", pattern: \"import wandb\", confidence: \"high\" },\r\n { type: \"import\", pattern: \"from wandb\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"wandb\\\\.init\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"W&B syncs to external service\"),\r\n ],\r\n },\r\n];\r\n\r\nexport function registerPythonPatterns(): void {\r\n pythonPatterns.forEach(registerPattern);\r\n}\r\n\r\nexport { pythonPatterns };\r\n","import type { PatternDefinition } from \"../types\";\r\nimport { registerPattern, createImplication } from \"./registry\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// JAVASCRIPT/TYPESCRIPT AI FRAMEWORK PATTERNS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nconst javascriptPatterns: PatternDefinition[] = [\r\n // ─────────────────────────────────────────────────────────────────\r\n // LLM PROVIDERS\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"openai-js\",\r\n name: \"OpenAI JavaScript SDK\",\r\n category: \"llm_provider\",\r\n language: \"javascript\",\r\n patterns: [\r\n { type: \"import\", pattern: 'from \"openai\"', confidence: \"high\" },\r\n { type: \"import\", pattern: \"from 'openai'\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"new OpenAI\\\\s*\\\\(\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"openai\\\\.chat\\\\.completions\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"OpenAI SDK calls external API\"),\r\n ],\r\n },\r\n {\r\n id: \"anthropic-js\",\r\n name: \"Anthropic JavaScript SDK\",\r\n category: \"llm_provider\",\r\n language: \"javascript\",\r\n patterns: [\r\n { type: \"import\", pattern: 'from \"@anthropic-ai/sdk\"', confidence: \"high\" },\r\n { type: \"import\", pattern: \"from '@anthropic-ai/sdk'\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"new Anthropic\\\\s*\\\\(\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"\\\\.messages\\\\.create\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"Anthropic SDK calls external API\"),\r\n ],\r\n },\r\n {\r\n id: \"cohere-js\",\r\n name: \"Cohere JavaScript SDK\",\r\n category: \"llm_provider\",\r\n language: \"javascript\",\r\n patterns: [\r\n { type: \"import\", pattern: 'from \"cohere-ai\"', confidence: \"high\" },\r\n { type: \"import\", pattern: \"from 'cohere-ai'\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"new CohereClient\", confidence: \"high\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"Cohere SDK calls external API\"),\r\n ],\r\n },\r\n {\r\n id: \"replicate-js\",\r\n name: \"Replicate\",\r\n category: \"llm_provider\",\r\n language: \"javascript\",\r\n patterns: [\r\n { type: \"import\", pattern: 'from \"replicate\"', confidence: \"high\" },\r\n { type: \"import\", pattern: \"from 'replicate'\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"new Replicate\\\\s*\\\\(\", confidence: \"high\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"Replicate SDK calls external API\"),\r\n ],\r\n },\r\n {\r\n id: \"huggingface-js\",\r\n name: \"Hugging Face Inference\",\r\n category: \"llm_provider\",\r\n language: \"javascript\",\r\n patterns: [\r\n { type: \"import\", pattern: 'from \"@huggingface/inference\"', confidence: \"high\" },\r\n { type: \"import\", pattern: \"from '@huggingface/inference'\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"HfInference\\\\s*\\\\(\", confidence: \"high\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"Hugging Face SDK calls external API\"),\r\n ],\r\n },\r\n {\r\n id: \"together-js\",\r\n name: \"Together AI\",\r\n category: \"llm_provider\",\r\n language: \"javascript\",\r\n patterns: [\r\n { type: \"import\", pattern: 'from \"together-ai\"', confidence: \"high\" },\r\n { type: \"import\", pattern: \"from 'together-ai'\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"new Together\\\\s*\\\\(\", confidence: \"high\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"Together AI SDK calls external API\"),\r\n ],\r\n },\r\n {\r\n id: \"groq-js\",\r\n name: \"Groq SDK\",\r\n category: \"llm_provider\",\r\n language: \"javascript\",\r\n patterns: [\r\n { type: \"import\", pattern: 'from \"groq-sdk\"', confidence: \"high\" },\r\n { type: \"import\", pattern: \"from 'groq-sdk'\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"new Groq\\\\s*\\\\(\", confidence: \"high\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"Groq SDK calls external API\"),\r\n ],\r\n },\r\n\r\n // ─────────────────────────────────────────────────────────────────\r\n // FRAMEWORKS\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"langchain-js\",\r\n name: \"LangChain.js\",\r\n category: \"framework\",\r\n language: \"javascript\",\r\n patterns: [\r\n { type: \"import\", pattern: 'from \"langchain\"', confidence: \"high\" },\r\n { type: \"import\", pattern: \"from 'langchain'\", confidence: \"high\" },\r\n { type: \"import\", pattern: 'from \"@langchain/core\"', confidence: \"high\" },\r\n { type: \"import\", pattern: 'from \"@langchain/openai\"', confidence: \"high\" },\r\n { type: \"import\", pattern: 'from \"@langchain/anthropic\"', confidence: \"high\" },\r\n { type: \"import\", pattern: 'from \"@langchain/community\"', confidence: \"high\" },\r\n { type: \"regex\", pattern: \"new ChatOpenAI\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"ChatPromptTemplate\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"\\\\.invoke\\\\s*\\\\(\", confidence: \"low\" },\r\n ],\r\n implies: [\r\n createImplication(\"toolExecution\", true, \"LangChain.js supports tool calling\"),\r\n createImplication(\"externalDataAccess\", true, \"LangChain.js chains access external data\"),\r\n ],\r\n },\r\n {\r\n id: \"vercel-ai-sdk\",\r\n name: \"Vercel AI SDK\",\r\n category: \"framework\",\r\n language: \"javascript\",\r\n patterns: [\r\n { type: \"import\", pattern: 'from \"ai\"', confidence: \"medium\" },\r\n { type: \"import\", pattern: \"from 'ai'\", confidence: \"medium\" },\r\n { type: \"import\", pattern: 'from \"ai/react\"', confidence: \"high\" },\r\n { type: \"import\", pattern: 'from \"@ai-sdk/openai\"', confidence: \"high\" },\r\n { type: \"import\", pattern: 'from \"@ai-sdk/anthropic\"', confidence: \"high\" },\r\n { type: \"regex\", pattern: \"generateText\\\\s*\\\\(\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"streamText\\\\s*\\\\(\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"useChat\\\\s*\\\\(\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"useCompletion\\\\s*\\\\(\", confidence: \"high\" },\r\n ],\r\n implies: [\r\n createImplication(\"customerFacing\", true, \"Vercel AI SDK typically used in user-facing apps\"),\r\n createImplication(\"externalDataAccess\", true, \"Vercel AI SDK calls LLM providers\"),\r\n ],\r\n },\r\n {\r\n id: \"llamaindex-js\",\r\n name: \"LlamaIndex.TS\",\r\n category: \"framework\",\r\n language: \"javascript\",\r\n patterns: [\r\n { type: \"import\", pattern: 'from \"llamaindex\"', confidence: \"high\" },\r\n { type: \"import\", pattern: \"from 'llamaindex'\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"VectorStoreIndex\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"LlamaIndex typically ingests external data\"),\r\n ],\r\n },\r\n\r\n // ─────────────────────────────────────────────────────────────────\r\n // ML FRAMEWORKS\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"tensorflow-js\",\r\n name: \"TensorFlow.js\",\r\n category: \"ml_framework\",\r\n language: \"javascript\",\r\n patterns: [\r\n { type: \"import\", pattern: 'from \"@tensorflow/tfjs\"', confidence: \"high\" },\r\n { type: \"import\", pattern: \"from '@tensorflow/tfjs'\", confidence: \"high\" },\r\n { type: \"import\", pattern: 'from \"@tensorflow/tfjs-node\"', confidence: \"high\" },\r\n { type: \"regex\", pattern: \"tf\\\\.loadLayersModel\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"tf\\\\.sequential\", confidence: \"medium\" },\r\n ],\r\n implies: [],\r\n },\r\n {\r\n id: \"onnxruntime-js\",\r\n name: \"ONNX Runtime Web\",\r\n category: \"ml_framework\",\r\n language: \"javascript\",\r\n patterns: [\r\n { type: \"import\", pattern: 'from \"onnxruntime-web\"', confidence: \"high\" },\r\n { type: \"import\", pattern: 'from \"onnxruntime-node\"', confidence: \"high\" },\r\n { type: \"regex\", pattern: \"InferenceSession\\\\.create\", confidence: \"high\" },\r\n ],\r\n implies: [],\r\n },\r\n {\r\n id: \"transformers-js\",\r\n name: \"Transformers.js\",\r\n category: \"ml_framework\",\r\n language: \"javascript\",\r\n patterns: [\r\n { type: \"import\", pattern: 'from \"@xenova/transformers\"', confidence: \"high\" },\r\n { type: \"import\", pattern: 'from \"@huggingface/transformers\"', confidence: \"high\" },\r\n { type: \"regex\", pattern: \"pipeline\\\\s*\\\\(\", confidence: \"medium\" },\r\n ],\r\n implies: [],\r\n },\r\n\r\n // ─────────────────────────────────────────────────────────────────\r\n // AGENT FRAMEWORKS\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"langgraph-js\",\r\n name: \"LangGraph.js\",\r\n category: \"agent_framework\",\r\n language: \"javascript\",\r\n patterns: [\r\n { type: \"import\", pattern: 'from \"@langchain/langgraph\"', confidence: \"high\" },\r\n { type: \"regex\", pattern: \"StateGraph\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"addNode\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"autonomousDecisions\", true, \"LangGraph enables stateful agent workflows\"),\r\n createImplication(\"toolExecution\", true, \"LangGraph agents execute tools\"),\r\n ],\r\n },\r\n {\r\n id: \"autogen-js\",\r\n name: \"AutoGen.js\",\r\n category: \"agent_framework\",\r\n language: \"javascript\",\r\n patterns: [\r\n { type: \"import\", pattern: 'from \"autogen\"', confidence: \"high\" },\r\n { type: \"regex\", pattern: \"AssistantAgent\", confidence: \"high\" },\r\n ],\r\n implies: [\r\n createImplication(\"autonomousDecisions\", true, \"AutoGen enables multi-agent systems\"),\r\n createImplication(\"toolExecution\", true, \"AutoGen agents execute tools\"),\r\n ],\r\n },\r\n];\r\n\r\nexport function registerJavaScriptPatterns(): void {\r\n javascriptPatterns.forEach(registerPattern);\r\n}\r\n\r\nexport { javascriptPatterns };\r\n","import type { PatternDefinition } from \"../types\";\r\nimport { registerPattern } from \"./registry\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// MODEL FILE PATTERNS (File Extension Based)\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nconst modelFilePatterns: PatternDefinition[] = [\r\n {\r\n id: \"pytorch-model\",\r\n name: \"PyTorch Model File\",\r\n category: \"model_file\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"literal\", pattern: \".pt\", confidence: \"high\" },\r\n { type: \"literal\", pattern: \".pth\", confidence: \"high\" },\r\n { type: \"literal\", pattern: \".bin\", confidence: \"medium\", description: \"May be transformer weights\" },\r\n ],\r\n implies: [],\r\n },\r\n {\r\n id: \"safetensors-model\",\r\n name: \"SafeTensors Model File\",\r\n category: \"model_file\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"literal\", pattern: \".safetensors\", confidence: \"high\" },\r\n ],\r\n implies: [],\r\n },\r\n {\r\n id: \"onnx-model\",\r\n name: \"ONNX Model File\",\r\n category: \"model_file\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"literal\", pattern: \".onnx\", confidence: \"high\" },\r\n ],\r\n implies: [],\r\n },\r\n {\r\n id: \"keras-model\",\r\n name: \"Keras/TensorFlow Model File\",\r\n category: \"model_file\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"literal\", pattern: \".h5\", confidence: \"high\" },\r\n { type: \"literal\", pattern: \".keras\", confidence: \"high\" },\r\n { type: \"literal\", pattern: \".pb\", confidence: \"medium\", description: \"TensorFlow frozen graph\" },\r\n ],\r\n implies: [],\r\n },\r\n {\r\n id: \"sklearn-model\",\r\n name: \"Scikit-learn Model File\",\r\n category: \"model_file\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"literal\", pattern: \".pkl\", confidence: \"low\", description: \"Could be any pickle file\" },\r\n { type: \"literal\", pattern: \".joblib\", confidence: \"high\" },\r\n ],\r\n implies: [],\r\n },\r\n {\r\n id: \"model-config\",\r\n name: \"Model Configuration File\",\r\n category: \"model_file\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"regex\", pattern: \"config\\\\.json$\", confidence: \"low\", description: \"May be model config\" },\r\n { type: \"regex\", pattern: \"model\\\\.json$\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"adapter_config\\\\.json$\", confidence: \"high\", description: \"LoRA adapter\" },\r\n { type: \"regex\", pattern: \"tokenizer\\\\.json$\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"tokenizer_config\\\\.json$\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"generation_config\\\\.json$\", confidence: \"high\" },\r\n ],\r\n implies: [],\r\n },\r\n {\r\n id: \"gguf-model\",\r\n name: \"GGUF Model File\",\r\n category: \"model_file\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"literal\", pattern: \".gguf\", confidence: \"high\", description: \"llama.cpp format\" },\r\n { type: \"literal\", pattern: \".ggml\", confidence: \"high\", description: \"Legacy GGML format\" },\r\n ],\r\n implies: [],\r\n },\r\n {\r\n id: \"mlx-model\",\r\n name: \"MLX Model File\",\r\n category: \"model_file\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"literal\", pattern: \".npz\", confidence: \"low\", description: \"May be MLX weights\" },\r\n ],\r\n implies: [],\r\n },\r\n];\r\n\r\nexport function registerModelFilePatterns(): void {\r\n modelFilePatterns.forEach(registerPattern);\r\n}\r\n\r\nexport { modelFilePatterns };\r\n","import type { PatternDefinition } from \"../types\";\r\nimport { registerPattern, createImplication } from \"./registry\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// RISK FACTOR INDICATOR PATTERNS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nconst riskIndicatorPatterns: PatternDefinition[] = [\r\n // ─────────────────────────────────────────────────────────────────\r\n // AUTONOMOUS EXECUTION\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"autonomous-execution\",\r\n name: \"Autonomous Execution Patterns\",\r\n category: \"framework\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"regex\", pattern: \"\\\\.invoke\\\\s*\\\\(\", confidence: \"medium\", description: \"Agent invocation\" },\r\n { type: \"regex\", pattern: \"\\\\.run\\\\s*\\\\(\", confidence: \"low\", description: \"Run method (generic)\" },\r\n { type: \"regex\", pattern: \"while\\\\s+True\", confidence: \"medium\", description: \"Potential agent loop (Python)\" },\r\n { type: \"regex\", pattern: \"while\\\\s*\\\\(\\\\s*true\\\\s*\\\\)\", confidence: \"medium\", description: \"Potential agent loop (JS)\" },\r\n { type: \"regex\", pattern: \"agent\\\\.execute\", confidence: \"high\", description: \"Agent execution\" },\r\n { type: \"regex\", pattern: \"AgentExecutor\", confidence: \"high\", description: \"LangChain agent executor\" },\r\n ],\r\n implies: [\r\n createImplication(\"autonomousDecisions\", true, \"Pattern indicates autonomous execution capability\"),\r\n ],\r\n },\r\n\r\n // ─────────────────────────────────────────────────────────────────\r\n // TOOL EXECUTION\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"tool-execution\",\r\n name: \"Tool Execution Patterns\",\r\n category: \"framework\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"decorator\", pattern: \"@tool\", confidence: \"high\", description: \"Tool decorator\" },\r\n { type: \"regex\", pattern: \"function_calling\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"tools\\\\s*[=:]\\\\s*\\\\[\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"bind_tools\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"create_tool\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"StructuredTool\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"BaseTool\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"mcp_server\", confidence: \"high\", description: \"MCP tool server\" },\r\n { type: \"regex\", pattern: \"McpServer\", confidence: \"high\", description: \"MCP server\" },\r\n ],\r\n implies: [\r\n createImplication(\"toolExecution\", true, \"Pattern indicates tool execution capability\"),\r\n ],\r\n },\r\n\r\n // ─────────────────────────────────────────────────────────────────\r\n // EXTERNAL DATA ACCESS\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"external-data-access\",\r\n name: \"External Data Access Patterns\",\r\n category: \"framework\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"regex\", pattern: \"requests\\\\.(get|post|put|delete|patch)\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"fetch\\\\s*\\\\(\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"axios\\\\.\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"httpx\\\\.\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"aiohttp\\\\.\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"WebBrowser\", confidence: \"high\", description: \"Web browsing capability\" },\r\n { type: \"regex\", pattern: \"Retriever\", confidence: \"medium\", description: \"RAG retrieval\" },\r\n { type: \"regex\", pattern: \"VectorStore\", confidence: \"medium\", description: \"Vector database access\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"Pattern indicates external data access\"),\r\n ],\r\n },\r\n\r\n // ─────────────────────────────────────────────────────────────────\r\n // DATABASE ACCESS\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"database-access\",\r\n name: \"Database Access Patterns\",\r\n category: \"framework\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"regex\", pattern: \"SQLDatabase\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"create_sql_agent\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"sql_agent\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"MongoClient\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"psycopg\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"pymongo\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"externalDataAccess\", true, \"Pattern indicates database access\"),\r\n ],\r\n },\r\n\r\n // ─────────────────────────────────────────────────────────────────\r\n // PII PROCESSING\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"pii-processing\",\r\n name: \"PII Processing Patterns\",\r\n category: \"framework\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"regex\", pattern: \"email|e-mail|e_mail\", confidence: \"low\" },\r\n { type: \"regex\", pattern: \"phone_number|phone|telephone|mobile\", confidence: \"low\" },\r\n { type: \"regex\", pattern: \"ssn|social_security|social-security\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"password|passwd|pwd\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"credit_card|creditcard|cc_number\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"date_of_birth|dob|birthdate\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"address|street|city|zipcode|zip_code\", confidence: \"low\" },\r\n { type: \"regex\", pattern: \"passport|driver_license|drivers_license\", confidence: \"high\" },\r\n ],\r\n implies: [\r\n createImplication(\"piiProcessing\", \"yes\", \"Pattern suggests PII handling\"),\r\n ],\r\n },\r\n\r\n // ─────────────────────────────────────────────────────────────────\r\n // HIGH-STAKES DECISIONS\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"high-stakes-medical\",\r\n name: \"Medical/Healthcare Patterns\",\r\n category: \"framework\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"regex\", pattern: \"medical|diagnosis|patient|treatment\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"healthcare|health_care|clinical\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"prescription|medication|drug\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"symptom|disease|condition\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"highStakesDecisions\", true, \"Pattern indicates medical/healthcare domain\"),\r\n ],\r\n },\r\n {\r\n id: \"high-stakes-legal\",\r\n name: \"Legal Patterns\",\r\n category: \"framework\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"regex\", pattern: \"legal|lawsuit|attorney|lawyer\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"contract|agreement|terms\", confidence: \"low\" },\r\n { type: \"regex\", pattern: \"court|judge|verdict|sentence\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"compliance|regulation|regulatory\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"highStakesDecisions\", true, \"Pattern indicates legal domain\"),\r\n ],\r\n },\r\n {\r\n id: \"high-stakes-financial\",\r\n name: \"Financial Patterns\",\r\n category: \"framework\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"regex\", pattern: \"financial|trading|investment|loan\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"credit_score|creditworthiness|credit_rating\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"mortgage|banking|transaction\", confidence: \"medium\" },\r\n { type: \"regex\", pattern: \"portfolio|stock|bond|asset\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"highStakesDecisions\", true, \"Pattern indicates financial domain\"),\r\n ],\r\n },\r\n {\r\n id: \"high-stakes-hiring\",\r\n name: \"Hiring/Employment Patterns\",\r\n category: \"framework\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"regex\", pattern: \"hiring|recruitment|candidate|applicant\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"resume|cv|curriculum_vitae\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"interview|screening|background_check\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"employee|termination|performance_review\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"highStakesDecisions\", true, \"Pattern indicates hiring/employment domain\"),\r\n ],\r\n },\r\n\r\n // ─────────────────────────────────────────────────────────────────\r\n // CUSTOMER FACING\r\n // ─────────────────────────────────────────────────────────────────\r\n {\r\n id: \"customer-facing\",\r\n name: \"Customer-Facing Patterns\",\r\n category: \"framework\",\r\n language: \"any\",\r\n patterns: [\r\n { type: \"regex\", pattern: \"chatbot|chat_bot|conversational\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"customer_service|customer_support\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"useChat|useCompletion\", confidence: \"high\", description: \"Vercel AI hooks\" },\r\n { type: \"regex\", pattern: \"StreamingTextResponse\", confidence: \"high\" },\r\n { type: \"regex\", pattern: \"user_input|user_message|user_query\", confidence: \"medium\" },\r\n ],\r\n implies: [\r\n createImplication(\"customerFacing\", true, \"Pattern indicates customer-facing application\"),\r\n ],\r\n },\r\n];\r\n\r\nexport function registerRiskIndicatorPatterns(): void {\r\n riskIndicatorPatterns.forEach(registerPattern);\r\n}\r\n\r\nexport { riskIndicatorPatterns };\r\n","// @aigrc/core - Main entry point\r\n\r\n// Schemas\r\nexport * from \"./schemas\";\r\n\r\n// Risk classification\r\nexport * from \"./classification\";\r\n\r\n// Asset card operations\r\nexport * from \"./asset-card\";\r\n\r\n// Golden Thread\r\nexport * from \"./golden-thread\";\r\n\r\n// Detection\r\nexport * from \"./detection\";\r\n\r\n// Utilities\r\nexport * from \"./utils\";","import { z } from \"zod\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// OWNER SCHEMA\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const OwnerSchema = z.object({\r\n name: z.string().min(1),\r\n email: z.string().email(),\r\n team: z.string().optional(),\r\n});\r\n\r\nexport type Owner = z.infer<typeof OwnerSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// TECHNICAL SCHEMA\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const TechnicalSchema = z.object({\r\n type: z.enum([\"model\", \"agent\", \"api_client\", \"framework\", \"pipeline\"]),\r\n framework: z.string().optional(),\r\n frameworkVersion: z.string().optional(),\r\n components: z\r\n .array(\r\n z.object({\r\n type: z.string(),\r\n provider: z.string().optional(),\r\n model: z.string().optional(),\r\n })\r\n )\r\n .optional(),\r\n sourceFiles: z.array(z.string()).optional(),\r\n});\r\n\r\nexport type Technical = z.infer<typeof TechnicalSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// RISK FACTORS SCHEMA\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const RiskFactorsSchema = z.object({\r\n autonomousDecisions: z.boolean().default(false),\r\n customerFacing: z.boolean().default(false),\r\n toolExecution: z.boolean().default(false),\r\n externalDataAccess: z.boolean().default(false),\r\n piiProcessing: z.enum([\"yes\", \"no\", \"unknown\"]).default(\"unknown\"),\r\n highStakesDecisions: z.boolean().default(false),\r\n});\r\n\r\nexport type RiskFactors = z.infer<typeof RiskFactorsSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// JURISDICTION CLASSIFICATION SCHEMA\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const ControlStatusSchema = z.object({\r\n controlId: z.string(),\r\n status: z.enum([\"implemented\", \"partial\", \"not_implemented\", \"not_applicable\"]),\r\n evidence: z.string().optional(),\r\n notes: z.string().optional(),\r\n lastUpdated: z.string().datetime().optional(),\r\n});\r\n\r\nexport type ControlStatus = z.infer<typeof ControlStatusSchema>;\r\n\r\nexport const JurisdictionClassificationSchema = z.object({\r\n /** Profile/jurisdiction ID (e.g., \"eu-ai-act\", \"us-omb-m24\") */\r\n jurisdictionId: z.string(),\r\n /** Risk level mapped to this jurisdiction's terminology */\r\n riskLevel: z.string(),\r\n /** Jurisdiction-specific category (e.g., EU AI Act category) */\r\n category: z.string().optional(),\r\n /** Status of controls for this jurisdiction */\r\n controlStatuses: z.array(ControlStatusSchema).optional(),\r\n /** Required artifacts for this jurisdiction */\r\n requiredArtifacts: z\r\n .array(\r\n z.object({\r\n artifactId: z.string(),\r\n status: z.enum([\"pending\", \"complete\", \"not_applicable\"]),\r\n path: z.string().optional(),\r\n })\r\n )\r\n .optional(),\r\n /** Last compliance check date */\r\n lastChecked: z.string().datetime().optional(),\r\n /** Compliance percentage for this jurisdiction */\r\n compliancePercentage: z.number().min(0).max(100).optional(),\r\n});\r\n\r\nexport type JurisdictionClassification = z.infer<typeof JurisdictionClassificationSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// TRUSTWORTHINESS CHARACTERISTICS SCHEMA (NIST AI RMF)\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const TrustworthinessCharacteristicSchema = z.object({\r\n score: z.number().min(0).max(100).optional(),\r\n notes: z.string().optional(),\r\n lastAssessed: z.string().datetime().optional(),\r\n assessedBy: z.string().optional(),\r\n});\r\n\r\nexport type TrustworthinessCharacteristic = z.infer<typeof TrustworthinessCharacteristicSchema>;\r\n\r\nexport const TrustworthinessSchema = z.object({\r\n /** Valid and reliable: produces accurate, consistent results */\r\n valid: TrustworthinessCharacteristicSchema.optional(),\r\n reliable: TrustworthinessCharacteristicSchema.optional(),\r\n /** Safe: minimizes harm and risk */\r\n safe: TrustworthinessCharacteristicSchema.optional(),\r\n /** Secure: protected against threats */\r\n secure: TrustworthinessCharacteristicSchema.optional(),\r\n /** Accountable: clear responsibility and oversight */\r\n accountable: TrustworthinessCharacteristicSchema.optional(),\r\n /** Transparent: understandable and open about limitations */\r\n transparent: TrustworthinessCharacteristicSchema.optional(),\r\n /** Explainable: decisions can be understood */\r\n explainable: TrustworthinessCharacteristicSchema.optional(),\r\n /** Privacy-enhanced: protects personal information */\r\n privacyEnhanced: TrustworthinessCharacteristicSchema.optional(),\r\n /** Fair: avoids bias and discrimination */\r\n fair: TrustworthinessCharacteristicSchema.optional(),\r\n});\r\n\r\nexport type Trustworthiness = z.infer<typeof TrustworthinessSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// CLASSIFICATION SCHEMA\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const ClassificationSchema = z.object({\r\n /** Primary AIGRC risk level */\r\n riskLevel: z.enum([\"minimal\", \"limited\", \"high\", \"unacceptable\"]),\r\n /** Risk factors that influenced the classification */\r\n riskFactors: RiskFactorsSchema,\r\n /** EU AI Act specific classification (legacy, prefer jurisdictions) */\r\n euAiAct: z\r\n .object({\r\n category: z.string(),\r\n transparencyRequired: z.boolean().default(false),\r\n })\r\n .optional(),\r\n /** Required artifacts based on classification */\r\n requiredArtifacts: z\r\n .array(\r\n z.object({\r\n type: z.string(),\r\n status: z.enum([\"pending\", \"complete\", \"not_applicable\"]),\r\n path: z.string().optional(),\r\n })\r\n )\r\n .optional(),\r\n /** Per-jurisdiction classifications for multi-jurisdiction compliance */\r\n jurisdictions: z.array(JurisdictionClassificationSchema).optional(),\r\n /** NIST AI RMF trustworthiness characteristics */\r\n trustworthiness: TrustworthinessSchema.optional(),\r\n});\r\n\r\nexport type Classification = z.infer<typeof ClassificationSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// INTENT SCHEMA (Golden Thread)\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const IntentSchema = z.object({\r\n linked: z.boolean().default(false),\r\n ticketSystem: z.enum([\"jira\", \"ado\", \"github\", \"gitlab\"]).nullable().optional(),\r\n ticketId: z.string().nullable().optional(),\r\n ticketUrl: z.string().url().nullable().optional(),\r\n businessJustification: z.string().nullable().optional(),\r\n riskTolerance: z.enum([\"low\", \"medium\", \"high\"]).nullable().optional(),\r\n importedAt: z.string().datetime().nullable().optional(),\r\n});\r\n\r\nexport type Intent = z.infer<typeof IntentSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// GOVERNANCE SCHEMA\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const ApprovalSchema = z.object({\r\n role: z.string(),\r\n name: z.string(),\r\n email: z.string().email().optional(),\r\n date: z.string(),\r\n source: z.string().optional(),\r\n});\r\n\r\nexport const GovernanceSchema = z.object({\r\n status: z.enum([\"draft\", \"linked\", \"approved\", \"production\", \"deprecated\", \"revoked\"]),\r\n approvals: z.array(ApprovalSchema).default([]),\r\n deployment: z\r\n .object({\r\n environments: z.array(z.string()).default([]),\r\n lastDeployed: z.string().datetime().nullable().optional(),\r\n })\r\n .optional(),\r\n});\r\n\r\nexport type Governance = z.infer<typeof GovernanceSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// CONSTRAINTS SCHEMA\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const ConstraintsSchema = z.object({\r\n runtime: z\r\n .object({\r\n maxIterations: z.number().positive().optional(),\r\n timeoutSeconds: z.number().positive().optional(),\r\n maxTokensPerRequest: z.number().positive().optional(),\r\n maxCostPerRequestUsd: z.number().positive().optional(),\r\n })\r\n .optional(),\r\n humanApprovalRequired: z.array(z.string()).optional(),\r\n monitoring: z\r\n .object({\r\n logAllDecisions: z.boolean().default(true),\r\n logToolInvocations: z.boolean().default(true),\r\n })\r\n .optional(),\r\n});\r\n\r\nexport type Constraints = z.infer<typeof ConstraintsSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// ASSET CARD SCHEMA (Main Schema)\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const AssetCardSchema = z.object({\r\n $schema: z.string().optional(),\r\n id: z.string().regex(/^aigrc-\\d{4}-[a-f0-9]{8}$/),\r\n name: z.string().min(1).max(100),\r\n description: z.string().max(500).optional(),\r\n version: z.string().default(\"1.0.0\"),\r\n created: z.string().datetime(),\r\n updated: z.string().datetime(),\r\n ownership: z.object({\r\n owner: OwnerSchema,\r\n team: z.string().optional(),\r\n }),\r\n technical: TechnicalSchema,\r\n classification: ClassificationSchema,\r\n intent: IntentSchema,\r\n governance: GovernanceSchema,\r\n constraints: ConstraintsSchema.optional(),\r\n});\r\n\r\nexport type AssetCard = z.infer<typeof AssetCardSchema>;","import type { RiskFactors } from \"./schemas\";\r\n\r\nexport type RiskLevel = \"minimal\" | \"limited\" | \"high\" | \"unacceptable\";\r\n\r\nexport interface ClassificationResult {\r\n riskLevel: RiskLevel;\r\n reasons: string[];\r\n euAiActCategory: string;\r\n requiredArtifacts: string[];\r\n}\r\n\r\nexport function classifyRisk(factors: RiskFactors): ClassificationResult {\r\n const reasons: string[] = [];\r\n let riskLevel: RiskLevel = \"minimal\";\r\n\r\n // High risk factors\r\n if (factors.highStakesDecisions) {\r\n riskLevel = \"high\";\r\n reasons.push(\"Makes high-stakes decisions affecting individuals\");\r\n }\r\n\r\n if (factors.autonomousDecisions && factors.toolExecution) {\r\n riskLevel = \"high\";\r\n reasons.push(\"Autonomous agent with tool execution capability\");\r\n }\r\n\r\n // Limited risk factors\r\n if (factors.customerFacing && riskLevel === \"minimal\") {\r\n riskLevel = \"limited\";\r\n reasons.push(\"Customer-facing AI requires transparency\");\r\n }\r\n\r\n if (factors.piiProcessing === \"yes\" && riskLevel === \"minimal\") {\r\n riskLevel = \"limited\";\r\n reasons.push(\"Processes personal data\");\r\n }\r\n\r\n // Determine EU AI Act category\r\n const euAiActCategory = mapToEuAiAct(riskLevel, factors);\r\n\r\n // Determine required artifacts\r\n const requiredArtifacts = getRequiredArtifacts(riskLevel, factors);\r\n\r\n return {\r\n riskLevel,\r\n reasons,\r\n euAiActCategory,\r\n requiredArtifacts,\r\n };\r\n}\r\n\r\nfunction mapToEuAiAct(level: RiskLevel, factors: RiskFactors): string {\r\n if (level === \"unacceptable\") return \"prohibited\";\r\n if (level === \"high\") return \"high_risk\";\r\n if (level === \"limited\" || factors.customerFacing) return \"limited_risk\";\r\n return \"minimal_risk\";\r\n}\r\n\r\nfunction getRequiredArtifacts(level: RiskLevel, factors: RiskFactors): string[] {\r\n const artifacts = [\"ai_asset_card\"];\r\n\r\n if (level === \"limited\" || level === \"high\") {\r\n if (factors.customerFacing) {\r\n artifacts.push(\"transparency_notice\");\r\n }\r\n }\r\n\r\n if (level === \"high\") {\r\n artifacts.push(\"risk_assessment\");\r\n artifacts.push(\"human_oversight_plan\");\r\n\r\n if (factors.toolExecution) {\r\n artifacts.push(\"tool_inventory\");\r\n }\r\n }\r\n\r\n return artifacts;\r\n}\r\nexport function validateRiskFactors(factors: RiskFactors): boolean {\r\n // Check for required properties in RiskFactors\r\n const requiredProperties = [\r\n 'highStakesDecisions',\r\n 'autonomousDecisions',\r\n 'toolExecution',\r\n 'customerFacing',\r\n 'piiProcessing'\r\n ];\r\n\r\n for (const prop of requiredProperties) {\r\n if (!(prop in factors)) {\r\n console.error(`Missing required property: ${prop}`);\r\n return false;\r\n }\r\n }\r\n\r\n // Additional validation logic can be added here\r\n return true;\r\n}","import {\r\n AssetCardSchema,\r\n type AssetCard,\r\n type JurisdictionClassification,\r\n type Trustworthiness,\r\n} from \"./schemas\";\r\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"fs\";\r\nimport { dirname } from \"path\";\r\nimport YAML from \"yaml\";\r\nimport { randomBytes } from \"crypto\";\r\n\r\nexport interface CreateAssetCardOptions {\r\n name: string;\r\n description?: string;\r\n owner: {\r\n name: string;\r\n email: string;\r\n team?: string;\r\n };\r\n technical: {\r\n type: \"model\" | \"agent\" | \"api_client\" | \"framework\" | \"pipeline\";\r\n framework?: string;\r\n frameworkVersion?: string;\r\n };\r\n riskFactors?: {\r\n autonomousDecisions?: boolean;\r\n customerFacing?: boolean;\r\n toolExecution?: boolean;\r\n externalDataAccess?: boolean;\r\n piiProcessing?: \"yes\" | \"no\" | \"unknown\";\r\n highStakesDecisions?: boolean;\r\n };\r\n /** Jurisdiction/profile IDs to track compliance against */\r\n jurisdictions?: string[];\r\n /** Initial trustworthiness characteristics */\r\n trustworthiness?: Partial<Trustworthiness>;\r\n}\r\n\r\nexport function generateAssetId(): string {\r\n const year = new Date().getFullYear();\r\n const random = randomBytes(4).toString(\"hex\");\r\n return `aigrc-${year}-${random}`;\r\n}\r\n\r\nexport function createAssetCard(options: CreateAssetCardOptions): AssetCard {\r\n const now = new Date().toISOString();\r\n const id = generateAssetId();\r\n\r\n // Initialize jurisdiction tracking if specified\r\n const jurisdictions: JurisdictionClassification[] | undefined =\r\n options.jurisdictions && options.jurisdictions.length > 0\r\n ? options.jurisdictions.map((jurisdictionId) => ({\r\n jurisdictionId,\r\n riskLevel: \"minimal\", // Will be updated by classify\r\n controlStatuses: [],\r\n requiredArtifacts: [],\r\n }))\r\n : undefined;\r\n\r\n const card: AssetCard = {\r\n $schema: \"https://aigrc.dev/schemas/asset-card/v1\",\r\n id,\r\n name: options.name,\r\n description: options.description,\r\n version: \"1.0.0\",\r\n created: now,\r\n updated: now,\r\n ownership: {\r\n owner: options.owner,\r\n team: options.owner.team,\r\n },\r\n technical: {\r\n type: options.technical.type,\r\n framework: options.technical.framework,\r\n frameworkVersion: options.technical.frameworkVersion,\r\n },\r\n classification: {\r\n riskLevel: \"minimal\",\r\n riskFactors: {\r\n autonomousDecisions: options.riskFactors?.autonomousDecisions ?? false,\r\n customerFacing: options.riskFactors?.customerFacing ?? false,\r\n toolExecution: options.riskFactors?.toolExecution ?? false,\r\n externalDataAccess: options.riskFactors?.externalDataAccess ?? false,\r\n piiProcessing: options.riskFactors?.piiProcessing ?? \"unknown\",\r\n highStakesDecisions: options.riskFactors?.highStakesDecisions ?? false,\r\n },\r\n jurisdictions,\r\n trustworthiness: options.trustworthiness,\r\n },\r\n intent: {\r\n linked: false,\r\n },\r\n governance: {\r\n status: \"draft\",\r\n approvals: [],\r\n },\r\n };\r\n\r\n const result = AssetCardSchema.safeParse(card);\r\n if (!result.success) {\r\n throw new Error(`Invalid asset card: ${result.error.message}`);\r\n }\r\n\r\n return result.data;\r\n}\r\n\r\n/**\r\n * Add or update jurisdiction tracking on an existing asset card\r\n */\r\nexport function addJurisdiction(\r\n card: AssetCard,\r\n jurisdictionId: string,\r\n riskLevel?: string\r\n): AssetCard {\r\n const jurisdictions = card.classification.jurisdictions || [];\r\n\r\n // Check if jurisdiction already exists\r\n const existing = jurisdictions.find((j) => j.jurisdictionId === jurisdictionId);\r\n if (existing) {\r\n if (riskLevel) {\r\n existing.riskLevel = riskLevel;\r\n }\r\n } else {\r\n jurisdictions.push({\r\n jurisdictionId,\r\n riskLevel: riskLevel || \"minimal\",\r\n controlStatuses: [],\r\n requiredArtifacts: [],\r\n });\r\n }\r\n\r\n return {\r\n ...card,\r\n classification: {\r\n ...card.classification,\r\n jurisdictions,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Update jurisdiction classification with compliance check results\r\n */\r\nexport function updateJurisdictionCompliance(\r\n card: AssetCard,\r\n jurisdictionId: string,\r\n update: Partial<JurisdictionClassification>\r\n): AssetCard {\r\n const jurisdictions = card.classification.jurisdictions || [];\r\n const idx = jurisdictions.findIndex((j) => j.jurisdictionId === jurisdictionId);\r\n\r\n if (idx === -1) {\r\n // Add new jurisdiction\r\n jurisdictions.push({\r\n jurisdictionId,\r\n riskLevel: update.riskLevel || \"minimal\",\r\n ...update,\r\n lastChecked: new Date().toISOString(),\r\n });\r\n } else {\r\n // Update existing\r\n jurisdictions[idx] = {\r\n ...jurisdictions[idx],\r\n ...update,\r\n lastChecked: new Date().toISOString(),\r\n };\r\n }\r\n\r\n return {\r\n ...card,\r\n classification: {\r\n ...card.classification,\r\n jurisdictions,\r\n },\r\n };\r\n}\r\n\r\nexport function loadAssetCard(filePath: string): AssetCard {\r\n if (!existsSync(filePath)) {\r\n throw new Error(`Asset card not found: ${filePath}`);\r\n }\r\n\r\n const content = readFileSync(filePath, \"utf-8\");\r\n const data = YAML.parse(content);\r\n\r\n const result = AssetCardSchema.safeParse(data);\r\n if (!result.success) {\r\n throw new Error(`Invalid asset card at ${filePath}: ${result.error.message}`);\r\n }\r\n\r\n return result.data;\r\n}\r\n\r\nexport function saveAssetCard(card: AssetCard, filePath: string): void {\r\n const result = AssetCardSchema.safeParse(card);\r\n if (!result.success) {\r\n throw new Error(`Invalid asset card: ${result.error.message}`);\r\n }\r\n\r\n const dir = dirname(filePath);\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n\r\n card.updated = new Date().toISOString();\r\n\r\n const content = YAML.stringify(card, { indent: 2, lineWidth: 100 });\r\n writeFileSync(filePath, content, \"utf-8\");\r\n}\r\n\r\nexport function validateAssetCard(card: unknown): { valid: boolean; errors?: string[] } {\r\n const result = AssetCardSchema.safeParse(card);\r\n if (result.success) {\r\n return { valid: true };\r\n }\r\n return {\r\n valid: false,\r\n errors: result.error.errors.map((e) => `${e.path.join(\".\")}: ${e.message}`),\r\n };\r\n}","import type { AssetCard, Intent } from \"./schemas\";\r\n\r\nexport interface TicketInfo {\r\n system: \"jira\" | \"ado\" | \"github\" | \"gitlab\";\r\n id: string;\r\n url: string;\r\n title: string;\r\n status: string;\r\n assignee?: string;\r\n reporter?: string;\r\n businessJustification?: string;\r\n riskTolerance?: \"low\" | \"medium\" | \"high\";\r\n}\r\n\r\nexport interface LinkResult {\r\n success: boolean;\r\n intent: Intent;\r\n warnings?: string[];\r\n}\r\n\r\nexport function linkAssetToTicket(asset: AssetCard, ticket: TicketInfo): LinkResult {\r\n const warnings: string[] = [];\r\n\r\n const intent: Intent = {\r\n linked: true,\r\n ticketSystem: ticket.system,\r\n ticketId: ticket.id,\r\n ticketUrl: ticket.url,\r\n businessJustification: ticket.businessJustification,\r\n riskTolerance: ticket.riskTolerance,\r\n importedAt: new Date().toISOString(),\r\n };\r\n\r\n // Check for risk mismatch\r\n if (ticket.riskTolerance && asset.classification.riskLevel) {\r\n const toleranceMap: Record<string, number> = { low: 0, medium: 1, high: 2 };\r\n const levelMap: Record<string, number> = { minimal: 0, limited: 1, high: 2, unacceptable: 3 };\r\n\r\n if (levelMap[asset.classification.riskLevel] > toleranceMap[ticket.riskTolerance]) {\r\n warnings.push(\r\n `Asset risk (${asset.classification.riskLevel}) exceeds ticket tolerance (${ticket.riskTolerance})`\r\n );\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n intent,\r\n warnings: warnings.length > 0 ? warnings : undefined,\r\n };\r\n}\r\n\r\nexport function validateGoldenThread(asset: AssetCard): {\r\n valid: boolean;\r\n healthScore: number;\r\n issues: string[];\r\n} {\r\n const issues: string[] = [];\r\n let score = 100;\r\n\r\n if (!asset.intent.linked) {\r\n issues.push(\"Asset is not linked to any ticket\");\r\n score -= 50;\r\n return { valid: false, healthScore: score, issues };\r\n }\r\n\r\n if (!asset.intent.businessJustification) {\r\n issues.push(\"Missing business justification\");\r\n score -= 20;\r\n }\r\n\r\n if (asset.classification.riskLevel === \"high\" && asset.governance.approvals.length === 0) {\r\n issues.push(\"High-risk asset missing approvals\");\r\n score -= 30;\r\n }\r\n\r\n return {\r\n valid: issues.length === 0,\r\n healthScore: Math.max(0, score),\r\n issues,\r\n };\r\n}","import { z } from \"zod\";\r\nimport type { RiskFactors, Technical } from \"../schemas\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// CONFIDENCE LEVELS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const ConfidenceLevelSchema = z.enum([\"high\", \"medium\", \"low\"]);\r\nexport type ConfidenceLevel = z.infer<typeof ConfidenceLevelSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// DETECTION STRATEGY TYPES\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const DetectionStrategySchema = z.enum([\r\n \"pattern_match\",\r\n \"import_analysis\",\r\n \"file_extension\",\r\n \"annotation\",\r\n]);\r\nexport type DetectionStrategy = z.infer<typeof DetectionStrategySchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// FRAMEWORK CATEGORY\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const FrameworkCategorySchema = z.enum([\r\n \"llm_provider\",\r\n \"framework\",\r\n \"agent_framework\",\r\n \"ml_framework\",\r\n \"ml_ops\",\r\n \"model_file\",\r\n]);\r\nexport type FrameworkCategory = z.infer<typeof FrameworkCategorySchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// RISK IMPLICATION\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport interface RiskImplication {\r\n factor: keyof RiskFactors;\r\n value: boolean | \"yes\" | \"no\" | \"unknown\";\r\n reason: string;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// PATTERN DEFINITION\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport type PatternRuleType = \"regex\" | \"literal\" | \"import\" | \"decorator\";\r\nexport type PatternLanguage = \"python\" | \"javascript\" | \"typescript\" | \"any\";\r\n\r\nexport interface PatternRule {\r\n type: PatternRuleType;\r\n pattern: string;\r\n confidence: ConfidenceLevel;\r\n description?: string;\r\n}\r\n\r\nexport interface PatternDefinition {\r\n id: string;\r\n name: string;\r\n category: FrameworkCategory;\r\n language: PatternLanguage;\r\n patterns: PatternRule[];\r\n implies: RiskImplication[];\r\n version?: string;\r\n documentation?: string;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// DETECTION RESULT\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport interface DetectionResult {\r\n filePath: string;\r\n line: number;\r\n column?: number;\r\n match: string;\r\n matchContext?: string;\r\n registryCard: string;\r\n framework: string;\r\n category: FrameworkCategory;\r\n confidence: ConfidenceLevel;\r\n strategy: DetectionStrategy;\r\n implies: RiskImplication[];\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// SCAN OPTIONS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport interface ScanOptions {\r\n directory: string;\r\n recursive?: boolean;\r\n extensions?: string[];\r\n ignorePatterns?: string[];\r\n strategies?: DetectionStrategy[];\r\n maxFileSize?: number;\r\n maxFiles?: number;\r\n earlyExit?: boolean;\r\n respectGitignore?: boolean;\r\n customPatterns?: PatternDefinition[];\r\n}\r\n\r\nexport interface ScanProgress {\r\n totalFiles: number;\r\n scannedFiles: number;\r\n currentFile: string;\r\n detections: number;\r\n}\r\n\r\nexport type ScanProgressCallback = (progress: ScanProgress) => void;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// SCAN RESULT\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport interface ScanSummary {\r\n totalDetections: number;\r\n byFramework: Record<string, number>;\r\n byCategory: Record<FrameworkCategory, number>;\r\n byConfidence: Record<ConfidenceLevel, number>;\r\n primaryFramework?: string;\r\n primaryCategory?: FrameworkCategory;\r\n}\r\n\r\nexport interface ScanError {\r\n filePath: string;\r\n error: string;\r\n recoverable: boolean;\r\n}\r\n\r\nexport interface ScanResult {\r\n detections: DetectionResult[];\r\n summary: ScanSummary;\r\n inferredRiskFactors: Partial<RiskFactors>;\r\n suggestedTechnical: Partial<Technical>;\r\n scannedFiles: number;\r\n skippedFiles: number;\r\n duration: number;\r\n errors?: ScanError[];\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// ASSET CARD SUGGESTION\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport interface AssetCardSuggestion {\r\n name: string;\r\n description: string;\r\n technical: {\r\n type: Technical[\"type\"];\r\n framework: string;\r\n components: Array<{\r\n type: string;\r\n provider?: string;\r\n model?: string;\r\n }>;\r\n sourceFiles: string[];\r\n };\r\n riskFactors: Partial<RiskFactors>;\r\n confidence: ConfidenceLevel;\r\n basedOn: string[];\r\n}\r\n","import { readFileSync, readdirSync, statSync, existsSync } from \"fs\";\r\nimport { join, extname, relative } from \"path\";\r\nimport type {\r\n ScanOptions,\r\n ScanResult,\r\n DetectionResult,\r\n ScanSummary,\r\n ScanError,\r\n ScanProgressCallback,\r\n ConfidenceLevel,\r\n FrameworkCategory,\r\n DetectionStrategy,\r\n} from \"./types\";\r\nimport { getAllPatterns, initializePatterns, isRegistryInitialized } from \"./patterns\";\r\nimport { matchPatterns } from \"./strategies/pattern-matcher\";\r\nimport { analyzeImports } from \"./strategies/import-analyzer\";\r\nimport { scanFileExtension, MODEL_EXTENSIONS } from \"./strategies/file-scanner\";\r\nimport { detectAnnotations } from \"./strategies/annotation-detector\";\r\nimport { inferRiskFactors } from \"./risk-inference\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// DEFAULT CONFIGURATION\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nconst DEFAULT_IGNORE_PATTERNS = [\r\n \"node_modules\",\r\n \"__pycache__\",\r\n \".git\",\r\n \"dist\",\r\n \"build\",\r\n \".next\",\r\n \".nuxt\",\r\n \"venv\",\r\n \".venv\",\r\n \"env\",\r\n \".env\",\r\n \".aigrc\",\r\n \"*.min.js\",\r\n \"*.bundle.js\",\r\n \"*.map\",\r\n \"coverage\",\r\n \".pytest_cache\",\r\n \".mypy_cache\",\r\n \".tox\",\r\n \"egg-info\",\r\n];\r\n\r\nconst DEFAULT_CODE_EXTENSIONS = [\r\n \".py\",\r\n \".js\",\r\n \".ts\",\r\n \".jsx\",\r\n \".tsx\",\r\n \".mjs\",\r\n \".cjs\",\r\n];\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// MAIN SCAN FUNCTION\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport async function scan(\r\n options: ScanOptions,\r\n onProgress?: ScanProgressCallback\r\n): Promise<ScanResult> {\r\n const startTime = Date.now();\r\n const detections: DetectionResult[] = [];\r\n const errors: ScanError[] = [];\r\n let scannedFiles = 0;\r\n let skippedFiles = 0;\r\n\r\n // Ensure patterns are initialized\r\n if (!isRegistryInitialized()) {\r\n initializePatterns();\r\n }\r\n\r\n const resolvedOptions = resolveOptions(options);\r\n const files = collectFiles(resolvedOptions);\r\n const totalFiles = files.length;\r\n\r\n for (const filePath of files) {\r\n if (resolvedOptions.maxFiles && scannedFiles >= resolvedOptions.maxFiles) {\r\n break;\r\n }\r\n\r\n if (onProgress) {\r\n onProgress({\r\n totalFiles,\r\n scannedFiles,\r\n currentFile: relative(resolvedOptions.directory, filePath),\r\n detections: detections.length,\r\n });\r\n }\r\n\r\n try {\r\n const fileDetections = await scanFile(filePath, resolvedOptions);\r\n detections.push(...fileDetections);\r\n scannedFiles++;\r\n\r\n // Early exit on high-confidence match\r\n if (\r\n resolvedOptions.earlyExit &&\r\n fileDetections.some((d) => d.confidence === \"high\")\r\n ) {\r\n break;\r\n }\r\n } catch (error) {\r\n errors.push({\r\n filePath,\r\n error: error instanceof Error ? error.message : String(error),\r\n recoverable: true,\r\n });\r\n skippedFiles++;\r\n }\r\n }\r\n\r\n // Deduplicate detections\r\n const uniqueDetections = deduplicateDetections(detections);\r\n\r\n // Create summary\r\n const summary = createSummary(uniqueDetections);\r\n\r\n // Infer risk factors\r\n const inferredRiskFactors = inferRiskFactors(uniqueDetections);\r\n\r\n // Suggest technical details\r\n const suggestedTechnical = suggestTechnical(uniqueDetections, summary);\r\n\r\n return {\r\n detections: uniqueDetections,\r\n summary,\r\n inferredRiskFactors,\r\n suggestedTechnical,\r\n scannedFiles,\r\n skippedFiles,\r\n duration: Date.now() - startTime,\r\n errors: errors.length > 0 ? errors : undefined,\r\n };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// SYNCHRONOUS SCAN (for CLI/scripts)\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport function scanSync(\r\n options: ScanOptions,\r\n onProgress?: ScanProgressCallback\r\n): ScanResult {\r\n const startTime = Date.now();\r\n const detections: DetectionResult[] = [];\r\n const errors: ScanError[] = [];\r\n let scannedFiles = 0;\r\n let skippedFiles = 0;\r\n\r\n // Ensure patterns are initialized\r\n if (!isRegistryInitialized()) {\r\n initializePatterns();\r\n }\r\n\r\n const resolvedOptions = resolveOptions(options);\r\n const files = collectFiles(resolvedOptions);\r\n const totalFiles = files.length;\r\n\r\n for (const filePath of files) {\r\n if (resolvedOptions.maxFiles && scannedFiles >= resolvedOptions.maxFiles) {\r\n break;\r\n }\r\n\r\n if (onProgress) {\r\n onProgress({\r\n totalFiles,\r\n scannedFiles,\r\n currentFile: relative(resolvedOptions.directory, filePath),\r\n detections: detections.length,\r\n });\r\n }\r\n\r\n try {\r\n const fileDetections = scanFileSync(filePath, resolvedOptions);\r\n detections.push(...fileDetections);\r\n scannedFiles++;\r\n\r\n if (\r\n resolvedOptions.earlyExit &&\r\n fileDetections.some((d) => d.confidence === \"high\")\r\n ) {\r\n break;\r\n }\r\n } catch (error) {\r\n errors.push({\r\n filePath,\r\n error: error instanceof Error ? error.message : String(error),\r\n recoverable: true,\r\n });\r\n skippedFiles++;\r\n }\r\n }\r\n\r\n const uniqueDetections = deduplicateDetections(detections);\r\n const summary = createSummary(uniqueDetections);\r\n const inferredRiskFactors = inferRiskFactors(uniqueDetections);\r\n const suggestedTechnical = suggestTechnical(uniqueDetections, summary);\r\n\r\n return {\r\n detections: uniqueDetections,\r\n summary,\r\n inferredRiskFactors,\r\n suggestedTechnical,\r\n scannedFiles,\r\n skippedFiles,\r\n duration: Date.now() - startTime,\r\n errors: errors.length > 0 ? errors : undefined,\r\n };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// HELPER FUNCTIONS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\ninterface ResolvedScanOptions {\r\n directory: string;\r\n recursive: boolean;\r\n extensions: string[];\r\n ignorePatterns: string[];\r\n strategies: DetectionStrategy[];\r\n maxFileSize: number;\r\n maxFiles: number;\r\n earlyExit: boolean;\r\n respectGitignore: boolean;\r\n customPatterns: ScanOptions[\"customPatterns\"];\r\n}\r\n\r\nfunction resolveOptions(options: ScanOptions): ResolvedScanOptions {\r\n return {\r\n directory: options.directory,\r\n recursive: options.recursive ?? true,\r\n extensions: options.extensions ?? [...DEFAULT_CODE_EXTENSIONS, ...MODEL_EXTENSIONS],\r\n ignorePatterns: options.ignorePatterns ?? DEFAULT_IGNORE_PATTERNS,\r\n strategies: options.strategies ?? [\r\n \"pattern_match\",\r\n \"import_analysis\",\r\n \"file_extension\",\r\n \"annotation\",\r\n ],\r\n maxFileSize: options.maxFileSize ?? 1024 * 1024, // 1MB default\r\n maxFiles: options.maxFiles ?? 10000,\r\n earlyExit: options.earlyExit ?? false,\r\n respectGitignore: options.respectGitignore ?? true,\r\n customPatterns: options.customPatterns ?? [],\r\n };\r\n}\r\n\r\nfunction collectFiles(options: ResolvedScanOptions): string[] {\r\n const files: string[] = [];\r\n const gitignorePatterns = options.respectGitignore\r\n ? loadGitignore(options.directory)\r\n : [];\r\n\r\n function walk(dir: string): void {\r\n let entries;\r\n try {\r\n entries = readdirSync(dir, { withFileTypes: true });\r\n } catch {\r\n return; // Skip directories we can't read\r\n }\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry.name);\r\n const relativePath = relative(options.directory, fullPath);\r\n\r\n // Check ignore patterns\r\n if (shouldIgnore(relativePath, entry.name, options.ignorePatterns, gitignorePatterns)) {\r\n continue;\r\n }\r\n\r\n if (entry.isDirectory() && options.recursive) {\r\n walk(fullPath);\r\n } else if (entry.isFile()) {\r\n const ext = extname(entry.name).toLowerCase();\r\n if (options.extensions.some((e) => e.toLowerCase() === ext)) {\r\n // Check file size\r\n try {\r\n const stats = statSync(fullPath);\r\n if (stats.size <= options.maxFileSize) {\r\n files.push(fullPath);\r\n }\r\n } catch {\r\n // Skip files we can't stat\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (existsSync(options.directory)) {\r\n const stat = statSync(options.directory);\r\n if (stat.isDirectory()) {\r\n walk(options.directory);\r\n } else if (stat.isFile()) {\r\n files.push(options.directory);\r\n }\r\n }\r\n\r\n return files;\r\n}\r\n\r\nfunction shouldIgnore(\r\n relativePath: string,\r\n name: string,\r\n ignorePatterns: string[],\r\n gitignorePatterns: string[]\r\n): boolean {\r\n const allPatterns = [...ignorePatterns, ...gitignorePatterns];\r\n\r\n for (const pattern of allPatterns) {\r\n // Direct name match\r\n if (name === pattern || relativePath === pattern) {\r\n return true;\r\n }\r\n\r\n // Check if path contains pattern\r\n if (relativePath.includes(pattern)) {\r\n return true;\r\n }\r\n\r\n // Glob-like matching\r\n if (pattern.includes(\"*\")) {\r\n const regexPattern = pattern\r\n .replace(/\\./g, \"\\\\.\")\r\n .replace(/\\*/g, \".*\");\r\n try {\r\n const regex = new RegExp(regexPattern);\r\n if (regex.test(name) || regex.test(relativePath)) {\r\n return true;\r\n }\r\n } catch {\r\n // Invalid pattern, skip\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction loadGitignore(directory: string): string[] {\r\n const gitignorePath = join(directory, \".gitignore\");\r\n if (!existsSync(gitignorePath)) {\r\n return [];\r\n }\r\n\r\n try {\r\n const content = readFileSync(gitignorePath, \"utf-8\");\r\n return content\r\n .split(\"\\n\")\r\n .map((line) => line.trim())\r\n .filter((line) => line && !line.startsWith(\"#\"));\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nasync function scanFile(\r\n filePath: string,\r\n options: ResolvedScanOptions\r\n): Promise<DetectionResult[]> {\r\n return scanFileSync(filePath, options);\r\n}\r\n\r\nfunction scanFileSync(\r\n filePath: string,\r\n options: ResolvedScanOptions\r\n): DetectionResult[] {\r\n const detections: DetectionResult[] = [];\r\n const ext = extname(filePath).toLowerCase();\r\n const patterns = [...getAllPatterns(), ...(options.customPatterns ?? [])];\r\n\r\n // File extension strategy (for model files)\r\n if (\r\n options.strategies.includes(\"file_extension\") &&\r\n MODEL_EXTENSIONS.some((e) => e.toLowerCase() === ext)\r\n ) {\r\n const extensionDetections = scanFileExtension(filePath);\r\n detections.push(...extensionDetections);\r\n }\r\n\r\n // For code files, read content and apply other strategies\r\n if (DEFAULT_CODE_EXTENSIONS.some((e) => e.toLowerCase() === ext)) {\r\n const content = readFileSync(filePath, \"utf-8\");\r\n const lines = content.split(\"\\n\");\r\n\r\n // Import analysis strategy\r\n if (options.strategies.includes(\"import_analysis\")) {\r\n const importDetections = analyzeImports(filePath, content, patterns);\r\n detections.push(...importDetections);\r\n }\r\n\r\n // Pattern matching strategy\r\n if (options.strategies.includes(\"pattern_match\")) {\r\n const patternDetections = matchPatterns(filePath, lines, patterns);\r\n detections.push(...patternDetections);\r\n }\r\n\r\n // Annotation detection strategy\r\n if (options.strategies.includes(\"annotation\")) {\r\n const annotationDetections = detectAnnotations(filePath, lines, patterns);\r\n detections.push(...annotationDetections);\r\n }\r\n }\r\n\r\n return detections;\r\n}\r\n\r\nfunction deduplicateDetections(detections: DetectionResult[]): DetectionResult[] {\r\n const seen = new Map<string, DetectionResult>();\r\n\r\n for (const detection of detections) {\r\n const key = `${detection.filePath}:${detection.line}:${detection.registryCard}`;\r\n const existing = seen.get(key);\r\n\r\n // Keep higher confidence detection\r\n if (!existing || confidenceRank(detection.confidence) > confidenceRank(existing.confidence)) {\r\n seen.set(key, detection);\r\n }\r\n }\r\n\r\n return Array.from(seen.values());\r\n}\r\n\r\nfunction confidenceRank(level: ConfidenceLevel): number {\r\n const ranks: Record<ConfidenceLevel, number> = { high: 3, medium: 2, low: 1 };\r\n return ranks[level];\r\n}\r\n\r\nfunction createSummary(detections: DetectionResult[]): ScanSummary {\r\n const byFramework: Record<string, number> = {};\r\n const byCategory: Record<FrameworkCategory, number> = {\r\n llm_provider: 0,\r\n framework: 0,\r\n agent_framework: 0,\r\n ml_framework: 0,\r\n ml_ops: 0,\r\n model_file: 0,\r\n };\r\n const byConfidence: Record<ConfidenceLevel, number> = {\r\n high: 0,\r\n medium: 0,\r\n low: 0,\r\n };\r\n\r\n for (const detection of detections) {\r\n byFramework[detection.framework] = (byFramework[detection.framework] || 0) + 1;\r\n byCategory[detection.category]++;\r\n byConfidence[detection.confidence]++;\r\n }\r\n\r\n // Determine primary framework (most detections, weighted by confidence)\r\n let primaryFramework: string | undefined;\r\n let maxScore = 0;\r\n\r\n for (const [framework] of Object.entries(byFramework)) {\r\n const frameworkDetections = detections.filter((d) => d.framework === framework);\r\n const score = frameworkDetections.reduce(\r\n (sum, d) => sum + confidenceRank(d.confidence),\r\n 0\r\n );\r\n if (score > maxScore) {\r\n maxScore = score;\r\n primaryFramework = framework;\r\n }\r\n }\r\n\r\n // Determine primary category\r\n let primaryCategory: FrameworkCategory | undefined;\r\n let maxCategoryCount = 0;\r\n\r\n for (const [cat, count] of Object.entries(byCategory)) {\r\n if (count > maxCategoryCount) {\r\n maxCategoryCount = count;\r\n primaryCategory = cat as FrameworkCategory;\r\n }\r\n }\r\n\r\n return {\r\n totalDetections: detections.length,\r\n byFramework,\r\n byCategory,\r\n byConfidence,\r\n primaryFramework,\r\n primaryCategory,\r\n };\r\n}\r\n\r\nfunction suggestTechnical(\r\n detections: DetectionResult[],\r\n summary: ScanSummary\r\n): ScanResult[\"suggestedTechnical\"] {\r\n // Determine type based on category\r\n const typeMap: Record<\r\n FrameworkCategory,\r\n \"model\" | \"agent\" | \"api_client\" | \"framework\" | \"pipeline\"\r\n > = {\r\n llm_provider: \"api_client\",\r\n framework: \"framework\",\r\n agent_framework: \"agent\",\r\n ml_framework: \"model\",\r\n ml_ops: \"pipeline\",\r\n model_file: \"model\",\r\n };\r\n\r\n const sourceFiles = [...new Set(detections.map((d) => d.filePath))];\r\n\r\n return {\r\n type: typeMap[summary.primaryCategory ?? \"framework\"],\r\n framework: summary.primaryFramework,\r\n sourceFiles,\r\n };\r\n}\r\n","// ─────────────────────────────────────────────────────────────────\r\n// PATTERN REGISTRY EXPORTS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport {\r\n registerPattern,\r\n getPattern,\r\n getAllPatterns,\r\n getPatternsByCategory,\r\n getPatternsByLanguage,\r\n clearRegistry,\r\n isRegistryInitialized,\r\n createImplication,\r\n} from \"./registry\";\r\n\r\nexport { registerPythonPatterns, pythonPatterns } from \"./python\";\r\nexport { registerJavaScriptPatterns, javascriptPatterns } from \"./javascript\";\r\nexport { registerModelFilePatterns, modelFilePatterns } from \"./model-files\";\r\nexport { registerRiskIndicatorPatterns, riskIndicatorPatterns } from \"./risk-indicators\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// INITIALIZE ALL PATTERNS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nlet initialized = false;\r\n\r\nexport function initializePatterns(): void {\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n const { registerPythonPatterns } = require(\"./python\");\r\n const { registerJavaScriptPatterns } = require(\"./javascript\");\r\n const { registerModelFilePatterns } = require(\"./model-files\");\r\n const { registerRiskIndicatorPatterns } = require(\"./risk-indicators\");\r\n\r\n registerPythonPatterns();\r\n registerJavaScriptPatterns();\r\n registerModelFilePatterns();\r\n registerRiskIndicatorPatterns();\r\n\r\n initialized = true;\r\n}\r\n\r\nexport function resetPatterns(): void {\r\n const { clearRegistry } = require(\"./registry\");\r\n clearRegistry();\r\n initialized = false;\r\n}\r\n","import type { DetectionResult, PatternDefinition, PatternRule } from \"../types\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// PATTERN MATCHING STRATEGY\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport function matchPatterns(\r\n filePath: string,\r\n lines: string[],\r\n patterns: PatternDefinition[]\r\n): DetectionResult[] {\r\n const detections: DetectionResult[] = [];\r\n\r\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\r\n const line = lines[lineIndex];\r\n\r\n for (const pattern of patterns) {\r\n for (const rule of pattern.patterns) {\r\n if (rule.type !== \"regex\" && rule.type !== \"literal\") continue;\r\n\r\n const match = matchRule(line, rule);\r\n if (match) {\r\n detections.push({\r\n filePath,\r\n line: lineIndex + 1,\r\n column: match.index,\r\n match: match.text,\r\n matchContext: getContext(lines, lineIndex),\r\n registryCard: pattern.id,\r\n framework: pattern.name,\r\n category: pattern.category,\r\n confidence: rule.confidence,\r\n strategy: \"pattern_match\",\r\n implies: pattern.implies,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return detections;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// HELPER FUNCTIONS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nfunction matchRule(\r\n line: string,\r\n rule: PatternRule\r\n): { text: string; index: number } | null {\r\n if (rule.type === \"literal\") {\r\n const index = line.indexOf(rule.pattern);\r\n if (index !== -1) {\r\n return { text: rule.pattern, index };\r\n }\r\n } else if (rule.type === \"regex\") {\r\n try {\r\n const regex = new RegExp(rule.pattern, \"i\");\r\n const match = regex.exec(line);\r\n if (match) {\r\n return { text: match[0], index: match.index };\r\n }\r\n } catch {\r\n // Invalid regex, skip\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction getContext(lines: string[], index: number, contextLines = 2): string {\r\n const start = Math.max(0, index - contextLines);\r\n const end = Math.min(lines.length, index + contextLines + 1);\r\n return lines.slice(start, end).join(\"\\n\");\r\n}\r\n","import type { DetectionResult, PatternDefinition } from \"../types\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// IMPORT ANALYSIS STRATEGY\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\n// Python import patterns\r\nconst PYTHON_IMPORT_REGEX = /^(?:from\\s+(\\S+)\\s+import|import\\s+(\\S+))/;\r\n\r\n// JavaScript/TypeScript import patterns\r\nconst JS_IMPORT_REGEX =\r\n /(?:import\\s+(?:[\\w{},*\\s]+\\s+from\\s+)?['\"]([^'\"]+)['\"]|require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\))/;\r\n\r\nexport function analyzeImports(\r\n filePath: string,\r\n content: string,\r\n patterns: PatternDefinition[]\r\n): DetectionResult[] {\r\n const detections: DetectionResult[] = [];\r\n const lines = content.split(\"\\n\");\r\n const isPython = filePath.endsWith(\".py\");\r\n\r\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\r\n const line = lines[lineIndex].trim();\r\n\r\n // Skip empty lines and comments\r\n if (!line) continue;\r\n if (isPython && line.startsWith(\"#\")) continue;\r\n if (!isPython && (line.startsWith(\"//\") || line.startsWith(\"/*\"))) continue;\r\n\r\n // Check if this is an import line\r\n const importMatch = isPython\r\n ? extractPythonImport(line)\r\n : extractJsImport(line);\r\n\r\n if (!importMatch) continue;\r\n\r\n // Match against patterns with import type rules\r\n for (const pattern of patterns) {\r\n // Skip patterns for different languages\r\n if (\r\n pattern.language !== \"any\" &&\r\n ((isPython && pattern.language !== \"python\") ||\r\n (!isPython && pattern.language !== \"javascript\" && pattern.language !== \"typescript\"))\r\n ) {\r\n continue;\r\n }\r\n\r\n for (const rule of pattern.patterns) {\r\n if (rule.type !== \"import\") continue;\r\n\r\n if (matchesImport(line, rule.pattern)) {\r\n detections.push({\r\n filePath,\r\n line: lineIndex + 1,\r\n match: line,\r\n registryCard: pattern.id,\r\n framework: pattern.name,\r\n category: pattern.category,\r\n confidence: rule.confidence,\r\n strategy: \"import_analysis\",\r\n implies: pattern.implies,\r\n metadata: { importedModule: importMatch },\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return detections;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// HELPER FUNCTIONS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nfunction extractPythonImport(line: string): string | null {\r\n const match = PYTHON_IMPORT_REGEX.exec(line);\r\n if (match) {\r\n return match[1] || match[2];\r\n }\r\n return null;\r\n}\r\n\r\nfunction extractJsImport(line: string): string | null {\r\n const match = JS_IMPORT_REGEX.exec(line);\r\n if (match) {\r\n return match[1] || match[2];\r\n }\r\n return null;\r\n}\r\n\r\nfunction matchesImport(line: string, pattern: string): boolean {\r\n // Normalize for comparison - handle both single and double quotes\r\n const normalizedLine = line.toLowerCase().replace(/'/g, '\"');\r\n const normalizedPattern = pattern.toLowerCase().replace(/'/g, '\"');\r\n return normalizedLine.includes(normalizedPattern);\r\n}\r\n","import { extname, basename } from \"path\";\r\nimport type { DetectionResult } from \"../types\";\r\nimport { getPatternsByCategory } from \"../patterns/registry\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// FILE EXTENSION SCANNING STRATEGY\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport function scanFileExtension(filePath: string): DetectionResult[] {\r\n const detections: DetectionResult[] = [];\r\n const ext = extname(filePath).toLowerCase();\r\n const filename = basename(filePath);\r\n\r\n const modelPatterns = getPatternsByCategory(\"model_file\");\r\n\r\n for (const pattern of modelPatterns) {\r\n for (const rule of pattern.patterns) {\r\n let matched = false;\r\n\r\n if (rule.type === \"literal\") {\r\n // Match file extension\r\n if (ext === rule.pattern.toLowerCase()) {\r\n matched = true;\r\n }\r\n } else if (rule.type === \"regex\") {\r\n // Match against full filename\r\n try {\r\n const regex = new RegExp(rule.pattern, \"i\");\r\n matched = regex.test(filename);\r\n } catch {\r\n // Invalid regex, skip\r\n }\r\n }\r\n\r\n if (matched) {\r\n detections.push({\r\n filePath,\r\n line: 0, // N/A for file-level detection\r\n match: filename,\r\n registryCard: pattern.id,\r\n framework: pattern.name,\r\n category: pattern.category,\r\n confidence: rule.confidence,\r\n strategy: \"file_extension\",\r\n implies: pattern.implies,\r\n metadata: { extension: ext, filename },\r\n });\r\n }\r\n }\r\n }\r\n\r\n return detections;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// MODEL FILE EXTENSIONS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const MODEL_EXTENSIONS = [\r\n \".pt\",\r\n \".pth\",\r\n \".safetensors\",\r\n \".onnx\",\r\n \".h5\",\r\n \".keras\",\r\n \".pb\",\r\n \".pkl\",\r\n \".joblib\",\r\n \".bin\",\r\n \".gguf\",\r\n \".ggml\",\r\n \".npz\",\r\n];\r\n\r\nexport function isModelFile(filePath: string): boolean {\r\n const ext = extname(filePath).toLowerCase();\r\n return MODEL_EXTENSIONS.includes(ext);\r\n}\r\n","import type { DetectionResult, PatternDefinition } from \"../types\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// ANNOTATION/DECORATOR DETECTION STRATEGY\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\n// Python decorator pattern: @decorator or @decorator(...)\r\nconst PYTHON_DECORATOR_REGEX = /^\\s*@(\\w+)(?:\\(.*\\))?\\s*$/;\r\n\r\n// TypeScript/JavaScript decorator pattern (experimental decorators)\r\nconst TS_DECORATOR_REGEX = /^\\s*@(\\w+)(?:\\(.*\\))?\\s*$/;\r\n\r\nexport function detectAnnotations(\r\n filePath: string,\r\n lines: string[],\r\n patterns: PatternDefinition[]\r\n): DetectionResult[] {\r\n const detections: DetectionResult[] = [];\r\n const isPython = filePath.endsWith(\".py\");\r\n\r\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\r\n const line = lines[lineIndex];\r\n const trimmedLine = line.trim();\r\n\r\n // Check for decorator syntax\r\n if (!trimmedLine.startsWith(\"@\")) continue;\r\n\r\n const decoratorMatch = isPython\r\n ? PYTHON_DECORATOR_REGEX.exec(trimmedLine)\r\n : TS_DECORATOR_REGEX.exec(trimmedLine);\r\n\r\n if (!decoratorMatch) continue;\r\n\r\n const decoratorName = decoratorMatch[1];\r\n\r\n // Match against patterns with decorator type rules\r\n for (const pattern of patterns) {\r\n // Skip patterns for different languages\r\n if (\r\n pattern.language !== \"any\" &&\r\n ((isPython && pattern.language !== \"python\") ||\r\n (!isPython && pattern.language !== \"javascript\" && pattern.language !== \"typescript\"))\r\n ) {\r\n continue;\r\n }\r\n\r\n for (const rule of pattern.patterns) {\r\n if (rule.type !== \"decorator\") continue;\r\n\r\n const ruleDecorator = rule.pattern.replace(/^@/, \"\");\r\n if (decoratorName.toLowerCase() === ruleDecorator.toLowerCase()) {\r\n // Look ahead to get the decorated function/class name\r\n const nextLine = lineIndex + 1 < lines.length ? lines[lineIndex + 1] : \"\";\r\n const decoratedName = extractDecoratedName(nextLine, isPython);\r\n\r\n detections.push({\r\n filePath,\r\n line: lineIndex + 1,\r\n match: trimmedLine,\r\n matchContext: decoratedName\r\n ? `${trimmedLine}\\n${nextLine.trim()}`\r\n : trimmedLine,\r\n registryCard: pattern.id,\r\n framework: pattern.name,\r\n category: pattern.category,\r\n confidence: rule.confidence,\r\n strategy: \"annotation\",\r\n implies: pattern.implies,\r\n metadata: {\r\n decorator: decoratorName,\r\n decorated: decoratedName,\r\n },\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return detections;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// HELPER FUNCTIONS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nfunction extractDecoratedName(line: string, isPython: boolean): string | null {\r\n if (isPython) {\r\n // Python: def function_name(...) or class ClassName\r\n const pythonMatch = /(?:def|class|async\\s+def)\\s+(\\w+)/.exec(line);\r\n if (pythonMatch) return pythonMatch[1];\r\n } else {\r\n // TypeScript/JavaScript: function name(...) or class ClassName or method name(...)\r\n const tsMatch = /(?:function|class|async\\s+function)\\s+(\\w+)/.exec(line);\r\n if (tsMatch) return tsMatch[1];\r\n\r\n // Also match method definitions\r\n const methodMatch = /^\\s*(?:async\\s+)?(\\w+)\\s*\\(/.exec(line);\r\n if (methodMatch) return methodMatch[1];\r\n }\r\n\r\n return null;\r\n}\r\n","import type { RiskFactors } from \"../schemas\";\r\nimport type { DetectionResult, RiskImplication, ConfidenceLevel } from \"./types\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// RISK FACTOR INFERENCE\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport function inferRiskFactors(detections: DetectionResult[]): Partial<RiskFactors> {\r\n const implications = collectImplications(detections);\r\n\r\n return {\r\n autonomousDecisions: inferBoolean(implications, \"autonomousDecisions\"),\r\n customerFacing: inferBoolean(implications, \"customerFacing\"),\r\n toolExecution: inferBoolean(implications, \"toolExecution\"),\r\n externalDataAccess: inferBoolean(implications, \"externalDataAccess\"),\r\n piiProcessing: inferPiiProcessing(implications),\r\n highStakesDecisions: inferBoolean(implications, \"highStakesDecisions\"),\r\n };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// HELPER FUNCTIONS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\ninterface WeightedImplication extends RiskImplication {\r\n weight: number;\r\n}\r\n\r\nfunction collectImplications(detections: DetectionResult[]): WeightedImplication[] {\r\n const implications: WeightedImplication[] = [];\r\n\r\n for (const detection of detections) {\r\n const weight = confidenceWeight(detection.confidence);\r\n\r\n for (const implication of detection.implies) {\r\n // Only include implications from medium+ confidence detections\r\n if (weight >= 2) {\r\n implications.push({\r\n ...implication,\r\n weight,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return implications;\r\n}\r\n\r\nfunction confidenceWeight(confidence: ConfidenceLevel): number {\r\n const weights: Record<ConfidenceLevel, number> = {\r\n high: 3,\r\n medium: 2,\r\n low: 1,\r\n };\r\n return weights[confidence];\r\n}\r\n\r\nfunction inferBoolean(\r\n implications: WeightedImplication[],\r\n factor: keyof RiskFactors\r\n): boolean {\r\n const relevant = implications.filter((i) => i.factor === factor);\r\n\r\n if (relevant.length === 0) return false;\r\n\r\n // If any high-weight implication sets it to true, return true\r\n // Otherwise, require multiple medium-weight implications\r\n const highWeight = relevant.filter((i) => i.weight >= 3 && i.value === true);\r\n if (highWeight.length > 0) return true;\r\n\r\n const mediumWeight = relevant.filter((i) => i.weight >= 2 && i.value === true);\r\n if (mediumWeight.length >= 2) return true;\r\n\r\n // Single medium-weight is still enough\r\n if (mediumWeight.length >= 1) return true;\r\n\r\n return false;\r\n}\r\n\r\nfunction inferPiiProcessing(\r\n implications: WeightedImplication[]\r\n): \"yes\" | \"no\" | \"unknown\" {\r\n const relevant = implications.filter((i) => i.factor === \"piiProcessing\");\r\n\r\n if (relevant.length === 0) return \"unknown\";\r\n\r\n // If any high-confidence says \"yes\", return \"yes\"\r\n const highYes = relevant.filter((i) => i.weight >= 3 && i.value === \"yes\");\r\n if (highYes.length > 0) return \"yes\";\r\n\r\n // If multiple medium-confidence say \"yes\", return \"yes\"\r\n const mediumYes = relevant.filter((i) => i.weight >= 2 && i.value === \"yes\");\r\n if (mediumYes.length >= 2) return \"yes\";\r\n\r\n // If any says \"yes\", return \"yes\" (conservative)\r\n if (relevant.some((i) => i.value === \"yes\")) return \"yes\";\r\n\r\n // If all say \"no\", return \"no\"\r\n if (relevant.every((i) => i.value === \"no\")) return \"no\";\r\n\r\n return \"unknown\";\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// IMPLICATION CHAIN APPLICATION\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nconst IMPLICATION_CHAINS: Record<string, RiskImplication[]> = {\r\n // LangChain implies tool execution and external data access\r\n \"langchain-python\": [\r\n { factor: \"toolExecution\", value: true, reason: \"LangChain enables tool calling\" },\r\n { factor: \"externalDataAccess\", value: true, reason: \"LangChain chains access external data\" },\r\n ],\r\n \"langchain-js\": [\r\n { factor: \"toolExecution\", value: true, reason: \"LangChain.js enables tool calling\" },\r\n { factor: \"externalDataAccess\", value: true, reason: \"LangChain.js chains access external data\" },\r\n ],\r\n // CrewAI implies autonomous decisions and tool execution\r\n crewai: [\r\n { factor: \"autonomousDecisions\", value: true, reason: \"CrewAI enables autonomous agents\" },\r\n { factor: \"toolExecution\", value: true, reason: \"CrewAI agents execute tools\" },\r\n ],\r\n // AutoGen implies autonomous decisions and tool execution\r\n autogen: [\r\n { factor: \"autonomousDecisions\", value: true, reason: \"AutoGen enables autonomous agents\" },\r\n { factor: \"toolExecution\", value: true, reason: \"AutoGen agents can execute code\" },\r\n ],\r\n // LangGraph implies autonomous decisions\r\n langgraph: [\r\n { factor: \"autonomousDecisions\", value: true, reason: \"LangGraph enables stateful agents\" },\r\n ],\r\n \"langgraph-js\": [\r\n { factor: \"autonomousDecisions\", value: true, reason: \"LangGraph.js enables stateful agents\" },\r\n ],\r\n // Vercel AI SDK implies customer-facing\r\n \"vercel-ai-sdk\": [\r\n { factor: \"customerFacing\", value: true, reason: \"Vercel AI SDK used in user-facing apps\" },\r\n ],\r\n};\r\n\r\nexport function applyImplicationChains(\r\n detections: DetectionResult[]\r\n): DetectionResult[] {\r\n return detections.map((detection) => {\r\n const chainedImplications = IMPLICATION_CHAINS[detection.registryCard];\r\n if (chainedImplications) {\r\n return {\r\n ...detection,\r\n implies: [...detection.implies, ...chainedImplications],\r\n };\r\n }\r\n return detection;\r\n });\r\n}\r\n","import type { Technical } from \"../schemas\";\r\nimport type {\r\n AssetCardSuggestion,\r\n DetectionResult,\r\n ScanResult,\r\n ConfidenceLevel,\r\n} from \"./types\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// ASSET CARD SUGGESTION\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport function suggestAssetCard(scanResult: ScanResult): AssetCardSuggestion {\r\n const { detections, summary, inferredRiskFactors, suggestedTechnical } = scanResult;\r\n\r\n // Generate name from primary framework\r\n const name = generateName(summary.primaryFramework, suggestedTechnical?.type);\r\n\r\n // Generate description\r\n const description = generateDescription(detections, summary);\r\n\r\n // Collect components from detections\r\n const components = collectComponents(detections);\r\n\r\n // Collect unique source files\r\n const sourceFiles = [...new Set(detections.map((d) => d.filePath))];\r\n\r\n // Calculate overall confidence\r\n const confidence = calculateOverallConfidence(detections);\r\n\r\n // Get unique registry cards used\r\n const basedOn = [...new Set(detections.map((d) => d.registryCard))];\r\n\r\n return {\r\n name,\r\n description,\r\n technical: {\r\n type: suggestedTechnical?.type ?? \"framework\",\r\n framework: suggestedTechnical?.framework ?? summary.primaryFramework ?? \"unknown\",\r\n components,\r\n sourceFiles,\r\n },\r\n riskFactors: inferredRiskFactors,\r\n confidence,\r\n basedOn,\r\n };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// HELPER FUNCTIONS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nfunction generateName(\r\n primaryFramework: string | undefined,\r\n type: Technical[\"type\"] | undefined\r\n): string {\r\n if (!primaryFramework) {\r\n return \"AI Asset\";\r\n }\r\n\r\n const typeLabel: Record<Technical[\"type\"], string> = {\r\n model: \"Model\",\r\n agent: \"Agent\",\r\n api_client: \"Integration\",\r\n framework: \"Application\",\r\n pipeline: \"Pipeline\",\r\n };\r\n\r\n return `${primaryFramework} ${typeLabel[type ?? \"framework\"]}`;\r\n}\r\n\r\nfunction generateDescription(\r\n detections: DetectionResult[],\r\n summary: ScanResult[\"summary\"]\r\n): string {\r\n const frameworks = Object.keys(summary.byFramework);\r\n const parts: string[] = [];\r\n\r\n // Main description\r\n if (frameworks.length === 1) {\r\n parts.push(`AI asset using ${frameworks[0]}.`);\r\n } else if (frameworks.length > 1) {\r\n parts.push(`AI asset using ${frameworks.slice(0, 3).join(\", \")}${frameworks.length > 3 ? ` and ${frameworks.length - 3} more` : \"\"}.`);\r\n } else {\r\n parts.push(\"AI asset detected in codebase.\");\r\n }\r\n\r\n // Add capability descriptions\r\n const categories = summary.byCategory;\r\n\r\n if (categories.agent_framework > 0) {\r\n parts.push(\"Includes autonomous agent capabilities.\");\r\n }\r\n\r\n if (categories.llm_provider > 0) {\r\n parts.push(\"Integrates with LLM providers.\");\r\n }\r\n\r\n if (categories.ml_framework > 0) {\r\n parts.push(\"Uses machine learning frameworks.\");\r\n }\r\n\r\n if (categories.model_file > 0) {\r\n parts.push(\"Contains model files.\");\r\n }\r\n\r\n return parts.join(\" \");\r\n}\r\n\r\nfunction collectComponents(\r\n detections: DetectionResult[]\r\n): AssetCardSuggestion[\"technical\"][\"components\"] {\r\n const components: AssetCardSuggestion[\"technical\"][\"components\"] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const detection of detections) {\r\n const key = `${detection.category}-${detection.framework}`;\r\n if (seen.has(key)) continue;\r\n seen.add(key);\r\n\r\n const component: { type: string; provider?: string; model?: string } = {\r\n type: mapCategoryToComponentType(detection.category),\r\n };\r\n\r\n // Add provider for LLM provider detections\r\n if (detection.category === \"llm_provider\") {\r\n component.provider = detection.framework;\r\n }\r\n\r\n components.push(component);\r\n }\r\n\r\n return components;\r\n}\r\n\r\nfunction mapCategoryToComponentType(category: string): string {\r\n const mapping: Record<string, string> = {\r\n llm_provider: \"llm\",\r\n framework: \"framework\",\r\n agent_framework: \"agent\",\r\n ml_framework: \"model\",\r\n ml_ops: \"mlops\",\r\n model_file: \"model\",\r\n };\r\n return mapping[category] ?? category;\r\n}\r\n\r\nfunction calculateOverallConfidence(\r\n detections: DetectionResult[]\r\n): ConfidenceLevel {\r\n if (detections.length === 0) return \"low\";\r\n\r\n const highCount = detections.filter((d) => d.confidence === \"high\").length;\r\n const mediumCount = detections.filter((d) => d.confidence === \"medium\").length;\r\n\r\n // High confidence if we have multiple high-confidence detections\r\n if (highCount >= 3) return \"high\";\r\n\r\n // High confidence if we have at least one high and several medium\r\n if (highCount >= 1 && mediumCount >= 2) return \"high\";\r\n\r\n // Medium confidence if we have any high or multiple medium\r\n if (highCount >= 1 || mediumCount >= 3) return \"medium\";\r\n\r\n // Medium confidence for moderate detection count\r\n if (mediumCount >= 1) return \"medium\";\r\n\r\n return \"low\";\r\n}\r\n","// ─────────────────────────────────────────────────────────────────\r\n// DETECTION ENGINE - Public API\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\n// Types\r\nexport type {\r\n DetectionResult,\r\n ScanOptions,\r\n ScanResult,\r\n ScanSummary,\r\n ScanProgress,\r\n ScanProgressCallback,\r\n ScanError,\r\n PatternDefinition,\r\n PatternRule,\r\n PatternRuleType,\r\n PatternLanguage,\r\n RiskImplication,\r\n AssetCardSuggestion,\r\n ConfidenceLevel,\r\n DetectionStrategy,\r\n FrameworkCategory,\r\n} from \"./types\";\r\n\r\n// Zod schemas\r\nexport { ConfidenceLevelSchema, DetectionStrategySchema, FrameworkCategorySchema } from \"./types\";\r\n\r\n// Main scan functions\r\nexport { scan, scanSync } from \"./scanner\";\r\n\r\n// Risk inference\r\nexport { inferRiskFactors, applyImplicationChains } from \"./risk-inference\";\r\n\r\n// Asset card suggestion\r\nexport { suggestAssetCard } from \"./asset-suggestion\";\r\n\r\n// Pattern registry\r\nexport {\r\n registerPattern,\r\n getPattern,\r\n getAllPatterns,\r\n getPatternsByCategory,\r\n getPatternsByLanguage,\r\n clearRegistry,\r\n isRegistryInitialized,\r\n createImplication,\r\n initializePatterns,\r\n resetPatterns,\r\n} from \"./patterns\";\r\n\r\n// Individual pattern sets (for reference/extension)\r\nexport { pythonPatterns } from \"./patterns/python\";\r\nexport { javascriptPatterns } from \"./patterns/javascript\";\r\nexport { modelFilePatterns } from \"./patterns/model-files\";\r\nexport { riskIndicatorPatterns } from \"./patterns/risk-indicators\";\r\n\r\n// Strategies (for advanced usage)\r\nexport { matchPatterns } from \"./strategies/pattern-matcher\";\r\nexport { analyzeImports } from \"./strategies/import-analyzer\";\r\nexport { scanFileExtension, isModelFile, MODEL_EXTENSIONS } from \"./strategies/file-scanner\";\r\nexport { detectAnnotations } from \"./strategies/annotation-detector\";\r\n","export function formatDate(date: Date): string {\r\n return date.toISOString();\r\n}\r\n\r\nexport function parseDate(dateString: string): Date {\r\n return new Date(dateString);\r\n}\r\n\r\nexport function slugify(text: string): string {\r\n return text\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, \"-\")\r\n .replace(/(^-|-$)/g, \"\");\r\n}"],"mappings":"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","names":["YAML","import_zod","import_fs","import_path","registerPythonPatterns","registerJavaScriptPatterns","registerModelFilePatterns","registerRiskIndicatorPatterns","clearRegistry","import_path"]}