@aigrc/core 0.1.0 → 0.2.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.
package/dist/index.js.map CHANGED
@@ -1 +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"]}
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/risk-utils.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/config.ts","../src/policy.ts","../src/air/index.ts","../src/governance-lock/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// Risk utilities\r\nexport * from \"./risk-utils\";\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// Configuration discovery\r\nexport * from \"./config\";\r\n\r\n// Policy engine\r\nexport * from \"./policy\";\r\n\r\n// AIR (AIGRC Intermediate Representation)\r\nexport * from \"./air\";\r\n\r\n// Governance Lock (policy version pinning)\r\nexport * from \"./governance-lock\";\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// RISK LEVEL SCHEMA (for runtime governance)\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const RiskLevelSchema = z.enum([\"minimal\", \"limited\", \"high\", \"unacceptable\"]);\r\nexport type RiskLevel = z.infer<typeof RiskLevelSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// GOLDEN THREAD SCHEMA (SPEC-PRT-001)\r\n// Cryptographic linking from runtime to business authorization\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const GoldenThreadSchema = z.object({\r\n /** Ticket ID from approval system (e.g., \"FIN-1234\") */\r\n ticket_id: z.string().min(1),\r\n /** Email of approver (e.g., \"ciso@corp.com\") */\r\n approved_by: z.string().email(),\r\n /** ISO 8601 timestamp of approval (e.g., \"2025-01-15T10:30:00Z\") */\r\n approved_at: z.string().datetime(),\r\n /** SHA-256 hash of canonical string: sha256:{64 hex chars} */\r\n hash: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),\r\n /** Optional cryptographic signature: {ALGORITHM}:{BASE64_SIGNATURE} */\r\n signature: z.string().regex(/^(RSA-SHA256|ECDSA-P256):[A-Za-z0-9+/=]+$/).optional(),\r\n});\r\n\r\nexport type GoldenThread = z.infer<typeof GoldenThreadSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// LINEAGE SCHEMA (SPEC-RT-002: Agent Hierarchy)\r\n// Tracks parent-child relationships for spawned agents\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const LineageSchema = z.object({\r\n /** Parent agent's instance_id, null for root agents */\r\n parent_instance_id: z.string().uuid().nullable(),\r\n /** Depth in spawn tree: 0 for root, 1 for first child, etc. */\r\n generation_depth: z.number().int().min(0),\r\n /** Chain of ancestor instance_ids from root to parent */\r\n ancestor_chain: z.array(z.string().uuid()),\r\n /** When this agent was spawned */\r\n spawned_at: z.string().datetime(),\r\n /** Root agent's instance_id for tracing entire tree */\r\n root_instance_id: z.string().uuid(),\r\n});\r\n\r\nexport type Lineage = z.infer<typeof LineageSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// CAPABILITIES MANIFEST SCHEMA (SPEC-RT-002)\r\n// Defines what actions/resources an agent is allowed\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const CapabilitiesManifestSchema = z.object({\r\n /** List of allowed tool/action identifiers (supports wildcards: *, prefix_*) */\r\n allowed_tools: z.array(z.string()).default([]),\r\n /** List of explicitly denied tools (takes precedence over allowed) */\r\n denied_tools: z.array(z.string()).default([]),\r\n /** Allowed domain patterns (regex) for external resources */\r\n allowed_domains: z.array(z.string()).default([]),\r\n /** Denied domain patterns (takes precedence over allowed) */\r\n denied_domains: z.array(z.string()).default([]),\r\n /** Maximum cost per session in USD */\r\n max_cost_per_session: z.number().positive().nullable().optional(),\r\n /** Maximum cost per day in USD */\r\n max_cost_per_day: z.number().positive().nullable().optional(),\r\n /** Maximum tokens per single API call */\r\n max_tokens_per_call: z.number().int().positive().nullable().optional(),\r\n /** Whether this agent can spawn child agents */\r\n may_spawn_children: z.boolean().default(false),\r\n /** Maximum depth of child agent spawning (0 = cannot spawn) */\r\n max_child_depth: z.number().int().min(0).default(0),\r\n /** Capability decay mode for children: decay, explicit, inherit */\r\n capability_mode: z.enum([\"decay\", \"explicit\", \"inherit\"]).default(\"decay\"),\r\n /** Custom extension fields */\r\n custom: z.record(z.unknown()).optional(),\r\n});\r\n\r\nexport type CapabilitiesManifest = z.infer<typeof CapabilitiesManifestSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// OPERATING MODE SCHEMA (SPEC-RT-002)\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const OperatingModeSchema = z.enum([\"NORMAL\", \"SANDBOX\", \"RESTRICTED\"]);\r\nexport type OperatingMode = z.infer<typeof OperatingModeSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// RUNTIME IDENTITY SCHEMA (SPEC-RT-002)\r\n// Cryptographic identity established at agent startup\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const RuntimeIdentitySchema = z.object({\r\n /** Unique UUIDv4 for this runtime instance */\r\n instance_id: z.string().uuid(),\r\n /** Asset ID from the Asset Card (e.g., \"aigrc-2024-a1b2c3d4\") */\r\n asset_id: z.string().regex(/^aigrc-\\d{4}-[a-f0-9]{8}$/),\r\n /** Human-readable name from Asset Card */\r\n asset_name: z.string().min(1).max(100),\r\n /** Semantic version from Asset Card */\r\n asset_version: z.string().regex(/^\\d+\\.\\d+\\.\\d+/),\r\n /** SHA-256 hash of Golden Thread data */\r\n golden_thread_hash: z.string().regex(/^sha256:[a-f0-9]{64}$/),\r\n /** Full Golden Thread authorization data */\r\n golden_thread: GoldenThreadSchema,\r\n /** Risk level from classification */\r\n risk_level: RiskLevelSchema,\r\n /** Agent lineage for spawned agents */\r\n lineage: LineageSchema,\r\n /** Capabilities manifest defining permissions */\r\n capabilities_manifest: CapabilitiesManifestSchema,\r\n /** When this identity was created */\r\n created_at: z.string().datetime(),\r\n /** Whether Golden Thread hash has been verified */\r\n verified: z.boolean().default(false),\r\n /** Current operating mode */\r\n mode: OperatingModeSchema.default(\"NORMAL\"),\r\n});\r\n\r\nexport type RuntimeIdentity = z.infer<typeof RuntimeIdentitySchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// KILL SWITCH COMMAND SCHEMA (SPEC-RT-005)\r\n// Remote termination command structure\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const KillSwitchCommandTypeSchema = z.enum([\"TERMINATE\", \"PAUSE\", \"RESUME\"]);\r\nexport type KillSwitchCommandType = z.infer<typeof KillSwitchCommandTypeSchema>;\r\n\r\nexport const KillSwitchCommandSchema = z.object({\r\n /** Unique command ID for idempotency and replay prevention */\r\n command_id: z.string().uuid(),\r\n /** Type of command */\r\n type: KillSwitchCommandTypeSchema,\r\n /** Target instance_id (optional, for specific instance) */\r\n instance_id: z.string().uuid().optional(),\r\n /** Target asset_id (optional, for all instances of an asset) */\r\n asset_id: z.string().regex(/^aigrc-\\d{4}-[a-f0-9]{8}$/).optional(),\r\n /** Target organization (optional, for org-wide kill) */\r\n organization: z.string().optional(),\r\n /** Cryptographic signature for verification */\r\n signature: z.string(),\r\n /** ISO 8601 timestamp for replay prevention */\r\n timestamp: z.string().datetime(),\r\n /** Human-readable reason for audit trail */\r\n reason: z.string().max(500),\r\n /** Issuer of the command (email or system ID) */\r\n issued_by: z.string(),\r\n});\r\n\r\nexport type KillSwitchCommand = z.infer<typeof KillSwitchCommandSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// GOVERNANCE TOKEN PAYLOAD SCHEMA (SPEC-PRT-003: A2A)\r\n// JWT payload for agent-to-agent mutual authentication\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const GovernanceTokenIdentityClaimsSchema = z.object({\r\n instance_id: z.string().uuid(),\r\n asset_id: z.string(),\r\n asset_name: z.string(),\r\n asset_version: z.string(),\r\n});\r\n\r\nexport const GovernanceTokenGovernanceClaimsSchema = z.object({\r\n risk_level: RiskLevelSchema,\r\n golden_thread: z.object({\r\n hash: z.string().regex(/^sha256:[a-f0-9]{64}$/),\r\n verified: z.boolean(),\r\n ticket_id: z.string(),\r\n }),\r\n mode: OperatingModeSchema,\r\n});\r\n\r\nexport const GovernanceTokenControlClaimsSchema = z.object({\r\n kill_switch: z.object({\r\n enabled: z.boolean(),\r\n channel: z.enum([\"sse\", \"polling\", \"file\"]),\r\n }),\r\n paused: z.boolean(),\r\n termination_pending: z.boolean(),\r\n});\r\n\r\nexport const GovernanceTokenCapabilityClaimsSchema = z.object({\r\n hash: z.string(),\r\n tools: z.array(z.string()),\r\n max_budget_usd: z.number().nullable(),\r\n can_spawn: z.boolean(),\r\n max_child_depth: z.number().int().min(0),\r\n});\r\n\r\nexport const GovernanceTokenLineageClaimsSchema = z.object({\r\n generation_depth: z.number().int().min(0),\r\n parent_instance_id: z.string().uuid().nullable(),\r\n root_instance_id: z.string().uuid(),\r\n});\r\n\r\nexport const GovernanceTokenPayloadSchema = z.object({\r\n // Standard JWT claims\r\n /** Issuer: \"aigos-runtime\" */\r\n iss: z.literal(\"aigos-runtime\"),\r\n /** Subject: instance_id of the agent */\r\n sub: z.string().uuid(),\r\n /** Audience: \"aigos-agents\" or specific agent */\r\n aud: z.union([z.string(), z.array(z.string())]),\r\n /** Expiration timestamp (Unix epoch) */\r\n exp: z.number().int().positive(),\r\n /** Issued at timestamp (Unix epoch) */\r\n iat: z.number().int().positive(),\r\n /** Not before timestamp (Unix epoch) */\r\n nbf: z.number().int().positive(),\r\n /** Unique JWT ID */\r\n jti: z.string().uuid(),\r\n\r\n // AIGOS-specific claims\r\n aigos: z.object({\r\n identity: GovernanceTokenIdentityClaimsSchema,\r\n governance: GovernanceTokenGovernanceClaimsSchema,\r\n control: GovernanceTokenControlClaimsSchema,\r\n capabilities: GovernanceTokenCapabilityClaimsSchema,\r\n lineage: GovernanceTokenLineageClaimsSchema,\r\n }),\r\n});\r\n\r\nexport type GovernanceTokenPayload = z.infer<typeof GovernanceTokenPayloadSchema>;\r\nexport type GovernanceTokenIdentityClaims = z.infer<typeof GovernanceTokenIdentityClaimsSchema>;\r\nexport type GovernanceTokenGovernanceClaims = z.infer<typeof GovernanceTokenGovernanceClaimsSchema>;\r\nexport type GovernanceTokenControlClaims = z.infer<typeof GovernanceTokenControlClaimsSchema>;\r\nexport type GovernanceTokenCapabilityClaims = z.infer<typeof GovernanceTokenCapabilityClaimsSchema>;\r\nexport type GovernanceTokenLineageClaims = z.infer<typeof GovernanceTokenLineageClaimsSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// ASSET CARD RUNTIME EXTENSION (SPEC-FMT-002)\r\n// Optional runtime section for Asset Cards\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const AssetCardRuntimeSchema = z.object({\r\n /** Path to policy file for this asset */\r\n policy_path: z.string().optional(),\r\n /** Behavior when Golden Thread verification fails */\r\n verification_failure_mode: z.enum([\"SANDBOX\", \"FAIL\"]).default(\"SANDBOX\"),\r\n /** Whether telemetry is enabled for this asset */\r\n telemetry_enabled: z.boolean().default(true),\r\n /** Kill switch configuration */\r\n kill_switch: z.object({\r\n enabled: z.boolean().default(true),\r\n channel: z.enum([\"sse\", \"polling\", \"file\"]).default(\"sse\"),\r\n endpoint: z.string().url().optional(),\r\n }).optional(),\r\n});\r\n\r\nexport type AssetCardRuntime = z.infer<typeof AssetCardRuntimeSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// POLICY FILE SCHEMA (SPEC-RT-003)\r\n// Defines runtime governance policies for AI agents\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const PolicyRuleEffectSchema = z.enum([\"allow\", \"deny\", \"audit\"]);\r\nexport type PolicyRuleEffect = z.infer<typeof PolicyRuleEffectSchema>;\r\n\r\nexport const PolicyRuleSchema = z.object({\r\n /** Unique identifier for this rule */\r\n id: z.string().min(1),\r\n /** Human-readable description */\r\n description: z.string().optional(),\r\n /** Effect when rule matches: allow, deny, or audit */\r\n effect: PolicyRuleEffectSchema,\r\n /** Actions/tools this rule applies to (supports wildcards) */\r\n actions: z.array(z.string()).default([\"*\"]),\r\n /** Resources/domains this rule applies to (supports patterns) */\r\n resources: z.array(z.string()).default([\"*\"]),\r\n /** Conditions that must be true for rule to apply */\r\n conditions: z.object({\r\n /** Required risk levels for this rule to apply */\r\n risk_levels: z.array(RiskLevelSchema).optional(),\r\n /** Required operating modes */\r\n modes: z.array(OperatingModeSchema).optional(),\r\n /** Time-based conditions (ISO 8601 time ranges) */\r\n time_ranges: z.array(z.object({\r\n start: z.string(),\r\n end: z.string(),\r\n })).optional(),\r\n /** Custom condition expressions */\r\n custom: z.record(z.unknown()).optional(),\r\n }).optional(),\r\n /** Priority for rule ordering (higher = evaluated first) */\r\n priority: z.number().int().default(0),\r\n});\r\n\r\nexport type PolicyRule = z.infer<typeof PolicyRuleSchema>;\r\n\r\nexport const PolicyCapabilitiesSchema = z.object({\r\n /** Default effect when no rule matches */\r\n default_effect: PolicyRuleEffectSchema.default(\"deny\"),\r\n /** Allowed tools (supports wildcards: *, prefix_*) */\r\n allowed_tools: z.array(z.string()).default([]),\r\n /** Denied tools (takes precedence) */\r\n denied_tools: z.array(z.string()).default([]),\r\n /** Allowed domain patterns */\r\n allowed_domains: z.array(z.string()).default([]),\r\n /** Denied domain patterns */\r\n denied_domains: z.array(z.string()).default([]),\r\n /** Maximum budget per session in USD */\r\n max_budget_per_session: z.number().positive().nullable().optional(),\r\n /** Maximum budget per day in USD */\r\n max_budget_per_day: z.number().positive().nullable().optional(),\r\n /** Whether agent can spawn children */\r\n may_spawn: z.boolean().default(false),\r\n /** Maximum spawn depth */\r\n max_spawn_depth: z.number().int().min(0).default(0),\r\n});\r\n\r\nexport type PolicyCapabilities = z.infer<typeof PolicyCapabilitiesSchema>;\r\n\r\nexport const PolicyFileSchema = z.object({\r\n /** Schema version for forward compatibility */\r\n version: z.literal(\"1.0\"),\r\n /** Unique policy identifier */\r\n id: z.string().min(1),\r\n /** Human-readable name */\r\n name: z.string().min(1).max(100),\r\n /** Description of this policy */\r\n description: z.string().max(500).optional(),\r\n /** Parent policy to inherit from */\r\n extends: z.string().optional(),\r\n /** Target asset IDs or patterns this policy applies to */\r\n applies_to: z.array(z.string()).default([\"*\"]),\r\n /** Default capabilities when no rules match */\r\n capabilities: PolicyCapabilitiesSchema.optional(),\r\n /** Ordered list of policy rules */\r\n rules: z.array(PolicyRuleSchema).default([]),\r\n /** Metadata */\r\n metadata: z.object({\r\n created_at: z.string().datetime().optional(),\r\n updated_at: z.string().datetime().optional(),\r\n created_by: z.string().optional(),\r\n tags: z.array(z.string()).optional(),\r\n }).optional(),\r\n});\r\n\r\nexport type PolicyFile = z.infer<typeof PolicyFileSchema>;\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// AIGRC CONFIGURATION SCHEMA (.aigrc.yaml)\r\n// Root configuration file for AIGRC projects\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport const AigrcRuntimeConfigSchema = z.object({\r\n /** Default policy file path */\r\n default_policy: z.string().optional(),\r\n /** Policy search paths */\r\n policy_paths: z.array(z.string()).default([\".aigrc/policies\"]),\r\n /** Asset card search paths */\r\n asset_paths: z.array(z.string()).default([\".aigrc/assets\"]),\r\n /** Default verification failure mode */\r\n verification_failure_mode: z.enum([\"SANDBOX\", \"FAIL\"]).default(\"SANDBOX\"),\r\n /** Telemetry configuration */\r\n telemetry: z.object({\r\n enabled: z.boolean().default(true),\r\n endpoint: z.string().url().optional(),\r\n sample_rate: z.number().min(0).max(1).default(1.0),\r\n }).optional(),\r\n /** Kill switch configuration */\r\n kill_switch: z.object({\r\n enabled: z.boolean().default(true),\r\n channel: z.enum([\"sse\", \"polling\", \"file\"]).default(\"sse\"),\r\n endpoint: z.string().url().optional(),\r\n poll_interval_ms: z.number().int().positive().default(5000),\r\n }).optional(),\r\n});\r\n\r\nexport type AigrcRuntimeConfig = z.infer<typeof AigrcRuntimeConfigSchema>;\r\n\r\nexport const AigrcIntegrationsConfigSchema = z.object({\r\n /** JIRA integration */\r\n jira: z.object({\r\n enabled: z.boolean().default(false),\r\n url: z.string().url().optional(),\r\n project_key: z.string().optional(),\r\n }).optional(),\r\n /** Azure DevOps integration */\r\n azure_devops: z.object({\r\n enabled: z.boolean().default(false),\r\n organization: z.string().optional(),\r\n project: z.string().optional(),\r\n }).optional(),\r\n /** GitHub integration */\r\n github: z.object({\r\n enabled: z.boolean().default(false),\r\n owner: z.string().optional(),\r\n repo: z.string().optional(),\r\n }).optional(),\r\n});\r\n\r\nexport type AigrcIntegrationsConfig = z.infer<typeof AigrcIntegrationsConfigSchema>;\r\n\r\nexport const AigrcConfigSchema = z.object({\r\n /** Schema version */\r\n version: z.literal(\"1.0\"),\r\n /** Project name */\r\n name: z.string().min(1).max(100).optional(),\r\n /** Project description */\r\n description: z.string().max(500).optional(),\r\n /** Runtime governance configuration */\r\n runtime: AigrcRuntimeConfigSchema.optional(),\r\n /** External integrations */\r\n integrations: AigrcIntegrationsConfigSchema.optional(),\r\n /** Environment-specific overrides */\r\n environments: z.record(z.object({\r\n runtime: AigrcRuntimeConfigSchema.partial().optional(),\r\n integrations: AigrcIntegrationsConfigSchema.partial().optional(),\r\n })).optional(),\r\n});\r\n\r\nexport type AigrcConfig = z.infer<typeof AigrcConfigSchema>;\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 /** Golden Thread authorization data (SPEC-PRT-001) */\r\n golden_thread: GoldenThreadSchema.optional(),\r\n /** Runtime governance configuration (SPEC-RT) */\r\n runtime: AssetCardRuntimeSchema.optional(),\r\n});\r\n\r\nexport type AssetCard = z.infer<typeof AssetCardSchema>;","import type { RiskFactors, RiskLevel } from \"./schemas\";\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}","/**\r\n * Risk Level Utility Functions (AIGOS-105)\r\n * Provides consistent operations for comparing and mapping risk levels\r\n */\r\n\r\nimport type { RiskLevel } from \"./schemas\";\r\n\r\n/** Risk level ordinal values for comparison */\r\nconst RISK_ORDINALS: Record<RiskLevel, number> = {\r\n minimal: 0,\r\n limited: 1,\r\n high: 2,\r\n unacceptable: 3,\r\n};\r\n\r\n/** EU AI Act category mapping */\r\nconst EU_AI_ACT_MAP: Record<RiskLevel, string> = {\r\n minimal: \"minimal_risk\",\r\n limited: \"limited_risk\",\r\n high: \"high_risk\",\r\n unacceptable: \"prohibited\",\r\n};\r\n\r\n/**\r\n * Compare two risk levels\r\n * @returns -1 if a < b, 0 if a == b, 1 if a > b\r\n */\r\nexport function compareRiskLevels(a: RiskLevel, b: RiskLevel): -1 | 0 | 1 {\r\n const ordA = RISK_ORDINALS[a];\r\n const ordB = RISK_ORDINALS[b];\r\n if (ordA < ordB) return -1;\r\n if (ordA > ordB) return 1;\r\n return 0;\r\n}\r\n\r\n/**\r\n * Check if a risk level is at least as severe as a threshold\r\n */\r\nexport function isRiskLevelAtLeast(level: RiskLevel, threshold: RiskLevel): boolean {\r\n return RISK_ORDINALS[level] >= RISK_ORDINALS[threshold];\r\n}\r\n\r\n/**\r\n * Check if a risk level is at most as severe as a threshold\r\n */\r\nexport function isRiskLevelAtMost(level: RiskLevel, threshold: RiskLevel): boolean {\r\n return RISK_ORDINALS[level] <= RISK_ORDINALS[threshold];\r\n}\r\n\r\n/**\r\n * Get the ordinal value (0-3) of a risk level\r\n */\r\nexport function getRiskLevelOrdinal(level: RiskLevel): number {\r\n return RISK_ORDINALS[level];\r\n}\r\n\r\n/**\r\n * Get the maximum (most severe) risk level from an array\r\n */\r\nexport function getMaxRiskLevel(levels: RiskLevel[]): RiskLevel {\r\n if (levels.length === 0) {\r\n return \"minimal\";\r\n }\r\n return levels.reduce((max, current) =>\r\n RISK_ORDINALS[current] > RISK_ORDINALS[max] ? current : max\r\n );\r\n}\r\n\r\n/**\r\n * Get the minimum (least severe) risk level from an array\r\n */\r\nexport function getMinRiskLevel(levels: RiskLevel[]): RiskLevel {\r\n if (levels.length === 0) {\r\n return \"minimal\";\r\n }\r\n return levels.reduce((min, current) =>\r\n RISK_ORDINALS[current] < RISK_ORDINALS[min] ? current : min\r\n );\r\n}\r\n\r\n/**\r\n * Map an AIGOS risk level to EU AI Act category\r\n */\r\nexport function mapToEuAiActCategory(level: RiskLevel): string {\r\n return EU_AI_ACT_MAP[level];\r\n}\r\n\r\n/**\r\n * Get all risk levels at or above a threshold\r\n */\r\nexport function getRiskLevelsAtLeast(threshold: RiskLevel): RiskLevel[] {\r\n const thresholdOrd = RISK_ORDINALS[threshold];\r\n return (Object.entries(RISK_ORDINALS) as [RiskLevel, number][])\r\n .filter(([, ord]) => ord >= thresholdOrd)\r\n .map(([level]) => level);\r\n}\r\n\r\n/**\r\n * Get all risk levels at or below a threshold\r\n */\r\nexport function getRiskLevelsAtMost(threshold: RiskLevel): RiskLevel[] {\r\n const thresholdOrd = RISK_ORDINALS[threshold];\r\n return (Object.entries(RISK_ORDINALS) as [RiskLevel, number][])\r\n .filter(([, ord]) => ord <= thresholdOrd)\r\n .map(([level]) => level);\r\n}\r\n\r\n/**\r\n * Parse a string to a RiskLevel, returning undefined if invalid\r\n */\r\nexport function parseRiskLevel(value: string): RiskLevel | undefined {\r\n const normalized = value.toLowerCase();\r\n if (normalized in RISK_ORDINALS) {\r\n return normalized as RiskLevel;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Check if a value is a valid RiskLevel\r\n */\r\nexport function isValidRiskLevel(value: unknown): value is RiskLevel {\r\n return typeof value === \"string\" && value in RISK_ORDINALS;\r\n}\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, GoldenThread } 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\n// ─────────────────────────────────────────────────────────────────\r\n// GOLDEN THREAD PROTOCOL IMPLEMENTATION (SPEC-PRT-001)\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport interface GoldenThreadComponents {\r\n ticket_id: string;\r\n approved_by: string;\r\n approved_at: string;\r\n}\r\n\r\nexport interface GoldenThreadHashResult {\r\n canonical_string: string;\r\n hash: string;\r\n}\r\n\r\nexport interface GoldenThreadVerificationResult {\r\n verified: boolean;\r\n computed: string;\r\n expected: string;\r\n mismatch_reason?: string;\r\n}\r\n\r\n/**\r\n * Compute the canonical string for Golden Thread hashing.\r\n * Format: approved_at={ISO8601}|approved_by={email}|ticket_id={id}\r\n * Fields are sorted alphabetically with pipe delimiters.\r\n *\r\n * Test Vector:\r\n * Input: ticket_id=FIN-1234, approved_by=ciso@corp.com, approved_at=2025-01-15T10:30:00Z\r\n * Output: \"approved_at=2025-01-15T10:30:00Z|approved_by=ciso@corp.com|ticket_id=FIN-1234\"\r\n */\r\nexport function computeCanonicalString(components: GoldenThreadComponents): string {\r\n // Normalize timestamp to UTC ISO 8601\r\n const normalizedTimestamp = normalizeTimestamp(components.approved_at);\r\n\r\n // Build key-value pairs sorted alphabetically by key\r\n const pairs = [\r\n `approved_at=${normalizedTimestamp}`,\r\n `approved_by=${components.approved_by}`,\r\n `ticket_id=${components.ticket_id}`,\r\n ];\r\n\r\n // Join with pipe delimiter\r\n return pairs.join(\"|\");\r\n}\r\n\r\n/**\r\n * Normalize a timestamp to UTC ISO 8601 format\r\n */\r\nfunction normalizeTimestamp(timestamp: string): string {\r\n const date = new Date(timestamp);\r\n if (isNaN(date.getTime())) {\r\n throw new Error(`Invalid timestamp: ${timestamp}`);\r\n }\r\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\r\n}\r\n\r\n/**\r\n * Compute SHA-256 hash of the Golden Thread canonical string.\r\n * Output format: sha256:{64 lowercase hex chars}\r\n *\r\n * Test Vector:\r\n * Input: FIN-1234 | ciso@corp.com | 2025-01-15T10:30:00Z\r\n * Output: sha256:7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730\r\n */\r\nexport async function computeGoldenThreadHash(\r\n components: GoldenThreadComponents\r\n): Promise<GoldenThreadHashResult> {\r\n const canonicalString = computeCanonicalString(components);\r\n\r\n // Use Web Crypto API for SHA-256\r\n const encoder = new TextEncoder();\r\n const data = encoder.encode(canonicalString);\r\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\r\n\r\n // Convert to hex string\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\r\n\r\n return {\r\n canonical_string: canonicalString,\r\n hash: `sha256:${hashHex}`,\r\n };\r\n}\r\n\r\n/**\r\n * Synchronous hash computation using Node.js crypto (for Node environments)\r\n */\r\nexport function computeGoldenThreadHashSync(\r\n components: GoldenThreadComponents\r\n): GoldenThreadHashResult {\r\n const canonicalString = computeCanonicalString(components);\r\n\r\n // Dynamic import to avoid bundling issues in browser\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n const crypto = require(\"crypto\");\r\n const hash = crypto.createHash(\"sha256\").update(canonicalString).digest(\"hex\");\r\n\r\n return {\r\n canonical_string: canonicalString,\r\n hash: `sha256:${hash}`,\r\n };\r\n}\r\n\r\n/**\r\n * Verify a Golden Thread hash against computed value.\r\n * Uses constant-time comparison for security.\r\n */\r\nexport async function verifyGoldenThreadHash(\r\n components: GoldenThreadComponents,\r\n expectedHash: string\r\n): Promise<GoldenThreadVerificationResult> {\r\n const { hash: computedHash } = await computeGoldenThreadHash(components);\r\n\r\n // Constant-time comparison\r\n const verified = constantTimeEqual(computedHash, expectedHash);\r\n\r\n return {\r\n verified,\r\n computed: computedHash,\r\n expected: expectedHash,\r\n mismatch_reason: verified ? undefined : \"Hash mismatch\",\r\n };\r\n}\r\n\r\n/**\r\n * Synchronous hash verification\r\n */\r\nexport function verifyGoldenThreadHashSync(\r\n components: GoldenThreadComponents,\r\n expectedHash: string\r\n): GoldenThreadVerificationResult {\r\n const { hash: computedHash } = computeGoldenThreadHashSync(components);\r\n\r\n const verified = constantTimeEqual(computedHash, expectedHash);\r\n\r\n return {\r\n verified,\r\n computed: computedHash,\r\n expected: expectedHash,\r\n mismatch_reason: verified ? undefined : \"Hash mismatch\",\r\n };\r\n}\r\n\r\n/**\r\n * Constant-time string comparison to prevent timing attacks\r\n */\r\nfunction constantTimeEqual(a: string, b: string): boolean {\r\n if (a.length !== b.length) {\r\n return false;\r\n }\r\n\r\n let result = 0;\r\n for (let i = 0; i < a.length; i++) {\r\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\r\n }\r\n return result === 0;\r\n}\r\n\r\n/**\r\n * Extract Golden Thread components from an Asset Card\r\n */\r\nexport function extractGoldenThreadComponents(\r\n asset: AssetCard\r\n): GoldenThreadComponents | null {\r\n // Try to extract from golden_thread field first\r\n if (asset.golden_thread) {\r\n return {\r\n ticket_id: asset.golden_thread.ticket_id,\r\n approved_by: asset.golden_thread.approved_by,\r\n approved_at: asset.golden_thread.approved_at,\r\n };\r\n }\r\n\r\n // Fall back to intent + governance.approvals\r\n if (!asset.intent.ticketId) {\r\n return null;\r\n }\r\n\r\n // Find the most recent approval\r\n const approvals = asset.governance.approvals;\r\n if (approvals.length === 0) {\r\n return null;\r\n }\r\n\r\n const latestApproval = approvals.reduce((latest, current) =>\r\n new Date(current.date) > new Date(latest.date) ? current : latest\r\n );\r\n\r\n return {\r\n ticket_id: asset.intent.ticketId,\r\n approved_by: latestApproval.email || latestApproval.name,\r\n approved_at: latestApproval.date,\r\n };\r\n}\r\n\r\n/**\r\n * Create a complete Golden Thread object with computed hash\r\n */\r\nexport async function createGoldenThread(\r\n components: GoldenThreadComponents\r\n): Promise<GoldenThread> {\r\n const { hash } = await computeGoldenThreadHash(components);\r\n\r\n return {\r\n ticket_id: components.ticket_id,\r\n approved_by: components.approved_by,\r\n approved_at: components.approved_at,\r\n hash,\r\n };\r\n}\r\n\r\n/**\r\n * Synchronous version of createGoldenThread\r\n */\r\nexport function createGoldenThreadSync(\r\n components: GoldenThreadComponents\r\n): GoldenThread {\r\n const { hash } = computeGoldenThreadHashSync(components);\r\n\r\n return {\r\n ticket_id: components.ticket_id,\r\n approved_by: components.approved_by,\r\n approved_at: components.approved_at,\r\n hash,\r\n };\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}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// SIGNATURE VERIFICATION (AIG-33 / SPEC-PRT-001)\r\n// Optional cryptographic signature verification for Golden Thread\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\n/** Supported signature algorithms */\r\nexport type SignatureAlgorithm = \"RSA-SHA256\" | \"ECDSA-P256\";\r\n\r\n/** Result of signature verification */\r\nexport interface SignatureVerificationResult {\r\n /** Whether signature is valid */\r\n verified: boolean;\r\n /** Algorithm used */\r\n algorithm: SignatureAlgorithm | null;\r\n /** Error message if verification failed */\r\n error?: string;\r\n /** The data that was signed (canonical string) */\r\n signedData?: string;\r\n}\r\n\r\n/** Public key for signature verification */\r\nexport interface SignaturePublicKey {\r\n /** Algorithm this key is for */\r\n algorithm: SignatureAlgorithm;\r\n /** PEM-encoded public key or JWK */\r\n key: string;\r\n /** Key ID for key rotation */\r\n keyId?: string;\r\n}\r\n\r\n/**\r\n * Parse a signature string in format: {ALGORITHM}:{BASE64_SIGNATURE}\r\n */\r\nexport function parseSignature(\r\n signature: string\r\n): { algorithm: SignatureAlgorithm; data: Uint8Array } | null {\r\n const match = signature.match(/^(RSA-SHA256|ECDSA-P256):([A-Za-z0-9+/=]+)$/);\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n const algorithm = match[1] as SignatureAlgorithm;\r\n const base64Data = match[2];\r\n\r\n try {\r\n // Decode base64 to Uint8Array\r\n const binaryString = atob(base64Data);\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n return { algorithm, data: bytes };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Verify a Golden Thread signature using Web Crypto API.\r\n *\r\n * @param components - The Golden Thread components that were signed\r\n * @param signature - The signature in format {ALGORITHM}:{BASE64_SIGNATURE}\r\n * @param publicKey - The public key for verification\r\n * @returns Verification result\r\n */\r\nexport async function verifyGoldenThreadSignature(\r\n components: GoldenThreadComponents,\r\n signature: string,\r\n publicKey: SignaturePublicKey\r\n): Promise<SignatureVerificationResult> {\r\n // Parse the signature\r\n const parsed = parseSignature(signature);\r\n if (!parsed) {\r\n return {\r\n verified: false,\r\n algorithm: null,\r\n error: \"Invalid signature format. Expected {ALGORITHM}:{BASE64_SIGNATURE}\",\r\n };\r\n }\r\n\r\n // Check algorithm matches\r\n if (parsed.algorithm !== publicKey.algorithm) {\r\n return {\r\n verified: false,\r\n algorithm: parsed.algorithm,\r\n error: `Algorithm mismatch: signature uses ${parsed.algorithm}, key is ${publicKey.algorithm}`,\r\n };\r\n }\r\n\r\n // Compute canonical string (the data that was signed)\r\n const canonicalString = computeCanonicalString(components);\r\n const encoder = new TextEncoder();\r\n const data = encoder.encode(canonicalString);\r\n\r\n try {\r\n // Import the public key\r\n const cryptoKey = await importPublicKey(publicKey);\r\n\r\n // Verify the signature\r\n const algorithmParams = getVerifyAlgorithm(parsed.algorithm);\r\n const verified = await crypto.subtle.verify(\r\n algorithmParams,\r\n cryptoKey as Parameters<typeof crypto.subtle.verify>[1],\r\n parsed.data,\r\n data\r\n );\r\n\r\n return {\r\n verified,\r\n algorithm: parsed.algorithm,\r\n signedData: canonicalString,\r\n error: verified ? undefined : \"Signature verification failed\",\r\n };\r\n } catch (error) {\r\n return {\r\n verified: false,\r\n algorithm: parsed.algorithm,\r\n error: `Verification error: ${error instanceof Error ? error.message : String(error)}`,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Synchronous signature verification using Node.js crypto\r\n */\r\nexport function verifyGoldenThreadSignatureSync(\r\n components: GoldenThreadComponents,\r\n signature: string,\r\n publicKeyPem: string\r\n): SignatureVerificationResult {\r\n const parsed = parseSignature(signature);\r\n if (!parsed) {\r\n return {\r\n verified: false,\r\n algorithm: null,\r\n error: \"Invalid signature format\",\r\n };\r\n }\r\n\r\n const canonicalString = computeCanonicalString(components);\r\n\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n const crypto = require(\"crypto\");\r\n\r\n const verifier = crypto.createVerify(\r\n parsed.algorithm === \"RSA-SHA256\" ? \"RSA-SHA256\" : \"SHA256\"\r\n );\r\n verifier.update(canonicalString);\r\n verifier.end();\r\n\r\n const verified = verifier.verify(publicKeyPem, Buffer.from(parsed.data));\r\n\r\n return {\r\n verified,\r\n algorithm: parsed.algorithm,\r\n signedData: canonicalString,\r\n error: verified ? undefined : \"Signature verification failed\",\r\n };\r\n } catch (error) {\r\n return {\r\n verified: false,\r\n algorithm: parsed.algorithm,\r\n error: `Verification error: ${error instanceof Error ? error.message : String(error)}`,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Sign Golden Thread components (for testing/tooling)\r\n * Note: privateKey should be a CryptoKey from Web Crypto API\r\n */\r\nexport async function signGoldenThread(\r\n components: GoldenThreadComponents,\r\n privateKey: unknown,\r\n algorithm: SignatureAlgorithm\r\n): Promise<string> {\r\n const canonicalString = computeCanonicalString(components);\r\n const encoder = new TextEncoder();\r\n const data = encoder.encode(canonicalString);\r\n\r\n const signatureBuffer = await crypto.subtle.sign(\r\n getSignAlgorithm(algorithm),\r\n privateKey as Parameters<typeof crypto.subtle.sign>[1],\r\n data\r\n );\r\n\r\n // Convert to base64\r\n const signatureArray = new Uint8Array(signatureBuffer);\r\n const base64 = btoa(String.fromCharCode(...signatureArray));\r\n\r\n return `${algorithm}:${base64}`;\r\n}\r\n\r\n/**\r\n * Import a PEM-encoded public key for verification\r\n * Returns a CryptoKey from Web Crypto API\r\n */\r\nasync function importPublicKey(publicKey: SignaturePublicKey): Promise<unknown> {\r\n const pemHeader = \"-----BEGIN PUBLIC KEY-----\";\r\n const pemFooter = \"-----END PUBLIC KEY-----\";\r\n\r\n let keyData: ArrayBuffer;\r\n\r\n if (publicKey.key.includes(pemHeader)) {\r\n // PEM format\r\n const pemContents = publicKey.key\r\n .replace(pemHeader, \"\")\r\n .replace(pemFooter, \"\")\r\n .replace(/\\s/g, \"\");\r\n const binaryString = atob(pemContents);\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n keyData = bytes.buffer;\r\n } else {\r\n // Assume raw base64\r\n const binaryString = atob(publicKey.key);\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n keyData = bytes.buffer;\r\n }\r\n\r\n const algorithm =\r\n publicKey.algorithm === \"RSA-SHA256\"\r\n ? { name: \"RSASSA-PKCS1-v1_5\", hash: \"SHA-256\" }\r\n : { name: \"ECDSA\", namedCurve: \"P-256\" };\r\n\r\n return crypto.subtle.importKey(\"spki\", keyData, algorithm, true, [\"verify\"]);\r\n}\r\n\r\n/** Web Crypto algorithm parameters */\r\ntype WebCryptoAlgorithmParams = { name: string; hash?: string };\r\n\r\n/**\r\n * Get Web Crypto verify algorithm params\r\n */\r\nfunction getVerifyAlgorithm(algorithm: SignatureAlgorithm): WebCryptoAlgorithmParams {\r\n if (algorithm === \"RSA-SHA256\") {\r\n return { name: \"RSASSA-PKCS1-v1_5\" };\r\n } else {\r\n return { name: \"ECDSA\", hash: \"SHA-256\" };\r\n }\r\n}\r\n\r\n/**\r\n * Get Web Crypto sign algorithm params\r\n */\r\nfunction getSignAlgorithm(algorithm: SignatureAlgorithm): WebCryptoAlgorithmParams {\r\n return getVerifyAlgorithm(algorithm);\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","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport * as yaml from \"yaml\";\r\nimport type { AigrcConfig, PolicyFile } from \"./schemas\";\r\nimport { AigrcConfigSchema, PolicyFileSchema } from \"./schemas\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// CONFIGURATION DISCOVERY (SPEC-RT-003)\r\n// Discovers and loads AIGRC configuration files\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\n/** Configuration file names to search for (in order of precedence) */\r\nexport const CONFIG_FILE_NAMES = [\r\n \".aigrc.yaml\",\r\n \".aigrc.yml\",\r\n \"aigrc.yaml\",\r\n \"aigrc.yml\",\r\n] as const;\r\n\r\n/** Environment variable for config path override */\r\nexport const CONFIG_ENV_VAR = \"AIGRC_CONFIG_PATH\";\r\n\r\n/** Result of configuration discovery */\r\nexport interface ConfigDiscoveryResult {\r\n /** The discovered configuration */\r\n config: AigrcConfig;\r\n /** Absolute path to the configuration file */\r\n configPath: string;\r\n /** Directory containing the configuration */\r\n configDir: string;\r\n /** Whether this was loaded from environment variable */\r\n fromEnv: boolean;\r\n}\r\n\r\n/** Options for configuration discovery */\r\nexport interface DiscoverConfigOptions {\r\n /** Starting directory for search (defaults to cwd) */\r\n startDir?: string;\r\n /** Maximum directories to traverse upward (default: 10) */\r\n maxDepth?: number;\r\n /** Override config path (equivalent to AIGRC_CONFIG_PATH) */\r\n configPath?: string;\r\n}\r\n\r\n/**\r\n * Discovers and loads the AIGRC configuration file.\r\n *\r\n * Search order:\r\n * 1. Explicit configPath option\r\n * 2. AIGRC_CONFIG_PATH environment variable\r\n * 3. Walking up from startDir looking for config files\r\n *\r\n * @param options Discovery options\r\n * @returns Configuration result or null if not found\r\n */\r\nexport function discoverConfig(\r\n options: DiscoverConfigOptions = {}\r\n): ConfigDiscoveryResult | null {\r\n const { startDir = process.cwd(), maxDepth = 10 } = options;\r\n\r\n // Check explicit path first\r\n if (options.configPath) {\r\n const result = loadConfigFromPath(options.configPath);\r\n if (result) {\r\n return { ...result, fromEnv: false };\r\n }\r\n }\r\n\r\n // Check environment variable\r\n const envPath = process.env[CONFIG_ENV_VAR];\r\n if (envPath) {\r\n const result = loadConfigFromPath(envPath);\r\n if (result) {\r\n return { ...result, fromEnv: true };\r\n }\r\n }\r\n\r\n // Walk up directory tree\r\n let currentDir = path.resolve(startDir);\r\n let depth = 0;\r\n\r\n while (depth < maxDepth) {\r\n for (const fileName of CONFIG_FILE_NAMES) {\r\n const filePath = path.join(currentDir, fileName);\r\n if (fs.existsSync(filePath)) {\r\n const config = loadConfigFile(filePath);\r\n if (config) {\r\n return {\r\n config,\r\n configPath: filePath,\r\n configDir: currentDir,\r\n fromEnv: false,\r\n };\r\n }\r\n }\r\n }\r\n\r\n const parentDir = path.dirname(currentDir);\r\n if (parentDir === currentDir) {\r\n // Reached root\r\n break;\r\n }\r\n currentDir = parentDir;\r\n depth++;\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Loads configuration from a specific path\r\n */\r\nfunction loadConfigFromPath(\r\n configPath: string\r\n): Omit<ConfigDiscoveryResult, \"fromEnv\"> | null {\r\n const resolvedPath = path.resolve(configPath);\r\n if (!fs.existsSync(resolvedPath)) {\r\n return null;\r\n }\r\n\r\n const config = loadConfigFile(resolvedPath);\r\n if (!config) {\r\n return null;\r\n }\r\n\r\n return {\r\n config,\r\n configPath: resolvedPath,\r\n configDir: path.dirname(resolvedPath),\r\n };\r\n}\r\n\r\n/**\r\n * Loads and parses a configuration file\r\n */\r\nfunction loadConfigFile(filePath: string): AigrcConfig | null {\r\n try {\r\n const content = fs.readFileSync(filePath, \"utf-8\");\r\n const parsed = yaml.parse(content);\r\n return AigrcConfigSchema.parse(parsed);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Synchronously discovers configuration\r\n */\r\nexport function discoverConfigSync(\r\n options: DiscoverConfigOptions = {}\r\n): ConfigDiscoveryResult | null {\r\n return discoverConfig(options);\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// POLICY DISCOVERY\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\n/** Result of policy discovery */\r\nexport interface PolicyDiscoveryResult {\r\n /** Loaded policies indexed by ID */\r\n policies: Map<string, PolicyFile>;\r\n /** Paths of loaded policy files */\r\n loadedPaths: string[];\r\n /** Errors encountered during loading */\r\n errors: PolicyLoadError[];\r\n}\r\n\r\n/** Error during policy loading */\r\nexport interface PolicyLoadError {\r\n path: string;\r\n error: string;\r\n}\r\n\r\n/** Options for policy discovery */\r\nexport interface DiscoverPoliciesOptions {\r\n /** Configuration to use for policy paths */\r\n config?: AigrcConfig;\r\n /** Base directory for relative paths */\r\n baseDir?: string;\r\n /** Additional paths to search */\r\n additionalPaths?: string[];\r\n}\r\n\r\n/**\r\n * Discovers and loads all policy files.\r\n *\r\n * @param options Discovery options\r\n * @returns Map of policy ID to PolicyFile\r\n */\r\nexport function discoverPolicies(\r\n options: DiscoverPoliciesOptions = {}\r\n): PolicyDiscoveryResult {\r\n const {\r\n config,\r\n baseDir = process.cwd(),\r\n additionalPaths = [],\r\n } = options;\r\n\r\n const policies = new Map<string, PolicyFile>();\r\n const loadedPaths: string[] = [];\r\n const errors: PolicyLoadError[] = [];\r\n\r\n // Get search paths from config or use defaults\r\n const searchPaths = [\r\n ...(config?.runtime?.policy_paths ?? [\".aigrc/policies\"]),\r\n ...additionalPaths,\r\n ];\r\n\r\n for (const searchPath of searchPaths) {\r\n const absolutePath = path.isAbsolute(searchPath)\r\n ? searchPath\r\n : path.join(baseDir, searchPath);\r\n\r\n if (!fs.existsSync(absolutePath)) {\r\n continue;\r\n }\r\n\r\n const stat = fs.statSync(absolutePath);\r\n if (stat.isDirectory()) {\r\n // Load all YAML files in directory\r\n const files = fs.readdirSync(absolutePath);\r\n for (const file of files) {\r\n if (file.endsWith(\".yaml\") || file.endsWith(\".yml\")) {\r\n const filePath = path.join(absolutePath, file);\r\n const result = loadPolicyFile(filePath);\r\n if (result.policy) {\r\n policies.set(result.policy.id, result.policy);\r\n loadedPaths.push(filePath);\r\n } else if (result.error) {\r\n errors.push({ path: filePath, error: result.error });\r\n }\r\n }\r\n }\r\n } else if (stat.isFile()) {\r\n // Load single file\r\n const result = loadPolicyFile(absolutePath);\r\n if (result.policy) {\r\n policies.set(result.policy.id, result.policy);\r\n loadedPaths.push(absolutePath);\r\n } else if (result.error) {\r\n errors.push({ path: absolutePath, error: result.error });\r\n }\r\n }\r\n }\r\n\r\n return { policies, loadedPaths, errors };\r\n}\r\n\r\n/**\r\n * Loads a single policy file\r\n */\r\nfunction loadPolicyFile(\r\n filePath: string\r\n): { policy: PolicyFile | null; error: string | null } {\r\n try {\r\n const content = fs.readFileSync(filePath, \"utf-8\");\r\n const parsed = yaml.parse(content);\r\n const policy = PolicyFileSchema.parse(parsed);\r\n return { policy, error: null };\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err);\r\n return { policy: null, error: message };\r\n }\r\n}\r\n\r\n/**\r\n * Loads a specific policy by ID\r\n */\r\nexport function loadPolicy(\r\n policyId: string,\r\n options: DiscoverPoliciesOptions = {}\r\n): PolicyFile | null {\r\n const { policies } = discoverPolicies(options);\r\n return policies.get(policyId) ?? null;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// ASSET CARD DISCOVERY\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nimport type { AssetCard } from \"./schemas\";\r\nimport { AssetCardSchema } from \"./schemas\";\r\n\r\n/** Result of asset card discovery */\r\nexport interface AssetDiscoveryResult {\r\n /** Loaded asset cards indexed by ID */\r\n assets: Map<string, AssetCard>;\r\n /** Paths of loaded asset files */\r\n loadedPaths: string[];\r\n /** Errors encountered during loading */\r\n errors: AssetLoadError[];\r\n}\r\n\r\n/** Error during asset loading */\r\nexport interface AssetLoadError {\r\n path: string;\r\n error: string;\r\n}\r\n\r\n/** Options for asset discovery */\r\nexport interface DiscoverAssetsOptions {\r\n /** Configuration to use for asset paths */\r\n config?: AigrcConfig;\r\n /** Base directory for relative paths */\r\n baseDir?: string;\r\n /** Additional paths to search */\r\n additionalPaths?: string[];\r\n}\r\n\r\n/**\r\n * Discovers and loads all asset cards.\r\n *\r\n * @param options Discovery options\r\n * @returns Map of asset ID to AssetCard\r\n */\r\nexport function discoverAssets(\r\n options: DiscoverAssetsOptions = {}\r\n): AssetDiscoveryResult {\r\n const {\r\n config,\r\n baseDir = process.cwd(),\r\n additionalPaths = [],\r\n } = options;\r\n\r\n const assets = new Map<string, AssetCard>();\r\n const loadedPaths: string[] = [];\r\n const errors: AssetLoadError[] = [];\r\n\r\n // Get search paths from config or use defaults\r\n const searchPaths = [\r\n ...(config?.runtime?.asset_paths ?? [\".aigrc/assets\"]),\r\n ...additionalPaths,\r\n ];\r\n\r\n for (const searchPath of searchPaths) {\r\n const absolutePath = path.isAbsolute(searchPath)\r\n ? searchPath\r\n : path.join(baseDir, searchPath);\r\n\r\n if (!fs.existsSync(absolutePath)) {\r\n continue;\r\n }\r\n\r\n const stat = fs.statSync(absolutePath);\r\n if (stat.isDirectory()) {\r\n // Load all YAML files in directory\r\n const files = fs.readdirSync(absolutePath);\r\n for (const file of files) {\r\n if (file.endsWith(\".yaml\") || file.endsWith(\".yml\")) {\r\n const filePath = path.join(absolutePath, file);\r\n const result = loadAssetFile(filePath);\r\n if (result.asset) {\r\n assets.set(result.asset.id, result.asset);\r\n loadedPaths.push(filePath);\r\n } else if (result.error) {\r\n errors.push({ path: filePath, error: result.error });\r\n }\r\n }\r\n }\r\n } else if (stat.isFile()) {\r\n // Load single file\r\n const result = loadAssetFile(absolutePath);\r\n if (result.asset) {\r\n assets.set(result.asset.id, result.asset);\r\n loadedPaths.push(absolutePath);\r\n } else if (result.error) {\r\n errors.push({ path: absolutePath, error: result.error });\r\n }\r\n }\r\n }\r\n\r\n return { assets, loadedPaths, errors };\r\n}\r\n\r\n/**\r\n * Loads a single asset card file\r\n */\r\nfunction loadAssetFile(\r\n filePath: string\r\n): { asset: AssetCard | null; error: string | null } {\r\n try {\r\n const content = fs.readFileSync(filePath, \"utf-8\");\r\n const parsed = yaml.parse(content);\r\n const asset = AssetCardSchema.parse(parsed);\r\n return { asset, error: null };\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err);\r\n return { asset: null, error: message };\r\n }\r\n}\r\n\r\n/**\r\n * Loads a specific asset by ID\r\n */\r\nexport function loadAsset(\r\n assetId: string,\r\n options: DiscoverAssetsOptions = {}\r\n): AssetCard | null {\r\n const { assets } = discoverAssets(options);\r\n return assets.get(assetId) ?? null;\r\n}\r\n\r\n/**\r\n * Loads an asset card from a specific file path\r\n */\r\nexport function loadAssetFromPath(filePath: string): AssetCard | null {\r\n const result = loadAssetFile(filePath);\r\n return result.asset;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// ENVIRONMENT CONFIGURATION\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Gets the effective configuration for an environment.\r\n * Merges base config with environment-specific overrides.\r\n *\r\n * @param config Base configuration\r\n * @param environment Environment name (e.g., \"production\", \"development\")\r\n * @returns Merged configuration\r\n */\r\nexport function getEnvironmentConfig(\r\n config: AigrcConfig,\r\n environment: string\r\n): AigrcConfig {\r\n const envOverrides = config.environments?.[environment];\r\n if (!envOverrides) {\r\n return config;\r\n }\r\n\r\n // Build result with proper typing\r\n const result: AigrcConfig = { ...config };\r\n\r\n // Merge runtime if either exists\r\n if (config.runtime || envOverrides.runtime) {\r\n result.runtime = {\r\n ...config.runtime,\r\n ...filterUndefined(envOverrides.runtime ?? {}),\r\n } as AigrcConfig[\"runtime\"];\r\n }\r\n\r\n // Merge integrations if either exists\r\n if (config.integrations || envOverrides.integrations) {\r\n result.integrations = {\r\n ...config.integrations,\r\n ...filterUndefined(envOverrides.integrations ?? {}),\r\n } as AigrcConfig[\"integrations\"];\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Filters out undefined values from an object.\r\n */\r\nfunction filterUndefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\r\n const result: Partial<T> = {};\r\n for (const key of Object.keys(obj) as Array<keyof T>) {\r\n if (obj[key] !== undefined) {\r\n result[key] = obj[key];\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Gets the current environment name from environment variables.\r\n * Checks NODE_ENV, AIGRC_ENV in order.\r\n */\r\nexport function getCurrentEnvironment(): string {\r\n return process.env.AIGRC_ENV ?? process.env.NODE_ENV ?? \"development\";\r\n}\r\n\r\n/**\r\n * Creates a default configuration\r\n */\r\nexport function createDefaultConfig(): AigrcConfig {\r\n return AigrcConfigSchema.parse({\r\n version: \"1.0\",\r\n runtime: {},\r\n integrations: {},\r\n });\r\n}\r\n","import type { PolicyFile, PolicyRule, PolicyCapabilities, RiskLevel, OperatingMode } from \"./schemas\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// POLICY INHERITANCE (SPEC-RT-003)\r\n// Resolves policy inheritance chains and merges policies\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\n/** Maximum inheritance depth to prevent infinite loops */\r\nexport const MAX_INHERITANCE_DEPTH = 10;\r\n\r\n/** Error thrown when policy resolution fails */\r\nexport class PolicyResolutionError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly policyId: string,\r\n public readonly cause?: unknown\r\n ) {\r\n super(message);\r\n this.name = \"PolicyResolutionError\";\r\n }\r\n}\r\n\r\n/** Result of policy resolution */\r\nexport interface ResolvedPolicy {\r\n /** The fully resolved policy (all inheritance applied) */\r\n policy: PolicyFile;\r\n /** Chain of policy IDs from root to this policy */\r\n inheritanceChain: string[];\r\n /** Number of policies in the chain */\r\n depth: number;\r\n}\r\n\r\n/** Policy repository for loading policies by ID */\r\nexport interface PolicyRepository {\r\n /** Gets a policy by ID */\r\n get(id: string): PolicyFile | undefined;\r\n /** Checks if a policy exists */\r\n has(id: string): boolean;\r\n}\r\n\r\n/**\r\n * Creates a PolicyRepository from a Map\r\n */\r\nexport function createPolicyRepository(\r\n policies: Map<string, PolicyFile>\r\n): PolicyRepository {\r\n return {\r\n get: (id) => policies.get(id),\r\n has: (id) => policies.has(id),\r\n };\r\n}\r\n\r\n/**\r\n * Resolves a policy by ID, applying all inherited policies.\r\n *\r\n * @param policyId The ID of the policy to resolve\r\n * @param repository Repository for loading policies\r\n * @returns Resolved policy with all inheritance applied\r\n */\r\nexport function resolvePolicy(\r\n policyId: string,\r\n repository: PolicyRepository\r\n): ResolvedPolicy {\r\n const chain: PolicyFile[] = [];\r\n const seenIds = new Set<string>();\r\n let currentId: string | undefined = policyId;\r\n\r\n // Build inheritance chain\r\n while (currentId) {\r\n if (seenIds.has(currentId)) {\r\n throw new PolicyResolutionError(\r\n `Circular inheritance detected: ${currentId}`,\r\n policyId\r\n );\r\n }\r\n\r\n if (chain.length >= MAX_INHERITANCE_DEPTH) {\r\n throw new PolicyResolutionError(\r\n `Maximum inheritance depth (${MAX_INHERITANCE_DEPTH}) exceeded`,\r\n policyId\r\n );\r\n }\r\n\r\n const policy = repository.get(currentId);\r\n if (!policy) {\r\n throw new PolicyResolutionError(\r\n `Policy not found: ${currentId}`,\r\n policyId\r\n );\r\n }\r\n\r\n seenIds.add(currentId);\r\n chain.push(policy);\r\n currentId = policy.extends;\r\n }\r\n\r\n // Reverse to get root-first order\r\n chain.reverse();\r\n\r\n // Merge policies from root to leaf\r\n const mergedPolicy = chain.reduce<PolicyFile>(\r\n (accumulated, current) => mergePolicies(accumulated, current),\r\n createEmptyPolicy(chain[0]?.id ?? policyId)\r\n );\r\n\r\n // Use the original policy's ID\r\n mergedPolicy.id = policyId;\r\n\r\n return {\r\n policy: mergedPolicy,\r\n inheritanceChain: chain.map((p) => p.id),\r\n depth: chain.length,\r\n };\r\n}\r\n\r\n/**\r\n * Creates an empty policy as a starting point for merging\r\n */\r\nfunction createEmptyPolicy(id: string): PolicyFile {\r\n return {\r\n version: \"1.0\",\r\n id,\r\n name: \"\",\r\n applies_to: [],\r\n rules: [],\r\n };\r\n}\r\n\r\n/**\r\n * Merges two policies, with the child taking precedence.\r\n *\r\n * Merge rules:\r\n * - Scalar values: child overrides parent\r\n * - Arrays (rules): child's rules are appended after parent's\r\n * - Capabilities: deep merge with child overriding\r\n * - applies_to: replaced entirely by child if specified\r\n */\r\nexport function mergePolicies(\r\n parent: PolicyFile,\r\n child: PolicyFile\r\n): PolicyFile {\r\n return {\r\n version: child.version,\r\n id: child.id,\r\n name: child.name || parent.name,\r\n description: child.description ?? parent.description,\r\n extends: child.extends, // Keep child's extends for reference\r\n applies_to:\r\n child.applies_to.length > 0 && child.applies_to[0] !== \"*\"\r\n ? child.applies_to\r\n : parent.applies_to,\r\n capabilities: mergeCapabilities(parent.capabilities, child.capabilities),\r\n rules: mergeRules(parent.rules, child.rules),\r\n metadata: {\r\n ...parent.metadata,\r\n ...child.metadata,\r\n // Merge tags\r\n tags: mergeArrays(parent.metadata?.tags, child.metadata?.tags),\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Merges capability objects\r\n */\r\nfunction mergeCapabilities(\r\n parent?: PolicyCapabilities,\r\n child?: PolicyCapabilities\r\n): PolicyCapabilities | undefined {\r\n if (!parent && !child) {\r\n return undefined;\r\n }\r\n\r\n if (!parent) {\r\n return child;\r\n }\r\n\r\n if (!child) {\r\n return parent;\r\n }\r\n\r\n return {\r\n default_effect: child.default_effect ?? parent.default_effect,\r\n allowed_tools: mergeArrays(parent.allowed_tools, child.allowed_tools),\r\n denied_tools: mergeArrays(parent.denied_tools, child.denied_tools),\r\n allowed_domains: mergeArrays(parent.allowed_domains, child.allowed_domains),\r\n denied_domains: mergeArrays(parent.denied_domains, child.denied_domains),\r\n max_budget_per_session:\r\n child.max_budget_per_session ?? parent.max_budget_per_session,\r\n max_budget_per_day: child.max_budget_per_day ?? parent.max_budget_per_day,\r\n may_spawn: child.may_spawn ?? parent.may_spawn,\r\n max_spawn_depth: child.max_spawn_depth ?? parent.max_spawn_depth,\r\n };\r\n}\r\n\r\n/**\r\n * Merges rule arrays.\r\n * Child rules are appended after parent rules, so they have higher precedence\r\n * when rules are evaluated in order.\r\n */\r\nfunction mergeRules(\r\n parentRules: PolicyRule[],\r\n childRules: PolicyRule[]\r\n): PolicyRule[] {\r\n // Combine rules - child rules come after parent, giving them effective priority\r\n const allRules = [...parentRules, ...childRules];\r\n\r\n // Sort by priority (higher priority evaluated first)\r\n return allRules.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\r\n}\r\n\r\n/**\r\n * Merges two arrays, removing duplicates\r\n */\r\nfunction mergeArrays<T>(parent?: T[], child?: T[]): T[] {\r\n const combined = [...(parent ?? []), ...(child ?? [])];\r\n return [...new Set(combined)];\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// POLICY EVALUATION\r\n// Evaluates policies against actions and resources\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\n/** Context for policy evaluation */\r\nexport interface PolicyEvaluationContext {\r\n /** Current risk level of the agent */\r\n riskLevel: RiskLevel;\r\n /** Current operating mode */\r\n mode: OperatingMode;\r\n /** Current timestamp (ISO 8601) */\r\n timestamp?: string;\r\n /** Custom context values */\r\n custom?: Record<string, unknown>;\r\n}\r\n\r\n/** Result of evaluating a policy rule */\r\nexport interface PolicyEvaluationResult {\r\n /** Whether the action is allowed */\r\n allowed: boolean;\r\n /** Effect that was applied */\r\n effect: \"allow\" | \"deny\" | \"audit\";\r\n /** Rule that matched, if any */\r\n matchedRule?: PolicyRule;\r\n /** Whether any rule matched */\r\n matched: boolean;\r\n /** Reason for the decision */\r\n reason: string;\r\n}\r\n\r\n/**\r\n * Evaluates a policy for a given action and resource.\r\n *\r\n * @param policy The resolved policy to evaluate\r\n * @param action The action being performed (e.g., \"read_file\")\r\n * @param resource The resource being accessed (e.g., \"/path/to/file\")\r\n * @param context Evaluation context\r\n * @returns Evaluation result\r\n */\r\nexport function evaluatePolicy(\r\n policy: PolicyFile,\r\n action: string,\r\n resource: string,\r\n context: PolicyEvaluationContext\r\n): PolicyEvaluationResult {\r\n // Find first matching rule\r\n for (const rule of policy.rules) {\r\n if (ruleMatches(rule, action, resource, context)) {\r\n return {\r\n allowed: rule.effect === \"allow\",\r\n effect: rule.effect,\r\n matchedRule: rule,\r\n matched: true,\r\n reason: `Rule \"${rule.id}\" matched: ${rule.description ?? rule.effect}`,\r\n };\r\n }\r\n }\r\n\r\n // No rule matched, use default effect from capabilities\r\n const defaultEffect = policy.capabilities?.default_effect ?? \"deny\";\r\n return {\r\n allowed: defaultEffect === \"allow\",\r\n effect: defaultEffect,\r\n matchedRule: undefined,\r\n matched: false,\r\n reason: `No rule matched, using default effect: ${defaultEffect}`,\r\n };\r\n}\r\n\r\n/**\r\n * Checks if a rule matches the given action, resource, and context\r\n */\r\nfunction ruleMatches(\r\n rule: PolicyRule,\r\n action: string,\r\n resource: string,\r\n context: PolicyEvaluationContext\r\n): boolean {\r\n // Check action match\r\n if (!matchesPattern(action, rule.actions)) {\r\n return false;\r\n }\r\n\r\n // Check resource match\r\n if (!matchesPattern(resource, rule.resources)) {\r\n return false;\r\n }\r\n\r\n // Check conditions if present\r\n if (rule.conditions) {\r\n if (!evaluateConditions(rule.conditions, context)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Checks if a value matches any of the patterns\r\n */\r\nfunction matchesPattern(value: string, patterns: string[]): boolean {\r\n for (const pattern of patterns) {\r\n if (pattern === \"*\") {\r\n return true;\r\n }\r\n if (pattern.endsWith(\"*\")) {\r\n const prefix = pattern.slice(0, -1);\r\n if (value.startsWith(prefix)) {\r\n return true;\r\n }\r\n } else if (pattern.startsWith(\"*\")) {\r\n const suffix = pattern.slice(1);\r\n if (value.endsWith(suffix)) {\r\n return true;\r\n }\r\n } else if (pattern === value) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Evaluates rule conditions against context\r\n */\r\nfunction evaluateConditions(\r\n conditions: NonNullable<PolicyRule[\"conditions\"]>,\r\n context: PolicyEvaluationContext\r\n): boolean {\r\n // Check risk level condition\r\n if (conditions.risk_levels && conditions.risk_levels.length > 0) {\r\n if (!conditions.risk_levels.includes(context.riskLevel)) {\r\n return false;\r\n }\r\n }\r\n\r\n // Check mode condition\r\n if (conditions.modes && conditions.modes.length > 0) {\r\n if (!conditions.modes.includes(context.mode)) {\r\n return false;\r\n }\r\n }\r\n\r\n // Check time range condition\r\n if (conditions.time_ranges && conditions.time_ranges.length > 0 && context.timestamp) {\r\n const currentTime = new Date(context.timestamp);\r\n const timeStr = currentTime.toTimeString().slice(0, 5); // HH:MM format\r\n\r\n const inRange = conditions.time_ranges.some(range => {\r\n return timeStr >= range.start && timeStr <= range.end;\r\n });\r\n\r\n if (!inRange) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Checks if an action is allowed by capability lists.\r\n * Uses tool allow/deny lists for quick checks without full rule evaluation.\r\n */\r\nexport function isToolAllowed(\r\n tool: string,\r\n capabilities?: PolicyCapabilities\r\n): boolean {\r\n if (!capabilities) {\r\n return false; // Default deny when no capabilities defined\r\n }\r\n\r\n // Check denied list first (takes precedence)\r\n if (\r\n capabilities.denied_tools.length > 0 &&\r\n matchesPattern(tool, capabilities.denied_tools)\r\n ) {\r\n return false;\r\n }\r\n\r\n // Check allowed list\r\n if (\r\n capabilities.allowed_tools.length > 0 &&\r\n matchesPattern(tool, capabilities.allowed_tools)\r\n ) {\r\n return true;\r\n }\r\n\r\n // Fall back to default effect\r\n return capabilities.default_effect === \"allow\";\r\n}\r\n\r\n/**\r\n * Checks if a domain is allowed by capability lists.\r\n */\r\nexport function isDomainAllowed(\r\n domain: string,\r\n capabilities?: PolicyCapabilities\r\n): boolean {\r\n if (!capabilities) {\r\n return false;\r\n }\r\n\r\n // Check denied list first\r\n if (\r\n capabilities.denied_domains.length > 0 &&\r\n matchesDomainPattern(domain, capabilities.denied_domains)\r\n ) {\r\n return false;\r\n }\r\n\r\n // Check allowed list\r\n if (\r\n capabilities.allowed_domains.length > 0 &&\r\n matchesDomainPattern(domain, capabilities.allowed_domains)\r\n ) {\r\n return true;\r\n }\r\n\r\n return capabilities.default_effect === \"allow\";\r\n}\r\n\r\n/**\r\n * Matches a domain against domain patterns (supports wildcards like *.example.com)\r\n */\r\nfunction matchesDomainPattern(domain: string, patterns: string[]): boolean {\r\n for (const pattern of patterns) {\r\n if (pattern === \"*\") {\r\n return true;\r\n }\r\n if (pattern.startsWith(\"*.\")) {\r\n // Wildcard subdomain match\r\n const suffix = pattern.slice(1); // .example.com\r\n if (domain === pattern.slice(2) || domain.endsWith(suffix)) {\r\n return true;\r\n }\r\n } else if (pattern === domain) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// POLICY SELECTION ALGORITHM (SPEC-RT-003 / AIG-24)\r\n// Selects the appropriate policy for an agent based on various criteria\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\n/** Policy selection criteria */\r\nexport interface PolicySelectionCriteria {\r\n /** Asset ID to match */\r\n assetId: string;\r\n /** Risk level of the agent */\r\n riskLevel: RiskLevel;\r\n /** Operating mode */\r\n mode: OperatingMode;\r\n /** Tags associated with the agent */\r\n tags?: string[];\r\n /** Environment (e.g., \"production\", \"staging\") */\r\n environment?: string;\r\n}\r\n\r\n/** Policy selection result */\r\nexport interface PolicySelectionResult {\r\n /** The selected policy (null if none found) */\r\n policy: PolicyFile | null;\r\n /** Policy ID */\r\n policyId: string | null;\r\n /** How the policy was selected */\r\n selectionReason: PolicySelectionReason;\r\n /** Policies that were considered */\r\n candidatePolicies: string[];\r\n /** Score breakdown for the selected policy */\r\n score?: PolicyScore;\r\n}\r\n\r\n/** Reason for policy selection */\r\nexport type PolicySelectionReason =\r\n | \"explicit_match\" // Matched by explicit asset ID\r\n | \"risk_level_match\" // Matched by risk level\r\n | \"tag_match\" // Matched by tags\r\n | \"wildcard_match\" // Matched by wildcard applies_to\r\n | \"default_policy\" // Used default policy\r\n | \"no_policy_found\"; // No matching policy\r\n\r\n/** Score breakdown for policy selection */\r\nexport interface PolicyScore {\r\n /** Total score */\r\n total: number;\r\n /** Explicit asset match bonus */\r\n explicitMatch: number;\r\n /** Risk level match bonus */\r\n riskLevelMatch: number;\r\n /** Tag match count */\r\n tagMatches: number;\r\n /** Priority from policy */\r\n priority: number;\r\n}\r\n\r\n/**\r\n * Selects the best policy for an agent based on criteria.\r\n *\r\n * Selection algorithm:\r\n * 1. Filter policies by applies_to (asset ID or wildcard)\r\n * 2. Score remaining policies:\r\n * - Explicit asset match: +100\r\n * - Risk level match: +50\r\n * - Each tag match: +10\r\n * - Policy priority: +priority value\r\n * 3. Return highest scoring policy\r\n *\r\n * @param criteria Selection criteria\r\n * @param repository Policy repository\r\n * @param defaultPolicyId Optional default policy ID\r\n * @returns Selected policy result\r\n */\r\nexport function selectPolicy(\r\n criteria: PolicySelectionCriteria,\r\n repository: PolicyRepository,\r\n defaultPolicyId?: string\r\n): PolicySelectionResult {\r\n const candidatePolicies: string[] = [];\r\n const scoredPolicies: Array<{\r\n policyId: string;\r\n policy: PolicyFile;\r\n score: PolicyScore;\r\n reason: PolicySelectionReason;\r\n }> = [];\r\n\r\n // Iterate through all policies in repository\r\n // Note: This assumes we can iterate - in practice, might need getAllIds() method\r\n const policies = getAllPoliciesFromRepository(repository);\r\n\r\n for (const [policyId, policy] of policies) {\r\n candidatePolicies.push(policyId);\r\n\r\n // Check if policy applies to this asset\r\n const appliesToResult = checkAppliesTo(policy.applies_to, criteria.assetId);\r\n if (!appliesToResult.applies) {\r\n continue;\r\n }\r\n\r\n // Score the policy\r\n const score = scorePolicy(policy, criteria, appliesToResult.isExplicit);\r\n const reason = determineSelectionReason(appliesToResult, score);\r\n\r\n scoredPolicies.push({ policyId, policy, score, reason });\r\n }\r\n\r\n // Sort by score descending\r\n scoredPolicies.sort((a, b) => b.score.total - a.score.total);\r\n\r\n // Return the best match\r\n if (scoredPolicies.length > 0) {\r\n const best = scoredPolicies[0];\r\n return {\r\n policy: best.policy,\r\n policyId: best.policyId,\r\n selectionReason: best.reason,\r\n candidatePolicies,\r\n score: best.score,\r\n };\r\n }\r\n\r\n // Try default policy\r\n if (defaultPolicyId && repository.has(defaultPolicyId)) {\r\n const defaultPolicy = repository.get(defaultPolicyId);\r\n if (defaultPolicy) {\r\n return {\r\n policy: defaultPolicy,\r\n policyId: defaultPolicyId,\r\n selectionReason: \"default_policy\",\r\n candidatePolicies,\r\n };\r\n }\r\n }\r\n\r\n // No policy found\r\n return {\r\n policy: null,\r\n policyId: null,\r\n selectionReason: \"no_policy_found\",\r\n candidatePolicies,\r\n };\r\n}\r\n\r\n/** Helper to get all policies from repository */\r\nfunction getAllPoliciesFromRepository(\r\n repository: PolicyRepository\r\n): Map<string, PolicyFile> {\r\n // If the repository is actually a Map, return it\r\n // This is a workaround for the interface limitation\r\n if (repository instanceof Map) {\r\n return repository as unknown as Map<string, PolicyFile>;\r\n }\r\n\r\n // Otherwise, we need to iterate through known IDs\r\n // In a real implementation, the repository would have a keys() or values() method\r\n const result = new Map<string, PolicyFile>();\r\n\r\n // Try to access internal map if available\r\n const anyRepo = repository as unknown as { policies?: Map<string, PolicyFile> };\r\n if (anyRepo.policies instanceof Map) {\r\n return anyRepo.policies;\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** Check if applies_to matches the asset ID */\r\nfunction checkAppliesTo(\r\n appliesTo: string[],\r\n assetId: string\r\n): { applies: boolean; isExplicit: boolean } {\r\n for (const pattern of appliesTo) {\r\n if (pattern === \"*\") {\r\n return { applies: true, isExplicit: false };\r\n }\r\n if (pattern === assetId) {\r\n return { applies: true, isExplicit: true };\r\n }\r\n // Support wildcard prefixes like \"aigrc-2024-*\"\r\n if (pattern.endsWith(\"*\") && assetId.startsWith(pattern.slice(0, -1))) {\r\n return { applies: true, isExplicit: false };\r\n }\r\n }\r\n return { applies: false, isExplicit: false };\r\n}\r\n\r\n/** Score a policy based on criteria */\r\nfunction scorePolicy(\r\n policy: PolicyFile,\r\n criteria: PolicySelectionCriteria,\r\n isExplicitMatch: boolean\r\n): PolicyScore {\r\n let total = 0;\r\n let explicitMatch = 0;\r\n let riskLevelMatch = 0;\r\n let tagMatches = 0;\r\n\r\n // Explicit asset match\r\n if (isExplicitMatch) {\r\n explicitMatch = 100;\r\n total += 100;\r\n }\r\n\r\n // Check risk level conditions in rules\r\n const hasRiskLevelRule = policy.rules.some(rule =>\r\n rule.conditions?.risk_levels?.includes(criteria.riskLevel)\r\n );\r\n if (hasRiskLevelRule) {\r\n riskLevelMatch = 50;\r\n total += 50;\r\n }\r\n\r\n // Check tag matches\r\n const policyTags = policy.metadata?.tags ?? [];\r\n const criteriaTags = criteria.tags ?? [];\r\n for (const tag of criteriaTags) {\r\n if (policyTags.includes(tag)) {\r\n tagMatches++;\r\n total += 10;\r\n }\r\n }\r\n\r\n // Add priority bonus (if rules have priorities)\r\n const maxPriority = Math.max(...policy.rules.map(r => r.priority ?? 0), 0);\r\n total += maxPriority;\r\n\r\n return {\r\n total,\r\n explicitMatch,\r\n riskLevelMatch,\r\n tagMatches,\r\n priority: maxPriority,\r\n };\r\n}\r\n\r\n/** Determine the selection reason based on score */\r\nfunction determineSelectionReason(\r\n appliesToResult: { applies: boolean; isExplicit: boolean },\r\n score: PolicyScore\r\n): PolicySelectionReason {\r\n if (appliesToResult.isExplicit) {\r\n return \"explicit_match\";\r\n }\r\n if (score.riskLevelMatch > 0) {\r\n return \"risk_level_match\";\r\n }\r\n if (score.tagMatches > 0) {\r\n return \"tag_match\";\r\n }\r\n return \"wildcard_match\";\r\n}\r\n\r\n/**\r\n * Creates a policy selector with caching for repeated lookups.\r\n */\r\nexport interface PolicySelector {\r\n /** Select a policy for given criteria */\r\n select(criteria: PolicySelectionCriteria): PolicySelectionResult;\r\n /** Clear the cache */\r\n clearCache(): void;\r\n /** Get cache statistics */\r\n getCacheStats(): { hits: number; misses: number; size: number };\r\n}\r\n\r\n/**\r\n * Creates a policy selector with LRU caching.\r\n *\r\n * @param repository Policy repository\r\n * @param defaultPolicyId Default policy ID\r\n * @param cacheSize Maximum cache size (default: 100)\r\n * @returns Policy selector\r\n */\r\nexport function createPolicySelector(\r\n repository: PolicyRepository,\r\n defaultPolicyId?: string,\r\n cacheSize: number = 100\r\n): PolicySelector {\r\n const cache = new Map<string, PolicySelectionResult>();\r\n let hits = 0;\r\n let misses = 0;\r\n\r\n function getCacheKey(criteria: PolicySelectionCriteria): string {\r\n return `${criteria.assetId}|${criteria.riskLevel}|${criteria.mode}|${(criteria.tags ?? []).sort().join(\",\")}|${criteria.environment ?? \"\"}`;\r\n }\r\n\r\n function select(criteria: PolicySelectionCriteria): PolicySelectionResult {\r\n const key = getCacheKey(criteria);\r\n\r\n // Check cache\r\n if (cache.has(key)) {\r\n hits++;\r\n return cache.get(key)!;\r\n }\r\n\r\n misses++;\r\n\r\n // Perform selection\r\n const result = selectPolicy(criteria, repository, defaultPolicyId);\r\n\r\n // Add to cache\r\n if (cache.size >= cacheSize) {\r\n // Remove oldest entry (first key)\r\n const firstKey = cache.keys().next().value;\r\n if (firstKey) {\r\n cache.delete(firstKey);\r\n }\r\n }\r\n cache.set(key, result);\r\n\r\n return result;\r\n }\r\n\r\n return {\r\n select,\r\n clearCache: () => cache.clear(),\r\n getCacheStats: () => ({ hits, misses, size: cache.size }),\r\n };\r\n}\r\n","/**\n * AIGRC Intermediate Representation (AIR)\n *\n * The AIR is a JSON/YAML schema that represents compiled policy constraints\n * in a format consumable by enforcement endpoints. It is the output of the\n * Policy Compiler and the input to the Supply Chain Firewall.\n *\n * @see I2E_Engine_Specification_v1.md Section 4.2.2\n * @module @aigrc/core/air\n */\n\nimport { z } from \"zod\";\n\n// ─────────────────────────────────────────────────────────────────\n// VENDOR SCHEMA\n// Defines an approved/blocked AI vendor\n// ─────────────────────────────────────────────────────────────────\n\nexport const AIRVendorSchema = z.object({\n /** Vendor identifier (e.g., \"openai\", \"anthropic\", \"google\") */\n id: z.string().min(1),\n /** Human-readable vendor name */\n name: z.string().optional(),\n /** Status of this vendor */\n status: z.enum([\"approved\", \"pending\", \"blocked\"]).default(\"pending\"),\n /** Optional approval ticket ID (Golden Thread) */\n approval_ticket: z.string().optional(),\n /** When approval was granted */\n approved_at: z.string().datetime().optional(),\n /** Who approved this vendor */\n approved_by: z.string().email().optional(),\n /** Expiration date for approval */\n expires_at: z.string().datetime().optional(),\n /** Vendor-specific notes */\n notes: z.string().optional(),\n});\n\nexport type AIRVendor = z.infer<typeof AIRVendorSchema>;\n\n// ─────────────────────────────────────────────────────────────────\n// MODEL SCHEMA\n// Defines an approved/blocked AI model\n// ─────────────────────────────────────────────────────────────────\n\nexport const AIRModelSchema = z.object({\n /** Model identifier (e.g., \"gpt-4\", \"claude-3-opus\") */\n id: z.string().min(1),\n /** Vendor that provides this model */\n vendor_id: z.string().min(1),\n /** Human-readable model name */\n name: z.string().optional(),\n /** Model version pattern (supports wildcards like \"gpt-4*\") */\n version_pattern: z.string().optional(),\n /** Status of this model */\n status: z.enum([\"approved\", \"pending\", \"blocked\"]).default(\"pending\"),\n /** Maximum allowed parameters (for on-premise deployment considerations) */\n max_parameters: z.number().positive().optional(),\n /** Risk level assigned to this model */\n risk_level: z.enum([\"minimal\", \"limited\", \"high\", \"unacceptable\"]).optional(),\n /** Optional approval ticket ID */\n approval_ticket: z.string().optional(),\n /** When approval was granted */\n approved_at: z.string().datetime().optional(),\n /** Expiration date for approval */\n expires_at: z.string().datetime().optional(),\n /** Model-specific notes */\n notes: z.string().optional(),\n});\n\nexport type AIRModel = z.infer<typeof AIRModelSchema>;\n\n// ─────────────────────────────────────────────────────────────────\n// REGION SCHEMA\n// Defines allowed/blocked deployment regions\n// ─────────────────────────────────────────────────────────────────\n\nexport const AIRRegionSchema = z.object({\n /** Region code (e.g., \"us-east-1\", \"eu-west-1\", \"EU\", \"US\") */\n code: z.string().min(1),\n /** Human-readable region name */\n name: z.string().optional(),\n /** Status of this region */\n status: z.enum([\"allowed\", \"restricted\", \"blocked\"]).default(\"allowed\"),\n /** Jurisdictions this region falls under (e.g., [\"GDPR\", \"EU-AI-ACT\"]) */\n jurisdictions: z.array(z.string()).default([]),\n /** Data residency requirements */\n data_residency: z.enum([\"required\", \"preferred\", \"none\"]).default(\"none\"),\n /** Notes about this region */\n notes: z.string().optional(),\n});\n\nexport type AIRRegion = z.infer<typeof AIRRegionSchema>;\n\n// ─────────────────────────────────────────────────────────────────\n// REGISTRY CONSTRAINTS SCHEMA\n// Controls vendor/model/region governance at procurement time\n// ─────────────────────────────────────────────────────────────────\n\nexport const AIRRegistryConstraintsSchema = z.object({\n /** List of approved vendors */\n allowed_vendors: z.array(AIRVendorSchema).default([]),\n /** List of blocked vendors */\n blocked_vendors: z.array(z.string()).default([]),\n /** List of approved regions */\n allowed_regions: z.array(AIRRegionSchema).default([]),\n /** List of blocked regions */\n blocked_regions: z.array(z.string()).default([]),\n /** List of approved models */\n allowed_models: z.array(AIRModelSchema).default([]),\n /** List of blocked models (patterns supported) */\n blocked_models: z.array(z.string()).default([]),\n /** Maximum model parameters allowed */\n max_model_parameters: z.number().positive().optional(),\n /** Require vendor approval before use */\n require_vendor_approval: z.boolean().default(true),\n /** Require model approval before use */\n require_model_approval: z.boolean().default(true),\n /** Default behavior for unknown vendors: \"block\" or \"request_approval\" */\n unknown_vendor_behavior: z.enum([\"block\", \"request_approval\"]).default(\"request_approval\"),\n /** Default behavior for unknown models */\n unknown_model_behavior: z.enum([\"block\", \"request_approval\"]).default(\"request_approval\"),\n});\n\nexport type AIRRegistryConstraints = z.infer<typeof AIRRegistryConstraintsSchema>;\n\n// ─────────────────────────────────────────────────────────────────\n// RUNTIME CONSTRAINTS SCHEMA\n// Controls runtime behavior of AI systems\n// ─────────────────────────────────────────────────────────────────\n\nexport const AIRPIIFilterConfigSchema = z.object({\n /** Whether PII filtering is enabled */\n enabled: z.boolean().default(false),\n /** PII types to filter (e.g., [\"email\", \"phone\", \"ssn\", \"credit_card\"]) */\n filter_types: z.array(z.string()).default([]),\n /** Action when PII is detected: \"redact\", \"block\", \"warn\", \"audit\" */\n action: z.enum([\"redact\", \"block\", \"warn\", \"audit\"]).default(\"warn\"),\n /** Custom patterns to detect (regex) */\n custom_patterns: z.array(z.object({\n name: z.string(),\n pattern: z.string(),\n action: z.enum([\"redact\", \"block\", \"warn\", \"audit\"]).optional(),\n })).default([]),\n});\n\nexport type AIRPIIFilterConfig = z.infer<typeof AIRPIIFilterConfigSchema>;\n\nexport const AIRToxicityFilterConfigSchema = z.object({\n /** Whether toxicity filtering is enabled */\n enabled: z.boolean().default(false),\n /** Toxicity threshold (0-1) */\n threshold: z.number().min(0).max(1).default(0.7),\n /** Categories to filter (e.g., [\"hate\", \"violence\", \"sexual\"]) */\n categories: z.array(z.string()).default([]),\n /** Action when toxicity is detected */\n action: z.enum([\"block\", \"warn\", \"audit\"]).default(\"warn\"),\n});\n\nexport type AIRToxicityFilterConfig = z.infer<typeof AIRToxicityFilterConfigSchema>;\n\nexport const AIRRuntimeConstraintsSchema = z.object({\n /** PII filtering configuration */\n pii_filter: AIRPIIFilterConfigSchema.optional(),\n /** Toxicity filtering configuration */\n toxicity_filter: AIRToxicityFilterConfigSchema.optional(),\n /** Data retention period in days (0 = no retention) */\n data_retention_days: z.number().int().min(0).default(90),\n /** Whether to enable output watermarking */\n watermark_enabled: z.boolean().default(false),\n /** Logging level: \"none\", \"errors\", \"all\" */\n logging_level: z.enum([\"none\", \"errors\", \"all\"]).default(\"all\"),\n /** Maximum tokens per request */\n max_tokens_per_request: z.number().int().positive().optional(),\n /** Maximum requests per minute */\n max_requests_per_minute: z.number().int().positive().optional(),\n /** Maximum cost per request in USD */\n max_cost_per_request_usd: z.number().positive().optional(),\n /** Maximum cost per day in USD */\n max_cost_per_day_usd: z.number().positive().optional(),\n /** Session timeout in seconds */\n session_timeout_seconds: z.number().int().positive().optional(),\n /** Require human approval for specific actions */\n human_approval_required: z.array(z.string()).default([]),\n /** Kill switch configuration */\n kill_switch: z.object({\n enabled: z.boolean().default(true),\n channel: z.enum([\"sse\", \"polling\", \"file\"]).default(\"sse\"),\n poll_interval_ms: z.number().int().positive().default(5000),\n }).optional(),\n /** Grounding check configuration (prevent hallucination) */\n grounding_check: z.object({\n enabled: z.boolean().default(false),\n confidence_threshold: z.number().min(0).max(1).default(0.8),\n action: z.enum([\"block\", \"warn\", \"audit\"]).default(\"warn\"),\n }).optional(),\n});\n\nexport type AIRRuntimeConstraints = z.infer<typeof AIRRuntimeConstraintsSchema>;\n\n// ─────────────────────────────────────────────────────────────────\n// BUILD CONSTRAINTS SCHEMA\n// Controls CI/CD and build-time governance\n// ─────────────────────────────────────────────────────────────────\n\nexport const AIRBuildConstraintsSchema = z.object({\n /** Require Golden Thread linkage (business justification) */\n require_golden_thread: z.boolean().default(true),\n /** Require asset card for all AI assets */\n require_asset_card: z.boolean().default(true),\n /** Require risk classification */\n require_risk_classification: z.boolean().default(true),\n /** Require model card documentation */\n require_model_card: z.boolean().default(false),\n /** Require security review for high-risk assets */\n require_security_review: z.boolean().default(false),\n /** Minimum risk levels that require security review */\n security_review_risk_levels: z.array(z.enum([\"high\", \"unacceptable\"])).default([\"high\", \"unacceptable\"]),\n /** Require governance.lock file */\n require_governance_lock: z.boolean().default(true),\n /** governance.lock must be signed */\n require_lock_signature: z.boolean().default(false),\n /** Block merge on validation failure */\n block_on_failure: z.boolean().default(true),\n /** Generate SARIF report for GitHub Security tab */\n generate_sarif: z.boolean().default(true),\n /** Required approvals before deployment */\n required_approvals: z.array(z.object({\n role: z.string(),\n count: z.number().int().positive().default(1),\n })).default([]),\n /** Allowed deployment environments */\n allowed_environments: z.array(z.string()).default([\"development\", \"staging\", \"production\"]),\n /** Environment-specific constraints */\n environment_constraints: z.record(z.object({\n require_approval: z.boolean().default(false),\n approvers: z.array(z.string()).default([]),\n require_testing: z.boolean().default(false),\n test_coverage_threshold: z.number().min(0).max(100).optional(),\n })).optional(),\n});\n\nexport type AIRBuildConstraints = z.infer<typeof AIRBuildConstraintsSchema>;\n\n// ─────────────────────────────────────────────────────────────────\n// POLICY SOURCE SCHEMA\n// References to source policy documents\n// ─────────────────────────────────────────────────────────────────\n\nexport const AIRPolicySourceSchema = z.object({\n /** Unique identifier for this source */\n id: z.string().min(1),\n /** Type of source: \"pdf\", \"url\", \"confluence\", \"jira\", \"manual\" */\n type: z.enum([\"pdf\", \"url\", \"confluence\", \"jira\", \"manual\"]),\n /** URI to the source document */\n uri: z.string(),\n /** SHA-256 hash of the source content */\n content_hash: z.string().regex(/^sha256:[a-f0-9]{64}$/),\n /** When the source was last fetched */\n fetched_at: z.string().datetime(),\n /** Title of the policy document */\n title: z.string().optional(),\n /** Version of the policy document */\n version: z.string().optional(),\n /** Confidence score of extraction (0-1) */\n extraction_confidence: z.number().min(0).max(1).optional(),\n});\n\nexport type AIRPolicySource = z.infer<typeof AIRPolicySourceSchema>;\n\n// ─────────────────────────────────────────────────────────────────\n// AIR METADATA SCHEMA\n// Metadata about the AIR compilation\n// ─────────────────────────────────────────────────────────────────\n\nexport const AIRMetadataSchema = z.object({\n /** When this AIR was generated */\n generated_at: z.string().datetime(),\n /** Tool/system that generated this AIR */\n generated_by: z.string().default(\"aigrc-policy-compiler\"),\n /** Version of the policy compiler */\n compiler_version: z.string(),\n /** Organization this AIR belongs to */\n organization: z.string().optional(),\n /** Environment this AIR is for (e.g., \"production\", \"staging\") */\n environment: z.string().optional(),\n /** Human-readable description */\n description: z.string().optional(),\n /** Tags for categorization */\n tags: z.array(z.string()).default([]),\n /** Custom metadata fields */\n custom: z.record(z.unknown()).optional(),\n});\n\nexport type AIRMetadata = z.infer<typeof AIRMetadataSchema>;\n\n// ─────────────────────────────────────────────────────────────────\n// AIGRC INTERMEDIATE REPRESENTATION (AIR) SCHEMA\n// The complete AIR document format\n// ─────────────────────────────────────────────────────────────────\n\nexport const AIRSchema = z.object({\n /** Schema version for forward compatibility */\n version: z.literal(\"1.0\"),\n /** Unique identifier for this AIR */\n id: z.string().uuid(),\n /** Human-readable name */\n name: z.string().min(1).max(200),\n /** SHA-256 hash of this AIR (computed after serialization) */\n hash: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),\n /** Policy sources that contributed to this AIR */\n policy_sources: z.array(AIRPolicySourceSchema).default([]),\n /** Registry constraints (vendor/model/region governance) */\n registry: AIRRegistryConstraintsSchema.default({}),\n /** Runtime constraints (execution-time governance) */\n runtime: AIRRuntimeConstraintsSchema.default({}),\n /** Build constraints (CI/CD governance) */\n build: AIRBuildConstraintsSchema.default({}),\n /** Metadata about this AIR */\n metadata: AIRMetadataSchema,\n /** When this AIR expires (forces re-compilation) */\n expires_at: z.string().datetime().optional(),\n /** Digital signatures for verification */\n signatures: z.array(z.object({\n /** Signer identity (email or system ID) */\n signer: z.string(),\n /** Algorithm used (RS256, ES256) */\n algorithm: z.enum([\"RS256\", \"ES256\"]),\n /** Base64-encoded signature */\n signature: z.string(),\n /** When the signature was created */\n signed_at: z.string().datetime(),\n /** Key ID for verification */\n key_id: z.string().optional(),\n })).default([]),\n});\n\nexport type AIR = z.infer<typeof AIRSchema>;\n\n// ─────────────────────────────────────────────────────────────────\n// HELPER FUNCTIONS\n// ─────────────────────────────────────────────────────────────────\n\n/**\n * Creates an empty AIR with default values\n */\nexport function createEmptyAIR(name: string, compilerVersion: string = \"1.0.0\"): AIR {\n return {\n version: \"1.0\",\n id: crypto.randomUUID(),\n name,\n policy_sources: [],\n registry: {\n allowed_vendors: [],\n blocked_vendors: [],\n allowed_regions: [],\n blocked_regions: [],\n allowed_models: [],\n blocked_models: [],\n require_vendor_approval: true,\n require_model_approval: true,\n unknown_vendor_behavior: \"request_approval\",\n unknown_model_behavior: \"request_approval\",\n },\n runtime: {\n data_retention_days: 90,\n watermark_enabled: false,\n logging_level: \"all\",\n human_approval_required: [],\n },\n build: {\n require_golden_thread: true,\n require_asset_card: true,\n require_risk_classification: true,\n require_model_card: false,\n require_security_review: false,\n security_review_risk_levels: [\"high\", \"unacceptable\"],\n require_governance_lock: true,\n require_lock_signature: false,\n block_on_failure: true,\n generate_sarif: true,\n required_approvals: [],\n allowed_environments: [\"development\", \"staging\", \"production\"],\n },\n metadata: {\n generated_at: new Date().toISOString(),\n generated_by: \"aigrc-policy-compiler\",\n compiler_version: compilerVersion,\n tags: [],\n },\n signatures: [],\n };\n}\n\n/**\n * Validates an AIR document\n */\nexport function validateAIR(air: unknown): { valid: boolean; errors: string[] } {\n const result = AIRSchema.safeParse(air);\n if (result.success) {\n return { valid: true, errors: [] };\n }\n return {\n valid: false,\n errors: result.error.errors.map(e => `${e.path.join(\".\")}: ${e.message}`),\n };\n}\n\n/**\n * Checks if a vendor is allowed by registry constraints\n */\nexport function isVendorAllowed(vendorId: string, registry: AIRRegistryConstraints): {\n allowed: boolean;\n reason: string;\n requiresApproval: boolean;\n} {\n // Check blocked list first\n if (registry.blocked_vendors.includes(vendorId)) {\n return { allowed: false, reason: \"Vendor is blocked\", requiresApproval: false };\n }\n\n // Check allowed list\n const allowedVendor = registry.allowed_vendors.find(v => v.id === vendorId);\n if (allowedVendor) {\n if (allowedVendor.status === \"approved\") {\n // Check expiration\n if (allowedVendor.expires_at && new Date(allowedVendor.expires_at) < new Date()) {\n return { allowed: false, reason: \"Vendor approval has expired\", requiresApproval: true };\n }\n return { allowed: true, reason: \"Vendor is approved\", requiresApproval: false };\n }\n if (allowedVendor.status === \"pending\") {\n return { allowed: false, reason: \"Vendor approval is pending\", requiresApproval: true };\n }\n return { allowed: false, reason: \"Vendor is blocked\", requiresApproval: false };\n }\n\n // Unknown vendor\n if (registry.unknown_vendor_behavior === \"block\") {\n return { allowed: false, reason: \"Unknown vendor (blocked by policy)\", requiresApproval: false };\n }\n return { allowed: false, reason: \"Unknown vendor (requires approval)\", requiresApproval: true };\n}\n\n/**\n * Checks if a model is allowed by registry constraints\n */\nexport function isModelAllowed(modelId: string, vendorId: string, registry: AIRRegistryConstraints): {\n allowed: boolean;\n reason: string;\n requiresApproval: boolean;\n} {\n // Check blocked models first (supports patterns)\n for (const pattern of registry.blocked_models) {\n if (matchesPattern(modelId, pattern)) {\n return { allowed: false, reason: `Model matches blocked pattern: ${pattern}`, requiresApproval: false };\n }\n }\n\n // Check allowed models\n const allowedModel = registry.allowed_models.find(m =>\n m.id === modelId && m.vendor_id === vendorId\n );\n if (allowedModel) {\n if (allowedModel.status === \"approved\") {\n if (allowedModel.expires_at && new Date(allowedModel.expires_at) < new Date()) {\n return { allowed: false, reason: \"Model approval has expired\", requiresApproval: true };\n }\n return { allowed: true, reason: \"Model is approved\", requiresApproval: false };\n }\n if (allowedModel.status === \"pending\") {\n return { allowed: false, reason: \"Model approval is pending\", requiresApproval: true };\n }\n return { allowed: false, reason: \"Model is blocked\", requiresApproval: false };\n }\n\n // Check version patterns for allowed models\n const matchingModel = registry.allowed_models.find(m =>\n m.vendor_id === vendorId &&\n m.version_pattern &&\n matchesPattern(modelId, m.version_pattern)\n );\n if (matchingModel && matchingModel.status === \"approved\") {\n return { allowed: true, reason: `Model matches approved pattern: ${matchingModel.version_pattern}`, requiresApproval: false };\n }\n\n // Unknown model\n if (registry.unknown_model_behavior === \"block\") {\n return { allowed: false, reason: \"Unknown model (blocked by policy)\", requiresApproval: false };\n }\n return { allowed: false, reason: \"Unknown model (requires approval)\", requiresApproval: true };\n}\n\n/**\n * Checks if a region is allowed by registry constraints\n */\nexport function isRegionAllowed(regionCode: string, registry: AIRRegistryConstraints): {\n allowed: boolean;\n reason: string;\n dataResidency: \"required\" | \"preferred\" | \"none\";\n} {\n // Check blocked regions first\n if (registry.blocked_regions.includes(regionCode)) {\n return { allowed: false, reason: \"Region is blocked\", dataResidency: \"none\" };\n }\n\n // Check allowed regions\n const allowedRegion = registry.allowed_regions.find(r => r.code === regionCode);\n if (allowedRegion) {\n if (allowedRegion.status === \"blocked\") {\n return { allowed: false, reason: \"Region is blocked\", dataResidency: \"none\" };\n }\n if (allowedRegion.status === \"restricted\") {\n return { allowed: true, reason: \"Region is restricted (requires approval)\", dataResidency: allowedRegion.data_residency };\n }\n return { allowed: true, reason: \"Region is allowed\", dataResidency: allowedRegion.data_residency };\n }\n\n // If no regions are explicitly allowed, allow all (except blocked)\n if (registry.allowed_regions.length === 0) {\n return { allowed: true, reason: \"No region restrictions\", dataResidency: \"none\" };\n }\n\n // Region not in allowed list\n return { allowed: false, reason: \"Region not in allowed list\", dataResidency: \"none\" };\n}\n\n/**\n * Simple pattern matching (supports wildcards)\n */\nfunction matchesPattern(value: string, pattern: string): boolean {\n if (pattern === \"*\") {\n return true;\n }\n if (pattern.endsWith(\"*\")) {\n return value.startsWith(pattern.slice(0, -1));\n }\n if (pattern.startsWith(\"*\")) {\n return value.endsWith(pattern.slice(1));\n }\n return value === pattern;\n}\n\n","/**\n * governance.lock File Format\n *\n * The governance.lock file pins policy version to code version, similar to\n * package-lock.json. It is generated by the Policy Compiler and verified\n * by the Supply Chain Firewall in IDE, CI/CD, and runtime.\n *\n * @see I2E_Engine_Specification_v1.md Section 4.2.3\n * @module @aigrc/core/governance-lock\n */\n\nimport { z } from \"zod\";\nimport * as yaml from \"yaml\";\nimport type { AIR, AIRPolicySource } from \"../air\";\n\n// ─────────────────────────────────────────────────────────────────\n// SIGNATURE SCHEMA\n// Cryptographic signatures from policy owners\n// ─────────────────────────────────────────────────────────────────\n\nexport const GovernanceLockSignatureSchema = z.object({\n /** Signer identity (email or system ID) */\n signer: z.string().min(1),\n /** Role of the signer (e.g., \"CISO\", \"PolicyOwner\", \"SecurityLead\") */\n role: z.string().optional(),\n /** Algorithm used: RS256 (RSA-SHA256) or ES256 (ECDSA-P256) */\n algorithm: z.enum([\"RS256\", \"ES256\"]),\n /** Base64-encoded signature */\n signature: z.string().min(1),\n /** When the signature was created */\n signed_at: z.string().datetime(),\n /** Key ID for key rotation support */\n key_id: z.string().optional(),\n /** Expiration of this signature (optional, separate from lock expiration) */\n expires_at: z.string().datetime().optional(),\n /** Certificate chain for verification (optional) */\n certificate_chain: z.array(z.string()).optional(),\n});\n\nexport type GovernanceLockSignature = z.infer<typeof GovernanceLockSignatureSchema>;\n\n// ─────────────────────────────────────────────────────────────────\n// POLICY SOURCE REFERENCE SCHEMA\n// References to source policy documents with integrity hashes\n// ─────────────────────────────────────────────────────────────────\n\nexport const GovernanceLockPolicySourceSchema = z.object({\n /** Unique identifier for this source */\n id: z.string().min(1),\n /** Type of source */\n type: z.enum([\"pdf\", \"url\", \"confluence\", \"jira\", \"manual\"]),\n /** URI to the source document */\n uri: z.string(),\n /** SHA-256 hash of the source content at time of compilation */\n content_hash: z.string().regex(/^sha256:[a-f0-9]{64}$/),\n /** When the source was fetched */\n fetched_at: z.string().datetime(),\n /** Title of the policy document */\n title: z.string().optional(),\n /** Version of the policy document */\n version: z.string().optional(),\n});\n\nexport type GovernanceLockPolicySource = z.infer<typeof GovernanceLockPolicySourceSchema>;\n\n// ─────────────────────────────────────────────────────────────────\n// COMPILED CONSTRAINTS SCHEMA\n// Subset of AIR constraints included in governance.lock\n// ─────────────────────────────────────────────────────────────────\n\nexport const GovernanceLockRegistryConstraintsSchema = z.object({\n /** List of approved vendor IDs */\n allowed_vendor_ids: z.array(z.string()).default([]),\n /** List of blocked vendor IDs */\n blocked_vendor_ids: z.array(z.string()).default([]),\n /** List of approved region codes */\n allowed_region_codes: z.array(z.string()).default([]),\n /** List of blocked region codes */\n blocked_region_codes: z.array(z.string()).default([]),\n /** List of approved model patterns */\n allowed_model_patterns: z.array(z.string()).default([]),\n /** List of blocked model patterns */\n blocked_model_patterns: z.array(z.string()).default([]),\n /** Maximum model parameters allowed */\n max_model_parameters: z.number().positive().optional(),\n});\n\nexport type GovernanceLockRegistryConstraints = z.infer<typeof GovernanceLockRegistryConstraintsSchema>;\n\nexport const GovernanceLockRuntimeConstraintsSchema = z.object({\n /** Whether PII filtering is required */\n pii_filter_enabled: z.boolean().default(false),\n /** PII filter action */\n pii_filter_action: z.enum([\"redact\", \"block\", \"warn\", \"audit\"]).optional(),\n /** Whether toxicity filtering is required */\n toxicity_filter_enabled: z.boolean().default(false),\n /** Toxicity threshold */\n toxicity_threshold: z.number().min(0).max(1).optional(),\n /** Data retention period in days */\n data_retention_days: z.number().int().min(0).default(90),\n /** Whether watermarking is required */\n watermark_enabled: z.boolean().default(false),\n /** Logging level */\n logging_level: z.enum([\"none\", \"errors\", \"all\"]).default(\"all\"),\n /** Maximum tokens per request */\n max_tokens_per_request: z.number().int().positive().optional(),\n /** Maximum cost per day in USD */\n max_cost_per_day_usd: z.number().positive().optional(),\n /** Kill switch enabled */\n kill_switch_enabled: z.boolean().default(true),\n});\n\nexport type GovernanceLockRuntimeConstraints = z.infer<typeof GovernanceLockRuntimeConstraintsSchema>;\n\nexport const GovernanceLockBuildConstraintsSchema = z.object({\n /** Require Golden Thread linkage */\n require_golden_thread: z.boolean().default(true),\n /** Require asset card */\n require_asset_card: z.boolean().default(true),\n /** Require risk classification */\n require_risk_classification: z.boolean().default(true),\n /** Require model card */\n require_model_card: z.boolean().default(false),\n /** Require security review for high risk */\n require_security_review: z.boolean().default(false),\n /** Block merge on validation failure */\n block_on_failure: z.boolean().default(true),\n /** Generate SARIF report */\n generate_sarif: z.boolean().default(true),\n /** Allowed environments */\n allowed_environments: z.array(z.string()).default([\"development\", \"staging\", \"production\"]),\n});\n\nexport type GovernanceLockBuildConstraints = z.infer<typeof GovernanceLockBuildConstraintsSchema>;\n\nexport const GovernanceLockConstraintsSchema = z.object({\n /** Registry constraints (vendor/model/region) */\n registry: GovernanceLockRegistryConstraintsSchema.default({}),\n /** Runtime constraints */\n runtime: GovernanceLockRuntimeConstraintsSchema.default({}),\n /** Build constraints */\n build: GovernanceLockBuildConstraintsSchema.default({}),\n});\n\nexport type GovernanceLockConstraints = z.infer<typeof GovernanceLockConstraintsSchema>;\n\n// ─────────────────────────────────────────────────────────────────\n// GOVERNANCE.LOCK SCHEMA\n// The complete governance.lock file format\n// ─────────────────────────────────────────────────────────────────\n\nexport const GovernanceLockSchema = z.object({\n /** Schema version for forward compatibility */\n version: z.literal(\"1.0\"),\n /** When this lock file was generated */\n generated_at: z.string().datetime(),\n /** SHA-256 hash of the compiled policy (AIR) */\n policy_hash: z.string().regex(/^sha256:[a-f0-9]{64}$/),\n /** Name of this policy lock */\n name: z.string().min(1).max(200).optional(),\n /** Description of this lock file */\n description: z.string().max(500).optional(),\n /** Policy sources that contributed to this lock */\n policy_sources: z.array(GovernanceLockPolicySourceSchema).default([]),\n /** Compiled constraints (subset of AIR) */\n constraints: GovernanceLockConstraintsSchema.default({}),\n /** Digital signatures from policy owners */\n signatures: z.array(GovernanceLockSignatureSchema).default([]),\n /** When this lock file expires (forces re-compilation) */\n expires_at: z.string().datetime(),\n /** Tool/system that generated this lock */\n generated_by: z.string().default(\"aigrc-policy-compiler\"),\n /** Version of the generator */\n generator_version: z.string().default(\"1.0.0\"),\n /** Organization this lock belongs to */\n organization: z.string().optional(),\n /** Environment this lock is for */\n environment: z.string().optional(),\n /** Reference to the full AIR document (optional) */\n air_reference: z.object({\n /** AIR document ID */\n id: z.string().uuid(),\n /** AIR document location (URI) */\n location: z.string().optional(),\n /** AIR document hash */\n hash: z.string().regex(/^sha256:[a-f0-9]{64}$/),\n }).optional(),\n /** Custom metadata fields */\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport type GovernanceLock = z.infer<typeof GovernanceLockSchema>;\n\n// ─────────────────────────────────────────────────────────────────\n// VALIDATION RESULT SCHEMA\n// Result of validating a governance.lock file\n// ─────────────────────────────────────────────────────────────────\n\nexport interface GovernanceLockValidationResult {\n /** Whether the lock file is valid */\n valid: boolean;\n /** Validation errors */\n errors: string[];\n /** Validation warnings */\n warnings: string[];\n /** Whether the lock file has expired */\n expired: boolean;\n /** Days until expiration (negative if expired) */\n daysUntilExpiration: number;\n /** Whether signatures are present */\n signed: boolean;\n /** Number of valid signatures */\n validSignatureCount: number;\n /** Whether policy hash is valid */\n policyHashValid: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────\n// HELPER FUNCTIONS\n// ─────────────────────────────────────────────────────────────────\n\n/**\n * Computes SHA-256 hash of a string\n */\nasync function computeHash(data: string): Promise<string> {\n // Use Web Crypto API (works in Node.js 18+ and browsers)\n const encoder = new TextEncoder();\n const dataBuffer = encoder.encode(data);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", dataBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n return `sha256:${hashHex}`;\n}\n\n/**\n * Creates a governance.lock from an AIR document\n */\nexport async function createGovernanceLock(\n air: AIR,\n options: {\n expiresInDays?: number;\n name?: string;\n description?: string;\n organization?: string;\n environment?: string;\n } = {}\n): Promise<GovernanceLock> {\n const now = new Date();\n const expiresAt = new Date(now);\n expiresAt.setDate(expiresAt.getDate() + (options.expiresInDays ?? 30));\n\n // Compute policy hash from AIR content (excluding signatures)\n const airForHashing = { ...air, signatures: [] };\n const policyHash = await computeHash(JSON.stringify(airForHashing));\n\n // Extract simplified constraints from AIR\n const constraints: GovernanceLockConstraints = {\n registry: {\n allowed_vendor_ids: air.registry.allowed_vendors.map(v => v.id),\n blocked_vendor_ids: air.registry.blocked_vendors,\n allowed_region_codes: air.registry.allowed_regions.map(r => r.code),\n blocked_region_codes: air.registry.blocked_regions,\n allowed_model_patterns: air.registry.allowed_models.map(m => m.version_pattern ?? m.id),\n blocked_model_patterns: air.registry.blocked_models,\n max_model_parameters: air.registry.max_model_parameters,\n },\n runtime: {\n pii_filter_enabled: air.runtime.pii_filter?.enabled ?? false,\n pii_filter_action: air.runtime.pii_filter?.action,\n toxicity_filter_enabled: air.runtime.toxicity_filter?.enabled ?? false,\n toxicity_threshold: air.runtime.toxicity_filter?.threshold,\n data_retention_days: air.runtime.data_retention_days,\n watermark_enabled: air.runtime.watermark_enabled,\n logging_level: air.runtime.logging_level,\n max_tokens_per_request: air.runtime.max_tokens_per_request,\n max_cost_per_day_usd: air.runtime.max_cost_per_day_usd,\n kill_switch_enabled: air.runtime.kill_switch?.enabled ?? true,\n },\n build: {\n require_golden_thread: air.build.require_golden_thread,\n require_asset_card: air.build.require_asset_card,\n require_risk_classification: air.build.require_risk_classification,\n require_model_card: air.build.require_model_card,\n require_security_review: air.build.require_security_review,\n block_on_failure: air.build.block_on_failure,\n generate_sarif: air.build.generate_sarif,\n allowed_environments: air.build.allowed_environments,\n },\n };\n\n // Map AIR policy sources to lock format\n const policySources: GovernanceLockPolicySource[] = air.policy_sources.map(s => ({\n id: s.id,\n type: s.type,\n uri: s.uri,\n content_hash: s.content_hash,\n fetched_at: s.fetched_at,\n title: s.title,\n version: s.version,\n }));\n\n return {\n version: \"1.0\",\n generated_at: now.toISOString(),\n policy_hash: policyHash,\n name: options.name ?? air.name,\n description: options.description,\n policy_sources: policySources,\n constraints,\n signatures: [],\n expires_at: expiresAt.toISOString(),\n generated_by: air.metadata.generated_by,\n generator_version: air.metadata.compiler_version,\n organization: options.organization ?? air.metadata.organization,\n environment: options.environment ?? air.metadata.environment,\n air_reference: {\n id: air.id,\n hash: policyHash,\n },\n };\n}\n\n/**\n * Validates a governance.lock file\n */\nexport function validateGovernanceLock(\n lock: unknown,\n options: {\n /** Whether to check expiration */\n checkExpiration?: boolean;\n /** Whether to require signatures */\n requireSignatures?: boolean;\n /** Expected policy hash (for integrity check) */\n expectedPolicyHash?: string;\n } = {}\n): GovernanceLockValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Parse and validate schema\n const parseResult = GovernanceLockSchema.safeParse(lock);\n if (!parseResult.success) {\n return {\n valid: false,\n errors: parseResult.error.errors.map(e => `${e.path.join(\".\")}: ${e.message}`),\n warnings: [],\n expired: false,\n daysUntilExpiration: 0,\n signed: false,\n validSignatureCount: 0,\n policyHashValid: false,\n };\n }\n\n const parsed = parseResult.data;\n const now = new Date();\n const expiresAt = new Date(parsed.expires_at);\n const daysUntilExpiration = Math.ceil((expiresAt.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));\n const expired = expiresAt < now;\n\n // Check expiration\n if (options.checkExpiration !== false && expired) {\n errors.push(`Lock file expired on ${parsed.expires_at}`);\n }\n\n // Warn if expiring soon (within 7 days)\n if (daysUntilExpiration > 0 && daysUntilExpiration <= 7) {\n warnings.push(`Lock file expires in ${daysUntilExpiration} days`);\n }\n\n // Check signatures\n const signed = parsed.signatures.length > 0;\n if (options.requireSignatures && !signed) {\n errors.push(\"Lock file requires at least one signature\");\n }\n\n // Check signature expiration\n let validSignatureCount = 0;\n for (const sig of parsed.signatures) {\n if (sig.expires_at) {\n const sigExpiresAt = new Date(sig.expires_at);\n if (sigExpiresAt < now) {\n warnings.push(`Signature from ${sig.signer} has expired`);\n } else {\n validSignatureCount++;\n }\n } else {\n validSignatureCount++;\n }\n }\n\n // Check policy hash\n let policyHashValid = true;\n if (options.expectedPolicyHash) {\n if (parsed.policy_hash !== options.expectedPolicyHash) {\n errors.push(`Policy hash mismatch: expected ${options.expectedPolicyHash}, got ${parsed.policy_hash}`);\n policyHashValid = false;\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n expired,\n daysUntilExpiration,\n signed,\n validSignatureCount,\n policyHashValid,\n };\n}\n\n/**\n * Parses a governance.lock file from YAML string\n */\nexport function parseGovernanceLockYAML(content: string): GovernanceLock {\n const parsed = yaml.parse(content);\n return GovernanceLockSchema.parse(parsed);\n}\n\n/**\n * Parses a governance.lock file from JSON string\n */\nexport function parseGovernanceLockJSON(content: string): GovernanceLock {\n const parsed = JSON.parse(content);\n return GovernanceLockSchema.parse(parsed);\n}\n\n/**\n * Serializes a governance.lock to YAML\n */\nexport function serializeGovernanceLockYAML(lock: GovernanceLock): string {\n return yaml.stringify(lock, {\n indent: 2,\n lineWidth: 120,\n });\n}\n\n/**\n * Serializes a governance.lock to JSON\n */\nexport function serializeGovernanceLockJSON(lock: GovernanceLock, pretty = true): string {\n return pretty ? JSON.stringify(lock, null, 2) : JSON.stringify(lock);\n}\n\n/**\n * Checks if a governance.lock file is expired\n */\nexport function isGovernanceLockExpired(lock: GovernanceLock): boolean {\n return new Date(lock.expires_at) < new Date();\n}\n\n/**\n * Gets the number of days until a governance.lock expires\n */\nexport function getDaysUntilExpiration(lock: GovernanceLock): number {\n const now = new Date();\n const expiresAt = new Date(lock.expires_at);\n return Math.ceil((expiresAt.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));\n}\n\n/**\n * Checks if a vendor is allowed by the governance.lock\n */\nexport function isVendorAllowedByLock(vendorId: string, lock: GovernanceLock): boolean {\n const { registry } = lock.constraints;\n\n // Check blocked list first\n if (registry.blocked_vendor_ids.includes(vendorId)) {\n return false;\n }\n\n // Check allowed list (if specified)\n if (registry.allowed_vendor_ids.length > 0) {\n return registry.allowed_vendor_ids.includes(vendorId);\n }\n\n // If no allowed list, allow by default (except blocked)\n return true;\n}\n\n/**\n * Checks if a model is allowed by the governance.lock\n */\nexport function isModelAllowedByLock(modelId: string, lock: GovernanceLock): boolean {\n const { registry } = lock.constraints;\n\n // Check blocked patterns\n for (const pattern of registry.blocked_model_patterns) {\n if (matchesPattern(modelId, pattern)) {\n return false;\n }\n }\n\n // Check allowed patterns (if specified)\n if (registry.allowed_model_patterns.length > 0) {\n return registry.allowed_model_patterns.some(pattern =>\n matchesPattern(modelId, pattern)\n );\n }\n\n // If no allowed list, allow by default (except blocked)\n return true;\n}\n\n/**\n * Checks if a region is allowed by the governance.lock\n */\nexport function isRegionAllowedByLock(regionCode: string, lock: GovernanceLock): boolean {\n const { registry } = lock.constraints;\n\n // Check blocked list first\n if (registry.blocked_region_codes.includes(regionCode)) {\n return false;\n }\n\n // Check allowed list (if specified)\n if (registry.allowed_region_codes.length > 0) {\n return registry.allowed_region_codes.includes(regionCode);\n }\n\n // If no allowed list, allow by default (except blocked)\n return true;\n}\n\n/**\n * Simple pattern matching (supports wildcards)\n */\nfunction matchesPattern(value: string, pattern: string): boolean {\n if (pattern === \"*\") {\n return true;\n }\n if (pattern.endsWith(\"*\")) {\n return value.startsWith(pattern.slice(0, -1));\n }\n if (pattern.startsWith(\"*\")) {\n return value.endsWith(pattern.slice(1));\n }\n return value === pattern;\n}\n\n/**\n * Creates a canonical string for signing\n */\nexport function createSigningPayload(lock: GovernanceLock): string {\n // Create a deterministic representation excluding signatures\n const forSigning = {\n version: lock.version,\n generated_at: lock.generated_at,\n policy_hash: lock.policy_hash,\n expires_at: lock.expires_at,\n constraints: lock.constraints,\n };\n return JSON.stringify(forSigning);\n}\n\n/**\n * Adds a signature to a governance.lock\n * Note: Actual cryptographic signing is delegated to external libraries\n */\nexport function addSignature(\n lock: GovernanceLock,\n signature: GovernanceLockSignature\n): GovernanceLock {\n return {\n ...lock,\n signatures: [...lock.signatures, signature],\n };\n}\n\n/**\n * Computes a hash for integrity verification\n */\nexport { computeHash };\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","crypto","import_zod","import_fs","import_path","registerPythonPatterns","registerJavaScriptPatterns","registerModelFilePatterns","registerRiskIndicatorPatterns","clearRegistry","import_path","import_zod","registry","matchesPattern","import_zod","yaml","registry","matchesPattern"]}