@i4ctime/q-ring 0.10.1 → 0.11.5

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/mcp.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mcp.ts","../src/mcp/server.ts","../src/version.ts","../src/mcp/tools/secrets.ts","../src/services/list-secrets-filter.ts","../src/core/noise.ts","../src/core/import.ts","../src/mcp/tools/_shared.ts","../src/core/validate.ts","../src/core/context.ts","../src/mcp/tools/project.ts","../src/mcp/tools/tunnel.ts","../src/mcp/tools/teleport.ts","../src/core/teleport.ts","../src/mcp/tools/audit.ts","../src/mcp/tools/validation.ts","../src/mcp/tools/hooks.ts","../src/mcp/tools/tooling.ts","../src/utils/colors.ts","../src/core/agent.ts","../src/core/exec.ts","../src/core/scan.ts","../src/core/secrets-detect.ts","../src/core/linter.ts","../src/mcp/tools/agent.ts","../src/core/memory.ts","../src/mcp/tools/policy.ts","../src/mcp/tool-registration.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createMcpServer } from \"./mcp/server.js\";\n\nconst server = createMcpServer();\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { PACKAGE_VERSION } from \"../version.js\";\nimport { registerMcpTools } from \"./tool-registration.js\";\n\nexport function createMcpServer(): McpServer {\n const server = new McpServer({\n name: \"q-ring\",\n version: PACKAGE_VERSION,\n });\n registerMcpTools(server);\n return server;\n}\n","import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Package version from `package.json` next to the compiled bundle (`dist/`).\n * Works when the package is installed from npm (package.json ships with dist).\n */\nfunction readPackageVersion(): string {\n try {\n const here = dirname(fileURLToPath(import.meta.url));\n const pkgPath = join(here, \"..\", \"package.json\");\n const raw = readFileSync(pkgPath, \"utf8\");\n const pkg = JSON.parse(raw) as { version?: string };\n return typeof pkg.version === \"string\" ? pkg.version : \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nexport const PACKAGE_VERSION = readPackageVersion();\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { filterSecretsByKeyGlob } from \"../../services/list-secrets-filter.js\";\nimport {\n getSecret,\n setSecret,\n deleteSecret,\n hasSecret,\n listSecrets,\n getEnvelope,\n entangleSecrets,\n disentangleSecrets,\n exportSecrets,\n} from \"../../core/keyring.js\";\nimport { checkDecay } from \"../../core/envelope.js\";\nimport type { Scope } from \"../../core/scope.js\";\nimport {\n generateSecret,\n estimateEntropy,\n type NoiseFormat,\n} from \"../../core/noise.js\";\nimport { importDotenv } from \"../../core/import.js\";\nimport { checkKeyReadPolicy } from \"../../core/policy.js\";\nimport { text, opts, enforceToolPolicy, commonSchemas } from \"./_shared.js\";\n\nconst { teamId, orgId, scope, projectPath, env } = commonSchemas;\n\nexport function registerSecretTools(server: McpServer): void {\n server.tool(\n \"get_secret\",\n \"[secrets] Retrieve a secret by key. Collapses superposition if the secret has multiple environment states. Records access in audit log (observer effect).\",\n {\n key: z.string().describe(\"The secret key name\"),\n scope,\n projectPath,\n env,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"get_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n try {\n const keyBlock = checkKeyReadPolicy(\n params.key,\n undefined,\n params.projectPath,\n );\n if (!keyBlock.allowed) {\n return text(`Policy Denied: ${keyBlock.reason}`, true);\n }\n\n const value = getSecret(params.key, opts(params));\n if (value === null) return text(`Secret \"${params.key}\" not found`, true);\n return text(\n JSON.stringify({ ok: true, data: { key: params.key, value } }, null, 2),\n );\n } catch (err) {\n return text(err instanceof Error ? err.message : String(err), true);\n }\n },\n );\n\n server.tool(\n \"list_secrets\",\n \"[secrets] List all secret keys with quantum metadata (scope, decay status, superposition states, entanglement, access count). Values are never exposed. Supports filtering by tag, expiry state, and key pattern.\",\n {\n scope,\n projectPath,\n tag: z.string().optional().describe(\"Filter by tag\"),\n expired: z.boolean().optional().describe(\"Show only expired secrets\"),\n stale: z\n .boolean()\n .optional()\n .describe(\"Show only stale secrets (75%+ decay)\"),\n filter: z\n .string()\n .optional()\n .describe(\"Glob pattern on key name (e.g., 'API_*')\"),\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"list_secrets\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n let entries = listSecrets(opts(params));\n\n if (params.tag) {\n entries = entries.filter((e) =>\n e.envelope?.meta.tags?.includes(params.tag!),\n );\n }\n if (params.expired) {\n entries = entries.filter((e) => e.decay?.isExpired);\n }\n if (params.stale) {\n entries = entries.filter(\n (e) => e.decay?.isStale && !e.decay?.isExpired,\n );\n }\n if (params.filter) {\n entries = filterSecretsByKeyGlob(entries, params.filter);\n }\n const rows = entries.map((e) => ({\n scope: e.scope,\n key: e.key,\n stateKeys: e.envelope?.states\n ? Object.keys(e.envelope.states)\n : undefined,\n expired: !!e.decay?.isExpired,\n stale: !!e.decay?.isStale && !e.decay?.isExpired,\n lifetimePercent: e.decay?.lifetimePercent,\n timeRemaining: e.decay?.timeRemaining ?? null,\n entangledCount: e.envelope?.meta.entangled?.length ?? 0,\n accessCount: e.envelope?.meta.accessCount ?? 0,\n }));\n\n return text(JSON.stringify({ ok: true, data: { entries: rows } }, null, 2));\n },\n );\n\n server.tool(\n \"set_secret\",\n \"[secrets] Store a secret with optional quantum metadata: TTL (decay), environment state (superposition), description, tags.\",\n {\n key: z.string().describe(\"The secret key name\"),\n value: z.string().describe(\"The secret value\"),\n scope: scope.default(\"global\"),\n projectPath,\n env: z\n .string()\n .optional()\n .describe(\n \"If provided, sets the value for this specific environment (superposition)\",\n ),\n ttlSeconds: z\n .number()\n .optional()\n .describe(\"Time-to-live in seconds (quantum decay)\"),\n description: z.string().optional().describe(\"Human-readable description\"),\n tags: z.array(z.string()).optional().describe(\"Tags for organization\"),\n rotationFormat: z\n .enum([\n \"hex\",\n \"base64\",\n \"alphanumeric\",\n \"uuid\",\n \"api-key\",\n \"token\",\n \"password\",\n ])\n .optional()\n .describe(\"Format for auto-rotation when this secret expires\"),\n rotationPrefix: z\n .string()\n .optional()\n .describe(\"Prefix for auto-rotation (e.g. 'sk-')\"),\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"set_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const o = opts(params);\n\n if (params.env) {\n const existing = getEnvelope(params.key, o);\n const states = existing?.envelope?.states ?? {};\n states[params.env] = params.value;\n\n if (existing?.envelope?.value && !states[\"default\"]) {\n states[\"default\"] = existing.envelope.value;\n }\n\n setSecret(params.key, \"\", {\n ...o,\n states,\n defaultEnv: existing?.envelope?.defaultEnv ?? params.env,\n ttlSeconds: params.ttlSeconds,\n description: params.description,\n tags: params.tags,\n rotationFormat: params.rotationFormat,\n rotationPrefix: params.rotationPrefix,\n });\n\n return text(\n `[${params.scope ?? \"global\"}] ${params.key} set for env:${params.env}`,\n );\n }\n\n setSecret(params.key, params.value, {\n ...o,\n ttlSeconds: params.ttlSeconds,\n description: params.description,\n tags: params.tags,\n rotationFormat: params.rotationFormat,\n rotationPrefix: params.rotationPrefix,\n });\n\n return text(`[${params.scope ?? \"global\"}] ${params.key} saved`);\n },\n );\n\n server.tool(\n \"delete_secret\",\n \"[secrets] Remove a secret from the keyring.\",\n {\n key: z.string().describe(\"The secret key name\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"delete_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const deleted = deleteSecret(params.key, opts(params));\n return text(\n deleted ? `Deleted \"${params.key}\"` : `Secret \"${params.key}\" not found`,\n !deleted,\n );\n },\n );\n\n server.tool(\n \"has_secret\",\n \"[secrets] Check if a secret exists. Returns boolean. Never reveals the value. Respects decay — expired secrets return false.\",\n {\n key: z.string().describe(\"The secret key name\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"has_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n return text(hasSecret(params.key, opts(params)) ? \"true\" : \"false\");\n },\n );\n\n server.tool(\n \"export_secrets\",\n \"[secrets] Export secrets as .env or JSON format. Collapses superposition. Supports filtering by specific keys or tags.\",\n {\n format: z\n .enum([\"env\", \"json\"])\n .optional()\n .default(\"env\")\n .describe(\"Output format\"),\n keys: z\n .array(z.string())\n .optional()\n .describe(\"Only export these specific key names\"),\n tags: z\n .array(z.string())\n .optional()\n .describe(\"Only export secrets with any of these tags\"),\n scope,\n projectPath,\n env,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"export_secrets\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const output = exportSecrets({\n ...opts(params),\n format: params.format as \"env\" | \"json\",\n keys: params.keys,\n tags: params.tags,\n });\n\n if (!output.trim()) return text(\"No secrets matched the filters\", true);\n return text(output);\n },\n );\n\n server.tool(\n \"import_dotenv\",\n \"[secrets] Import secrets from .env file content. Parses standard dotenv syntax (comments, quotes, multiline escapes) and stores each key/value pair in q-ring.\",\n {\n content: z.string().describe(\"The .env file content to parse and import\"),\n scope: scope.default(\"global\"),\n projectPath,\n skipExisting: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Skip keys that already exist in q-ring\"),\n dryRun: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Preview what would be imported without saving\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"import_dotenv\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const result = importDotenv(params.content, {\n scope: params.scope as \"global\" | \"project\",\n projectPath: params.projectPath ?? process.cwd(),\n source: \"mcp\",\n skipExisting: params.skipExisting,\n dryRun: params.dryRun,\n });\n\n const lines = [\n params.dryRun\n ? \"Dry run — no changes made\"\n : `Imported ${result.imported.length} secret(s)`,\n ];\n\n if (result.imported.length > 0) {\n lines.push(`Keys: ${result.imported.join(\", \")}`);\n }\n if (result.skipped.length > 0) {\n lines.push(`Skipped (existing): ${result.skipped.join(\", \")}`);\n }\n\n return text(lines.join(\"\\n\"));\n },\n );\n\n server.tool(\n \"inspect_secret\",\n \"[secrets] Show full quantum state of a secret: superposition states, decay status, entanglement links, access history. Never reveals the actual value.\",\n {\n key: z.string().describe(\"The secret key name\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"inspect_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const result = getEnvelope(params.key, opts(params));\n if (!result) return text(`Secret \"${params.key}\" not found`, true);\n\n const { envelope, scope: entryScope } = result;\n const decay = checkDecay(envelope);\n\n const info: Record<string, unknown> = {\n key: params.key,\n scope: entryScope,\n type: envelope.states ? \"superposition\" : \"collapsed\",\n created: envelope.meta.createdAt,\n updated: envelope.meta.updatedAt,\n accessCount: envelope.meta.accessCount,\n lastAccessed: envelope.meta.lastAccessedAt ?? \"never\",\n };\n\n if (envelope.states) {\n info.environments = Object.keys(envelope.states);\n info.defaultEnv = envelope.defaultEnv;\n }\n\n if (decay.timeRemaining) {\n info.decay = {\n expired: decay.isExpired,\n stale: decay.isStale,\n lifetimePercent: decay.lifetimePercent,\n timeRemaining: decay.timeRemaining,\n };\n }\n\n if (envelope.meta.entangled?.length) {\n info.entangled = envelope.meta.entangled;\n }\n\n if (envelope.meta.description)\n info.description = envelope.meta.description;\n if (envelope.meta.tags?.length) info.tags = envelope.meta.tags;\n\n return text(JSON.stringify(info, null, 2));\n },\n );\n\n server.tool(\n \"generate_secret\",\n \"[secrets] Generate a cryptographic secret (quantum noise). Formats: hex, base64, alphanumeric, uuid, api-key, token, password. Optionally save directly to the keyring.\",\n {\n format: z\n .enum([\n \"hex\",\n \"base64\",\n \"alphanumeric\",\n \"uuid\",\n \"api-key\",\n \"token\",\n \"password\",\n ])\n .optional()\n .default(\"api-key\")\n .describe(\"Output format\"),\n length: z.number().optional().describe(\"Length in bytes or characters\"),\n prefix: z.string().optional().describe(\"Prefix for api-key/token format\"),\n saveAs: z\n .string()\n .optional()\n .describe(\"If provided, save the generated secret with this key name\"),\n scope: scope.default(\"global\"),\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"generate_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const secret = generateSecret({\n format: params.format as NoiseFormat,\n length: params.length,\n prefix: params.prefix,\n });\n\n if (params.saveAs) {\n setSecret(params.saveAs, secret, {\n ...opts(params),\n description: `Generated ${params.format} secret`,\n });\n const entropy = estimateEntropy(secret);\n return text(\n `Generated and saved as \"${params.saveAs}\" (${params.format}, ~${entropy} bits entropy)`,\n );\n }\n\n return text(JSON.stringify({ ok: true, data: { value: secret } }, null, 2));\n },\n );\n\n server.tool(\n \"entangle_secrets\",\n \"[secrets] Create a quantum entanglement between two secrets. When the source is rotated/updated, the target automatically receives the same value.\",\n {\n sourceKey: z.string().describe(\"Source secret key\"),\n targetKey: z.string().describe(\"Target secret key\"),\n sourceScope: scope.default(\"global\"),\n targetScope: scope.default(\"global\"),\n sourceProjectPath: z.string().optional(),\n targetProjectPath: z.string().optional(),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\n \"entangle_secrets\",\n params.sourceProjectPath,\n );\n if (toolBlock) return toolBlock;\n\n entangleSecrets(\n params.sourceKey,\n {\n scope: params.sourceScope as Scope,\n projectPath: params.sourceProjectPath ?? process.cwd(),\n source: \"mcp\",\n },\n params.targetKey,\n {\n scope: params.targetScope as Scope,\n projectPath: params.targetProjectPath ?? process.cwd(),\n source: \"mcp\",\n },\n );\n\n return text(`Entangled: ${params.sourceKey} <-> ${params.targetKey}`);\n },\n );\n\n server.tool(\n \"disentangle_secrets\",\n \"[secrets] Remove a quantum entanglement between two secrets. They will no longer synchronize on rotation.\",\n {\n sourceKey: z.string().describe(\"Source secret key\"),\n targetKey: z.string().describe(\"Target secret key\"),\n sourceScope: scope.default(\"global\"),\n targetScope: scope.default(\"global\"),\n sourceProjectPath: z.string().optional(),\n targetProjectPath: z.string().optional(),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\n \"disentangle_secrets\",\n params.sourceProjectPath,\n );\n if (toolBlock) return toolBlock;\n\n disentangleSecrets(\n params.sourceKey,\n {\n scope: params.sourceScope as Scope,\n projectPath: params.sourceProjectPath ?? process.cwd(),\n source: \"mcp\",\n },\n params.targetKey,\n {\n scope: params.targetScope as Scope,\n projectPath: params.targetProjectPath ?? process.cwd(),\n source: \"mcp\",\n },\n );\n\n return text(`Disentangled: ${params.sourceKey} </> ${params.targetKey}`);\n },\n );\n}\n","import type { SecretEntry } from \"../core/keyring.js\";\n\n/**\n * Turn a user glob (`*`, `?`) into a case-insensitive RegExp source.\n * Other regex metacharacters are escaped.\n */\nfunction globKeyPatternToRegexSource(pattern: string): string {\n let out = \"\";\n for (const c of pattern) {\n if (c === \"*\") out += \".*\";\n else if (c === \"?\") out += \".\";\n else if (\"\\\\^$+{}()|[]\".includes(c)) out += \"\\\\\" + c;\n else if (c === \".\") out += \"\\\\.\";\n else out += c;\n }\n return out;\n}\n\n/**\n * Key name glob: `*` → `.*`, `?` → `.`, other regex metacharacters escaped (CLI + MCP aligned).\n */\nexport function filterSecretsByKeyGlob(\n entries: SecretEntry[],\n filter?: string,\n): SecretEntry[] {\n if (!filter?.trim()) return entries;\n const regex = new RegExp(\"^\" + globKeyPatternToRegexSource(filter) + \"$\", \"i\");\n return entries.filter((e) => regex.test(e.key));\n}\n","/**\n * Quantum Noise: cryptographic secret generation.\n * Generates high-entropy values in common formats.\n */\n\nimport { randomBytes, randomInt } from \"node:crypto\";\n\nexport type NoiseFormat =\n | \"hex\"\n | \"base64\"\n | \"alphanumeric\"\n | \"uuid\"\n | \"api-key\"\n | \"token\"\n | \"password\";\n\nexport interface NoiseOptions {\n format?: NoiseFormat;\n /** Length in bytes (for hex/base64) or characters (for alphanumeric/password) */\n length?: number;\n /** Prefix for api-key format (e.g., \"sk-\", \"pk-\") */\n prefix?: string;\n}\n\nconst ALPHA_NUM =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst PASSWORD_CHARS =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+[]{}|;:,.<>?\";\n\nfunction randomString(charset: string, length: number): string {\n let result = \"\";\n for (let i = 0; i < length; i++) {\n result += charset[randomInt(charset.length)];\n }\n return result;\n}\n\nexport function generateSecret(opts: NoiseOptions = {}): string {\n const format = opts.format ?? \"api-key\";\n\n switch (format) {\n case \"hex\": {\n const len = opts.length ?? 32;\n return randomBytes(len).toString(\"hex\");\n }\n\n case \"base64\": {\n const len = opts.length ?? 32;\n return randomBytes(len).toString(\"base64url\");\n }\n\n case \"alphanumeric\": {\n const len = opts.length ?? 32;\n return randomString(ALPHA_NUM, len);\n }\n\n case \"uuid\": {\n const bytes = randomBytes(16);\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 1\n const hex = bytes.toString(\"hex\");\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20, 32),\n ].join(\"-\");\n }\n\n case \"api-key\": {\n const prefix = opts.prefix ?? \"qr_\";\n const len = opts.length ?? 48;\n return prefix + randomString(ALPHA_NUM, len);\n }\n\n case \"token\": {\n const prefix = opts.prefix ?? \"\";\n const len = opts.length ?? 64;\n return prefix + randomBytes(len).toString(\"base64url\");\n }\n\n case \"password\": {\n const len = opts.length ?? 24;\n let pw = randomString(PASSWORD_CHARS, len);\n\n // Guarantee at least one of each class\n const hasUpper = /[A-Z]/.test(pw);\n const hasLower = /[a-z]/.test(pw);\n const hasDigit = /[0-9]/.test(pw);\n const hasSpecial = /[^A-Za-z0-9]/.test(pw);\n\n if (!hasUpper) pw = replaceAt(pw, randomInt(len), randomString(\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\", 1));\n if (!hasLower) pw = replaceAt(pw, randomInt(len), randomString(\"abcdefghijklmnopqrstuvwxyz\", 1));\n if (!hasDigit) pw = replaceAt(pw, randomInt(len), randomString(\"0123456789\", 1));\n if (!hasSpecial) pw = replaceAt(pw, randomInt(len), randomString(\"!@#$%^&*()-_=+\", 1));\n\n return pw;\n }\n\n default:\n return randomBytes(32).toString(\"hex\");\n }\n}\n\nfunction replaceAt(str: string, index: number, char: string): string {\n return str.slice(0, index) + char + str.slice(index + 1);\n}\n\n/**\n * Estimate the entropy of a secret in bits.\n */\nexport function estimateEntropy(secret: string): number {\n const charsets = [\n { regex: /[a-z]/, size: 26 },\n { regex: /[A-Z]/, size: 26 },\n { regex: /[0-9]/, size: 10 },\n { regex: /[^A-Za-z0-9]/, size: 32 },\n ];\n\n let poolSize = 0;\n for (const { regex, size } of charsets) {\n if (regex.test(secret)) poolSize += size;\n }\n\n return poolSize > 0 ? Math.floor(Math.log2(poolSize) * secret.length) : 0;\n}\n","/**\n * Import module: parse .env files and bulk-store secrets into q-ring.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { setSecret, hasSecret, type SetSecretOptions } from \"./keyring.js\";\n\nexport interface ImportOptions {\n scope?: \"global\" | \"project\";\n projectPath?: string;\n env?: string;\n source?: \"cli\" | \"mcp\" | \"agent\" | \"api\";\n skipExisting?: boolean;\n dryRun?: boolean;\n}\n\nexport interface ImportResult {\n imported: string[];\n skipped: string[];\n total: number;\n}\n\n/**\n * Parse .env content into key-value pairs.\n * Handles comments, blank lines, quoted values, and basic multiline.\n */\nexport function parseDotenv(content: string): Map<string, string> {\n const result = new Map<string, string>();\n const lines = content.split(/\\r?\\n/);\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n\n if (!line || line.startsWith(\"#\")) continue;\n\n const eqIdx = line.indexOf(\"=\");\n if (eqIdx === -1) continue;\n\n const key = line.slice(0, eqIdx).trim();\n let value = line.slice(eqIdx + 1).trim();\n\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n const escapeMap: Record<string, string> = {\n n: \"\\n\", r: \"\\r\", t: \"\\t\", \"\\\\\": \"\\\\\", '\"': '\"',\n };\n value = value.replace(/\\\\([nrt\"\\\\])/g, (_, ch) => escapeMap[ch] ?? ch);\n\n if (value.includes(\"#\") && !line.includes('\"') && !line.includes(\"'\")) {\n value = value.split(\"#\")[0].trim();\n }\n\n if (key) result.set(key, value);\n }\n\n return result;\n}\n\n/**\n * Import secrets from a .env file path or raw content string.\n */\nexport function importDotenv(\n filePathOrContent: string,\n options: ImportOptions = {},\n): ImportResult {\n let content: string;\n\n try {\n content = readFileSync(filePathOrContent, \"utf8\");\n } catch {\n content = filePathOrContent;\n }\n\n const pairs = parseDotenv(content);\n const result: ImportResult = {\n imported: [],\n skipped: [],\n total: pairs.size,\n };\n\n for (const [key, value] of pairs) {\n if (options.skipExisting && hasSecret(key, {\n scope: options.scope,\n projectPath: options.projectPath,\n source: options.source ?? \"cli\",\n })) {\n result.skipped.push(key);\n continue;\n }\n\n if (options.dryRun) {\n result.imported.push(key);\n continue;\n }\n\n const setOpts: SetSecretOptions = {\n scope: options.scope ?? \"global\",\n projectPath: options.projectPath ?? process.cwd(),\n source: options.source ?? \"cli\",\n };\n\n setSecret(key, value, setOpts);\n result.imported.push(key);\n }\n\n return result;\n}\n","import { z } from \"zod\";\nimport type { KeyringOptions } from \"../../core/keyring.js\";\nimport type { Scope } from \"../../core/scope.js\";\nimport { checkToolPolicy } from \"../../core/policy.js\";\n\n/**\n * Standard MCP tool response shape for text content.\n * Set `isError: true` for failure responses so clients surface them appropriately.\n */\nexport function text(t: string, isError = false) {\n return {\n content: [{ type: \"text\" as const, text: t }],\n ...(isError ? { isError: true } : {}),\n };\n}\n\n/** Build `KeyringOptions` from MCP tool params with `source: \"mcp\"` baked in. */\nexport function opts(params: {\n scope?: string;\n projectPath?: string;\n env?: string;\n teamId?: string;\n orgId?: string;\n}): KeyringOptions {\n return {\n scope: params.scope as Scope | undefined,\n projectPath: params.projectPath ?? process.cwd(),\n teamId: params.teamId,\n orgId: params.orgId,\n env: params.env,\n source: \"mcp\",\n };\n}\n\n/**\n * Short-circuit guard: returns a \"Policy Denied\" text response if the tool\n * is blocked by project governance, else `null` to continue.\n */\nexport function enforceToolPolicy(toolName: string, projectPath?: string) {\n const decision = checkToolPolicy(toolName, projectPath);\n if (!decision.allowed) {\n return text(\n `Policy Denied: ${decision.reason} (source: ${decision.policySource})`,\n true,\n );\n }\n return null;\n}\n\n/** Reusable zod schemas for the common MCP tool parameters. */\nexport const commonSchemas = {\n teamId: z\n .string()\n .optional()\n .describe(\"Team identifier for team-scoped secrets\"),\n orgId: z\n .string()\n .optional()\n .describe(\"Org identifier for org-scoped secrets\"),\n scope: z\n .enum([\"global\", \"project\", \"team\", \"org\"])\n .optional()\n .describe(\"Scope: global, project, team, or org\"),\n projectPath: z\n .string()\n .optional()\n .describe(\"Project root path for project-scoped secrets\"),\n env: z\n .string()\n .optional()\n .describe(\"Environment for superposition collapse (e.g., dev, staging, prod)\"),\n} as const;\n","/**\n * Secret Liveness Validation: test if a secret is actually valid\n * with its target service using a pluggable provider system.\n */\n\nimport { httpRequest } from \"../utils/http-request.js\";\nimport { generateSecret, type NoiseFormat } from \"./noise.js\";\nimport { checkSSRF } from \"./ssrf.js\";\n\nexport interface ValidationResult {\n valid: boolean;\n status: \"valid\" | \"invalid\" | \"error\" | \"unknown\";\n message: string;\n latencyMs: number;\n provider: string;\n}\n\nexport interface Provider {\n name: string;\n description: string;\n /** Prefixes that auto-detect to this provider */\n prefixes?: string[];\n validate(value: string): Promise<ValidationResult>;\n}\n\nfunction makeRequest(\n url: string,\n headers: Record<string, string>,\n timeoutMs = 10000,\n): Promise<{ statusCode: number; body: string }> {\n return httpRequest({ url, method: \"GET\", headers, timeoutMs });\n}\n\nexport class ProviderRegistry {\n private providers = new Map<string, Provider>();\n\n register(provider: Provider): void {\n this.providers.set(provider.name, provider);\n }\n\n get(name: string): Provider | undefined {\n return this.providers.get(name);\n }\n\n detectProvider(\n value: string,\n hints?: { provider?: string; prefix?: string },\n ): Provider | undefined {\n if (hints?.provider) {\n return this.providers.get(hints.provider);\n }\n\n for (const provider of this.providers.values()) {\n if (provider.prefixes) {\n for (const pfx of provider.prefixes) {\n if (value.startsWith(pfx)) return provider;\n }\n }\n }\n\n return undefined;\n }\n\n listProviders(): Provider[] {\n return [...this.providers.values()];\n }\n}\n\n// ─── Built-in Providers ───\n\nconst openaiProvider: Provider = {\n name: \"openai\",\n description: \"OpenAI API key validation\",\n prefixes: [\"sk-\"],\n async validate(value: string): Promise<ValidationResult> {\n const start = Date.now();\n try {\n const { statusCode } = await makeRequest(\n \"https://api.openai.com/v1/models?limit=1\",\n {\n Authorization: `Bearer ${value}`,\n \"User-Agent\": \"q-ring-validator/1.0\",\n },\n );\n const latencyMs = Date.now() - start;\n\n if (statusCode === 200)\n return { valid: true, status: \"valid\", message: \"API key is valid\", latencyMs, provider: \"openai\" };\n if (statusCode === 401)\n return { valid: false, status: \"invalid\", message: \"Invalid or revoked API key\", latencyMs, provider: \"openai\" };\n if (statusCode === 429)\n return { valid: true, status: \"error\", message: \"Rate limited — key may be valid\", latencyMs, provider: \"openai\" };\n return { valid: false, status: \"error\", message: `Unexpected status ${statusCode}`, latencyMs, provider: \"openai\" };\n } catch (err) {\n return { valid: false, status: \"error\", message: `${err instanceof Error ? err.message : \"Network error\"}`, latencyMs: Date.now() - start, provider: \"openai\" };\n }\n },\n};\n\nconst stripeProvider: Provider = {\n name: \"stripe\",\n description: \"Stripe API key validation\",\n prefixes: [\"sk_live_\", \"sk_test_\", \"rk_live_\", \"rk_test_\", \"pk_live_\", \"pk_test_\"],\n async validate(value: string): Promise<ValidationResult> {\n const start = Date.now();\n try {\n const { statusCode } = await makeRequest(\n \"https://api.stripe.com/v1/balance\",\n {\n Authorization: `Bearer ${value}`,\n \"User-Agent\": \"q-ring-validator/1.0\",\n },\n );\n const latencyMs = Date.now() - start;\n\n if (statusCode === 200)\n return { valid: true, status: \"valid\", message: \"API key is valid\", latencyMs, provider: \"stripe\" };\n if (statusCode === 401)\n return { valid: false, status: \"invalid\", message: \"Invalid or revoked API key\", latencyMs, provider: \"stripe\" };\n if (statusCode === 429)\n return { valid: true, status: \"error\", message: \"Rate limited — key may be valid\", latencyMs, provider: \"stripe\" };\n return { valid: false, status: \"error\", message: `Unexpected status ${statusCode}`, latencyMs, provider: \"stripe\" };\n } catch (err) {\n return { valid: false, status: \"error\", message: `${err instanceof Error ? err.message : \"Network error\"}`, latencyMs: Date.now() - start, provider: \"stripe\" };\n }\n },\n};\n\nconst githubProvider: Provider = {\n name: \"github\",\n description: \"GitHub token validation\",\n prefixes: [\"ghp_\", \"gho_\", \"ghu_\", \"ghs_\", \"ghr_\", \"github_pat_\"],\n async validate(value: string): Promise<ValidationResult> {\n const start = Date.now();\n try {\n const { statusCode } = await makeRequest(\n \"https://api.github.com/user\",\n {\n Authorization: `token ${value}`,\n \"User-Agent\": \"q-ring-validator/1.0\",\n Accept: \"application/vnd.github+json\",\n },\n );\n const latencyMs = Date.now() - start;\n\n if (statusCode === 200)\n return { valid: true, status: \"valid\", message: \"Token is valid\", latencyMs, provider: \"github\" };\n if (statusCode === 401)\n return { valid: false, status: \"invalid\", message: \"Invalid or expired token\", latencyMs, provider: \"github\" };\n if (statusCode === 403)\n return { valid: false, status: \"invalid\", message: \"Token lacks required permissions\", latencyMs, provider: \"github\" };\n if (statusCode === 429)\n return { valid: true, status: \"error\", message: \"Rate limited — token may be valid\", latencyMs, provider: \"github\" };\n return { valid: false, status: \"error\", message: `Unexpected status ${statusCode}`, latencyMs, provider: \"github\" };\n } catch (err) {\n return { valid: false, status: \"error\", message: `${err instanceof Error ? err.message : \"Network error\"}`, latencyMs: Date.now() - start, provider: \"github\" };\n }\n },\n};\n\nconst awsProvider: Provider = {\n name: \"aws\",\n description: \"AWS access key validation (checks key format only — full STS validation requires secret key + region)\",\n prefixes: [\"AKIA\", \"ASIA\"],\n async validate(value: string): Promise<ValidationResult> {\n const start = Date.now();\n const latencyMs = Date.now() - start;\n\n if (/^(AKIA|ASIA)[A-Z0-9]{16}$/.test(value)) {\n return { valid: true, status: \"unknown\", message: \"Valid AWS access key format (STS validation requires secret key)\", latencyMs, provider: \"aws\" };\n }\n return { valid: false, status: \"invalid\", message: \"Invalid AWS access key format\", latencyMs, provider: \"aws\" };\n },\n};\n\nconst httpProvider: Provider = {\n name: \"http\",\n description: \"Generic HTTP endpoint validation\",\n async validate(value: string, url?: string): Promise<ValidationResult> {\n const start = Date.now();\n\n if (!url) {\n return { valid: false, status: \"unknown\", message: \"No validation URL configured\", latencyMs: 0, provider: \"http\" };\n }\n\n const ssrfBlock = await checkSSRF(url);\n if (ssrfBlock) {\n return { valid: false, status: \"error\", message: `SSRF blocked: ${ssrfBlock}`, latencyMs: Date.now() - start, provider: \"http\" };\n }\n\n try {\n const { statusCode } = await makeRequest(url, {\n Authorization: `Bearer ${value}`,\n \"User-Agent\": \"q-ring-validator/1.0\",\n });\n const latencyMs = Date.now() - start;\n\n if (statusCode >= 200 && statusCode < 300)\n return { valid: true, status: \"valid\", message: `Endpoint returned ${statusCode}`, latencyMs, provider: \"http\" };\n if (statusCode === 401 || statusCode === 403)\n return { valid: false, status: \"invalid\", message: `Authentication failed (${statusCode})`, latencyMs, provider: \"http\" };\n return { valid: false, status: \"error\", message: `Unexpected status ${statusCode}`, latencyMs, provider: \"http\" };\n } catch (err) {\n return { valid: false, status: \"error\", message: `${err instanceof Error ? err.message : \"Network error\"}`, latencyMs: Date.now() - start, provider: \"http\" };\n }\n },\n};\n\nexport const registry = new ProviderRegistry();\nregistry.register(openaiProvider);\nregistry.register(stripeProvider);\nregistry.register(githubProvider);\nregistry.register(awsProvider);\nregistry.register(httpProvider);\n\n/**\n * Validate a secret value against its detected or specified provider.\n */\nexport async function validateSecret(\n value: string,\n opts?: { provider?: string; validationUrl?: string },\n): Promise<ValidationResult> {\n const provider = opts?.provider\n ? registry.get(opts.provider)\n : registry.detectProvider(value);\n\n if (!provider) {\n return {\n valid: false,\n status: \"unknown\",\n message: \"No provider detected — set a provider in the manifest or secret metadata\",\n latencyMs: 0,\n provider: \"none\",\n };\n }\n\n if (provider.name === \"http\" && opts?.validationUrl) {\n return (provider as any).validate(value, opts.validationUrl);\n }\n\n return provider.validate(value);\n}\n\n// ─── Rotation Support ───\n\nexport interface RotationResult {\n rotated: boolean;\n provider: string;\n message: string;\n newValue?: string;\n}\n\nexport interface RotatableProvider extends Provider {\n rotate?(currentValue: string): Promise<RotationResult>;\n supportsRotation: boolean;\n}\n\n/**\n * Attempt provider-native rotation of a secret.\n * Falls back to local generation if the provider does not support native rotation.\n */\nexport async function rotateWithProvider(\n value: string,\n providerName?: string,\n): Promise<RotationResult> {\n const provider = providerName\n ? registry.get(providerName)\n : registry.detectProvider(value);\n\n if (!provider) {\n return { rotated: false, provider: \"none\", message: \"No provider detected for rotation\" };\n }\n\n const rotatable = provider as RotatableProvider;\n if (rotatable.supportsRotation && rotatable.rotate) {\n return rotatable.rotate(value);\n }\n\n // Fall back to local generation\n const format: NoiseFormat = \"api-key\";\n const newValue = generateSecret({ format, length: 48 });\n return {\n rotated: true,\n provider: provider.name,\n message: `Provider \"${provider.name}\" does not support native rotation — generated new value locally`,\n newValue,\n };\n}\n\n// ─── CI Scan ───\n\nexport interface CiScanResult {\n key: string;\n validation: ValidationResult;\n requiresRotation: boolean;\n}\n\n/**\n * CI-oriented batch validation: validates all secrets and returns\n * a structured report suitable for CI pipeline gating.\n */\nexport async function ciValidateBatch(\n secrets: { key: string; value: string; provider?: string; validationUrl?: string }[],\n): Promise<{ results: CiScanResult[]; allValid: boolean; failCount: number }> {\n const results: CiScanResult[] = [];\n\n for (const s of secrets) {\n const validation = await validateSecret(s.value, {\n provider: s.provider,\n validationUrl: s.validationUrl,\n });\n\n results.push({\n key: s.key,\n validation,\n requiresRotation: validation.status === \"invalid\",\n });\n }\n\n const failCount = results.filter((r) => !r.validation.valid).length;\n\n return { results, allValid: failCount === 0, failCount };\n}\n","/**\n * Self-Documenting Project Context for AI Agents\n *\n * Provides a safe, redacted view of the project's secrets, configuration,\n * and state without ever exposing actual secret values.\n */\n\nimport { listSecrets } from \"./keyring.js\";\nimport { collapseEnvironment, readProjectConfig } from \"./collapse.js\";\nimport { queryAudit } from \"./observer.js\";\nimport { listHooks } from \"./hooks.js\";\nimport { registry as providerRegistry } from \"./validate.js\";\nimport { registry as jitRegistry } from \"./provision.js\";\nimport type { KeyringOptions } from \"./keyring.js\";\n\nexport interface SecretSummary {\n key: string;\n scope: string;\n tags?: string[];\n description?: string;\n provider?: string;\n requiresApproval?: boolean;\n jitProvider?: string;\n hasStates: boolean;\n isExpired: boolean;\n isStale: boolean;\n timeRemaining: string | null;\n accessCount: number;\n lastAccessed: string | null;\n rotationFormat?: string;\n}\n\nexport interface ProjectContext {\n projectPath: string;\n environment: {\n env: string;\n source: string;\n } | null;\n secrets: SecretSummary[];\n totalSecrets: number;\n expiredCount: number;\n staleCount: number;\n protectedCount: number;\n manifest: {\n declared: number;\n missing: string[];\n } | null;\n validationProviders: string[];\n jitProviders: string[];\n hooksCount: number;\n recentActions: Array<{\n action: string;\n key?: string;\n source: string;\n timestamp: string;\n }>;\n}\n\nexport function getProjectContext(opts: KeyringOptions = {}): ProjectContext {\n const projectPath = opts.projectPath ?? process.cwd();\n const envResult = collapseEnvironment({ projectPath });\n\n const secretsList = listSecrets({\n ...opts,\n projectPath,\n silent: true,\n });\n\n let expiredCount = 0;\n let staleCount = 0;\n let protectedCount = 0;\n\n const secrets: SecretSummary[] = secretsList.map((entry) => {\n const meta = entry.envelope?.meta;\n const decay = entry.decay;\n\n if (decay?.isExpired) expiredCount++;\n if (decay?.isStale) staleCount++;\n if (meta?.requiresApproval) protectedCount++;\n\n return {\n key: entry.key,\n scope: entry.scope,\n tags: meta?.tags,\n description: meta?.description,\n provider: meta?.provider,\n requiresApproval: meta?.requiresApproval,\n jitProvider: meta?.jitProvider,\n hasStates: !!(entry.envelope?.states && Object.keys(entry.envelope.states).length > 0),\n isExpired: decay?.isExpired ?? false,\n isStale: decay?.isStale ?? false,\n timeRemaining: decay?.timeRemaining ?? null,\n accessCount: meta?.accessCount ?? 0,\n lastAccessed: meta?.lastAccessedAt ?? null,\n rotationFormat: meta?.rotationFormat,\n };\n });\n\n // Manifest analysis\n let manifest: ProjectContext[\"manifest\"] = null;\n const config = readProjectConfig(projectPath);\n if (config?.secrets) {\n const declaredKeys = Object.keys(config.secrets);\n const existingKeys = new Set(secrets.map((s) => s.key));\n const missing = declaredKeys.filter((k) => !existingKeys.has(k));\n manifest = { declared: declaredKeys.length, missing };\n }\n\n // Recent audit activity (last 20 events, redacted)\n const recentEvents = queryAudit({ limit: 20 });\n const recentActions = recentEvents.map((e) => ({\n action: e.action,\n key: e.key,\n source: e.source,\n timestamp: e.timestamp,\n }));\n\n return {\n projectPath,\n environment: envResult\n ? { env: envResult.env, source: envResult.source }\n : null,\n secrets,\n totalSecrets: secrets.length,\n expiredCount,\n staleCount,\n protectedCount,\n manifest,\n validationProviders: providerRegistry.listProviders().map((p) => p.name),\n jitProviders: jitRegistry.listProviders().map((p) => p.name),\n hooksCount: listHooks().length,\n recentActions,\n };\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getSecret, getEnvelope } from \"../../core/keyring.js\";\nimport { checkDecay } from \"../../core/envelope.js\";\nimport { collapseEnvironment, readProjectConfig } from \"../../core/collapse.js\";\nimport { getProjectContext } from \"../../core/context.js\";\nimport { text, opts, enforceToolPolicy, commonSchemas } from \"./_shared.js\";\n\nconst { teamId, orgId, scope, projectPath, env } = commonSchemas;\n\nexport function registerProjectTools(server: McpServer): void {\n server.tool(\n \"check_project\",\n \"[project] Validate project secrets against the .q-ring.json manifest. Returns which required secrets are present, missing, expired, or stale. Use this to verify project readiness.\",\n {\n projectPath,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"check_project\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const pp = params.projectPath ?? process.cwd();\n const config = readProjectConfig(pp);\n\n if (!config?.secrets || Object.keys(config.secrets).length === 0) {\n return text(\"No secrets manifest found in .q-ring.json\", true);\n }\n\n const results: Record<string, unknown>[] = [];\n let presentCount = 0;\n let missingCount = 0;\n let expiredCount = 0;\n let staleCount = 0;\n\n for (const [key, manifest] of Object.entries(config.secrets)) {\n const result = getEnvelope(key, { projectPath: pp, source: \"mcp\" });\n\n if (!result) {\n const status = manifest.required !== false ? \"missing\" : \"optional_missing\";\n if (manifest.required !== false) missingCount++;\n results.push({\n key,\n status,\n required: manifest.required !== false,\n description: manifest.description,\n });\n continue;\n }\n\n const decay = checkDecay(result.envelope);\n\n if (decay.isExpired) {\n expiredCount++;\n results.push({\n key,\n status: \"expired\",\n timeRemaining: decay.timeRemaining,\n description: manifest.description,\n });\n } else if (decay.isStale) {\n staleCount++;\n results.push({\n key,\n status: \"stale\",\n lifetimePercent: decay.lifetimePercent,\n timeRemaining: decay.timeRemaining,\n description: manifest.description,\n });\n } else {\n presentCount++;\n results.push({ key, status: \"ok\", description: manifest.description });\n }\n }\n\n const summary = {\n total: Object.keys(config.secrets).length,\n present: presentCount,\n missing: missingCount,\n expired: expiredCount,\n stale: staleCount,\n ready: missingCount === 0 && expiredCount === 0,\n secrets: results,\n };\n\n return text(JSON.stringify(summary, null, 2));\n },\n );\n\n server.tool(\n \"env_generate\",\n \"[project] Generate .env file content from the project manifest (.q-ring.json). Resolves each declared secret from q-ring, collapses superposition, and returns .env formatted output. Warns about missing or expired secrets.\",\n {\n projectPath,\n env,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"env_generate\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const pp = params.projectPath ?? process.cwd();\n const config = readProjectConfig(pp);\n\n if (!config?.secrets || Object.keys(config.secrets).length === 0) {\n return text(\"No secrets manifest found in .q-ring.json\", true);\n }\n\n const lines: string[] = [];\n const warnings: string[] = [];\n\n for (const [key, manifest] of Object.entries(config.secrets)) {\n const value = getSecret(key, {\n projectPath: pp,\n env: params.env,\n source: \"mcp\",\n });\n\n if (value === null) {\n if (manifest.required !== false) {\n warnings.push(`MISSING (required): ${key}`);\n }\n lines.push(`# ${key}=`);\n continue;\n }\n\n const result = getEnvelope(key, { projectPath: pp, source: \"mcp\" });\n if (result) {\n const decay = checkDecay(result.envelope);\n if (decay.isExpired) warnings.push(`EXPIRED: ${key}`);\n else if (decay.isStale) warnings.push(`STALE: ${key}`);\n }\n\n const escaped = value\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\");\n lines.push(`${key}=\"${escaped}\"`);\n }\n\n const output = lines.join(\"\\n\");\n const result =\n warnings.length > 0\n ? `${output}\\n\\n# Warnings:\\n${warnings.map((w) => `# ${w}`).join(\"\\n\")}`\n : output;\n\n return text(result);\n },\n );\n\n server.tool(\n \"detect_environment\",\n \"[project] Detect the current environment context (wavefunction collapse). Returns the detected environment and its source (NODE_ENV, git branch, project config, etc.).\",\n {\n projectPath,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\n \"detect_environment\",\n params.projectPath,\n );\n if (toolBlock) return toolBlock;\n\n const result = collapseEnvironment({\n projectPath: params.projectPath ?? process.cwd(),\n });\n\n if (!result) {\n return text(\n \"No environment detected. Set QRING_ENV, NODE_ENV, or create .q-ring.json\",\n );\n }\n\n return text(JSON.stringify(result, null, 2));\n },\n );\n\n server.tool(\n \"get_project_context\",\n \"[agent] Get a safe, redacted overview of the project's secrets, environment, manifest, providers, hooks, and recent audit activity. No secret values are ever exposed. Use this to understand what secrets exist before asking to read them.\",\n {\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\n \"get_project_context\",\n params.projectPath,\n );\n if (toolBlock) return toolBlock;\n\n const context = getProjectContext(opts(params));\n return text(JSON.stringify(context, null, 2));\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n tunnelCreate,\n tunnelRead,\n tunnelDestroy,\n tunnelList,\n} from \"../../core/tunnel.js\";\nimport { text, enforceToolPolicy } from \"./_shared.js\";\n\nexport function registerTunnelTools(server: McpServer): void {\n server.tool(\n \"tunnel_create\",\n \"[tunnel] Create an ephemeral secret that exists only in memory (quantum tunneling). Never persisted to disk. Optional TTL and max-reads for self-destruction.\",\n {\n value: z.string().describe(\"The secret value\"),\n ttlSeconds: z.number().optional().describe(\"Auto-expire after N seconds\"),\n maxReads: z.number().optional().describe(\"Self-destruct after N reads\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"tunnel_create\");\n if (toolBlock) return toolBlock;\n\n const id = tunnelCreate(params.value, {\n ttlSeconds: params.ttlSeconds,\n maxReads: params.maxReads,\n });\n return text(JSON.stringify({ ok: true, data: { id } }, null, 2));\n },\n );\n\n server.tool(\n \"tunnel_read\",\n \"[tunnel] Read an ephemeral tunneled secret by ID. May self-destruct if max-reads is reached.\",\n {\n id: z.string().describe(\"Tunnel ID\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"tunnel_read\");\n if (toolBlock) return toolBlock;\n\n const value = tunnelRead(params.id);\n if (value === null) {\n return text(`Tunnel \"${params.id}\" not found or expired`, true);\n }\n return text(\n JSON.stringify({ ok: true, data: { id: params.id, value } }, null, 2),\n );\n },\n );\n\n server.tool(\n \"tunnel_list\",\n \"[tunnel] List active tunneled secrets (IDs and metadata only, never values).\",\n {},\n async () => {\n const toolBlock = enforceToolPolicy(\"tunnel_list\");\n if (toolBlock) return toolBlock;\n\n const tunnels = tunnelList();\n if (tunnels.length === 0) return text(\"No active tunnels\");\n\n const lines = tunnels.map((t) => {\n const parts = [t.id];\n parts.push(`reads:${t.accessCount}`);\n if (t.maxReads) parts.push(`max:${t.maxReads}`);\n if (t.expiresAt) {\n const rem = Math.max(\n 0,\n Math.floor((t.expiresAt - Date.now()) / 1000),\n );\n parts.push(`expires:${rem}s`);\n }\n return parts.join(\" | \");\n });\n\n return text(lines.join(\"\\n\"));\n },\n );\n\n server.tool(\n \"tunnel_destroy\",\n \"[tunnel] Immediately destroy a tunneled secret.\",\n {\n id: z.string().describe(\"Tunnel ID\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"tunnel_destroy\");\n if (toolBlock) return toolBlock;\n\n const destroyed = tunnelDestroy(params.id);\n return text(\n destroyed ? `Destroyed ${params.id}` : `Tunnel \"${params.id}\" not found`,\n !destroyed,\n );\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n getSecret,\n setSecret,\n listSecrets,\n} from \"../../core/keyring.js\";\nimport { teleportPack, teleportUnpack } from \"../../core/teleport.js\";\nimport { text, opts, enforceToolPolicy, commonSchemas } from \"./_shared.js\";\n\nconst { teamId, orgId, scope, projectPath } = commonSchemas;\n\nexport function registerTeleportTools(server: McpServer): void {\n server.tool(\n \"teleport_pack\",\n \"[teleport] Pack secrets into an AES-256-GCM encrypted bundle for sharing between machines (quantum teleportation).\",\n {\n keys: z\n .array(z.string())\n .optional()\n .describe(\"Specific keys to pack (all if omitted)\"),\n passphrase: z.string().describe(\"Encryption passphrase\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"teleport_pack\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const o = opts(params);\n const entries = listSecrets(o);\n\n const secrets: { key: string; value: string; scope?: string }[] = [];\n for (const entry of entries) {\n if (params.keys && !params.keys.includes(entry.key)) continue;\n const value = getSecret(entry.key, { ...o, scope: entry.scope });\n if (value !== null) {\n secrets.push({ key: entry.key, value, scope: entry.scope });\n }\n }\n\n if (secrets.length === 0) return text(\"No secrets to pack\", true);\n\n const bundle = teleportPack(secrets, params.passphrase);\n return text(bundle);\n },\n );\n\n server.tool(\n \"teleport_unpack\",\n \"[teleport] Decrypt and import secrets from a teleport bundle.\",\n {\n bundle: z.string().describe(\"Base64-encoded encrypted bundle\"),\n passphrase: z.string().describe(\"Decryption passphrase\"),\n scope: scope.default(\"global\"),\n projectPath,\n teamId,\n orgId,\n dryRun: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Preview without importing\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"teleport_unpack\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n try {\n const payload = teleportUnpack(params.bundle, params.passphrase);\n\n if (params.dryRun) {\n const preview = payload.secrets\n .map((s) => `${s.key} [${s.scope ?? \"global\"}]`)\n .join(\"\\n\");\n return text(\n `Would import ${payload.secrets.length} secrets:\\n${preview}`,\n );\n }\n\n const o = opts(params);\n for (const s of payload.secrets) {\n setSecret(s.key, s.value, o);\n }\n\n return text(\n `Imported ${payload.secrets.length} secret(s) from teleport bundle`,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return text(JSON.stringify({ ok: false, error: { message: msg } }), true);\n }\n },\n );\n}\n","/**\n * Quantum Teleportation: securely share/transfer secrets between machines.\n *\n * Generates encrypted bundles that can be shared via any channel.\n * The recipient decrypts with a shared passphrase (out-of-band exchange).\n * Uses AES-256-GCM with PBKDF2-derived keys.\n */\n\nimport {\n randomBytes,\n createCipheriv,\n createDecipheriv,\n pbkdf2Sync,\n} from \"node:crypto\";\nimport { z } from \"zod\";\n\nconst ALGORITHM = \"aes-256-gcm\";\nconst KEY_LENGTH = 32;\n/** NIST / OpenSSL recommendation for AES-GCM (96-bit nonce). */\nconst IV_LENGTH = 12;\nconst SALT_LENGTH = 32;\nconst PBKDF2_ITERATIONS = 100000;\n\nexport interface TeleportBundle {\n /** Format version */\n v: 1;\n /** Base64-encoded encrypted payload */\n data: string;\n /** Base64-encoded salt for key derivation */\n salt: string;\n /** Base64-encoded initialization vector */\n iv: string;\n /** Base64-encoded auth tag */\n tag: string;\n /** ISO timestamp of creation */\n createdAt: string;\n /** Number of secrets in the bundle */\n count: number;\n}\n\nexport interface TeleportPayload {\n secrets: { key: string; value: string; scope?: string }[];\n exportedAt: string;\n exportedBy?: string;\n}\n\nexport const TeleportBundleSchema = z.object({\n v: z.literal(1),\n data: z.string(),\n salt: z.string(),\n iv: z.string(),\n tag: z.string(),\n createdAt: z.string(),\n count: z.number(),\n});\n\nexport const TeleportPayloadSchema = z.object({\n secrets: z.array(\n z.object({\n key: z.string(),\n value: z.string(),\n scope: z.string().optional(),\n }),\n ),\n exportedAt: z.string(),\n exportedBy: z.string().optional(),\n});\n\nfunction deriveKey(passphrase: string, salt: Buffer): Buffer {\n return pbkdf2Sync(passphrase, salt, PBKDF2_ITERATIONS, KEY_LENGTH, \"sha512\");\n}\n\n/**\n * Pack secrets into an encrypted teleport bundle.\n */\nexport function teleportPack(\n secrets: { key: string; value: string; scope?: string }[],\n passphrase: string,\n): string {\n const payload: TeleportPayload = {\n secrets,\n exportedAt: new Date().toISOString(),\n };\n\n const plaintext = JSON.stringify(payload);\n const salt = randomBytes(SALT_LENGTH);\n const iv = randomBytes(IV_LENGTH);\n const key = deriveKey(passphrase, salt);\n\n const cipher = createCipheriv(ALGORITHM, key, iv);\n const encrypted = Buffer.concat([\n cipher.update(plaintext, \"utf8\"),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n\n const bundle: TeleportBundle = {\n v: 1,\n data: encrypted.toString(\"base64\"),\n salt: salt.toString(\"base64\"),\n iv: iv.toString(\"base64\"),\n tag: tag.toString(\"base64\"),\n createdAt: new Date().toISOString(),\n count: secrets.length,\n };\n\n return Buffer.from(JSON.stringify(bundle)).toString(\"base64\");\n}\n\n/**\n * Unpack and decrypt a teleport bundle.\n */\nexport function teleportUnpack(\n encoded: string,\n passphrase: string,\n): TeleportPayload {\n let bundleJson: string;\n try {\n bundleJson = Buffer.from(encoded, \"base64\").toString(\"utf8\");\n } catch {\n throw new Error(\"ERR_TELEPORT_CORRUPT: invalid base64 bundle\");\n }\n\n let rawBundle: unknown;\n try {\n rawBundle = JSON.parse(bundleJson);\n } catch {\n throw new Error(\"ERR_TELEPORT_CORRUPT: bundle is not valid JSON\");\n }\n\n const parsedBundle = TeleportBundleSchema.safeParse(rawBundle);\n if (!parsedBundle.success) {\n throw new Error(\n `ERR_TELEPORT_CORRUPT: invalid bundle shape (${parsedBundle.error.message})`,\n );\n }\n const bundle = parsedBundle.data;\n\n const salt = Buffer.from(bundle.salt, \"base64\");\n const iv = Buffer.from(bundle.iv, \"base64\");\n const tag = Buffer.from(bundle.tag, \"base64\");\n const encrypted = Buffer.from(bundle.data, \"base64\");\n const key = deriveKey(passphrase, salt);\n\n const decipher = createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(tag);\n\n let decrypted: Buffer;\n try {\n decrypted = Buffer.concat([\n decipher.update(encrypted),\n decipher.final(),\n ]);\n } catch {\n throw new Error(\"ERR_TELEPORT_BAD_PASSPHRASE: decryption failed (wrong passphrase or corrupt data)\");\n }\n\n let rawPayload: unknown;\n try {\n rawPayload = JSON.parse(decrypted.toString(\"utf8\"));\n } catch {\n throw new Error(\"ERR_TELEPORT_CORRUPT: decrypted payload is not valid JSON\");\n }\n\n const payload = TeleportPayloadSchema.safeParse(rawPayload);\n if (!payload.success) {\n throw new Error(\n `ERR_TELEPORT_CORRUPT: invalid payload (${payload.error.message})`,\n );\n }\n return payload.data;\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { listSecrets } from \"../../core/keyring.js\";\nimport {\n queryAudit,\n detectAnomalies,\n verifyAuditChain,\n exportAudit,\n} from \"../../core/observer.js\";\nimport { text, opts, enforceToolPolicy, commonSchemas } from \"./_shared.js\";\n\nconst { teamId, orgId, scope, projectPath } = commonSchemas;\n\nexport function registerAuditTools(server: McpServer): void {\n server.tool(\n \"audit_log\",\n \"[audit] Query the audit log for secret access history (observer effect). Shows who accessed what and when.\",\n {\n key: z.string().optional().describe(\"Filter by key\"),\n action: z\n .enum([\n \"read\",\n \"write\",\n \"delete\",\n \"list\",\n \"export\",\n \"generate\",\n \"entangle\",\n \"tunnel\",\n \"teleport\",\n \"collapse\",\n ])\n .optional()\n .describe(\"Filter by action\"),\n limit: z.number().optional().default(20).describe(\"Max events to return\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"audit_log\");\n if (toolBlock) return toolBlock;\n\n const events = queryAudit({\n key: params.key,\n action: params.action,\n limit: params.limit,\n });\n\n if (events.length === 0) return text(\"No audit events found\");\n\n const lines = events.map((e) => {\n const parts = [e.timestamp, e.action];\n if (e.key) parts.push(e.key);\n if (e.scope) parts.push(`[${e.scope}]`);\n if (e.env) parts.push(`env:${e.env}`);\n if (e.detail) parts.push(e.detail);\n return parts.join(\" | \");\n });\n\n return text(lines.join(\"\\n\"));\n },\n );\n\n server.tool(\n \"detect_anomalies\",\n \"[audit] Scan for anomalous secret access patterns: burst reads, unusual-hour access. Returns findings and recommendations.\",\n {\n key: z.string().optional().describe(\"Check anomalies for a specific key\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"detect_anomalies\");\n if (toolBlock) return toolBlock;\n\n const anomalies = detectAnomalies(params.key);\n if (anomalies.length === 0) return text(\"No anomalies detected\");\n\n const lines = anomalies.map((a) => `[${a.type}] ${a.description}`);\n return text(lines.join(\"\\n\"));\n },\n );\n\n server.tool(\n \"health_check\",\n \"[health] Run a comprehensive health check on all secrets: decay status, staleness, anomalies, entropy assessment.\",\n {\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"health_check\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const entries = listSecrets(opts(params));\n const anomalies = detectAnomalies();\n\n let healthy = 0;\n let stale = 0;\n let expired = 0;\n let noDecay = 0;\n const issues: string[] = [];\n\n for (const entry of entries) {\n if (!entry.decay?.timeRemaining) {\n noDecay++;\n continue;\n }\n if (entry.decay.isExpired) {\n expired++;\n issues.push(`EXPIRED: ${entry.key}`);\n } else if (entry.decay.isStale) {\n stale++;\n issues.push(\n `STALE: ${entry.key} (${entry.decay.lifetimePercent}%, ${entry.decay.timeRemaining} left)`,\n );\n } else {\n healthy++;\n }\n }\n\n const summary = [\n `Secrets: ${entries.length} total`,\n `Healthy: ${healthy} | Stale: ${stale} | Expired: ${expired} | No decay: ${noDecay}`,\n `Anomalies: ${anomalies.length}`,\n ];\n\n if (issues.length > 0) {\n summary.push(\"\", \"Issues:\", ...issues);\n }\n if (anomalies.length > 0) {\n summary.push(\n \"\",\n \"Anomalies:\",\n ...anomalies.map((a) => `[${a.type}] ${a.description}`),\n );\n }\n\n return text(summary.join(\"\\n\"));\n },\n );\n\n server.tool(\n \"verify_audit_chain\",\n \"[audit] Verify the tamper-evident hash chain of the audit log. Returns integrity status and the first break point if tampered.\",\n {},\n async () => {\n const toolBlock = enforceToolPolicy(\"verify_audit_chain\");\n if (toolBlock) return toolBlock;\n\n const result = verifyAuditChain();\n return text(JSON.stringify(result, null, 2));\n },\n );\n\n server.tool(\n \"export_audit\",\n \"[audit] Export audit events in a portable format (jsonl, json, or csv) with optional time range filtering.\",\n {\n since: z.string().optional().describe(\"Start date (ISO 8601)\"),\n until: z.string().optional().describe(\"End date (ISO 8601)\"),\n format: z\n .enum([\"jsonl\", \"json\", \"csv\"])\n .optional()\n .default(\"jsonl\")\n .describe(\"Output format\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"export_audit\");\n if (toolBlock) return toolBlock;\n\n const output = exportAudit({\n since: params.since,\n until: params.until,\n format: params.format,\n });\n return text(output);\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n getSecret,\n setSecret,\n getEnvelope,\n listSecrets,\n} from \"../../core/keyring.js\";\nimport type { Scope } from \"../../core/scope.js\";\nimport {\n validateSecret,\n rotateWithProvider,\n ciValidateBatch,\n registry as providerRegistry,\n} from \"../../core/validate.js\";\nimport { text, opts, enforceToolPolicy, commonSchemas } from \"./_shared.js\";\n\nconst { teamId, orgId, scope, projectPath } = commonSchemas;\n\nexport function registerValidationTools(server: McpServer): void {\n server.tool(\n \"validate_secret\",\n \"[validation] Test if a secret is actually valid with its target service (e.g., OpenAI, Stripe, GitHub). Uses provider auto-detection based on key prefixes, or accepts an explicit provider name. Never logs the secret value.\",\n {\n key: z.string().describe(\"The secret key name\"),\n provider: z\n .string()\n .optional()\n .describe(\"Force a specific provider (openai, stripe, github, aws, http)\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"validate_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const value = getSecret(params.key, opts(params));\n if (value === null) return text(`Secret \"${params.key}\" not found`, true);\n\n const envelope = getEnvelope(params.key, opts(params));\n const provHint = params.provider ?? envelope?.envelope.meta.provider;\n\n const result = await validateSecret(value, { provider: provHint });\n return text(JSON.stringify(result, null, 2));\n },\n );\n\n server.tool(\n \"list_providers\",\n \"[validation] List all available validation providers for secret liveness testing.\",\n {},\n async () => {\n const toolBlock = enforceToolPolicy(\"list_providers\");\n if (toolBlock) return toolBlock;\n\n const providers = providerRegistry.listProviders().map((p) => ({\n name: p.name,\n description: p.description,\n prefixes: p.prefixes ?? [],\n }));\n return text(JSON.stringify(providers, null, 2));\n },\n );\n\n server.tool(\n \"rotate_secret\",\n \"[validation] Attempt issuer-native rotation of a secret via its detected or specified provider. Returns rotation result.\",\n {\n key: z.string().describe(\"The secret key to rotate\"),\n provider: z.string().optional().describe(\"Force a specific provider\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"rotate_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const value = getSecret(params.key, opts(params));\n if (!value) return text(`Secret \"${params.key}\" not found`, true);\n\n const result = await rotateWithProvider(value, params.provider);\n if (result.rotated && result.newValue) {\n setSecret(params.key, result.newValue, {\n scope: (params.scope as Scope) ?? \"global\",\n projectPath: params.projectPath,\n source: \"mcp\",\n });\n }\n return text(JSON.stringify(result, null, 2));\n },\n );\n\n server.tool(\n \"ci_validate_secrets\",\n \"[validation] CI-oriented batch validation: validates all accessible secrets against their providers and returns a structured pass/fail report.\",\n {\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\n \"ci_validate_secrets\",\n params.projectPath,\n );\n if (toolBlock) return toolBlock;\n\n const entries = listSecrets(opts(params));\n const secrets = entries\n .map((e) => {\n const val = getSecret(e.key, {\n ...opts(params),\n scope: e.scope,\n silent: true,\n });\n if (!val) return null;\n return {\n key: e.key,\n value: val,\n provider: e.envelope?.meta.provider,\n validationUrl: e.envelope?.meta.validationUrl,\n };\n })\n .filter((s): s is NonNullable<typeof s> => s !== null);\n\n if (secrets.length === 0) return text(\"No secrets to validate\");\n\n const report = await ciValidateBatch(secrets);\n return text(JSON.stringify(report, null, 2));\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n registerHook,\n removeHook,\n listHooks as listAllHooks,\n type HookType,\n type HookAction,\n} from \"../../core/hooks.js\";\nimport { text, enforceToolPolicy } from \"./_shared.js\";\n\nexport function registerHookTools(server: McpServer): void {\n server.tool(\n \"register_hook\",\n \"[hooks] Register a webhook/callback that fires when a secret is updated, deleted, or rotated. Supports shell commands, HTTP webhooks, and process signals.\",\n {\n type: z.enum([\"shell\", \"http\", \"signal\"]).describe(\"Hook type\"),\n key: z.string().optional().describe(\"Trigger on exact key match\"),\n keyPattern: z\n .string()\n .optional()\n .describe(\"Trigger on key glob pattern (e.g. DB_*)\"),\n tag: z.string().optional().describe(\"Trigger on secrets with this tag\"),\n scope: z\n .enum([\"global\", \"project\"])\n .optional()\n .describe(\"Trigger only for this scope\"),\n actions: z\n .array(z.enum([\"write\", \"delete\", \"rotate\"]))\n .optional()\n .default([\"write\", \"delete\", \"rotate\"])\n .describe(\"Which actions trigger this hook\"),\n command: z\n .string()\n .optional()\n .describe(\"Shell command to execute (for shell type)\"),\n url: z.string().optional().describe(\"URL to POST to (for http type)\"),\n signalTarget: z\n .string()\n .optional()\n .describe(\"Process name or PID (for signal type)\"),\n signalName: z\n .string()\n .optional()\n .default(\"SIGHUP\")\n .describe(\"Signal to send (for signal type)\"),\n description: z.string().optional().describe(\"Human-readable description\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"register_hook\");\n if (toolBlock) return toolBlock;\n\n if (!params.key && !params.keyPattern && !params.tag) {\n return text(\n \"At least one match criterion required: key, keyPattern, or tag\",\n true,\n );\n }\n\n const entry = registerHook({\n type: params.type as HookType,\n match: {\n key: params.key,\n keyPattern: params.keyPattern,\n tag: params.tag,\n scope: params.scope as \"global\" | \"project\" | undefined,\n action: params.actions as HookAction[],\n },\n command: params.command,\n url: params.url,\n signal: params.signalTarget\n ? { target: params.signalTarget, signal: params.signalName }\n : undefined,\n description: params.description,\n enabled: true,\n });\n\n return text(JSON.stringify(entry, null, 2));\n },\n );\n\n server.tool(\n \"list_hooks\",\n \"[hooks] List all registered secret change hooks with their match criteria, type, and status.\",\n {},\n async () => {\n const toolBlock = enforceToolPolicy(\"list_hooks\");\n if (toolBlock) return toolBlock;\n\n const hooks = listAllHooks();\n if (hooks.length === 0) return text(\"No hooks registered\");\n return text(JSON.stringify(hooks, null, 2));\n },\n );\n\n server.tool(\n \"remove_hook\",\n \"[hooks] Remove a registered hook by ID.\",\n {\n id: z.string().describe(\"Hook ID to remove\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"remove_hook\");\n if (toolBlock) return toolBlock;\n\n const removed = removeHook(params.id);\n return text(\n removed ? `Removed hook ${params.id}` : `Hook \"${params.id}\" not found`,\n !removed,\n );\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { listSecrets } from \"../../core/keyring.js\";\nimport { runHealthScan } from \"../../core/agent.js\";\nimport { queryAudit } from \"../../core/observer.js\";\nimport { execCommand } from \"../../core/exec.js\";\nimport { scanCodebase } from \"../../core/scan.js\";\nimport { lintFiles } from \"../../core/linter.js\";\nimport { checkExecPolicy } from \"../../core/policy.js\";\nimport { text, opts, enforceToolPolicy, commonSchemas } from \"./_shared.js\";\n\nconst { teamId, orgId, scope, projectPath } = commonSchemas;\n\nexport function registerToolingTools(server: McpServer): void {\n server.tool(\n \"exec_with_secrets\",\n \"[exec] Run a shell command securely. Project secrets are injected into the environment, and any secret values in the output are automatically redacted to prevent leaking into transcripts.\",\n {\n command: z.string().describe(\"Command to run\"),\n args: z.array(z.string()).optional().describe(\"Command arguments\"),\n keys: z\n .array(z.string())\n .optional()\n .describe(\"Only inject these specific keys\"),\n tags: z\n .array(z.string())\n .optional()\n .describe(\"Only inject secrets with these tags\"),\n profile: z\n .enum([\"unrestricted\", \"restricted\", \"ci\"])\n .optional()\n .default(\"restricted\")\n .describe(\"Exec profile: unrestricted, restricted, or ci\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"exec_with_secrets\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const execBlock = checkExecPolicy(params.command, params.projectPath);\n if (!execBlock.allowed) {\n return text(`Policy Denied: ${execBlock.reason}`, true);\n }\n\n try {\n const result = await execCommand({\n command: params.command,\n args: params.args ?? [],\n keys: params.keys,\n tags: params.tags,\n profile: params.profile,\n scope: params.scope,\n projectPath: params.projectPath,\n source: \"mcp\",\n captureOutput: true,\n });\n\n const output: string[] = [];\n output.push(`Exit code: ${result.code}`);\n if (result.stdout) output.push(`STDOUT:\\n${result.stdout}`);\n if (result.stderr) output.push(`STDERR:\\n${result.stderr}`);\n\n return text(output.join(\"\\n\\n\"));\n } catch (err) {\n return text(\n `Execution failed: ${err instanceof Error ? err.message : String(err)}`,\n true,\n );\n }\n },\n );\n\n server.tool(\n \"scan_codebase_for_secrets\",\n \"[scan] Scan a directory for hardcoded secrets using regex heuristics and Shannon entropy analysis. Returns file paths, line numbers, and the matched key/value to help migrate legacy codebases into q-ring.\",\n {\n dirPath: z\n .string()\n .describe(\"Absolute or relative path to the directory to scan\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"scan_codebase_for_secrets\");\n if (toolBlock) return toolBlock;\n\n try {\n const results = scanCodebase(params.dirPath);\n if (results.length === 0) {\n return text(\"No hardcoded secrets found in the specified directory.\");\n }\n return text(JSON.stringify(results, null, 2));\n } catch (err) {\n return text(\n `Scan failed: ${err instanceof Error ? err.message : String(err)}`,\n true,\n );\n }\n },\n );\n\n server.tool(\n \"lint_files\",\n \"[scan] Scan specific files for hardcoded secrets. Optionally auto-fix by replacing them with process.env references and storing the values in q-ring.\",\n {\n files: z.array(z.string()).describe(\"File paths to lint\"),\n fix: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Auto-replace and store secrets\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"lint_files\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n try {\n const results = lintFiles(params.files, {\n fix: params.fix,\n scope: params.scope as \"global\" | \"project\" | undefined,\n projectPath: params.projectPath,\n });\n if (results.length === 0) {\n return text(\"No hardcoded secrets found in the specified files.\");\n }\n return text(JSON.stringify(results, null, 2));\n } catch (err) {\n return text(\n `Lint failed: ${err instanceof Error ? err.message : String(err)}`,\n true,\n );\n }\n },\n );\n\n server.tool(\n \"analyze_secrets\",\n \"[agent] Analyze secret usage patterns and provide optimization suggestions including most accessed, stale, unused, and rotation recommendations.\",\n {\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"analyze_secrets\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const o = opts(params);\n const entries = listSecrets({ ...o, silent: true });\n const audit = queryAudit({ limit: 500 });\n\n const accessMap = new Map<string, number>();\n for (const e of audit) {\n if (e.action === \"read\" && e.key) {\n accessMap.set(e.key, (accessMap.get(e.key) || 0) + 1);\n }\n }\n\n const analysis = {\n total: entries.length,\n expired: entries.filter((e) => e.decay?.isExpired).length,\n stale: entries.filter((e) => e.decay?.isStale && !e.decay?.isExpired)\n .length,\n neverAccessed: entries\n .filter((e) => (e.envelope?.meta.accessCount ?? 0) === 0)\n .map((e) => e.key),\n noRotationFormat: entries\n .filter((e) => !e.envelope?.meta.rotationFormat)\n .map((e) => e.key),\n mostAccessed: [...accessMap.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([key, count]) => ({ key, reads: count })),\n };\n\n return text(JSON.stringify(analysis, null, 2));\n },\n );\n\n // One process-scoped instance; reusing across tool invocations avoids\n // leaking listeners when the MCP client pings `status_dashboard` twice.\n let dashboardInstance: { port: number; close: () => void } | null = null;\n\n server.tool(\n \"status_dashboard\",\n \"[dashboard] Launch the quantum status dashboard — a local web page showing live health, decay timers, superposition states, entanglement graph, tunnels, audit log, and anomaly alerts. Returns the URL to open in a browser.\",\n {\n port: z.number().optional().default(9876).describe(\"Port to serve on\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"status_dashboard\");\n if (toolBlock) return toolBlock;\n\n if (dashboardInstance) {\n return text(\n `Dashboard already running at http://127.0.0.1:${dashboardInstance.port}`,\n );\n }\n\n const { startDashboardServer } = await import(\"../../core/dashboard.js\");\n dashboardInstance = startDashboardServer({ port: params.port });\n\n return text(\n `Dashboard started at http://127.0.0.1:${dashboardInstance.port}\\nOpen this URL in a browser to see live quantum status.`,\n );\n },\n );\n\n server.tool(\n \"agent_scan\",\n \"[agent] Run an autonomous agent health scan: checks decay, staleness, anomalies, and optionally auto-rotates expired secrets. Returns a structured report.\",\n {\n autoRotate: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Auto-rotate expired secrets with generated values\"),\n projectPaths: z\n .array(z.string())\n .optional()\n .describe(\"Project paths to monitor\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"agent_scan\");\n if (toolBlock) return toolBlock;\n\n const report = runHealthScan({\n autoRotate: params.autoRotate,\n projectPaths: params.projectPaths ?? [process.cwd()],\n });\n return text(JSON.stringify(report, null, 2));\n },\n );\n}\n","/**\n * Minimal ANSI color helpers. No dependencies.\n */\n\nconst enabled = process.stdout.isTTY !== false && !process.env.NO_COLOR;\n\nfunction wrap(code: string, text: string): string {\n return enabled ? `\\x1b[${code}m${text}\\x1b[0m` : text;\n}\n\nexport const c = {\n bold: (t: string) => wrap(\"1\", t),\n dim: (t: string) => wrap(\"2\", t),\n italic: (t: string) => wrap(\"3\", t),\n underline: (t: string) => wrap(\"4\", t),\n\n red: (t: string) => wrap(\"31\", t),\n green: (t: string) => wrap(\"32\", t),\n yellow: (t: string) => wrap(\"33\", t),\n blue: (t: string) => wrap(\"34\", t),\n magenta: (t: string) => wrap(\"35\", t),\n cyan: (t: string) => wrap(\"36\", t),\n white: (t: string) => wrap(\"37\", t),\n gray: (t: string) => wrap(\"90\", t),\n\n bgRed: (t: string) => wrap(\"41\", t),\n bgGreen: (t: string) => wrap(\"42\", t),\n bgYellow: (t: string) => wrap(\"43\", t),\n bgBlue: (t: string) => wrap(\"44\", t),\n bgMagenta: (t: string) => wrap(\"45\", t),\n bgCyan: (t: string) => wrap(\"46\", t),\n};\n\nexport function scopeColor(scope: string): string {\n return scope === \"project\" ? c.cyan(scope) : c.blue(scope);\n}\n\nexport function decayIndicator(percent: number, expired: boolean): string {\n if (expired) return c.bgRed(c.white(\" EXPIRED \"));\n if (percent >= 90) return c.red(`[decay ${percent}%]`);\n if (percent >= 75) return c.yellow(`[decay ${percent}%]`);\n if (percent > 0) return c.green(`[decay ${percent}%]`);\n return \"\";\n}\n\nexport function envBadge(env: string): string {\n switch (env) {\n case \"prod\":\n return c.bgRed(c.white(` ${env} `));\n case \"staging\":\n return c.bgYellow(c.white(` ${env} `));\n case \"dev\":\n return c.bgGreen(c.white(` ${env} `));\n case \"test\":\n return c.bgBlue(c.white(` ${env} `));\n default:\n return c.bgMagenta(c.white(` ${env} `));\n }\n}\n\nexport const SYMBOLS = {\n check: enabled ? \"\\u2713\" : \"[ok]\",\n cross: enabled ? \"\\u2717\" : \"[x]\",\n arrow: enabled ? \"\\u2192\" : \"->\",\n dot: enabled ? \"\\u2022\" : \"*\",\n lock: enabled ? \"\\u{1f512}\" : \"[locked]\",\n key: enabled ? \"\\u{1f511}\" : \"[key]\",\n link: enabled ? \"\\u{1f517}\" : \"[link]\",\n warning: enabled ? \"\\u26a0\\ufe0f\" : \"[!]\",\n clock: enabled ? \"\\u23f0\" : \"[time]\",\n shield: enabled ? \"\\u{1f6e1}\\ufe0f\" : \"[shield]\",\n zap: enabled ? \"\\u26a1\" : \"[zap]\",\n eye: enabled ? \"\\u{1f441}\\ufe0f\" : \"[eye]\",\n ghost: enabled ? \"\\u{1f47b}\" : \"[ghost]\",\n package: enabled ? \"\\u{1f4e6}\" : \"[pkg]\",\n sparkle: enabled ? \"\\u2728\" : \"[*]\",\n} as const;\n","/**\n * Quantum Agent: autonomous background monitor for secret health.\n *\n * Runs as a long-lived process that periodically:\n * - Checks for expired/stale secrets (decay monitoring)\n * - Detects access anomalies (observer analysis)\n * - Logs health reports\n * - Can trigger rotation callbacks\n *\n * Designed to run as `qring agent` or be invoked by the MCP server.\n */\n\nimport { listSecrets, setSecret } from \"./keyring.js\";\nimport { checkDecay } from \"./envelope.js\";\nimport { detectAnomalies, logAudit } from \"./observer.js\";\nimport { generateSecret } from \"./noise.js\";\nimport { fireHooks } from \"./hooks.js\";\nimport { c, SYMBOLS } from \"../utils/colors.js\";\n\nexport interface AgentConfig {\n /** Check interval in seconds (default: 60) */\n intervalSeconds: number;\n /** Auto-rotate expired secrets with generated values */\n autoRotate: boolean;\n /** Project paths to monitor */\n projectPaths: string[];\n /** Verbose output */\n verbose: boolean;\n}\n\nexport interface AgentReport {\n timestamp: string;\n totalSecrets: number;\n healthy: number;\n stale: number;\n expired: number;\n anomalies: number;\n rotated: string[];\n warnings: string[];\n}\n\nfunction defaultConfig(): AgentConfig {\n return {\n intervalSeconds: 60,\n autoRotate: false,\n projectPaths: [process.cwd()],\n verbose: false,\n };\n}\n\nexport function runHealthScan(config: Partial<AgentConfig> = {}): AgentReport {\n const cfg = { ...defaultConfig(), ...config };\n\n const report: AgentReport = {\n timestamp: new Date().toISOString(),\n totalSecrets: 0,\n healthy: 0,\n stale: 0,\n expired: 0,\n anomalies: 0,\n rotated: [],\n warnings: [],\n };\n\n // Scan global scope\n const globalEntries = listSecrets({ scope: \"global\", source: \"agent\" });\n\n // Scan project scopes\n const projectEntries = cfg.projectPaths.flatMap((pp) =>\n listSecrets({ scope: \"project\", projectPath: pp, source: \"agent\" }),\n );\n\n const allEntries = [...globalEntries, ...projectEntries];\n report.totalSecrets = allEntries.length;\n\n for (const entry of allEntries) {\n if (!entry.envelope) continue;\n\n const decay = checkDecay(entry.envelope);\n\n if (decay.isExpired) {\n report.expired++;\n report.warnings.push(\n `EXPIRED: ${entry.key} [${entry.scope}] — expired ${decay.timeRemaining}`,\n );\n\n if (cfg.autoRotate) {\n const fmt = (entry.envelope?.meta.rotationFormat ?? \"api-key\") as import(\"./noise.js\").NoiseFormat;\n const prefix = entry.envelope?.meta.rotationPrefix;\n const newValue = generateSecret({ format: fmt, prefix });\n setSecret(entry.key, newValue, {\n scope: entry.scope,\n projectPath: cfg.projectPaths[0],\n source: \"agent\",\n });\n report.rotated.push(entry.key);\n logAudit({\n action: \"write\",\n key: entry.key,\n scope: entry.scope,\n source: \"agent\",\n detail: \"auto-rotated by agent (expired)\",\n });\n fireHooks({\n action: \"rotate\",\n key: entry.key,\n scope: entry.scope,\n timestamp: new Date().toISOString(),\n source: \"agent\",\n }, entry.envelope?.meta.tags).catch(() => {});\n }\n } else if (decay.isStale) {\n report.stale++;\n report.warnings.push(\n `STALE: ${entry.key} [${entry.scope}] — ${decay.lifetimePercent}% lifetime, ${decay.timeRemaining} remaining`,\n );\n } else {\n report.healthy++;\n }\n }\n\n // Check for anomalies\n const anomalies = detectAnomalies();\n report.anomalies = anomalies.length;\n for (const a of anomalies) {\n report.warnings.push(`ANOMALY [${a.type}]: ${a.description}`);\n }\n\n return report;\n}\n\nfunction formatReport(report: AgentReport, verbose: boolean): string {\n const lines: string[] = [];\n\n lines.push(\n `${c.bold(`${SYMBOLS.shield} q-ring agent scan`)} ${c.dim(report.timestamp)}`,\n );\n lines.push(\n ` ${c.dim(\"secrets:\")} ${report.totalSecrets} ${c.green(`${SYMBOLS.check} ${report.healthy}`)} ${c.yellow(`${SYMBOLS.warning} ${report.stale}`)} ${c.red(`${SYMBOLS.cross} ${report.expired}`)} ${c.dim(`anomalies: ${report.anomalies}`)}`,\n );\n\n if (report.rotated.length > 0) {\n lines.push(\n ` ${c.cyan(`${SYMBOLS.zap} auto-rotated:`)} ${report.rotated.join(\", \")}`,\n );\n }\n\n if (verbose && report.warnings.length > 0) {\n lines.push(\"\");\n for (const w of report.warnings) {\n if (w.startsWith(\"EXPIRED\")) lines.push(` ${c.red(w)}`);\n else if (w.startsWith(\"STALE\")) lines.push(` ${c.yellow(w)}`);\n else if (w.startsWith(\"ANOMALY\")) lines.push(` ${c.magenta(w)}`);\n else lines.push(` ${w}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Run the agent as a continuous background monitor.\n */\nexport async function startAgent(config: Partial<AgentConfig> = {}): Promise<void> {\n const cfg = { ...defaultConfig(), ...config };\n\n console.log(\n `${c.bold(`${SYMBOLS.zap} q-ring agent started`)} ${c.dim(`(interval: ${cfg.intervalSeconds}s, auto-rotate: ${cfg.autoRotate})`)}`,\n );\n console.log(\n c.dim(` monitoring: global + ${cfg.projectPaths.length} project(s)`),\n );\n console.log();\n\n const scan = () => {\n const report = runHealthScan(cfg);\n console.log(formatReport(report, cfg.verbose));\n\n if (report.warnings.length > 0 || cfg.verbose) {\n console.log();\n }\n };\n\n // Initial scan\n scan();\n\n // Continuous monitoring\n const interval = setInterval(scan, cfg.intervalSeconds * 1000);\n\n // Graceful shutdown\n const shutdown = () => {\n clearInterval(interval);\n console.log(`\\n${c.dim(\"q-ring agent stopped\")}`);\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Keep alive\n await new Promise(() => {});\n}\n","/**\n * Secure Execution & Auto-Redaction\n *\n * Runs child processes with project secrets injected into the environment.\n * Captures stdout/stderr and redacts any known secret values before they\n * are printed to the terminal or returned to the MCP agent.\n *\n * Exec profiles restrict which commands may be run, with optional\n * network and timeout controls.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { Transform } from \"node:stream\";\nimport { listSecrets, getSecret, type KeyringOptions } from \"./keyring.js\";\nimport { checkDecay } from \"./envelope.js\";\nimport { checkExecPolicy, getExecMaxRuntime } from \"./policy.js\";\n\nexport interface ExecProfile {\n name: string;\n allowCommands?: string[];\n denyCommands?: string[];\n maxRuntimeSeconds?: number;\n allowNetwork?: boolean;\n stripEnvVars?: string[];\n}\n\nconst BUILTIN_PROFILES: Record<string, ExecProfile> = {\n unrestricted: { name: \"unrestricted\" },\n restricted: {\n name: \"restricted\",\n denyCommands: [\"curl\", \"wget\", \"ssh\", \"scp\", \"nc\", \"netcat\", \"ncat\"],\n maxRuntimeSeconds: 30,\n allowNetwork: false,\n stripEnvVars: [\"HTTP_PROXY\", \"HTTPS_PROXY\", \"ALL_PROXY\"],\n },\n ci: {\n name: \"ci\",\n maxRuntimeSeconds: 300,\n allowNetwork: true,\n denyCommands: [\"rm -rf /\", \"mkfs\", \"dd if=\"],\n },\n};\n\nexport function getProfile(name?: string): ExecProfile {\n if (!name) return BUILTIN_PROFILES.unrestricted;\n return BUILTIN_PROFILES[name] ?? { name };\n}\n\nexport function listProfiles(): ExecProfile[] {\n return Object.values(BUILTIN_PROFILES);\n}\n\nexport interface ExecOptions extends KeyringOptions {\n tags?: string[];\n keys?: string[];\n command: string;\n args: string[];\n /** If true, return output as string instead of piping to process.stdout */\n captureOutput?: boolean;\n /** Exec profile name (unrestricted, restricted, ci) */\n profile?: string;\n}\n\nexport interface ExecResult {\n code: number;\n stdout: string;\n stderr: string;\n}\n\nexport class RedactionTransform extends Transform {\n private patterns: { value: string; replacement: string }[] = [];\n private tail: string = \"\";\n private maxLen: number = 0;\n\n constructor(secretsToRedact: string[]) {\n super();\n // Only redact secrets > 5 chars to avoid destroying output\n const validSecrets = secretsToRedact.filter((s) => s.length > 5);\n // Sort by length descending to match longest first\n validSecrets.sort((a, b) => b.length - a.length);\n\n this.patterns = validSecrets.map((s) => ({\n value: s,\n replacement: \"[QRING:REDACTED]\",\n }));\n\n if (validSecrets.length > 0) {\n this.maxLen = validSecrets[0].length;\n }\n }\n\n _transform(chunk: Buffer | string, _encoding: string, callback: () => void) {\n if (this.patterns.length === 0) {\n this.push(chunk);\n return callback();\n }\n\n const text = this.tail + chunk.toString();\n let redacted = text;\n\n for (const { value, replacement } of this.patterns) {\n redacted = redacted.split(value).join(replacement);\n }\n\n if (redacted.length < this.maxLen) {\n this.tail = redacted;\n return callback();\n }\n\n const outputLen = redacted.length - this.maxLen + 1;\n const output = redacted.slice(0, outputLen);\n this.tail = redacted.slice(outputLen);\n\n this.push(output);\n callback();\n }\n\n _flush(callback: () => void) {\n if (this.tail) {\n let final = this.tail;\n for (const { value, replacement } of this.patterns) {\n final = final.split(value).join(replacement);\n }\n this.push(final);\n }\n callback();\n }\n}\n\nexport async function execCommand(opts: ExecOptions): Promise<ExecResult> {\n const profile = getProfile(opts.profile);\n const fullCommand = [opts.command, ...opts.args].join(\" \");\n\n const policyDecision = checkExecPolicy(fullCommand, opts.projectPath);\n if (!policyDecision.allowed) {\n throw new Error(`Policy Denied: ${policyDecision.reason}`);\n }\n\n if (profile.denyCommands) {\n const denied = profile.denyCommands.find((d) => {\n const pattern = new RegExp(`(^|[\\\\s/])${d.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}(\\\\s|$)`, \"i\");\n return pattern.test(fullCommand);\n });\n if (denied) {\n throw new Error(`Exec profile \"${profile.name}\" denies command containing \"${denied}\"`);\n }\n }\n if (profile.allowCommands) {\n const allowed = profile.allowCommands.some((a) => fullCommand.startsWith(a));\n if (!allowed) {\n throw new Error(`Exec profile \"${profile.name}\" does not allow command \"${opts.command}\"`);\n }\n }\n\n const envMap: Record<string, string> = {};\n for (const [k, v] of Object.entries(process.env)) {\n if (v !== undefined) envMap[k] = v;\n }\n\n if (profile.stripEnvVars) {\n for (const key of profile.stripEnvVars) {\n delete envMap[key];\n }\n }\n\n const secretsToRedact = new Set<string>();\n\n let entries = listSecrets({\n scope: opts.scope,\n projectPath: opts.projectPath,\n source: opts.source ?? \"cli\",\n silent: true, // list silently\n });\n\n if (opts.keys?.length) {\n const keySet = new Set(opts.keys);\n entries = entries.filter((e) => keySet.has(e.key));\n }\n\n if (opts.tags?.length) {\n entries = entries.filter((e) =>\n opts.tags!.some((t) => e.envelope?.meta.tags?.includes(t)),\n );\n }\n\n for (const entry of entries) {\n if (entry.envelope) {\n const decay = checkDecay(entry.envelope);\n if (decay.isExpired) continue;\n }\n\n const val = getSecret(entry.key, {\n scope: entry.scope,\n projectPath: opts.projectPath,\n env: opts.env,\n source: opts.source ?? \"cli\",\n silent: false, // Log access for execution\n });\n\n if (val !== null) {\n envMap[entry.key] = val;\n if (val.length > 5) {\n secretsToRedact.add(val);\n }\n }\n }\n\n const maxRuntime = profile.maxRuntimeSeconds ?? getExecMaxRuntime(opts.projectPath);\n\n return new Promise((resolve, reject) => {\n // Enforce network restrictions for profiles that disallow network access.\n const networkTools = new Set([\n \"curl\", \"wget\", \"ping\", \"nc\", \"netcat\", \"ssh\", \"telnet\", \"ftp\", \"dig\", \"nslookup\",\n ]);\n\n if (profile.allowNetwork === false && networkTools.has(opts.command)) {\n const msg = `[QRING] Execution blocked: network access is disabled for profile \"${profile.name}\", command \"${opts.command}\" is considered network-related`;\n if (opts.captureOutput) {\n return resolve({ code: 126, stdout: \"\", stderr: msg });\n }\n process.stderr.write(msg + \"\\n\");\n return resolve({ code: 126, stdout: \"\", stderr: \"\" });\n }\n\n const child = spawn(opts.command, opts.args, {\n env: envMap,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n shell: false,\n });\n\n let timedOut = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n if (maxRuntime) {\n timer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGKILL\");\n }, maxRuntime * 1000);\n }\n\n const stdoutRedact = new RedactionTransform([...secretsToRedact]);\n const stderrRedact = new RedactionTransform([...secretsToRedact]);\n\n if (child.stdout) child.stdout.pipe(stdoutRedact);\n if (child.stderr) child.stderr.pipe(stderrRedact);\n\n let stdoutStr = \"\";\n let stderrStr = \"\";\n\n if (opts.captureOutput) {\n stdoutRedact.on(\"data\", (d) => (stdoutStr += d.toString()));\n stderrRedact.on(\"data\", (d) => (stderrStr += d.toString()));\n } else {\n stdoutRedact.pipe(process.stdout);\n stderrRedact.pipe(process.stderr);\n }\n\n child.on(\"close\", (code) => {\n if (timer) clearTimeout(timer);\n if (timedOut) {\n resolve({ code: 124, stdout: stdoutStr, stderr: stderrStr + `\\n[QRING] Process killed: exceeded ${maxRuntime}s runtime limit` });\n } else {\n resolve({ code: code ?? 0, stdout: stdoutStr, stderr: stderrStr });\n }\n });\n\n child.on(\"error\", (err) => {\n if (timer) clearTimeout(timer);\n reject(err);\n });\n });\n}\n","/**\n * Codebase Secret Scanner\n *\n * Scans a directory for hardcoded secrets using regex heuristics\n * and Shannon entropy analysis. Useful for migrating legacy codebases\n * into q-ring.\n */\n\nimport { readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { findSecretsInLine, calculateEntropy } from \"./secrets-detect.js\";\n\nexport interface ScanResult {\n file: string;\n line: number;\n keyName: string;\n match: string;\n context: string;\n entropy: number;\n}\n\nconst IGNORE_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \".next\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".cursor\",\n \"venv\",\n \"__pycache__\",\n]);\n\nconst IGNORE_EXTS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".ico\", \".svg\", \".webp\",\n \".mp4\", \".mp3\", \".wav\", \".ogg\",\n \".pdf\", \".zip\", \".tar\", \".gz\", \".xz\",\n \".ttf\", \".woff\", \".woff2\", \".eot\",\n \".exe\", \".dll\", \".so\", \".dylib\",\n \".lock\",\n]);\n\nexport function scanCodebase(dir: string): ScanResult[] {\n const results: ScanResult[] = [];\n\n function walk(currentDir: string) {\n let entries;\n try {\n entries = readdirSync(currentDir);\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (IGNORE_DIRS.has(entry)) continue;\n\n const fullPath = join(currentDir, entry);\n let stat;\n try {\n stat = statSync(fullPath);\n } catch {\n continue;\n }\n\n if (stat.isDirectory()) {\n walk(fullPath);\n } else if (stat.isFile()) {\n const ext = fullPath.slice(fullPath.lastIndexOf(\".\")).toLowerCase();\n if (IGNORE_EXTS.has(ext) || entry.endsWith(\".lock\")) continue;\n\n let content;\n try {\n content = readFileSync(fullPath, \"utf8\");\n } catch {\n continue;\n }\n\n if (content.includes(\"\\0\")) continue;\n\n const lines = content.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const matches = findSecretsInLine(line);\n for (const m of matches) {\n const entropy = calculateEntropy(m.value);\n const relPath = fullPath.startsWith(dir)\n ? fullPath.slice(dir.length).replace(/^[/\\\\]+/, \"\")\n : fullPath;\n\n results.push({\n file: relPath || fullPath,\n line: i + 1,\n keyName: m.varName,\n match: m.value,\n context: line.trim(),\n entropy: parseFloat(entropy.toFixed(2)),\n });\n }\n }\n }\n }\n }\n\n walk(dir);\n return results;\n}\n","/**\n * Shared heuristics for hardcoded-secret detection (scan + lint).\n * Both `scan.ts` and `linter.ts` use this module so rules stay aligned.\n */\n\n/** Same pattern for assignment-style secrets in source lines. */\nexport const SECRET_ASSIGNMENT_PATTERN =\n /((?:api_?key|secret|token|password|auth|credential|access_?key)[a-z0-9_]*)\\s*[:=]\\s*(['\"])([^'\"]+)\\2/gi;\n\nexport interface SecretMatchInLine {\n varName: string;\n value: string;\n quote: string;\n}\n\nexport function calculateEntropy(str: string): number {\n if (!str) return 0;\n const len = str.length;\n const frequencies = new Map<string, number>();\n\n for (let i = 0; i < len; i++) {\n const char = str[i];\n frequencies.set(char, (frequencies.get(char) || 0) + 1);\n }\n\n let entropy = 0;\n for (const count of frequencies.values()) {\n const p = count / len;\n entropy -= p * Math.log2(p);\n }\n\n return entropy;\n}\n\nfunction isPlaceholderValue(value: string): boolean {\n const lv = value.toLowerCase();\n return (\n lv.includes(\"example\") ||\n lv.includes(\"your_\") ||\n lv.includes(\"placeholder\") ||\n lv.includes(\"replace_me\") ||\n lv.includes(\"xxx\")\n );\n}\n\nfunction passesSecretHeuristic(value: string, entropy: number): boolean {\n return entropy > 3.5 || value.startsWith(\"sk-\") || value.startsWith(\"ghp_\");\n}\n\n/**\n * Find all secret-like assignments on one line (same behavior as the linter:\n * every match on the line is considered).\n */\nexport function findSecretsInLine(line: string): SecretMatchInLine[] {\n if (line.length > 500) return [];\n\n const out: SecretMatchInLine[] = [];\n SECRET_ASSIGNMENT_PATTERN.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = SECRET_ASSIGNMENT_PATTERN.exec(line)) !== null) {\n const varName = match[1];\n const quote = match[2];\n const value = match[3];\n\n if (value.length < 8) continue;\n if (isPlaceholderValue(value)) continue;\n\n const entropy = calculateEntropy(value);\n if (!passesSecretHeuristic(value, entropy)) continue;\n\n out.push({ varName, value, quote });\n }\n return out;\n}\n","/**\n * Secret-Aware Linter\n *\n * Scans individual files (or staged git content) for hardcoded secrets and\n * optionally rewrites them with `process.env.KEY` references, storing the\n * discovered values in q-ring.\n */\n\nimport { readFileSync, writeFileSync, existsSync } from \"node:fs\";\nimport { basename, extname } from \"node:path\";\nimport { type ScanResult } from \"./scan.js\";\nimport { setSecret, hasSecret } from \"./keyring.js\";\nimport { findSecretsInLine, calculateEntropy } from \"./secrets-detect.js\";\n\nexport interface LintResult extends ScanResult {\n fixed: boolean;\n}\n\nexport interface LintOptions {\n fix?: boolean;\n scope?: import(\"./scope.js\").Scope;\n projectPath?: string;\n}\n\nconst ENV_REF_BY_EXT: Record<string, (key: string) => string> = {\n \".ts\": (k) => `process.env.${k}`,\n \".tsx\": (k) => `process.env.${k}`,\n \".js\": (k) => `process.env.${k}`,\n \".jsx\": (k) => `process.env.${k}`,\n \".mjs\": (k) => `process.env.${k}`,\n \".cjs\": (k) => `process.env.${k}`,\n \".py\": (k) => `os.environ[\"${k}\"]`,\n \".rb\": (k) => `ENV[\"${k}\"]`,\n \".go\": (k) => `os.Getenv(\"${k}\")`,\n \".rs\": (k) => `std::env::var(\"${k}\")`,\n \".java\": (k) => `System.getenv(\"${k}\")`,\n \".kt\": (k) => `System.getenv(\"${k}\")`,\n \".cs\": (k) => `Environment.GetEnvironmentVariable(\"${k}\")`,\n \".php\": (k) => `getenv('${k}')`,\n \".sh\": (k) => `\\${${k}}`,\n \".bash\": (k) => `\\${${k}}`,\n};\n\nfunction getEnvRef(filePath: string, keyName: string): string {\n const ext = extname(filePath).toLowerCase();\n const formatter = ENV_REF_BY_EXT[ext];\n return formatter ? formatter(keyName) : `process.env.${keyName}`;\n}\n\n/**\n * Lint specific files for hardcoded secrets.\n */\nexport function lintFiles(\n files: string[],\n opts: LintOptions = {},\n): LintResult[] {\n const results: LintResult[] = [];\n\n for (const file of files) {\n if (!existsSync(file)) continue;\n\n let content: string;\n try {\n content = readFileSync(file, \"utf8\");\n } catch {\n continue;\n }\n\n if (content.includes(\"\\0\")) continue;\n\n const lines = content.split(/\\r?\\n/);\n const fixes: Array<{ line: number; original: string; replacement: string; keyName: string; value: string }> = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const matches = findSecretsInLine(line);\n\n for (const m of matches) {\n const varNameUpper = m.varName.toUpperCase();\n const entropy = calculateEntropy(m.value);\n const shouldFix = opts.fix === true;\n\n if (shouldFix) {\n const envRef = getEnvRef(file, varNameUpper);\n fixes.push({\n line: i,\n original: `${m.quote}${m.value}${m.quote}`,\n replacement: envRef,\n keyName: varNameUpper,\n value: m.value,\n });\n }\n\n results.push({\n file,\n line: i + 1,\n keyName: varNameUpper,\n match: m.value,\n context: line.trim(),\n entropy: parseFloat(entropy.toFixed(2)),\n fixed: shouldFix,\n });\n }\n }\n\n if (opts.fix && fixes.length > 0) {\n const fixLines = content.split(/\\r?\\n/);\n for (const fix of fixes.reverse()) {\n const lineIdx = fix.line;\n if (lineIdx >= 0 && lineIdx < fixLines.length) {\n fixLines[lineIdx] = fixLines[lineIdx].replace(fix.original, fix.replacement);\n }\n\n if (!hasSecret(fix.keyName, { scope: opts.scope, projectPath: opts.projectPath })) {\n setSecret(fix.keyName, fix.value, {\n scope: opts.scope ?? \"global\",\n projectPath: opts.projectPath,\n source: \"cli\",\n description: `Auto-imported from ${basename(file)}:${fix.line + 1}`,\n });\n }\n }\n\n writeFileSync(file, fixLines.join(\"\\n\"), \"utf8\");\n }\n }\n\n return results;\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { remember, recall, listMemory, forget } from \"../../core/memory.js\";\nimport { text, enforceToolPolicy } from \"./_shared.js\";\n\nexport function registerAgentTools(server: McpServer): void {\n server.tool(\n \"agent_remember\",\n \"[agent] Store a key-value pair in encrypted agent memory that persists across sessions. Use this to remember decisions, rotation history, or project-specific context.\",\n {\n key: z.string().describe(\"Memory key\"),\n value: z.string().describe(\"Value to store\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"agent_remember\");\n if (toolBlock) return toolBlock;\n\n remember(params.key, params.value);\n return text(`Remembered \"${params.key}\"`);\n },\n );\n\n server.tool(\n \"agent_recall\",\n \"[agent] Retrieve a value from agent memory, or list all stored keys if no key is provided.\",\n {\n key: z.string().optional().describe(\"Memory key to recall (omit to list all)\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"agent_recall\");\n if (toolBlock) return toolBlock;\n\n if (!params.key) {\n const entries = listMemory();\n if (entries.length === 0) return text(\"Agent memory is empty\");\n return text(JSON.stringify(entries, null, 2));\n }\n const value = recall(params.key);\n if (value === null)\n return text(`No memory found for \"${params.key}\"`, true);\n return text(\n JSON.stringify({ ok: true, data: { key: params.key, value } }, null, 2),\n );\n },\n );\n\n server.tool(\n \"agent_forget\",\n \"[agent] Delete a key from agent memory.\",\n {\n key: z.string().describe(\"Memory key to forget\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"agent_forget\");\n if (toolBlock) return toolBlock;\n\n const removed = forget(params.key);\n return text(\n removed ? `Forgot \"${params.key}\"` : `No memory found for \"${params.key}\"`,\n !removed,\n );\n },\n );\n}\n","/**\n * Agent Memory — Persistent State Across Sessions\n *\n * Stores key-value pairs in an encrypted JSON file so the AI agent\n * can remember decisions, rotations performed, and project-specific\n * context between conversations.\n *\n * Data is encrypted using AES-256-GCM derived from a machine-specific\n * fingerprint (hostname + username), so it only decrypts on the same machine.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir, hostname, userInfo } from \"node:os\";\nimport { createCipheriv, createDecipheriv, createHash, randomBytes } from \"node:crypto\";\nimport { Entry } from \"@napi-rs/keyring\";\n\nconst MEMORY_FILE = \"agent-memory.enc\";\nconst KEYRING_SERVICE = \"qring-memory-key\";\nconst KEYRING_ACCOUNT = \"encryption-key\";\n\nfunction getMemoryDir(): string {\n const dir = join(homedir(), \".config\", \"q-ring\");\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n return dir;\n}\n\nfunction getMemoryPath(): string {\n return join(getMemoryDir(), MEMORY_FILE);\n}\n\nfunction deriveLegacyKey(): Buffer {\n const fingerprint = `qring-memory:${hostname()}:${userInfo().username}`;\n return createHash(\"sha256\").update(fingerprint).digest();\n}\n\nfunction getOrCreateKey(): Buffer {\n try {\n const entry = new Entry(KEYRING_SERVICE, KEYRING_ACCOUNT);\n const stored = entry.getPassword();\n if (stored) return Buffer.from(stored, \"base64\");\n\n const key = randomBytes(32);\n entry.setPassword(key.toString(\"base64\"));\n return key;\n } catch {\n console.warn(\"[q-ring] OS keyring unavailable for memory key — falling back to machine-derived key\");\n return deriveLegacyKey();\n }\n}\n\nfunction encryptWith(data: string, key: Buffer): string {\n const iv = randomBytes(12);\n const cipher = createCipheriv(\"aes-256-gcm\", key, iv);\n const encrypted = Buffer.concat([cipher.update(data, \"utf8\"), cipher.final()]);\n const tag = cipher.getAuthTag();\n return `${iv.toString(\"base64\")}:${tag.toString(\"base64\")}:${encrypted.toString(\"base64\")}`;\n}\n\nfunction decryptWith(blob: string, key: Buffer): string {\n const parts = blob.split(\":\");\n if (parts.length !== 3) throw new Error(\"Invalid encrypted format\");\n const iv = Buffer.from(parts[0], \"base64\");\n const tag = Buffer.from(parts[1], \"base64\");\n const encrypted = Buffer.from(parts[2], \"base64\");\n\n const decipher = createDecipheriv(\"aes-256-gcm\", key, iv);\n decipher.setAuthTag(tag);\n return decipher.update(encrypted) + decipher.final(\"utf8\");\n}\n\nfunction encrypt(data: string): string {\n return encryptWith(data, getOrCreateKey());\n}\n\nfunction decrypt(blob: string): string {\n const key = getOrCreateKey();\n try {\n return decryptWith(blob, key);\n } catch {\n // Migration: try legacy key, re-encrypt with new key if successful\n const legacy = deriveLegacyKey();\n const plain = decryptWith(blob, legacy);\n writeFileSync(getMemoryPath(), encryptWith(plain, key), \"utf8\");\n return plain;\n }\n}\n\ninterface MemoryStore {\n entries: Record<string, { value: string; updatedAt: string }>;\n}\n\nfunction loadStore(): MemoryStore {\n const path = getMemoryPath();\n if (!existsSync(path)) {\n return { entries: {} };\n }\n try {\n const raw = readFileSync(path, \"utf8\");\n const decrypted = decrypt(raw);\n return JSON.parse(decrypted);\n } catch {\n return { entries: {} };\n }\n}\n\nfunction saveStore(store: MemoryStore): void {\n const json = JSON.stringify(store);\n const encrypted = encrypt(json);\n writeFileSync(getMemoryPath(), encrypted, \"utf8\");\n}\n\n/**\n * Store a value in agent memory.\n */\nexport function remember(key: string, value: string): void {\n const store = loadStore();\n store.entries[key] = {\n value,\n updatedAt: new Date().toISOString(),\n };\n saveStore(store);\n}\n\n/**\n * Retrieve a value from agent memory.\n */\nexport function recall(key: string): string | null {\n const store = loadStore();\n return store.entries[key]?.value ?? null;\n}\n\n/**\n * List all keys in agent memory.\n */\nexport function listMemory(): Array<{ key: string; updatedAt: string }> {\n const store = loadStore();\n return Object.entries(store.entries).map(([key, entry]) => ({\n key,\n updatedAt: entry.updatedAt,\n }));\n}\n\n/**\n * Delete a key from agent memory.\n */\nexport function forget(key: string): boolean {\n const store = loadStore();\n if (key in store.entries) {\n delete store.entries[key];\n saveStore(store);\n return true;\n }\n return false;\n}\n\n/**\n * Clear all agent memory.\n */\nexport function clearMemory(): void {\n saveStore({ entries: {} });\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n checkToolPolicy,\n checkKeyReadPolicy,\n checkExecPolicy,\n getPolicySummary,\n} from \"../../core/policy.js\";\nimport { text, enforceToolPolicy, commonSchemas } from \"./_shared.js\";\n\nconst { projectPath } = commonSchemas;\n\nexport function registerPolicyTools(server: McpServer): void {\n server.tool(\n \"check_policy\",\n \"[policy] Check if an action is allowed by the project's governance policy. Returns the policy decision and source.\",\n {\n action: z\n .enum([\"tool\", \"key_read\", \"exec\"])\n .describe(\"Type of policy check\"),\n toolName: z\n .string()\n .optional()\n .describe(\"Tool name to check (for action=tool)\"),\n key: z.string().optional().describe(\"Secret key to check (for action=key_read)\"),\n command: z\n .string()\n .optional()\n .describe(\"Command to check (for action=exec)\"),\n projectPath,\n },\n async (params) => {\n if (params.action === \"tool\" && params.toolName) {\n const d = checkToolPolicy(params.toolName, params.projectPath);\n return text(JSON.stringify(d, null, 2));\n }\n if (params.action === \"key_read\" && params.key) {\n const d = checkKeyReadPolicy(params.key, undefined, params.projectPath);\n return text(JSON.stringify(d, null, 2));\n }\n if (params.action === \"exec\" && params.command) {\n const d = checkExecPolicy(params.command, params.projectPath);\n return text(JSON.stringify(d, null, 2));\n }\n return text(\n \"Missing required parameter for the selected action type\",\n true,\n );\n },\n );\n\n server.tool(\n \"get_policy_summary\",\n \"[policy] Get a summary of the project's governance policy configuration.\",\n {\n projectPath,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\n \"get_policy_summary\",\n params.projectPath,\n );\n if (toolBlock) return toolBlock;\n const summary = getPolicySummary(params.projectPath);\n return text(JSON.stringify(summary, null, 2));\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerSecretTools } from \"./tools/secrets.js\";\nimport { registerProjectTools } from \"./tools/project.js\";\nimport { registerTunnelTools } from \"./tools/tunnel.js\";\nimport { registerTeleportTools } from \"./tools/teleport.js\";\nimport { registerAuditTools } from \"./tools/audit.js\";\nimport { registerValidationTools } from \"./tools/validation.js\";\nimport { registerHookTools } from \"./tools/hooks.js\";\nimport { registerToolingTools } from \"./tools/tooling.js\";\nimport { registerAgentTools } from \"./tools/agent.js\";\nimport { registerPolicyTools } from \"./tools/policy.js\";\n\n/**\n * Register every MCP tool on the given server.\n *\n * Tools are grouped by concern in `src/mcp/tools/*.ts`. Keep the registration\n * order stable — some MCP clients cache the tool list ordering.\n */\nexport function registerMcpTools(server: McpServer): void {\n registerSecretTools(server);\n registerProjectTools(server);\n registerTunnelTools(server);\n registerTeleportTools(server);\n registerAuditTools(server);\n registerValidationTools(server);\n registerHookTools(server);\n registerToolingTools(server);\n registerAgentTools(server);\n registerPolicyTools(server);\n}\n"],"mappings":"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","names":["z","c","opts","readFileSync","readFileSync","projectPath","server","z","registry","opts","opts","projectPath","registry","teamId","orgId","scope","projectPath","env","server","result","z","server","z","z","randomBytes","z","teamId","orgId","scope","projectPath","server","z","z","teamId","orgId","scope","projectPath","server","z","z","teamId","orgId","scope","projectPath","server","z","registry","z","server","z","z","text","opts","readFileSync","join","join","readFileSync","readFileSync","opts","readFileSync","teamId","orgId","scope","projectPath","server","z","z","existsSync","readFileSync","writeFileSync","join","createCipheriv","createDecipheriv","randomBytes","server","z","z","projectPath","server","z","server","server"]}
1
+ {"version":3,"sources":["../src/mcp.ts","../src/mcp/server.ts","../src/mcp/tools/secrets.ts","../src/services/list-secrets-filter.ts","../src/core/noise.ts","../src/core/import.ts","../src/mcp/tools/_shared.ts","../src/core/validate.ts","../src/core/context.ts","../src/mcp/tools/project.ts","../src/mcp/tools/tunnel.ts","../src/mcp/tools/teleport.ts","../src/core/teleport.ts","../src/mcp/tools/audit.ts","../src/mcp/tools/validation.ts","../src/mcp/tools/hooks.ts","../src/mcp/tools/tooling.ts","../src/utils/colors.ts","../src/core/agent.ts","../src/core/exec.ts","../src/core/scan.ts","../src/core/secrets-detect.ts","../src/core/linter.ts","../src/mcp/tools/agent.ts","../src/mcp/tools/policy.ts","../src/mcp/tool-registration.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createMcpServer } from \"./mcp/server.js\";\n\nconst server = createMcpServer();\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { PACKAGE_VERSION } from \"../version.js\";\nimport { registerMcpTools } from \"./tool-registration.js\";\n\nexport function createMcpServer(): McpServer {\n const server = new McpServer({\n name: \"q-ring\",\n version: PACKAGE_VERSION,\n });\n registerMcpTools(server);\n return server;\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { filterSecretsByKeyGlob } from \"../../services/list-secrets-filter.js\";\nimport {\n getSecret,\n setSecret,\n deleteSecret,\n hasSecret,\n listSecrets,\n getEnvelope,\n entangleSecrets,\n disentangleSecrets,\n exportSecrets,\n} from \"../../core/keyring.js\";\nimport { checkDecay } from \"../../core/envelope.js\";\nimport type { Scope } from \"../../core/scope.js\";\nimport {\n generateSecret,\n estimateEntropy,\n type NoiseFormat,\n} from \"../../core/noise.js\";\nimport { importDotenv } from \"../../core/import.js\";\nimport { checkKeyReadPolicy } from \"../../core/policy.js\";\nimport { text, opts, enforceToolPolicy, commonSchemas } from \"./_shared.js\";\n\nconst { teamId, orgId, scope, projectPath, env } = commonSchemas;\n\nexport function registerSecretTools(server: McpServer): void {\n server.tool(\n \"get_secret\",\n \"[secrets] Retrieve a secret by key. Collapses superposition if the secret has multiple environment states. Records access in audit log (observer effect).\",\n {\n key: z.string().describe(\"The secret key name\"),\n scope,\n projectPath,\n env,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"get_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n try {\n const keyBlock = checkKeyReadPolicy(\n params.key,\n undefined,\n params.projectPath,\n );\n if (!keyBlock.allowed) {\n return text(`Policy Denied: ${keyBlock.reason}`, true);\n }\n\n const value = getSecret(params.key, opts(params));\n if (value === null) return text(`Secret \"${params.key}\" not found`, true);\n return text(\n JSON.stringify({ ok: true, data: { key: params.key, value } }, null, 2),\n );\n } catch (err) {\n return text(err instanceof Error ? err.message : String(err), true);\n }\n },\n );\n\n server.tool(\n \"list_secrets\",\n \"[secrets] List all secret keys with quantum metadata (scope, decay status, superposition states, entanglement, access count). Values are never exposed. Supports filtering by tag, expiry state, and key pattern.\",\n {\n scope,\n projectPath,\n tag: z.string().optional().describe(\"Filter by tag\"),\n expired: z.boolean().optional().describe(\"Show only expired secrets\"),\n stale: z\n .boolean()\n .optional()\n .describe(\"Show only stale secrets (75%+ decay)\"),\n filter: z\n .string()\n .optional()\n .describe(\"Glob pattern on key name (e.g., 'API_*')\"),\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"list_secrets\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n let entries = listSecrets(opts(params));\n\n if (params.tag) {\n entries = entries.filter((e) =>\n e.envelope?.meta.tags?.includes(params.tag!),\n );\n }\n if (params.expired) {\n entries = entries.filter((e) => e.decay?.isExpired);\n }\n if (params.stale) {\n entries = entries.filter(\n (e) => e.decay?.isStale && !e.decay?.isExpired,\n );\n }\n if (params.filter) {\n entries = filterSecretsByKeyGlob(entries, params.filter);\n }\n const rows = entries.map((e) => ({\n scope: e.scope,\n key: e.key,\n stateKeys: e.envelope?.states\n ? Object.keys(e.envelope.states)\n : undefined,\n expired: !!e.decay?.isExpired,\n stale: !!e.decay?.isStale && !e.decay?.isExpired,\n lifetimePercent: e.decay?.lifetimePercent,\n timeRemaining: e.decay?.timeRemaining ?? null,\n entangledCount: e.envelope?.meta.entangled?.length ?? 0,\n accessCount: e.envelope?.meta.accessCount ?? 0,\n }));\n\n return text(JSON.stringify({ ok: true, data: { entries: rows } }, null, 2));\n },\n );\n\n server.tool(\n \"set_secret\",\n \"[secrets] Create or overwrite a secret value plus optional metadata (TTL/decay, per-env superposition, description, tags). Overwrites existing values for the same key/scope; records access in the audit log. Use import_dotenv for bulk .env ingest. Subject to tool policy; no external rate limits beyond provider calls when validating elsewhere.\",\n {\n key: z.string().describe(\"The secret key name\"),\n value: z.string().describe(\"The secret value\"),\n scope: scope.default(\"global\"),\n projectPath,\n env: z\n .string()\n .optional()\n .describe(\n \"If provided, sets the value for this specific environment (superposition)\",\n ),\n ttlSeconds: z\n .number()\n .optional()\n .describe(\"Time-to-live in seconds (quantum decay)\"),\n description: z.string().optional().describe(\"Human-readable description\"),\n tags: z.array(z.string()).optional().describe(\"Tags for organization\"),\n rotationFormat: z\n .enum([\n \"hex\",\n \"base64\",\n \"alphanumeric\",\n \"uuid\",\n \"api-key\",\n \"token\",\n \"password\",\n ])\n .optional()\n .describe(\"Format for auto-rotation when this secret expires\"),\n rotationPrefix: z\n .string()\n .optional()\n .describe(\"Prefix for auto-rotation (e.g. 'sk-')\"),\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"set_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const o = opts(params);\n\n if (params.env) {\n const existing = getEnvelope(params.key, o);\n const states = existing?.envelope?.states ?? {};\n states[params.env] = params.value;\n\n if (existing?.envelope?.value && !states[\"default\"]) {\n states[\"default\"] = existing.envelope.value;\n }\n\n setSecret(params.key, \"\", {\n ...o,\n states,\n defaultEnv: existing?.envelope?.defaultEnv ?? params.env,\n ttlSeconds: params.ttlSeconds,\n description: params.description,\n tags: params.tags,\n rotationFormat: params.rotationFormat,\n rotationPrefix: params.rotationPrefix,\n });\n\n return text(\n `[${params.scope ?? \"global\"}] ${params.key} set for env:${params.env}`,\n );\n }\n\n setSecret(params.key, params.value, {\n ...o,\n ttlSeconds: params.ttlSeconds,\n description: params.description,\n tags: params.tags,\n rotationFormat: params.rotationFormat,\n rotationPrefix: params.rotationPrefix,\n });\n\n return text(`[${params.scope ?? \"global\"}] ${params.key} saved`);\n },\n );\n\n server.tool(\n \"delete_secret\",\n \"[secrets] Permanently remove a secret value from the keyring for the given scope/path (not recoverable from q-ring). Does not remove hooks, tunnels, or entanglement metadata alone—use remove_hook, tunnel_destroy, or disentangle_secrets respectively. Returns success or not-found text; subject to tool policy.\",\n {\n key: z.string().describe(\"The secret key name\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"delete_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const deleted = deleteSecret(params.key, opts(params));\n return text(\n deleted ? `Deleted \"${params.key}\"` : `Secret \"${params.key}\" not found`,\n !deleted,\n );\n },\n );\n\n server.tool(\n \"has_secret\",\n \"[secrets] Check if a secret exists. Returns boolean. Never reveals the value. Respects decay — expired secrets return false.\",\n {\n key: z.string().describe(\"The secret key name\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"has_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n return text(hasSecret(params.key, opts(params)) ? \"true\" : \"false\");\n },\n );\n\n server.tool(\n \"export_secrets\",\n \"[secrets] Export secrets as .env or JSON format. Collapses superposition. Supports filtering by specific keys or tags.\",\n {\n format: z\n .enum([\"env\", \"json\"])\n .optional()\n .default(\"env\")\n .describe(\"Output format\"),\n keys: z\n .array(z.string())\n .optional()\n .describe(\"Only export these specific key names\"),\n tags: z\n .array(z.string())\n .optional()\n .describe(\"Only export secrets with any of these tags\"),\n scope,\n projectPath,\n env,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"export_secrets\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const output = exportSecrets({\n ...opts(params),\n format: params.format as \"env\" | \"json\",\n keys: params.keys,\n tags: params.tags,\n });\n\n if (!output.trim()) return text(\"No secrets matched the filters\", true);\n return text(output);\n },\n );\n\n server.tool(\n \"import_dotenv\",\n \"[secrets] Import secrets from .env file content. Parses standard dotenv syntax (comments, quotes, multiline escapes) and stores each key/value pair in q-ring.\",\n {\n content: z.string().describe(\"The .env file content to parse and import\"),\n scope: scope.default(\"global\"),\n projectPath,\n skipExisting: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Skip keys that already exist in q-ring\"),\n dryRun: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Preview what would be imported without saving\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"import_dotenv\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const result = importDotenv(params.content, {\n scope: params.scope as \"global\" | \"project\",\n projectPath: params.projectPath ?? process.cwd(),\n source: \"mcp\",\n skipExisting: params.skipExisting,\n dryRun: params.dryRun,\n });\n\n const lines = [\n params.dryRun\n ? \"Dry run — no changes made\"\n : `Imported ${result.imported.length} secret(s)`,\n ];\n\n if (result.imported.length > 0) {\n lines.push(`Keys: ${result.imported.join(\", \")}`);\n }\n if (result.skipped.length > 0) {\n lines.push(`Skipped (existing): ${result.skipped.join(\", \")}`);\n }\n\n return text(lines.join(\"\\n\"));\n },\n );\n\n server.tool(\n \"inspect_secret\",\n \"[secrets] Show full quantum state of a secret: superposition states, decay status, entanglement links, access history. Never reveals the actual value.\",\n {\n key: z.string().describe(\"The secret key name\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"inspect_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const result = getEnvelope(params.key, opts(params));\n if (!result) return text(`Secret \"${params.key}\" not found`, true);\n\n const { envelope, scope: entryScope } = result;\n const decay = checkDecay(envelope);\n\n const info: Record<string, unknown> = {\n key: params.key,\n scope: entryScope,\n type: envelope.states ? \"superposition\" : \"collapsed\",\n created: envelope.meta.createdAt,\n updated: envelope.meta.updatedAt,\n accessCount: envelope.meta.accessCount,\n lastAccessed: envelope.meta.lastAccessedAt ?? \"never\",\n };\n\n if (envelope.states) {\n info.environments = Object.keys(envelope.states);\n info.defaultEnv = envelope.defaultEnv;\n }\n\n if (decay.timeRemaining) {\n info.decay = {\n expired: decay.isExpired,\n stale: decay.isStale,\n lifetimePercent: decay.lifetimePercent,\n timeRemaining: decay.timeRemaining,\n };\n }\n\n if (envelope.meta.entangled?.length) {\n info.entangled = envelope.meta.entangled;\n }\n\n if (envelope.meta.description)\n info.description = envelope.meta.description;\n if (envelope.meta.tags?.length) info.tags = envelope.meta.tags;\n\n return text(JSON.stringify(info, null, 2));\n },\n );\n\n server.tool(\n \"generate_secret\",\n \"[secrets] Generate a cryptographic secret (quantum noise). Formats: hex, base64, alphanumeric, uuid, api-key, token, password. Optionally save directly to the keyring.\",\n {\n format: z\n .enum([\n \"hex\",\n \"base64\",\n \"alphanumeric\",\n \"uuid\",\n \"api-key\",\n \"token\",\n \"password\",\n ])\n .optional()\n .default(\"api-key\")\n .describe(\"Output format\"),\n length: z.number().optional().describe(\"Length in bytes or characters\"),\n prefix: z.string().optional().describe(\"Prefix for api-key/token format\"),\n saveAs: z\n .string()\n .optional()\n .describe(\"If provided, save the generated secret with this key name\"),\n scope: scope.default(\"global\"),\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"generate_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const secret = generateSecret({\n format: params.format as NoiseFormat,\n length: params.length,\n prefix: params.prefix,\n });\n\n if (params.saveAs) {\n setSecret(params.saveAs, secret, {\n ...opts(params),\n description: `Generated ${params.format} secret`,\n });\n const entropy = estimateEntropy(secret);\n return text(\n `Generated and saved as \"${params.saveAs}\" (${params.format}, ~${entropy} bits entropy)`,\n );\n }\n\n return text(JSON.stringify({ ok: true, data: { value: secret } }, null, 2));\n },\n );\n\n server.tool(\n \"entangle_secrets\",\n \"[secrets] Link two keys so source updates/rotations propagate the same value to the target (mutates metadata; future writes sync). Reverse with disentangle_secrets without deleting values; do not confuse with set_secret (single-key write). Subject to tool policy.\",\n {\n sourceKey: z.string().describe(\"Source secret key\"),\n targetKey: z.string().describe(\"Target secret key\"),\n sourceScope: scope.default(\"global\"),\n targetScope: scope.default(\"global\"),\n sourceProjectPath: z.string().optional(),\n targetProjectPath: z.string().optional(),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\n \"entangle_secrets\",\n params.sourceProjectPath,\n );\n if (toolBlock) return toolBlock;\n\n entangleSecrets(\n params.sourceKey,\n {\n scope: params.sourceScope as Scope,\n projectPath: params.sourceProjectPath ?? process.cwd(),\n source: \"mcp\",\n },\n params.targetKey,\n {\n scope: params.targetScope as Scope,\n projectPath: params.targetProjectPath ?? process.cwd(),\n source: \"mcp\",\n },\n );\n\n return text(`Entangled: ${params.sourceKey} <-> ${params.targetKey}`);\n },\n );\n\n server.tool(\n \"disentangle_secrets\",\n \"[secrets] Remove the sync link between two keys so rotations stop propagating. Does not delete either secret—use delete_secret to erase values. Contrast entangle_secrets (creates link). Safe if the link was already absent; updates metadata; subject to tool policy.\",\n {\n sourceKey: z.string().describe(\"Source secret key\"),\n targetKey: z.string().describe(\"Target secret key\"),\n sourceScope: scope.default(\"global\"),\n targetScope: scope.default(\"global\"),\n sourceProjectPath: z.string().optional(),\n targetProjectPath: z.string().optional(),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\n \"disentangle_secrets\",\n params.sourceProjectPath,\n );\n if (toolBlock) return toolBlock;\n\n disentangleSecrets(\n params.sourceKey,\n {\n scope: params.sourceScope as Scope,\n projectPath: params.sourceProjectPath ?? process.cwd(),\n source: \"mcp\",\n },\n params.targetKey,\n {\n scope: params.targetScope as Scope,\n projectPath: params.targetProjectPath ?? process.cwd(),\n source: \"mcp\",\n },\n );\n\n return text(`Disentangled: ${params.sourceKey} </> ${params.targetKey}`);\n },\n );\n}\n","import type { SecretEntry } from \"../core/keyring.js\";\n\n/**\n * Turn a user glob (`*`, `?`) into a case-insensitive RegExp source.\n * Other regex metacharacters are escaped.\n */\nfunction globKeyPatternToRegexSource(pattern: string): string {\n let out = \"\";\n for (const c of pattern) {\n if (c === \"*\") out += \".*\";\n else if (c === \"?\") out += \".\";\n else if (\"\\\\^$+{}()|[]\".includes(c)) out += \"\\\\\" + c;\n else if (c === \".\") out += \"\\\\.\";\n else out += c;\n }\n return out;\n}\n\n/**\n * Key name glob: `*` → `.*`, `?` → `.`, other regex metacharacters escaped (CLI + MCP aligned).\n */\nexport function filterSecretsByKeyGlob(\n entries: SecretEntry[],\n filter?: string,\n): SecretEntry[] {\n if (!filter?.trim()) return entries;\n const regex = new RegExp(\"^\" + globKeyPatternToRegexSource(filter) + \"$\", \"i\");\n return entries.filter((e) => regex.test(e.key));\n}\n","/**\n * Quantum Noise: cryptographic secret generation.\n * Generates high-entropy values in common formats.\n */\n\nimport { randomBytes, randomInt } from \"node:crypto\";\n\nexport type NoiseFormat =\n | \"hex\"\n | \"base64\"\n | \"alphanumeric\"\n | \"uuid\"\n | \"api-key\"\n | \"token\"\n | \"password\";\n\nexport interface NoiseOptions {\n format?: NoiseFormat;\n /** Length in bytes (for hex/base64) or characters (for alphanumeric/password) */\n length?: number;\n /** Prefix for api-key format (e.g., \"sk-\", \"pk-\") */\n prefix?: string;\n}\n\nconst ALPHA_NUM =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst PASSWORD_CHARS =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+[]{}|;:,.<>?\";\n\nfunction randomString(charset: string, length: number): string {\n let result = \"\";\n for (let i = 0; i < length; i++) {\n result += charset[randomInt(charset.length)];\n }\n return result;\n}\n\nexport function generateSecret(opts: NoiseOptions = {}): string {\n const format = opts.format ?? \"api-key\";\n\n switch (format) {\n case \"hex\": {\n const len = opts.length ?? 32;\n return randomBytes(len).toString(\"hex\");\n }\n\n case \"base64\": {\n const len = opts.length ?? 32;\n return randomBytes(len).toString(\"base64url\");\n }\n\n case \"alphanumeric\": {\n const len = opts.length ?? 32;\n return randomString(ALPHA_NUM, len);\n }\n\n case \"uuid\": {\n const bytes = randomBytes(16);\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 1\n const hex = bytes.toString(\"hex\");\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20, 32),\n ].join(\"-\");\n }\n\n case \"api-key\": {\n const prefix = opts.prefix ?? \"qr_\";\n const len = opts.length ?? 48;\n return prefix + randomString(ALPHA_NUM, len);\n }\n\n case \"token\": {\n const prefix = opts.prefix ?? \"\";\n const len = opts.length ?? 64;\n return prefix + randomBytes(len).toString(\"base64url\");\n }\n\n case \"password\": {\n const len = opts.length ?? 24;\n let pw = randomString(PASSWORD_CHARS, len);\n\n // Guarantee at least one of each class\n const hasUpper = /[A-Z]/.test(pw);\n const hasLower = /[a-z]/.test(pw);\n const hasDigit = /[0-9]/.test(pw);\n const hasSpecial = /[^A-Za-z0-9]/.test(pw);\n\n if (!hasUpper) pw = replaceAt(pw, randomInt(len), randomString(\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\", 1));\n if (!hasLower) pw = replaceAt(pw, randomInt(len), randomString(\"abcdefghijklmnopqrstuvwxyz\", 1));\n if (!hasDigit) pw = replaceAt(pw, randomInt(len), randomString(\"0123456789\", 1));\n if (!hasSpecial) pw = replaceAt(pw, randomInt(len), randomString(\"!@#$%^&*()-_=+\", 1));\n\n return pw;\n }\n\n default:\n return randomBytes(32).toString(\"hex\");\n }\n}\n\nfunction replaceAt(str: string, index: number, char: string): string {\n return str.slice(0, index) + char + str.slice(index + 1);\n}\n\n/**\n * Estimate the entropy of a secret in bits.\n */\nexport function estimateEntropy(secret: string): number {\n const charsets = [\n { regex: /[a-z]/, size: 26 },\n { regex: /[A-Z]/, size: 26 },\n { regex: /[0-9]/, size: 10 },\n { regex: /[^A-Za-z0-9]/, size: 32 },\n ];\n\n let poolSize = 0;\n for (const { regex, size } of charsets) {\n if (regex.test(secret)) poolSize += size;\n }\n\n return poolSize > 0 ? Math.floor(Math.log2(poolSize) * secret.length) : 0;\n}\n","/**\n * Import module: parse .env files and bulk-store secrets into q-ring.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { setSecret, hasSecret, type SetSecretOptions } from \"./keyring.js\";\n\nexport interface ImportOptions {\n scope?: \"global\" | \"project\";\n projectPath?: string;\n env?: string;\n source?: \"cli\" | \"mcp\" | \"agent\" | \"api\";\n skipExisting?: boolean;\n dryRun?: boolean;\n}\n\nexport interface ImportResult {\n imported: string[];\n skipped: string[];\n total: number;\n}\n\n/**\n * Parse .env content into key-value pairs.\n * Handles comments, blank lines, quoted values, and basic multiline.\n */\nexport function parseDotenv(content: string): Map<string, string> {\n const result = new Map<string, string>();\n const lines = content.split(/\\r?\\n/);\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n\n if (!line || line.startsWith(\"#\")) continue;\n\n const eqIdx = line.indexOf(\"=\");\n if (eqIdx === -1) continue;\n\n const key = line.slice(0, eqIdx).trim();\n let value = line.slice(eqIdx + 1).trim();\n\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n const escapeMap: Record<string, string> = {\n n: \"\\n\", r: \"\\r\", t: \"\\t\", \"\\\\\": \"\\\\\", '\"': '\"',\n };\n value = value.replace(/\\\\([nrt\"\\\\])/g, (_, ch) => escapeMap[ch] ?? ch);\n\n if (value.includes(\"#\") && !line.includes('\"') && !line.includes(\"'\")) {\n value = value.split(\"#\")[0].trim();\n }\n\n if (key) result.set(key, value);\n }\n\n return result;\n}\n\n/**\n * Import secrets from a .env file path or raw content string.\n */\nexport function importDotenv(\n filePathOrContent: string,\n options: ImportOptions = {},\n): ImportResult {\n let content: string;\n\n try {\n content = readFileSync(filePathOrContent, \"utf8\");\n } catch {\n content = filePathOrContent;\n }\n\n const pairs = parseDotenv(content);\n const result: ImportResult = {\n imported: [],\n skipped: [],\n total: pairs.size,\n };\n\n for (const [key, value] of pairs) {\n if (options.skipExisting && hasSecret(key, {\n scope: options.scope,\n projectPath: options.projectPath,\n source: options.source ?? \"cli\",\n })) {\n result.skipped.push(key);\n continue;\n }\n\n if (options.dryRun) {\n result.imported.push(key);\n continue;\n }\n\n const setOpts: SetSecretOptions = {\n scope: options.scope ?? \"global\",\n projectPath: options.projectPath ?? process.cwd(),\n source: options.source ?? \"cli\",\n };\n\n setSecret(key, value, setOpts);\n result.imported.push(key);\n }\n\n return result;\n}\n","import { z } from \"zod\";\nimport type { KeyringOptions } from \"../../core/keyring.js\";\nimport type { Scope } from \"../../core/scope.js\";\nimport { checkToolPolicy } from \"../../core/policy.js\";\n\n/**\n * Standard MCP tool response shape for text content.\n * Set `isError: true` for failure responses so clients surface them appropriately.\n */\nexport function text(t: string, isError = false) {\n return {\n content: [{ type: \"text\" as const, text: t }],\n ...(isError ? { isError: true } : {}),\n };\n}\n\n/** Build `KeyringOptions` from MCP tool params with `source: \"mcp\"` baked in. */\nexport function opts(params: {\n scope?: string;\n projectPath?: string;\n env?: string;\n teamId?: string;\n orgId?: string;\n}): KeyringOptions {\n return {\n scope: params.scope as Scope | undefined,\n projectPath: params.projectPath ?? process.cwd(),\n teamId: params.teamId,\n orgId: params.orgId,\n env: params.env,\n source: \"mcp\",\n };\n}\n\n/**\n * Short-circuit guard: returns a \"Policy Denied\" text response if the tool\n * is blocked by project governance, else `null` to continue.\n */\nexport function enforceToolPolicy(toolName: string, projectPath?: string) {\n const decision = checkToolPolicy(toolName, projectPath);\n if (!decision.allowed) {\n return text(\n `Policy Denied: ${decision.reason} (source: ${decision.policySource})`,\n true,\n );\n }\n return null;\n}\n\n/** Reusable zod schemas for the common MCP tool parameters. */\nexport const commonSchemas = {\n teamId: z\n .string()\n .optional()\n .describe(\"Team identifier for team-scoped secrets\"),\n orgId: z\n .string()\n .optional()\n .describe(\"Org identifier for org-scoped secrets\"),\n scope: z\n .enum([\"global\", \"project\", \"team\", \"org\"])\n .optional()\n .describe(\"Scope: global, project, team, or org\"),\n projectPath: z\n .string()\n .optional()\n .describe(\"Project root path for project-scoped secrets\"),\n env: z\n .string()\n .optional()\n .describe(\"Environment for superposition collapse (e.g., dev, staging, prod)\"),\n} as const;\n","/**\n * Secret Liveness Validation: test if a secret is actually valid\n * with its target service using a pluggable provider system.\n */\n\nimport { httpRequest } from \"../utils/http-request.js\";\nimport { generateSecret, type NoiseFormat } from \"./noise.js\";\nimport { checkSSRF } from \"./ssrf.js\";\n\nexport interface ValidationResult {\n valid: boolean;\n status: \"valid\" | \"invalid\" | \"error\" | \"unknown\";\n message: string;\n latencyMs: number;\n provider: string;\n}\n\nexport interface Provider {\n name: string;\n description: string;\n /** Prefixes that auto-detect to this provider */\n prefixes?: string[];\n validate(value: string): Promise<ValidationResult>;\n}\n\nfunction makeRequest(\n url: string,\n headers: Record<string, string>,\n timeoutMs = 10000,\n): Promise<{ statusCode: number; body: string }> {\n return httpRequest({ url, method: \"GET\", headers, timeoutMs });\n}\n\nexport class ProviderRegistry {\n private providers = new Map<string, Provider>();\n\n register(provider: Provider): void {\n this.providers.set(provider.name, provider);\n }\n\n get(name: string): Provider | undefined {\n return this.providers.get(name);\n }\n\n detectProvider(\n value: string,\n hints?: { provider?: string; prefix?: string },\n ): Provider | undefined {\n if (hints?.provider) {\n return this.providers.get(hints.provider);\n }\n\n for (const provider of this.providers.values()) {\n if (provider.prefixes) {\n for (const pfx of provider.prefixes) {\n if (value.startsWith(pfx)) return provider;\n }\n }\n }\n\n return undefined;\n }\n\n listProviders(): Provider[] {\n return [...this.providers.values()];\n }\n}\n\n// ─── Built-in Providers ───\n\nconst openaiProvider: Provider = {\n name: \"openai\",\n description: \"OpenAI API key validation\",\n prefixes: [\"sk-\"],\n async validate(value: string): Promise<ValidationResult> {\n const start = Date.now();\n try {\n const { statusCode } = await makeRequest(\n \"https://api.openai.com/v1/models?limit=1\",\n {\n Authorization: `Bearer ${value}`,\n \"User-Agent\": \"q-ring-validator/1.0\",\n },\n );\n const latencyMs = Date.now() - start;\n\n if (statusCode === 200)\n return { valid: true, status: \"valid\", message: \"API key is valid\", latencyMs, provider: \"openai\" };\n if (statusCode === 401)\n return { valid: false, status: \"invalid\", message: \"Invalid or revoked API key\", latencyMs, provider: \"openai\" };\n if (statusCode === 429)\n return { valid: true, status: \"error\", message: \"Rate limited — key may be valid\", latencyMs, provider: \"openai\" };\n return { valid: false, status: \"error\", message: `Unexpected status ${statusCode}`, latencyMs, provider: \"openai\" };\n } catch (err) {\n return { valid: false, status: \"error\", message: `${err instanceof Error ? err.message : \"Network error\"}`, latencyMs: Date.now() - start, provider: \"openai\" };\n }\n },\n};\n\nconst stripeProvider: Provider = {\n name: \"stripe\",\n description: \"Stripe API key validation\",\n prefixes: [\"sk_live_\", \"sk_test_\", \"rk_live_\", \"rk_test_\", \"pk_live_\", \"pk_test_\"],\n async validate(value: string): Promise<ValidationResult> {\n const start = Date.now();\n try {\n const { statusCode } = await makeRequest(\n \"https://api.stripe.com/v1/balance\",\n {\n Authorization: `Bearer ${value}`,\n \"User-Agent\": \"q-ring-validator/1.0\",\n },\n );\n const latencyMs = Date.now() - start;\n\n if (statusCode === 200)\n return { valid: true, status: \"valid\", message: \"API key is valid\", latencyMs, provider: \"stripe\" };\n if (statusCode === 401)\n return { valid: false, status: \"invalid\", message: \"Invalid or revoked API key\", latencyMs, provider: \"stripe\" };\n if (statusCode === 429)\n return { valid: true, status: \"error\", message: \"Rate limited — key may be valid\", latencyMs, provider: \"stripe\" };\n return { valid: false, status: \"error\", message: `Unexpected status ${statusCode}`, latencyMs, provider: \"stripe\" };\n } catch (err) {\n return { valid: false, status: \"error\", message: `${err instanceof Error ? err.message : \"Network error\"}`, latencyMs: Date.now() - start, provider: \"stripe\" };\n }\n },\n};\n\nconst githubProvider: Provider = {\n name: \"github\",\n description: \"GitHub token validation\",\n prefixes: [\"ghp_\", \"gho_\", \"ghu_\", \"ghs_\", \"ghr_\", \"github_pat_\"],\n async validate(value: string): Promise<ValidationResult> {\n const start = Date.now();\n try {\n const { statusCode } = await makeRequest(\n \"https://api.github.com/user\",\n {\n Authorization: `token ${value}`,\n \"User-Agent\": \"q-ring-validator/1.0\",\n Accept: \"application/vnd.github+json\",\n },\n );\n const latencyMs = Date.now() - start;\n\n if (statusCode === 200)\n return { valid: true, status: \"valid\", message: \"Token is valid\", latencyMs, provider: \"github\" };\n if (statusCode === 401)\n return { valid: false, status: \"invalid\", message: \"Invalid or expired token\", latencyMs, provider: \"github\" };\n if (statusCode === 403)\n return { valid: false, status: \"invalid\", message: \"Token lacks required permissions\", latencyMs, provider: \"github\" };\n if (statusCode === 429)\n return { valid: true, status: \"error\", message: \"Rate limited — token may be valid\", latencyMs, provider: \"github\" };\n return { valid: false, status: \"error\", message: `Unexpected status ${statusCode}`, latencyMs, provider: \"github\" };\n } catch (err) {\n return { valid: false, status: \"error\", message: `${err instanceof Error ? err.message : \"Network error\"}`, latencyMs: Date.now() - start, provider: \"github\" };\n }\n },\n};\n\nconst awsProvider: Provider = {\n name: \"aws\",\n description: \"AWS access key validation (checks key format only — full STS validation requires secret key + region)\",\n prefixes: [\"AKIA\", \"ASIA\"],\n async validate(value: string): Promise<ValidationResult> {\n const start = Date.now();\n const latencyMs = Date.now() - start;\n\n if (/^(AKIA|ASIA)[A-Z0-9]{16}$/.test(value)) {\n return { valid: true, status: \"unknown\", message: \"Valid AWS access key format (STS validation requires secret key)\", latencyMs, provider: \"aws\" };\n }\n return { valid: false, status: \"invalid\", message: \"Invalid AWS access key format\", latencyMs, provider: \"aws\" };\n },\n};\n\nconst httpProvider: Provider = {\n name: \"http\",\n description: \"Generic HTTP endpoint validation\",\n async validate(value: string, url?: string): Promise<ValidationResult> {\n const start = Date.now();\n\n if (!url) {\n return { valid: false, status: \"unknown\", message: \"No validation URL configured\", latencyMs: 0, provider: \"http\" };\n }\n\n const ssrfBlock = await checkSSRF(url);\n if (ssrfBlock) {\n return { valid: false, status: \"error\", message: `SSRF blocked: ${ssrfBlock}`, latencyMs: Date.now() - start, provider: \"http\" };\n }\n\n try {\n const { statusCode } = await makeRequest(url, {\n Authorization: `Bearer ${value}`,\n \"User-Agent\": \"q-ring-validator/1.0\",\n });\n const latencyMs = Date.now() - start;\n\n if (statusCode >= 200 && statusCode < 300)\n return { valid: true, status: \"valid\", message: `Endpoint returned ${statusCode}`, latencyMs, provider: \"http\" };\n if (statusCode === 401 || statusCode === 403)\n return { valid: false, status: \"invalid\", message: `Authentication failed (${statusCode})`, latencyMs, provider: \"http\" };\n return { valid: false, status: \"error\", message: `Unexpected status ${statusCode}`, latencyMs, provider: \"http\" };\n } catch (err) {\n return { valid: false, status: \"error\", message: `${err instanceof Error ? err.message : \"Network error\"}`, latencyMs: Date.now() - start, provider: \"http\" };\n }\n },\n};\n\nexport const registry = new ProviderRegistry();\nregistry.register(openaiProvider);\nregistry.register(stripeProvider);\nregistry.register(githubProvider);\nregistry.register(awsProvider);\nregistry.register(httpProvider);\n\n/**\n * Validate a secret value against its detected or specified provider.\n */\nexport async function validateSecret(\n value: string,\n opts?: { provider?: string; validationUrl?: string },\n): Promise<ValidationResult> {\n const provider = opts?.provider\n ? registry.get(opts.provider)\n : registry.detectProvider(value);\n\n if (!provider) {\n return {\n valid: false,\n status: \"unknown\",\n message: \"No provider detected — set a provider in the manifest or secret metadata\",\n latencyMs: 0,\n provider: \"none\",\n };\n }\n\n if (provider.name === \"http\" && opts?.validationUrl) {\n return (provider as any).validate(value, opts.validationUrl);\n }\n\n return provider.validate(value);\n}\n\n// ─── Rotation Support ───\n\nexport interface RotationResult {\n rotated: boolean;\n provider: string;\n message: string;\n newValue?: string;\n}\n\nexport interface RotatableProvider extends Provider {\n rotate?(currentValue: string): Promise<RotationResult>;\n supportsRotation: boolean;\n}\n\n/**\n * Attempt provider-native rotation of a secret.\n * Falls back to local generation if the provider does not support native rotation.\n */\nexport async function rotateWithProvider(\n value: string,\n providerName?: string,\n): Promise<RotationResult> {\n const provider = providerName\n ? registry.get(providerName)\n : registry.detectProvider(value);\n\n if (!provider) {\n return { rotated: false, provider: \"none\", message: \"No provider detected for rotation\" };\n }\n\n const rotatable = provider as RotatableProvider;\n if (rotatable.supportsRotation && rotatable.rotate) {\n return rotatable.rotate(value);\n }\n\n // Fall back to local generation\n const format: NoiseFormat = \"api-key\";\n const newValue = generateSecret({ format, length: 48 });\n return {\n rotated: true,\n provider: provider.name,\n message: `Provider \"${provider.name}\" does not support native rotation — generated new value locally`,\n newValue,\n };\n}\n\n// ─── CI Scan ───\n\nexport interface CiScanResult {\n key: string;\n validation: ValidationResult;\n requiresRotation: boolean;\n}\n\n/**\n * CI-oriented batch validation: validates all secrets and returns\n * a structured report suitable for CI pipeline gating.\n */\nexport async function ciValidateBatch(\n secrets: { key: string; value: string; provider?: string; validationUrl?: string }[],\n): Promise<{ results: CiScanResult[]; allValid: boolean; failCount: number }> {\n const results: CiScanResult[] = [];\n\n for (const s of secrets) {\n const validation = await validateSecret(s.value, {\n provider: s.provider,\n validationUrl: s.validationUrl,\n });\n\n results.push({\n key: s.key,\n validation,\n requiresRotation: validation.status === \"invalid\",\n });\n }\n\n const failCount = results.filter((r) => !r.validation.valid).length;\n\n return { results, allValid: failCount === 0, failCount };\n}\n","/**\n * Self-Documenting Project Context for AI Agents\n *\n * Provides a safe, redacted view of the project's secrets, configuration,\n * and state without ever exposing actual secret values.\n */\n\nimport { listSecrets } from \"./keyring.js\";\nimport { collapseEnvironment, readProjectConfig } from \"./collapse.js\";\nimport { queryAudit } from \"./observer.js\";\nimport { listHooks } from \"./hooks.js\";\nimport { registry as providerRegistry } from \"./validate.js\";\nimport { registry as jitRegistry } from \"./provision.js\";\nimport type { KeyringOptions } from \"./keyring.js\";\n\nexport interface SecretSummary {\n key: string;\n scope: string;\n tags?: string[];\n description?: string;\n provider?: string;\n requiresApproval?: boolean;\n jitProvider?: string;\n hasStates: boolean;\n isExpired: boolean;\n isStale: boolean;\n timeRemaining: string | null;\n accessCount: number;\n lastAccessed: string | null;\n rotationFormat?: string;\n}\n\nexport interface ProjectContext {\n projectPath: string;\n environment: {\n env: string;\n source: string;\n } | null;\n secrets: SecretSummary[];\n totalSecrets: number;\n expiredCount: number;\n staleCount: number;\n protectedCount: number;\n manifest: {\n declared: number;\n missing: string[];\n } | null;\n validationProviders: string[];\n jitProviders: string[];\n hooksCount: number;\n recentActions: Array<{\n action: string;\n key?: string;\n source: string;\n timestamp: string;\n }>;\n}\n\nexport function getProjectContext(opts: KeyringOptions = {}): ProjectContext {\n const projectPath = opts.projectPath ?? process.cwd();\n const envResult = collapseEnvironment({ projectPath });\n\n const secretsList = listSecrets({\n ...opts,\n projectPath,\n silent: true,\n });\n\n let expiredCount = 0;\n let staleCount = 0;\n let protectedCount = 0;\n\n const secrets: SecretSummary[] = secretsList.map((entry) => {\n const meta = entry.envelope?.meta;\n const decay = entry.decay;\n\n if (decay?.isExpired) expiredCount++;\n if (decay?.isStale) staleCount++;\n if (meta?.requiresApproval) protectedCount++;\n\n return {\n key: entry.key,\n scope: entry.scope,\n tags: meta?.tags,\n description: meta?.description,\n provider: meta?.provider,\n requiresApproval: meta?.requiresApproval,\n jitProvider: meta?.jitProvider,\n hasStates: !!(entry.envelope?.states && Object.keys(entry.envelope.states).length > 0),\n isExpired: decay?.isExpired ?? false,\n isStale: decay?.isStale ?? false,\n timeRemaining: decay?.timeRemaining ?? null,\n accessCount: meta?.accessCount ?? 0,\n lastAccessed: meta?.lastAccessedAt ?? null,\n rotationFormat: meta?.rotationFormat,\n };\n });\n\n // Manifest analysis\n let manifest: ProjectContext[\"manifest\"] = null;\n const config = readProjectConfig(projectPath);\n if (config?.secrets) {\n const declaredKeys = Object.keys(config.secrets);\n const existingKeys = new Set(secrets.map((s) => s.key));\n const missing = declaredKeys.filter((k) => !existingKeys.has(k));\n manifest = { declared: declaredKeys.length, missing };\n }\n\n // Recent audit activity (last 20 events, redacted)\n const recentEvents = queryAudit({ limit: 20 });\n const recentActions = recentEvents.map((e) => ({\n action: e.action,\n key: e.key,\n source: e.source,\n timestamp: e.timestamp,\n }));\n\n return {\n projectPath,\n environment: envResult\n ? { env: envResult.env, source: envResult.source }\n : null,\n secrets,\n totalSecrets: secrets.length,\n expiredCount,\n staleCount,\n protectedCount,\n manifest,\n validationProviders: providerRegistry.listProviders().map((p) => p.name),\n jitProviders: jitRegistry.listProviders().map((p) => p.name),\n hooksCount: listHooks().length,\n recentActions,\n };\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getSecret, getEnvelope } from \"../../core/keyring.js\";\nimport { checkDecay } from \"../../core/envelope.js\";\nimport { collapseEnvironment, readProjectConfig } from \"../../core/collapse.js\";\nimport { getProjectContext } from \"../../core/context.js\";\nimport { text, opts, enforceToolPolicy, commonSchemas } from \"./_shared.js\";\n\nconst { teamId, orgId, scope, projectPath, env } = commonSchemas;\n\nexport function registerProjectTools(server: McpServer): void {\n server.tool(\n \"check_project\",\n \"[project] Validate project secrets against the .q-ring.json manifest. Returns which required secrets are present, missing, expired, or stale. Use this to verify project readiness.\",\n {\n projectPath,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"check_project\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const pp = params.projectPath ?? process.cwd();\n const config = readProjectConfig(pp);\n\n if (!config?.secrets || Object.keys(config.secrets).length === 0) {\n return text(\"No secrets manifest found in .q-ring.json\", true);\n }\n\n const results: Record<string, unknown>[] = [];\n let presentCount = 0;\n let missingCount = 0;\n let expiredCount = 0;\n let staleCount = 0;\n\n for (const [key, manifest] of Object.entries(config.secrets)) {\n const result = getEnvelope(key, { projectPath: pp, source: \"mcp\" });\n\n if (!result) {\n const status = manifest.required !== false ? \"missing\" : \"optional_missing\";\n if (manifest.required !== false) missingCount++;\n results.push({\n key,\n status,\n required: manifest.required !== false,\n description: manifest.description,\n });\n continue;\n }\n\n const decay = checkDecay(result.envelope);\n\n if (decay.isExpired) {\n expiredCount++;\n results.push({\n key,\n status: \"expired\",\n timeRemaining: decay.timeRemaining,\n description: manifest.description,\n });\n } else if (decay.isStale) {\n staleCount++;\n results.push({\n key,\n status: \"stale\",\n lifetimePercent: decay.lifetimePercent,\n timeRemaining: decay.timeRemaining,\n description: manifest.description,\n });\n } else {\n presentCount++;\n results.push({ key, status: \"ok\", description: manifest.description });\n }\n }\n\n const summary = {\n total: Object.keys(config.secrets).length,\n present: presentCount,\n missing: missingCount,\n expired: expiredCount,\n stale: staleCount,\n ready: missingCount === 0 && expiredCount === 0,\n secrets: results,\n };\n\n return text(JSON.stringify(summary, null, 2));\n },\n );\n\n server.tool(\n \"env_generate\",\n \"[project] Generate .env file content from the project manifest (.q-ring.json). Resolves each declared secret from q-ring, collapses superposition, and returns .env formatted output. Warns about missing or expired secrets.\",\n {\n projectPath,\n env,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"env_generate\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const pp = params.projectPath ?? process.cwd();\n const config = readProjectConfig(pp);\n\n if (!config?.secrets || Object.keys(config.secrets).length === 0) {\n return text(\"No secrets manifest found in .q-ring.json\", true);\n }\n\n const lines: string[] = [];\n const warnings: string[] = [];\n\n for (const [key, manifest] of Object.entries(config.secrets)) {\n const value = getSecret(key, {\n projectPath: pp,\n env: params.env,\n source: \"mcp\",\n });\n\n if (value === null) {\n if (manifest.required !== false) {\n warnings.push(`MISSING (required): ${key}`);\n }\n lines.push(`# ${key}=`);\n continue;\n }\n\n const result = getEnvelope(key, { projectPath: pp, source: \"mcp\" });\n if (result) {\n const decay = checkDecay(result.envelope);\n if (decay.isExpired) warnings.push(`EXPIRED: ${key}`);\n else if (decay.isStale) warnings.push(`STALE: ${key}`);\n }\n\n const escaped = value\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\");\n lines.push(`${key}=\"${escaped}\"`);\n }\n\n const output = lines.join(\"\\n\");\n const result =\n warnings.length > 0\n ? `${output}\\n\\n# Warnings:\\n${warnings.map((w) => `# ${w}`).join(\"\\n\")}`\n : output;\n\n return text(result);\n },\n );\n\n server.tool(\n \"detect_environment\",\n \"[project] Detect the current environment context (wavefunction collapse). Returns the detected environment and its source (NODE_ENV, git branch, project config, etc.).\",\n {\n projectPath,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\n \"detect_environment\",\n params.projectPath,\n );\n if (toolBlock) return toolBlock;\n\n const result = collapseEnvironment({\n projectPath: params.projectPath ?? process.cwd(),\n });\n\n if (!result) {\n return text(\n \"No environment detected. Set QRING_ENV, NODE_ENV, or create .q-ring.json\",\n );\n }\n\n return text(JSON.stringify(result, null, 2));\n },\n );\n\n server.tool(\n \"get_project_context\",\n \"[agent] Get a safe, redacted overview of the project's secrets, environment, manifest, providers, hooks, and recent audit activity. No secret values are ever exposed. Use this to understand what secrets exist before asking to read them.\",\n {\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\n \"get_project_context\",\n params.projectPath,\n );\n if (toolBlock) return toolBlock;\n\n const context = getProjectContext(opts(params));\n return text(JSON.stringify(context, null, 2));\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n tunnelCreate,\n tunnelRead,\n tunnelDestroy,\n tunnelList,\n} from \"../../core/tunnel.js\";\nimport { text, enforceToolPolicy } from \"./_shared.js\";\n\nexport function registerTunnelTools(server: McpServer): void {\n server.tool(\n \"tunnel_create\",\n \"[tunnel] Create an ephemeral secret that exists only in memory (quantum tunneling). Never persisted to disk. Optional TTL and max-reads for self-destruction.\",\n {\n value: z.string().describe(\"The secret value\"),\n ttlSeconds: z.number().optional().describe(\"Auto-expire after N seconds\"),\n maxReads: z.number().optional().describe(\"Self-destruct after N reads\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"tunnel_create\");\n if (toolBlock) return toolBlock;\n\n const id = tunnelCreate(params.value, {\n ttlSeconds: params.ttlSeconds,\n maxReads: params.maxReads,\n });\n return text(JSON.stringify({ ok: true, data: { id } }, null, 2));\n },\n );\n\n server.tool(\n \"tunnel_read\",\n \"[tunnel] Read an ephemeral tunneled secret by ID. May self-destruct if max-reads is reached.\",\n {\n id: z.string().describe(\"Tunnel ID\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"tunnel_read\");\n if (toolBlock) return toolBlock;\n\n const value = tunnelRead(params.id);\n if (value === null) {\n return text(`Tunnel \"${params.id}\" not found or expired`, true);\n }\n return text(\n JSON.stringify({ ok: true, data: { id: params.id, value } }, null, 2),\n );\n },\n );\n\n server.tool(\n \"tunnel_list\",\n \"[tunnel] List active tunneled secrets (IDs and metadata only, never values).\",\n {},\n async () => {\n const toolBlock = enforceToolPolicy(\"tunnel_list\");\n if (toolBlock) return toolBlock;\n\n const tunnels = tunnelList();\n if (tunnels.length === 0) return text(\"No active tunnels\");\n\n const lines = tunnels.map((t) => {\n const parts = [t.id];\n parts.push(`reads:${t.accessCount}`);\n if (t.maxReads) parts.push(`max:${t.maxReads}`);\n if (t.expiresAt) {\n const rem = Math.max(\n 0,\n Math.floor((t.expiresAt - Date.now()) / 1000),\n );\n parts.push(`expires:${rem}s`);\n }\n return parts.join(\" | \");\n });\n\n return text(lines.join(\"\\n\"));\n },\n );\n\n server.tool(\n \"tunnel_destroy\",\n \"[tunnel] Immediately destroy a tunneled secret.\",\n {\n id: z.string().describe(\"Tunnel ID\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"tunnel_destroy\");\n if (toolBlock) return toolBlock;\n\n const destroyed = tunnelDestroy(params.id);\n return text(\n destroyed ? `Destroyed ${params.id}` : `Tunnel \"${params.id}\" not found`,\n !destroyed,\n );\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n getSecret,\n setSecret,\n listSecrets,\n} from \"../../core/keyring.js\";\nimport { teleportPack, teleportUnpack } from \"../../core/teleport.js\";\nimport { text, opts, enforceToolPolicy, commonSchemas } from \"./_shared.js\";\n\nconst { teamId, orgId, scope, projectPath } = commonSchemas;\n\nexport function registerTeleportTools(server: McpServer): void {\n server.tool(\n \"teleport_pack\",\n \"[teleport] Pack secrets into an AES-256-GCM encrypted bundle for sharing between machines (quantum teleportation).\",\n {\n keys: z\n .array(z.string())\n .optional()\n .describe(\"Specific keys to pack (all if omitted)\"),\n passphrase: z.string().describe(\"Encryption passphrase\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"teleport_pack\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const o = opts(params);\n const entries = listSecrets(o);\n\n const secrets: { key: string; value: string; scope?: string }[] = [];\n for (const entry of entries) {\n if (params.keys && !params.keys.includes(entry.key)) continue;\n const value = getSecret(entry.key, { ...o, scope: entry.scope });\n if (value !== null) {\n secrets.push({ key: entry.key, value, scope: entry.scope });\n }\n }\n\n if (secrets.length === 0) return text(\"No secrets to pack\", true);\n\n const bundle = teleportPack(secrets, params.passphrase);\n return text(bundle);\n },\n );\n\n server.tool(\n \"teleport_unpack\",\n \"[teleport] Decrypt and import secrets from a teleport bundle.\",\n {\n bundle: z.string().describe(\"Base64-encoded encrypted bundle\"),\n passphrase: z.string().describe(\"Decryption passphrase\"),\n scope: scope.default(\"global\"),\n projectPath,\n teamId,\n orgId,\n dryRun: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Preview without importing\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"teleport_unpack\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n try {\n const payload = teleportUnpack(params.bundle, params.passphrase);\n\n if (params.dryRun) {\n const preview = payload.secrets\n .map((s) => `${s.key} [${s.scope ?? \"global\"}]`)\n .join(\"\\n\");\n return text(\n `Would import ${payload.secrets.length} secrets:\\n${preview}`,\n );\n }\n\n const o = opts(params);\n for (const s of payload.secrets) {\n setSecret(s.key, s.value, o);\n }\n\n return text(\n `Imported ${payload.secrets.length} secret(s) from teleport bundle`,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return text(JSON.stringify({ ok: false, error: { message: msg } }), true);\n }\n },\n );\n}\n","/**\n * Quantum Teleportation: securely share/transfer secrets between machines.\n *\n * Generates encrypted bundles that can be shared via any channel.\n * The recipient decrypts with a shared passphrase (out-of-band exchange).\n * Uses AES-256-GCM with PBKDF2-derived keys.\n */\n\nimport {\n randomBytes,\n createCipheriv,\n createDecipheriv,\n pbkdf2Sync,\n} from \"node:crypto\";\nimport { z } from \"zod\";\n\nconst ALGORITHM = \"aes-256-gcm\";\nconst KEY_LENGTH = 32;\n/** NIST / OpenSSL recommendation for AES-GCM (96-bit nonce). */\nconst IV_LENGTH = 12;\nconst SALT_LENGTH = 32;\nconst PBKDF2_ITERATIONS = 100000;\n\nexport interface TeleportBundle {\n /** Format version */\n v: 1;\n /** Base64-encoded encrypted payload */\n data: string;\n /** Base64-encoded salt for key derivation */\n salt: string;\n /** Base64-encoded initialization vector */\n iv: string;\n /** Base64-encoded auth tag */\n tag: string;\n /** ISO timestamp of creation */\n createdAt: string;\n /** Number of secrets in the bundle */\n count: number;\n}\n\nexport interface TeleportPayload {\n secrets: { key: string; value: string; scope?: string }[];\n exportedAt: string;\n exportedBy?: string;\n}\n\nexport const TeleportBundleSchema = z.object({\n v: z.literal(1),\n data: z.string(),\n salt: z.string(),\n iv: z.string(),\n tag: z.string(),\n createdAt: z.string(),\n count: z.number(),\n});\n\nexport const TeleportPayloadSchema = z.object({\n secrets: z.array(\n z.object({\n key: z.string(),\n value: z.string(),\n scope: z.string().optional(),\n }),\n ),\n exportedAt: z.string(),\n exportedBy: z.string().optional(),\n});\n\nfunction deriveKey(passphrase: string, salt: Buffer): Buffer {\n return pbkdf2Sync(passphrase, salt, PBKDF2_ITERATIONS, KEY_LENGTH, \"sha512\");\n}\n\n/**\n * Pack secrets into an encrypted teleport bundle.\n */\nexport function teleportPack(\n secrets: { key: string; value: string; scope?: string }[],\n passphrase: string,\n): string {\n const payload: TeleportPayload = {\n secrets,\n exportedAt: new Date().toISOString(),\n };\n\n const plaintext = JSON.stringify(payload);\n const salt = randomBytes(SALT_LENGTH);\n const iv = randomBytes(IV_LENGTH);\n const key = deriveKey(passphrase, salt);\n\n const cipher = createCipheriv(ALGORITHM, key, iv);\n const encrypted = Buffer.concat([\n cipher.update(plaintext, \"utf8\"),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n\n const bundle: TeleportBundle = {\n v: 1,\n data: encrypted.toString(\"base64\"),\n salt: salt.toString(\"base64\"),\n iv: iv.toString(\"base64\"),\n tag: tag.toString(\"base64\"),\n createdAt: new Date().toISOString(),\n count: secrets.length,\n };\n\n return Buffer.from(JSON.stringify(bundle)).toString(\"base64\");\n}\n\n/**\n * Unpack and decrypt a teleport bundle.\n */\nexport function teleportUnpack(\n encoded: string,\n passphrase: string,\n): TeleportPayload {\n let bundleJson: string;\n try {\n bundleJson = Buffer.from(encoded, \"base64\").toString(\"utf8\");\n } catch {\n throw new Error(\"ERR_TELEPORT_CORRUPT: invalid base64 bundle\");\n }\n\n let rawBundle: unknown;\n try {\n rawBundle = JSON.parse(bundleJson);\n } catch {\n throw new Error(\"ERR_TELEPORT_CORRUPT: bundle is not valid JSON\");\n }\n\n const parsedBundle = TeleportBundleSchema.safeParse(rawBundle);\n if (!parsedBundle.success) {\n throw new Error(\n `ERR_TELEPORT_CORRUPT: invalid bundle shape (${parsedBundle.error.message})`,\n );\n }\n const bundle = parsedBundle.data;\n\n const salt = Buffer.from(bundle.salt, \"base64\");\n const iv = Buffer.from(bundle.iv, \"base64\");\n const tag = Buffer.from(bundle.tag, \"base64\");\n const encrypted = Buffer.from(bundle.data, \"base64\");\n const key = deriveKey(passphrase, salt);\n\n const decipher = createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(tag);\n\n let decrypted: Buffer;\n try {\n decrypted = Buffer.concat([\n decipher.update(encrypted),\n decipher.final(),\n ]);\n } catch {\n throw new Error(\"ERR_TELEPORT_BAD_PASSPHRASE: decryption failed (wrong passphrase or corrupt data)\");\n }\n\n let rawPayload: unknown;\n try {\n rawPayload = JSON.parse(decrypted.toString(\"utf8\"));\n } catch {\n throw new Error(\"ERR_TELEPORT_CORRUPT: decrypted payload is not valid JSON\");\n }\n\n const payload = TeleportPayloadSchema.safeParse(rawPayload);\n if (!payload.success) {\n throw new Error(\n `ERR_TELEPORT_CORRUPT: invalid payload (${payload.error.message})`,\n );\n }\n return payload.data;\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { listSecrets } from \"../../core/keyring.js\";\nimport {\n queryAudit,\n detectAnomalies,\n verifyAuditChain,\n exportAudit,\n} from \"../../core/observer.js\";\nimport { text, opts, enforceToolPolicy, commonSchemas } from \"./_shared.js\";\n\nconst { teamId, orgId, scope, projectPath } = commonSchemas;\n\nexport function registerAuditTools(server: McpServer): void {\n server.tool(\n \"audit_log\",\n \"[audit] Query the audit log for secret access history (observer effect). Shows who accessed what and when.\",\n {\n key: z.string().optional().describe(\"Filter by key\"),\n action: z\n .enum([\n \"read\",\n \"write\",\n \"delete\",\n \"list\",\n \"export\",\n \"generate\",\n \"entangle\",\n \"tunnel\",\n \"teleport\",\n \"collapse\",\n ])\n .optional()\n .describe(\"Filter by action\"),\n limit: z.number().optional().default(20).describe(\"Max events to return\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"audit_log\");\n if (toolBlock) return toolBlock;\n\n const events = queryAudit({\n key: params.key,\n action: params.action,\n limit: params.limit,\n });\n\n if (events.length === 0) return text(\"No audit events found\");\n\n const lines = events.map((e) => {\n const parts = [e.timestamp, e.action];\n if (e.key) parts.push(e.key);\n if (e.scope) parts.push(`[${e.scope}]`);\n if (e.env) parts.push(`env:${e.env}`);\n if (e.detail) parts.push(e.detail);\n return parts.join(\" | \");\n });\n\n return text(lines.join(\"\\n\"));\n },\n );\n\n server.tool(\n \"detect_anomalies\",\n \"[audit] Read-only scan of audit history for burst reads and unusual-hour access (text lines per finding). Optional key filter. Use health_check for full decay inventory + anomaly count in scope; use agent_scan for multi-project JSON reports or optional auto-rotation. Does not mutate secrets.\",\n {\n key: z.string().optional().describe(\"Check anomalies for a specific key\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"detect_anomalies\");\n if (toolBlock) return toolBlock;\n\n const anomalies = detectAnomalies(params.key);\n if (anomalies.length === 0) return text(\"No anomalies detected\");\n\n const lines = anomalies.map((a) => `[${a.type}] ${a.description}`);\n return text(lines.join(\"\\n\"));\n },\n );\n\n server.tool(\n \"health_check\",\n \"[health] Read-only scoped pass: decay/stale/expired counts, per-secret issue lines, plus audit-derived anomalies. No writes. Use check_project for .q-ring.json manifest compliance; use detect_anomalies for audit-pattern-only triage; use agent_scan for multi-project JSON or optional autoRotate credential replacement.\",\n {\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"health_check\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const entries = listSecrets(opts(params));\n const anomalies = detectAnomalies();\n\n let healthy = 0;\n let stale = 0;\n let expired = 0;\n let noDecay = 0;\n const issues: string[] = [];\n\n for (const entry of entries) {\n if (!entry.decay?.timeRemaining) {\n noDecay++;\n continue;\n }\n if (entry.decay.isExpired) {\n expired++;\n issues.push(`EXPIRED: ${entry.key}`);\n } else if (entry.decay.isStale) {\n stale++;\n issues.push(\n `STALE: ${entry.key} (${entry.decay.lifetimePercent}%, ${entry.decay.timeRemaining} left)`,\n );\n } else {\n healthy++;\n }\n }\n\n const summary = [\n `Secrets: ${entries.length} total`,\n `Healthy: ${healthy} | Stale: ${stale} | Expired: ${expired} | No decay: ${noDecay}`,\n `Anomalies: ${anomalies.length}`,\n ];\n\n if (issues.length > 0) {\n summary.push(\"\", \"Issues:\", ...issues);\n }\n if (anomalies.length > 0) {\n summary.push(\n \"\",\n \"Anomalies:\",\n ...anomalies.map((a) => `[${a.type}] ${a.description}`),\n );\n }\n\n return text(summary.join(\"\\n\"));\n },\n );\n\n server.tool(\n \"verify_audit_chain\",\n \"[audit] Verify the tamper-evident hash chain of the audit log. Returns integrity status and the first break point if tampered.\",\n {},\n async () => {\n const toolBlock = enforceToolPolicy(\"verify_audit_chain\");\n if (toolBlock) return toolBlock;\n\n const result = verifyAuditChain();\n return text(JSON.stringify(result, null, 2));\n },\n );\n\n server.tool(\n \"export_audit\",\n \"[audit] Export audit events in a portable format (jsonl, json, or csv) with optional time range filtering.\",\n {\n since: z.string().optional().describe(\"Start date (ISO 8601)\"),\n until: z.string().optional().describe(\"End date (ISO 8601)\"),\n format: z\n .enum([\"jsonl\", \"json\", \"csv\"])\n .optional()\n .default(\"jsonl\")\n .describe(\"Output format\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"export_audit\");\n if (toolBlock) return toolBlock;\n\n const output = exportAudit({\n since: params.since,\n until: params.until,\n format: params.format,\n });\n return text(output);\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n getSecret,\n setSecret,\n getEnvelope,\n listSecrets,\n} from \"../../core/keyring.js\";\nimport type { Scope } from \"../../core/scope.js\";\nimport {\n validateSecret,\n rotateWithProvider,\n ciValidateBatch,\n registry as providerRegistry,\n} from \"../../core/validate.js\";\nimport { text, opts, enforceToolPolicy, commonSchemas } from \"./_shared.js\";\n\nconst { teamId, orgId, scope, projectPath } = commonSchemas;\n\nexport function registerValidationTools(server: McpServer): void {\n server.tool(\n \"validate_secret\",\n \"[validation] Test if a secret is actually valid with its target service (e.g., OpenAI, Stripe, GitHub). Uses provider auto-detection based on key prefixes, or accepts an explicit provider name. Never logs the secret value.\",\n {\n key: z.string().describe(\"The secret key name\"),\n provider: z\n .string()\n .optional()\n .describe(\"Force a specific provider (openai, stripe, github, aws, http)\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"validate_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const value = getSecret(params.key, opts(params));\n if (value === null) return text(`Secret \"${params.key}\" not found`, true);\n\n const envelope = getEnvelope(params.key, opts(params));\n const provHint = params.provider ?? envelope?.envelope.meta.provider;\n\n const result = await validateSecret(value, { provider: provHint });\n return text(JSON.stringify(result, null, 2));\n },\n );\n\n server.tool(\n \"list_providers\",\n \"[validation] List all available validation providers for secret liveness testing.\",\n {},\n async () => {\n const toolBlock = enforceToolPolicy(\"list_providers\");\n if (toolBlock) return toolBlock;\n\n const providers = providerRegistry.listProviders().map((p) => ({\n name: p.name,\n description: p.description,\n prefixes: p.prefixes ?? [],\n }));\n return text(JSON.stringify(providers, null, 2));\n },\n );\n\n server.tool(\n \"rotate_secret\",\n \"[validation] Attempt issuer-native rotation of a secret via its detected or specified provider. Returns rotation result.\",\n {\n key: z.string().describe(\"The secret key to rotate\"),\n provider: z.string().optional().describe(\"Force a specific provider\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"rotate_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const value = getSecret(params.key, opts(params));\n if (!value) return text(`Secret \"${params.key}\" not found`, true);\n\n const result = await rotateWithProvider(value, params.provider);\n if (result.rotated && result.newValue) {\n setSecret(params.key, result.newValue, {\n scope: (params.scope as Scope) ?? \"global\",\n projectPath: params.projectPath,\n source: \"mcp\",\n });\n }\n return text(JSON.stringify(result, null, 2));\n },\n );\n\n server.tool(\n \"ci_validate_secrets\",\n \"[validation] CI-oriented batch validation: validates all accessible secrets against their providers and returns a structured pass/fail report.\",\n {\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\n \"ci_validate_secrets\",\n params.projectPath,\n );\n if (toolBlock) return toolBlock;\n\n const entries = listSecrets(opts(params));\n const secrets = entries\n .map((e) => {\n const val = getSecret(e.key, {\n ...opts(params),\n scope: e.scope,\n silent: true,\n });\n if (!val) return null;\n return {\n key: e.key,\n value: val,\n provider: e.envelope?.meta.provider,\n validationUrl: e.envelope?.meta.validationUrl,\n };\n })\n .filter((s): s is NonNullable<typeof s> => s !== null);\n\n if (secrets.length === 0) return text(\"No secrets to validate\");\n\n const report = await ciValidateBatch(secrets);\n return text(JSON.stringify(report, null, 2));\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n registerHook,\n removeHook,\n listHooks as listAllHooks,\n type HookType,\n type HookAction,\n} from \"../../core/hooks.js\";\nimport { text, enforceToolPolicy } from \"./_shared.js\";\n\nexport function registerHookTools(server: McpServer): void {\n server.tool(\n \"register_hook\",\n \"[hooks] Register a webhook/callback that fires when a secret is updated, deleted, or rotated. Supports shell commands, HTTP webhooks, and process signals.\",\n {\n type: z.enum([\"shell\", \"http\", \"signal\"]).describe(\"Hook type\"),\n key: z.string().optional().describe(\"Trigger on exact key match\"),\n keyPattern: z\n .string()\n .optional()\n .describe(\"Trigger on key glob pattern (e.g. DB_*)\"),\n tag: z.string().optional().describe(\"Trigger on secrets with this tag\"),\n scope: z\n .enum([\"global\", \"project\"])\n .optional()\n .describe(\"Trigger only for this scope\"),\n actions: z\n .array(z.enum([\"write\", \"delete\", \"rotate\"]))\n .optional()\n .default([\"write\", \"delete\", \"rotate\"])\n .describe(\"Which actions trigger this hook\"),\n command: z\n .string()\n .optional()\n .describe(\"Shell command to execute (for shell type)\"),\n url: z.string().optional().describe(\"URL to POST to (for http type)\"),\n signalTarget: z\n .string()\n .optional()\n .describe(\"Process name or PID (for signal type)\"),\n signalName: z\n .string()\n .optional()\n .default(\"SIGHUP\")\n .describe(\"Signal to send (for signal type)\"),\n description: z.string().optional().describe(\"Human-readable description\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"register_hook\");\n if (toolBlock) return toolBlock;\n\n if (!params.key && !params.keyPattern && !params.tag) {\n return text(\n \"At least one match criterion required: key, keyPattern, or tag\",\n true,\n );\n }\n\n const entry = registerHook({\n type: params.type as HookType,\n match: {\n key: params.key,\n keyPattern: params.keyPattern,\n tag: params.tag,\n scope: params.scope as \"global\" | \"project\" | undefined,\n action: params.actions as HookAction[],\n },\n command: params.command,\n url: params.url,\n signal: params.signalTarget\n ? { target: params.signalTarget, signal: params.signalName }\n : undefined,\n description: params.description,\n enabled: true,\n });\n\n return text(JSON.stringify(entry, null, 2));\n },\n );\n\n server.tool(\n \"list_hooks\",\n \"[hooks] List all registered secret change hooks with their match criteria, type, and status.\",\n {},\n async () => {\n const toolBlock = enforceToolPolicy(\"list_hooks\");\n if (toolBlock) return toolBlock;\n\n const hooks = listAllHooks();\n if (hooks.length === 0) return text(\"No hooks registered\");\n return text(JSON.stringify(hooks, null, 2));\n },\n );\n\n server.tool(\n \"remove_hook\",\n \"[hooks] Remove a lifecycle hook entry by id from the hook registry only (stops callbacks; does not touch secret values). Call list_hooks first for ids. Contrast delete_secret (credential removal) or tunnel_destroy (ephemeral tunnel). Returns success or not-found; subject to tool policy.\",\n {\n id: z.string().describe(\"Hook ID to remove\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"remove_hook\");\n if (toolBlock) return toolBlock;\n\n const removed = removeHook(params.id);\n return text(\n removed ? `Removed hook ${params.id}` : `Hook \"${params.id}\" not found`,\n !removed,\n );\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { listSecrets } from \"../../core/keyring.js\";\nimport { runHealthScan } from \"../../core/agent.js\";\nimport { queryAudit } from \"../../core/observer.js\";\nimport { execCommand } from \"../../core/exec.js\";\nimport { scanCodebase } from \"../../core/scan.js\";\nimport { lintFiles } from \"../../core/linter.js\";\nimport { checkExecPolicy } from \"../../core/policy.js\";\nimport { text, opts, enforceToolPolicy, commonSchemas } from \"./_shared.js\";\n\nconst { teamId, orgId, scope, projectPath } = commonSchemas;\n\nexport function registerToolingTools(server: McpServer): void {\n server.tool(\n \"exec_with_secrets\",\n \"[exec] Run a shell command securely. Project secrets are injected into the environment, and any secret values in the output are automatically redacted to prevent leaking into transcripts.\",\n {\n command: z.string().describe(\"Command to run\"),\n args: z.array(z.string()).optional().describe(\"Command arguments\"),\n keys: z\n .array(z.string())\n .optional()\n .describe(\"Only inject these specific keys\"),\n tags: z\n .array(z.string())\n .optional()\n .describe(\"Only inject secrets with these tags\"),\n profile: z\n .enum([\"unrestricted\", \"restricted\", \"ci\"])\n .optional()\n .default(\"restricted\")\n .describe(\"Exec profile: unrestricted, restricted, or ci\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"exec_with_secrets\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const execBlock = checkExecPolicy(params.command, params.projectPath);\n if (!execBlock.allowed) {\n return text(`Policy Denied: ${execBlock.reason}`, true);\n }\n\n try {\n const result = await execCommand({\n command: params.command,\n args: params.args ?? [],\n keys: params.keys,\n tags: params.tags,\n profile: params.profile,\n scope: params.scope,\n projectPath: params.projectPath,\n source: \"mcp\",\n captureOutput: true,\n });\n\n const output: string[] = [];\n output.push(`Exit code: ${result.code}`);\n if (result.stdout) output.push(`STDOUT:\\n${result.stdout}`);\n if (result.stderr) output.push(`STDERR:\\n${result.stderr}`);\n\n return text(output.join(\"\\n\\n\"));\n } catch (err) {\n return text(\n `Execution failed: ${err instanceof Error ? err.message : String(err)}`,\n true,\n );\n }\n },\n );\n\n server.tool(\n \"scan_codebase_for_secrets\",\n \"[scan] Scan a directory for hardcoded secrets using regex heuristics and Shannon entropy analysis. Returns file paths, line numbers, and the matched key/value to help migrate legacy codebases into q-ring.\",\n {\n dirPath: z\n .string()\n .describe(\"Absolute or relative path to the directory to scan\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"scan_codebase_for_secrets\");\n if (toolBlock) return toolBlock;\n\n try {\n const results = scanCodebase(params.dirPath);\n if (results.length === 0) {\n return text(\"No hardcoded secrets found in the specified directory.\");\n }\n return text(JSON.stringify(results, null, 2));\n } catch (err) {\n return text(\n `Scan failed: ${err instanceof Error ? err.message : String(err)}`,\n true,\n );\n }\n },\n );\n\n server.tool(\n \"lint_files\",\n \"[scan] Scan specific files for hardcoded secrets. Optionally auto-fix by replacing them with process.env references and storing the values in q-ring.\",\n {\n files: z.array(z.string()).describe(\"File paths to lint\"),\n fix: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Auto-replace and store secrets\"),\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"lint_files\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n try {\n const results = lintFiles(params.files, {\n fix: params.fix,\n scope: params.scope as \"global\" | \"project\" | undefined,\n projectPath: params.projectPath,\n });\n if (results.length === 0) {\n return text(\"No hardcoded secrets found in the specified files.\");\n }\n return text(JSON.stringify(results, null, 2));\n } catch (err) {\n return text(\n `Lint failed: ${err instanceof Error ? err.message : String(err)}`,\n true,\n );\n }\n },\n );\n\n server.tool(\n \"analyze_secrets\",\n \"[agent] Analyze secret usage patterns and provide optimization suggestions including most accessed, stale, unused, and rotation recommendations.\",\n {\n scope,\n projectPath,\n teamId,\n orgId,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"analyze_secrets\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const o = opts(params);\n const entries = listSecrets({ ...o, silent: true });\n const audit = queryAudit({ limit: 500 });\n\n const accessMap = new Map<string, number>();\n for (const e of audit) {\n if (e.action === \"read\" && e.key) {\n accessMap.set(e.key, (accessMap.get(e.key) || 0) + 1);\n }\n }\n\n const analysis = {\n total: entries.length,\n expired: entries.filter((e) => e.decay?.isExpired).length,\n stale: entries.filter((e) => e.decay?.isStale && !e.decay?.isExpired)\n .length,\n neverAccessed: entries\n .filter((e) => (e.envelope?.meta.accessCount ?? 0) === 0)\n .map((e) => e.key),\n noRotationFormat: entries\n .filter((e) => !e.envelope?.meta.rotationFormat)\n .map((e) => e.key),\n mostAccessed: [...accessMap.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([key, count]) => ({ key, reads: count })),\n };\n\n return text(JSON.stringify(analysis, null, 2));\n },\n );\n\n // One process-scoped instance; reusing across tool invocations avoids\n // leaking listeners when the MCP client pings `status_dashboard` twice.\n let dashboardInstance: { port: number; close: () => void } | null = null;\n\n server.tool(\n \"status_dashboard\",\n \"[dashboard] Launch the quantum status dashboard — a local SSE-driven web page showing live KPIs (secrets, env, protected, approvals, hooks, 24h reads, anomalies), health summary, environment, .q-ring.json manifest gaps, governance policy summary, sortable searchable secrets table, decay/superposition/entanglement/tunnel cards, active approvals & hooks, agent memory, anomaly alerts, and a filterable 24h audit feed. Returns the URL to open in a browser. Never exposes secret values.\",\n {\n port: z.number().optional().default(9876).describe(\"Port to serve on\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"status_dashboard\");\n if (toolBlock) return toolBlock;\n\n if (dashboardInstance) {\n return text(\n `Dashboard already running at http://127.0.0.1:${dashboardInstance.port}`,\n );\n }\n\n const { startDashboardServer } = await import(\"../../core/dashboard.js\");\n dashboardInstance = startDashboardServer({ port: params.port });\n\n return text(\n `Dashboard started at http://127.0.0.1:${dashboardInstance.port}\\nOpen this URL in a browser to see live quantum status.`,\n );\n },\n );\n\n server.tool(\n \"agent_scan\",\n \"[agent] Multi-project health pass: decay, staleness, audit anomalies, manifest gaps; returns JSON. Prefer health_check for a read-only scoped decay/anomaly text summary (no writes). Prefer detect_anomalies for audit-pattern spikes on one key. With autoRotate=true, overwrites expired secret values in the keyring (credential change—not undoable); leave false unless intentional rotation. Same policy gates as other MCP tools; no separate external auth.\",\n {\n autoRotate: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Auto-rotate expired secrets with generated values\"),\n projectPaths: z\n .array(z.string())\n .optional()\n .describe(\"Project paths to monitor\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"agent_scan\");\n if (toolBlock) return toolBlock;\n\n const report = runHealthScan({\n autoRotate: params.autoRotate,\n projectPaths: params.projectPaths ?? [process.cwd()],\n });\n return text(JSON.stringify(report, null, 2));\n },\n );\n}\n","/**\n * Minimal ANSI color helpers. No dependencies.\n */\n\nconst enabled = process.stdout.isTTY !== false && !process.env.NO_COLOR;\n\nfunction wrap(code: string, text: string): string {\n return enabled ? `\\x1b[${code}m${text}\\x1b[0m` : text;\n}\n\nexport const c = {\n bold: (t: string) => wrap(\"1\", t),\n dim: (t: string) => wrap(\"2\", t),\n italic: (t: string) => wrap(\"3\", t),\n underline: (t: string) => wrap(\"4\", t),\n\n red: (t: string) => wrap(\"31\", t),\n green: (t: string) => wrap(\"32\", t),\n yellow: (t: string) => wrap(\"33\", t),\n blue: (t: string) => wrap(\"34\", t),\n magenta: (t: string) => wrap(\"35\", t),\n cyan: (t: string) => wrap(\"36\", t),\n white: (t: string) => wrap(\"37\", t),\n gray: (t: string) => wrap(\"90\", t),\n\n bgRed: (t: string) => wrap(\"41\", t),\n bgGreen: (t: string) => wrap(\"42\", t),\n bgYellow: (t: string) => wrap(\"43\", t),\n bgBlue: (t: string) => wrap(\"44\", t),\n bgMagenta: (t: string) => wrap(\"45\", t),\n bgCyan: (t: string) => wrap(\"46\", t),\n};\n\nexport function scopeColor(scope: string): string {\n return scope === \"project\" ? c.cyan(scope) : c.blue(scope);\n}\n\nexport function decayIndicator(percent: number, expired: boolean): string {\n if (expired) return c.bgRed(c.white(\" EXPIRED \"));\n if (percent >= 90) return c.red(`[decay ${percent}%]`);\n if (percent >= 75) return c.yellow(`[decay ${percent}%]`);\n if (percent > 0) return c.green(`[decay ${percent}%]`);\n return \"\";\n}\n\nexport function envBadge(env: string): string {\n switch (env) {\n case \"prod\":\n return c.bgRed(c.white(` ${env} `));\n case \"staging\":\n return c.bgYellow(c.white(` ${env} `));\n case \"dev\":\n return c.bgGreen(c.white(` ${env} `));\n case \"test\":\n return c.bgBlue(c.white(` ${env} `));\n default:\n return c.bgMagenta(c.white(` ${env} `));\n }\n}\n\nexport const SYMBOLS = {\n check: enabled ? \"\\u2713\" : \"[ok]\",\n cross: enabled ? \"\\u2717\" : \"[x]\",\n arrow: enabled ? \"\\u2192\" : \"->\",\n dot: enabled ? \"\\u2022\" : \"*\",\n lock: enabled ? \"\\u{1f512}\" : \"[locked]\",\n key: enabled ? \"\\u{1f511}\" : \"[key]\",\n link: enabled ? \"\\u{1f517}\" : \"[link]\",\n warning: enabled ? \"\\u26a0\\ufe0f\" : \"[!]\",\n clock: enabled ? \"\\u23f0\" : \"[time]\",\n shield: enabled ? \"\\u{1f6e1}\\ufe0f\" : \"[shield]\",\n zap: enabled ? \"\\u26a1\" : \"[zap]\",\n eye: enabled ? \"\\u{1f441}\\ufe0f\" : \"[eye]\",\n ghost: enabled ? \"\\u{1f47b}\" : \"[ghost]\",\n package: enabled ? \"\\u{1f4e6}\" : \"[pkg]\",\n sparkle: enabled ? \"\\u2728\" : \"[*]\",\n} as const;\n","/**\n * Quantum Agent: autonomous background monitor for secret health.\n *\n * Runs as a long-lived process that periodically:\n * - Checks for expired/stale secrets (decay monitoring)\n * - Detects access anomalies (observer analysis)\n * - Logs health reports\n * - Can trigger rotation callbacks\n *\n * Designed to run as `qring agent` or be invoked by the MCP server.\n */\n\nimport { listSecrets, setSecret } from \"./keyring.js\";\nimport { checkDecay } from \"./envelope.js\";\nimport { detectAnomalies, logAudit } from \"./observer.js\";\nimport { generateSecret } from \"./noise.js\";\nimport { fireHooks } from \"./hooks.js\";\nimport { c, SYMBOLS } from \"../utils/colors.js\";\n\nexport interface AgentConfig {\n /** Check interval in seconds (default: 60) */\n intervalSeconds: number;\n /** Auto-rotate expired secrets with generated values */\n autoRotate: boolean;\n /** Project paths to monitor */\n projectPaths: string[];\n /** Verbose output */\n verbose: boolean;\n}\n\nexport interface AgentReport {\n timestamp: string;\n totalSecrets: number;\n healthy: number;\n stale: number;\n expired: number;\n anomalies: number;\n rotated: string[];\n warnings: string[];\n}\n\nfunction defaultConfig(): AgentConfig {\n return {\n intervalSeconds: 60,\n autoRotate: false,\n projectPaths: [process.cwd()],\n verbose: false,\n };\n}\n\nexport function runHealthScan(config: Partial<AgentConfig> = {}): AgentReport {\n const cfg = { ...defaultConfig(), ...config };\n\n const report: AgentReport = {\n timestamp: new Date().toISOString(),\n totalSecrets: 0,\n healthy: 0,\n stale: 0,\n expired: 0,\n anomalies: 0,\n rotated: [],\n warnings: [],\n };\n\n // Scan global scope\n const globalEntries = listSecrets({ scope: \"global\", source: \"agent\" });\n\n // Scan project scopes\n const projectEntries = cfg.projectPaths.flatMap((pp) =>\n listSecrets({ scope: \"project\", projectPath: pp, source: \"agent\" }),\n );\n\n const allEntries = [...globalEntries, ...projectEntries];\n report.totalSecrets = allEntries.length;\n\n for (const entry of allEntries) {\n if (!entry.envelope) continue;\n\n const decay = checkDecay(entry.envelope);\n\n if (decay.isExpired) {\n report.expired++;\n report.warnings.push(\n `EXPIRED: ${entry.key} [${entry.scope}] — expired ${decay.timeRemaining}`,\n );\n\n if (cfg.autoRotate) {\n const fmt = (entry.envelope?.meta.rotationFormat ?? \"api-key\") as import(\"./noise.js\").NoiseFormat;\n const prefix = entry.envelope?.meta.rotationPrefix;\n const newValue = generateSecret({ format: fmt, prefix });\n setSecret(entry.key, newValue, {\n scope: entry.scope,\n projectPath: cfg.projectPaths[0],\n source: \"agent\",\n });\n report.rotated.push(entry.key);\n logAudit({\n action: \"write\",\n key: entry.key,\n scope: entry.scope,\n source: \"agent\",\n detail: \"auto-rotated by agent (expired)\",\n });\n fireHooks({\n action: \"rotate\",\n key: entry.key,\n scope: entry.scope,\n timestamp: new Date().toISOString(),\n source: \"agent\",\n }, entry.envelope?.meta.tags).catch(() => {});\n }\n } else if (decay.isStale) {\n report.stale++;\n report.warnings.push(\n `STALE: ${entry.key} [${entry.scope}] — ${decay.lifetimePercent}% lifetime, ${decay.timeRemaining} remaining`,\n );\n } else {\n report.healthy++;\n }\n }\n\n // Check for anomalies\n const anomalies = detectAnomalies();\n report.anomalies = anomalies.length;\n for (const a of anomalies) {\n report.warnings.push(`ANOMALY [${a.type}]: ${a.description}`);\n }\n\n return report;\n}\n\nfunction formatReport(report: AgentReport, verbose: boolean): string {\n const lines: string[] = [];\n\n lines.push(\n `${c.bold(`${SYMBOLS.shield} q-ring agent scan`)} ${c.dim(report.timestamp)}`,\n );\n lines.push(\n ` ${c.dim(\"secrets:\")} ${report.totalSecrets} ${c.green(`${SYMBOLS.check} ${report.healthy}`)} ${c.yellow(`${SYMBOLS.warning} ${report.stale}`)} ${c.red(`${SYMBOLS.cross} ${report.expired}`)} ${c.dim(`anomalies: ${report.anomalies}`)}`,\n );\n\n if (report.rotated.length > 0) {\n lines.push(\n ` ${c.cyan(`${SYMBOLS.zap} auto-rotated:`)} ${report.rotated.join(\", \")}`,\n );\n }\n\n if (verbose && report.warnings.length > 0) {\n lines.push(\"\");\n for (const w of report.warnings) {\n if (w.startsWith(\"EXPIRED\")) lines.push(` ${c.red(w)}`);\n else if (w.startsWith(\"STALE\")) lines.push(` ${c.yellow(w)}`);\n else if (w.startsWith(\"ANOMALY\")) lines.push(` ${c.magenta(w)}`);\n else lines.push(` ${w}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Run the agent as a continuous background monitor.\n */\nexport async function startAgent(config: Partial<AgentConfig> = {}): Promise<void> {\n const cfg = { ...defaultConfig(), ...config };\n\n console.log(\n `${c.bold(`${SYMBOLS.zap} q-ring agent started`)} ${c.dim(`(interval: ${cfg.intervalSeconds}s, auto-rotate: ${cfg.autoRotate})`)}`,\n );\n console.log(\n c.dim(` monitoring: global + ${cfg.projectPaths.length} project(s)`),\n );\n console.log();\n\n const scan = () => {\n const report = runHealthScan(cfg);\n console.log(formatReport(report, cfg.verbose));\n\n if (report.warnings.length > 0 || cfg.verbose) {\n console.log();\n }\n };\n\n // Initial scan\n scan();\n\n // Continuous monitoring\n const interval = setInterval(scan, cfg.intervalSeconds * 1000);\n\n // Graceful shutdown\n const shutdown = () => {\n clearInterval(interval);\n console.log(`\\n${c.dim(\"q-ring agent stopped\")}`);\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Keep alive\n await new Promise(() => {});\n}\n","/**\n * Secure Execution & Auto-Redaction\n *\n * Runs child processes with project secrets injected into the environment.\n * Captures stdout/stderr and redacts any known secret values before they\n * are printed to the terminal or returned to the MCP agent.\n *\n * Exec profiles restrict which commands may be run, with optional\n * network and timeout controls.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { Transform } from \"node:stream\";\nimport { listSecrets, getSecret, type KeyringOptions } from \"./keyring.js\";\nimport { checkDecay } from \"./envelope.js\";\nimport { checkExecPolicy, getExecMaxRuntime } from \"./policy.js\";\n\nexport interface ExecProfile {\n name: string;\n allowCommands?: string[];\n denyCommands?: string[];\n maxRuntimeSeconds?: number;\n allowNetwork?: boolean;\n stripEnvVars?: string[];\n}\n\nconst BUILTIN_PROFILES: Record<string, ExecProfile> = {\n unrestricted: { name: \"unrestricted\" },\n restricted: {\n name: \"restricted\",\n denyCommands: [\"curl\", \"wget\", \"ssh\", \"scp\", \"nc\", \"netcat\", \"ncat\"],\n maxRuntimeSeconds: 30,\n allowNetwork: false,\n stripEnvVars: [\"HTTP_PROXY\", \"HTTPS_PROXY\", \"ALL_PROXY\"],\n },\n ci: {\n name: \"ci\",\n maxRuntimeSeconds: 300,\n allowNetwork: true,\n denyCommands: [\"rm -rf /\", \"mkfs\", \"dd if=\"],\n },\n};\n\nexport function getProfile(name?: string): ExecProfile {\n if (!name) return BUILTIN_PROFILES.unrestricted;\n return BUILTIN_PROFILES[name] ?? { name };\n}\n\nexport function listProfiles(): ExecProfile[] {\n return Object.values(BUILTIN_PROFILES);\n}\n\nexport interface ExecOptions extends KeyringOptions {\n tags?: string[];\n keys?: string[];\n command: string;\n args: string[];\n /** If true, return output as string instead of piping to process.stdout */\n captureOutput?: boolean;\n /** Exec profile name (unrestricted, restricted, ci) */\n profile?: string;\n}\n\nexport interface ExecResult {\n code: number;\n stdout: string;\n stderr: string;\n}\n\nexport class RedactionTransform extends Transform {\n private patterns: { value: string; replacement: string }[] = [];\n private tail: string = \"\";\n private maxLen: number = 0;\n\n constructor(secretsToRedact: string[]) {\n super();\n // Only redact secrets > 5 chars to avoid destroying output\n const validSecrets = secretsToRedact.filter((s) => s.length > 5);\n // Sort by length descending to match longest first\n validSecrets.sort((a, b) => b.length - a.length);\n\n this.patterns = validSecrets.map((s) => ({\n value: s,\n replacement: \"[QRING:REDACTED]\",\n }));\n\n if (validSecrets.length > 0) {\n this.maxLen = validSecrets[0].length;\n }\n }\n\n _transform(chunk: Buffer | string, _encoding: string, callback: () => void) {\n if (this.patterns.length === 0) {\n this.push(chunk);\n return callback();\n }\n\n const text = this.tail + chunk.toString();\n let redacted = text;\n\n for (const { value, replacement } of this.patterns) {\n redacted = redacted.split(value).join(replacement);\n }\n\n if (redacted.length < this.maxLen) {\n this.tail = redacted;\n return callback();\n }\n\n const outputLen = redacted.length - this.maxLen + 1;\n const output = redacted.slice(0, outputLen);\n this.tail = redacted.slice(outputLen);\n\n this.push(output);\n callback();\n }\n\n _flush(callback: () => void) {\n if (this.tail) {\n let final = this.tail;\n for (const { value, replacement } of this.patterns) {\n final = final.split(value).join(replacement);\n }\n this.push(final);\n }\n callback();\n }\n}\n\nexport async function execCommand(opts: ExecOptions): Promise<ExecResult> {\n const profile = getProfile(opts.profile);\n const fullCommand = [opts.command, ...opts.args].join(\" \");\n\n const policyDecision = checkExecPolicy(fullCommand, opts.projectPath);\n if (!policyDecision.allowed) {\n throw new Error(`Policy Denied: ${policyDecision.reason}`);\n }\n\n if (profile.denyCommands) {\n const denied = profile.denyCommands.find((d) => {\n const pattern = new RegExp(`(^|[\\\\s/])${d.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}(\\\\s|$)`, \"i\");\n return pattern.test(fullCommand);\n });\n if (denied) {\n throw new Error(`Exec profile \"${profile.name}\" denies command containing \"${denied}\"`);\n }\n }\n if (profile.allowCommands) {\n const allowed = profile.allowCommands.some((a) => fullCommand.startsWith(a));\n if (!allowed) {\n throw new Error(`Exec profile \"${profile.name}\" does not allow command \"${opts.command}\"`);\n }\n }\n\n const envMap: Record<string, string> = {};\n for (const [k, v] of Object.entries(process.env)) {\n if (v !== undefined) envMap[k] = v;\n }\n\n if (profile.stripEnvVars) {\n for (const key of profile.stripEnvVars) {\n delete envMap[key];\n }\n }\n\n const secretsToRedact = new Set<string>();\n\n let entries = listSecrets({\n scope: opts.scope,\n projectPath: opts.projectPath,\n source: opts.source ?? \"cli\",\n silent: true, // list silently\n });\n\n if (opts.keys?.length) {\n const keySet = new Set(opts.keys);\n entries = entries.filter((e) => keySet.has(e.key));\n }\n\n if (opts.tags?.length) {\n entries = entries.filter((e) =>\n opts.tags!.some((t) => e.envelope?.meta.tags?.includes(t)),\n );\n }\n\n for (const entry of entries) {\n if (entry.envelope) {\n const decay = checkDecay(entry.envelope);\n if (decay.isExpired) continue;\n }\n\n const val = getSecret(entry.key, {\n scope: entry.scope,\n projectPath: opts.projectPath,\n env: opts.env,\n source: opts.source ?? \"cli\",\n silent: false, // Log access for execution\n });\n\n if (val !== null) {\n envMap[entry.key] = val;\n if (val.length > 5) {\n secretsToRedact.add(val);\n }\n }\n }\n\n const maxRuntime = profile.maxRuntimeSeconds ?? getExecMaxRuntime(opts.projectPath);\n\n return new Promise((resolve, reject) => {\n // Enforce network restrictions for profiles that disallow network access.\n const networkTools = new Set([\n \"curl\", \"wget\", \"ping\", \"nc\", \"netcat\", \"ssh\", \"telnet\", \"ftp\", \"dig\", \"nslookup\",\n ]);\n\n if (profile.allowNetwork === false && networkTools.has(opts.command)) {\n const msg = `[QRING] Execution blocked: network access is disabled for profile \"${profile.name}\", command \"${opts.command}\" is considered network-related`;\n if (opts.captureOutput) {\n return resolve({ code: 126, stdout: \"\", stderr: msg });\n }\n process.stderr.write(msg + \"\\n\");\n return resolve({ code: 126, stdout: \"\", stderr: \"\" });\n }\n\n const child = spawn(opts.command, opts.args, {\n env: envMap,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n shell: false,\n });\n\n let timedOut = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n if (maxRuntime) {\n timer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGKILL\");\n }, maxRuntime * 1000);\n }\n\n const stdoutRedact = new RedactionTransform([...secretsToRedact]);\n const stderrRedact = new RedactionTransform([...secretsToRedact]);\n\n if (child.stdout) child.stdout.pipe(stdoutRedact);\n if (child.stderr) child.stderr.pipe(stderrRedact);\n\n let stdoutStr = \"\";\n let stderrStr = \"\";\n\n if (opts.captureOutput) {\n stdoutRedact.on(\"data\", (d) => (stdoutStr += d.toString()));\n stderrRedact.on(\"data\", (d) => (stderrStr += d.toString()));\n } else {\n stdoutRedact.pipe(process.stdout);\n stderrRedact.pipe(process.stderr);\n }\n\n child.on(\"close\", (code) => {\n if (timer) clearTimeout(timer);\n if (timedOut) {\n resolve({ code: 124, stdout: stdoutStr, stderr: stderrStr + `\\n[QRING] Process killed: exceeded ${maxRuntime}s runtime limit` });\n } else {\n resolve({ code: code ?? 0, stdout: stdoutStr, stderr: stderrStr });\n }\n });\n\n child.on(\"error\", (err) => {\n if (timer) clearTimeout(timer);\n reject(err);\n });\n });\n}\n","/**\n * Codebase Secret Scanner\n *\n * Scans a directory for hardcoded secrets using regex heuristics\n * and Shannon entropy analysis. Useful for migrating legacy codebases\n * into q-ring.\n */\n\nimport { readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { findSecretsInLine, calculateEntropy } from \"./secrets-detect.js\";\n\nexport interface ScanResult {\n file: string;\n line: number;\n keyName: string;\n match: string;\n context: string;\n entropy: number;\n}\n\nconst IGNORE_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \".next\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".cursor\",\n \"venv\",\n \"__pycache__\",\n]);\n\nconst IGNORE_EXTS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".ico\", \".svg\", \".webp\",\n \".mp4\", \".mp3\", \".wav\", \".ogg\",\n \".pdf\", \".zip\", \".tar\", \".gz\", \".xz\",\n \".ttf\", \".woff\", \".woff2\", \".eot\",\n \".exe\", \".dll\", \".so\", \".dylib\",\n \".lock\",\n]);\n\nexport function scanCodebase(dir: string): ScanResult[] {\n const results: ScanResult[] = [];\n\n function walk(currentDir: string) {\n let entries;\n try {\n entries = readdirSync(currentDir);\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (IGNORE_DIRS.has(entry)) continue;\n\n const fullPath = join(currentDir, entry);\n let stat;\n try {\n stat = statSync(fullPath);\n } catch {\n continue;\n }\n\n if (stat.isDirectory()) {\n walk(fullPath);\n } else if (stat.isFile()) {\n const ext = fullPath.slice(fullPath.lastIndexOf(\".\")).toLowerCase();\n if (IGNORE_EXTS.has(ext) || entry.endsWith(\".lock\")) continue;\n\n let content;\n try {\n content = readFileSync(fullPath, \"utf8\");\n } catch {\n continue;\n }\n\n if (content.includes(\"\\0\")) continue;\n\n const lines = content.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const matches = findSecretsInLine(line);\n for (const m of matches) {\n const entropy = calculateEntropy(m.value);\n const relPath = fullPath.startsWith(dir)\n ? fullPath.slice(dir.length).replace(/^[/\\\\]+/, \"\")\n : fullPath;\n\n results.push({\n file: relPath || fullPath,\n line: i + 1,\n keyName: m.varName,\n match: m.value,\n context: line.trim(),\n entropy: parseFloat(entropy.toFixed(2)),\n });\n }\n }\n }\n }\n }\n\n walk(dir);\n return results;\n}\n","/**\n * Shared heuristics for hardcoded-secret detection (scan + lint).\n * Both `scan.ts` and `linter.ts` use this module so rules stay aligned.\n */\n\n/** Same pattern for assignment-style secrets in source lines. */\nexport const SECRET_ASSIGNMENT_PATTERN =\n /((?:api_?key|secret|token|password|auth|credential|access_?key)[a-z0-9_]*)\\s*[:=]\\s*(['\"])([^'\"]+)\\2/gi;\n\nexport interface SecretMatchInLine {\n varName: string;\n value: string;\n quote: string;\n}\n\nexport function calculateEntropy(str: string): number {\n if (!str) return 0;\n const len = str.length;\n const frequencies = new Map<string, number>();\n\n for (let i = 0; i < len; i++) {\n const char = str[i];\n frequencies.set(char, (frequencies.get(char) || 0) + 1);\n }\n\n let entropy = 0;\n for (const count of frequencies.values()) {\n const p = count / len;\n entropy -= p * Math.log2(p);\n }\n\n return entropy;\n}\n\nfunction isPlaceholderValue(value: string): boolean {\n const lv = value.toLowerCase();\n return (\n lv.includes(\"example\") ||\n lv.includes(\"your_\") ||\n lv.includes(\"placeholder\") ||\n lv.includes(\"replace_me\") ||\n lv.includes(\"xxx\")\n );\n}\n\nfunction passesSecretHeuristic(value: string, entropy: number): boolean {\n return entropy > 3.5 || value.startsWith(\"sk-\") || value.startsWith(\"ghp_\");\n}\n\n/**\n * Find all secret-like assignments on one line (same behavior as the linter:\n * every match on the line is considered).\n */\nexport function findSecretsInLine(line: string): SecretMatchInLine[] {\n if (line.length > 500) return [];\n\n const out: SecretMatchInLine[] = [];\n SECRET_ASSIGNMENT_PATTERN.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = SECRET_ASSIGNMENT_PATTERN.exec(line)) !== null) {\n const varName = match[1];\n const quote = match[2];\n const value = match[3];\n\n if (value.length < 8) continue;\n if (isPlaceholderValue(value)) continue;\n\n const entropy = calculateEntropy(value);\n if (!passesSecretHeuristic(value, entropy)) continue;\n\n out.push({ varName, value, quote });\n }\n return out;\n}\n","/**\n * Secret-Aware Linter\n *\n * Scans individual files (or staged git content) for hardcoded secrets and\n * optionally rewrites them with `process.env.KEY` references, storing the\n * discovered values in q-ring.\n */\n\nimport { readFileSync, writeFileSync, existsSync } from \"node:fs\";\nimport { basename, extname } from \"node:path\";\nimport { type ScanResult } from \"./scan.js\";\nimport { setSecret, hasSecret } from \"./keyring.js\";\nimport { findSecretsInLine, calculateEntropy } from \"./secrets-detect.js\";\n\nexport interface LintResult extends ScanResult {\n fixed: boolean;\n}\n\nexport interface LintOptions {\n fix?: boolean;\n scope?: import(\"./scope.js\").Scope;\n projectPath?: string;\n}\n\nconst ENV_REF_BY_EXT: Record<string, (key: string) => string> = {\n \".ts\": (k) => `process.env.${k}`,\n \".tsx\": (k) => `process.env.${k}`,\n \".js\": (k) => `process.env.${k}`,\n \".jsx\": (k) => `process.env.${k}`,\n \".mjs\": (k) => `process.env.${k}`,\n \".cjs\": (k) => `process.env.${k}`,\n \".py\": (k) => `os.environ[\"${k}\"]`,\n \".rb\": (k) => `ENV[\"${k}\"]`,\n \".go\": (k) => `os.Getenv(\"${k}\")`,\n \".rs\": (k) => `std::env::var(\"${k}\")`,\n \".java\": (k) => `System.getenv(\"${k}\")`,\n \".kt\": (k) => `System.getenv(\"${k}\")`,\n \".cs\": (k) => `Environment.GetEnvironmentVariable(\"${k}\")`,\n \".php\": (k) => `getenv('${k}')`,\n \".sh\": (k) => `\\${${k}}`,\n \".bash\": (k) => `\\${${k}}`,\n};\n\nfunction getEnvRef(filePath: string, keyName: string): string {\n const ext = extname(filePath).toLowerCase();\n const formatter = ENV_REF_BY_EXT[ext];\n return formatter ? formatter(keyName) : `process.env.${keyName}`;\n}\n\n/**\n * Lint specific files for hardcoded secrets.\n */\nexport function lintFiles(\n files: string[],\n opts: LintOptions = {},\n): LintResult[] {\n const results: LintResult[] = [];\n\n for (const file of files) {\n if (!existsSync(file)) continue;\n\n let content: string;\n try {\n content = readFileSync(file, \"utf8\");\n } catch {\n continue;\n }\n\n if (content.includes(\"\\0\")) continue;\n\n const lines = content.split(/\\r?\\n/);\n const fixes: Array<{ line: number; original: string; replacement: string; keyName: string; value: string }> = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const matches = findSecretsInLine(line);\n\n for (const m of matches) {\n const varNameUpper = m.varName.toUpperCase();\n const entropy = calculateEntropy(m.value);\n const shouldFix = opts.fix === true;\n\n if (shouldFix) {\n const envRef = getEnvRef(file, varNameUpper);\n fixes.push({\n line: i,\n original: `${m.quote}${m.value}${m.quote}`,\n replacement: envRef,\n keyName: varNameUpper,\n value: m.value,\n });\n }\n\n results.push({\n file,\n line: i + 1,\n keyName: varNameUpper,\n match: m.value,\n context: line.trim(),\n entropy: parseFloat(entropy.toFixed(2)),\n fixed: shouldFix,\n });\n }\n }\n\n if (opts.fix && fixes.length > 0) {\n const fixLines = content.split(/\\r?\\n/);\n for (const fix of fixes.reverse()) {\n const lineIdx = fix.line;\n if (lineIdx >= 0 && lineIdx < fixLines.length) {\n fixLines[lineIdx] = fixLines[lineIdx].replace(fix.original, fix.replacement);\n }\n\n if (!hasSecret(fix.keyName, { scope: opts.scope, projectPath: opts.projectPath })) {\n setSecret(fix.keyName, fix.value, {\n scope: opts.scope ?? \"global\",\n projectPath: opts.projectPath,\n source: \"cli\",\n description: `Auto-imported from ${basename(file)}:${fix.line + 1}`,\n });\n }\n }\n\n writeFileSync(file, fixLines.join(\"\\n\"), \"utf8\");\n }\n }\n\n return results;\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { remember, recall, listMemory, forget } from \"../../core/memory.js\";\nimport { text, enforceToolPolicy } from \"./_shared.js\";\n\nexport function registerAgentTools(server: McpServer): void {\n server.tool(\n \"agent_remember\",\n \"[agent] Store a key-value pair in encrypted agent memory that persists across sessions. Use this to remember decisions, rotation history, or project-specific context.\",\n {\n key: z.string().describe(\"Memory key\"),\n value: z.string().describe(\"Value to store\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"agent_remember\");\n if (toolBlock) return toolBlock;\n\n remember(params.key, params.value);\n return text(`Remembered \"${params.key}\"`);\n },\n );\n\n server.tool(\n \"agent_recall\",\n \"[agent] Retrieve a value from agent memory, or list all stored keys if no key is provided.\",\n {\n key: z.string().optional().describe(\"Memory key to recall (omit to list all)\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"agent_recall\");\n if (toolBlock) return toolBlock;\n\n if (!params.key) {\n const entries = listMemory();\n if (entries.length === 0) return text(\"Agent memory is empty\");\n return text(JSON.stringify(entries, null, 2));\n }\n const value = recall(params.key);\n if (value === null)\n return text(`No memory found for \"${params.key}\"`, true);\n return text(\n JSON.stringify({ ok: true, data: { key: params.key, value } }, null, 2),\n );\n },\n );\n\n server.tool(\n \"agent_forget\",\n \"[agent] Delete a key from agent memory.\",\n {\n key: z.string().describe(\"Memory key to forget\"),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"agent_forget\");\n if (toolBlock) return toolBlock;\n\n const removed = forget(params.key);\n return text(\n removed ? `Forgot \"${params.key}\"` : `No memory found for \"${params.key}\"`,\n !removed,\n );\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n checkToolPolicy,\n checkKeyReadPolicy,\n checkExecPolicy,\n getPolicySummary,\n} from \"../../core/policy.js\";\nimport { text, enforceToolPolicy, commonSchemas } from \"./_shared.js\";\n\nconst { projectPath } = commonSchemas;\n\nexport function registerPolicyTools(server: McpServer): void {\n server.tool(\n \"check_policy\",\n \"[policy] Check if an action is allowed by the project's governance policy. Returns the policy decision and source.\",\n {\n action: z\n .enum([\"tool\", \"key_read\", \"exec\"])\n .describe(\"Type of policy check\"),\n toolName: z\n .string()\n .optional()\n .describe(\"Tool name to check (for action=tool)\"),\n key: z.string().optional().describe(\"Secret key to check (for action=key_read)\"),\n command: z\n .string()\n .optional()\n .describe(\"Command to check (for action=exec)\"),\n projectPath,\n },\n async (params) => {\n if (params.action === \"tool\" && params.toolName) {\n const d = checkToolPolicy(params.toolName, params.projectPath);\n return text(JSON.stringify(d, null, 2));\n }\n if (params.action === \"key_read\" && params.key) {\n const d = checkKeyReadPolicy(params.key, undefined, params.projectPath);\n return text(JSON.stringify(d, null, 2));\n }\n if (params.action === \"exec\" && params.command) {\n const d = checkExecPolicy(params.command, params.projectPath);\n return text(JSON.stringify(d, null, 2));\n }\n return text(\n \"Missing required parameter for the selected action type\",\n true,\n );\n },\n );\n\n server.tool(\n \"get_policy_summary\",\n \"[policy] Get a summary of the project's governance policy configuration.\",\n {\n projectPath,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\n \"get_policy_summary\",\n params.projectPath,\n );\n if (toolBlock) return toolBlock;\n const summary = getPolicySummary(params.projectPath);\n return text(JSON.stringify(summary, null, 2));\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerSecretTools } from \"./tools/secrets.js\";\nimport { registerProjectTools } from \"./tools/project.js\";\nimport { registerTunnelTools } from \"./tools/tunnel.js\";\nimport { registerTeleportTools } from \"./tools/teleport.js\";\nimport { registerAuditTools } from \"./tools/audit.js\";\nimport { registerValidationTools } from \"./tools/validation.js\";\nimport { registerHookTools } from \"./tools/hooks.js\";\nimport { registerToolingTools } from \"./tools/tooling.js\";\nimport { registerAgentTools } from \"./tools/agent.js\";\nimport { registerPolicyTools } from \"./tools/policy.js\";\n\n/**\n * Register every MCP tool on the given server.\n *\n * Tools are grouped by concern in `src/mcp/tools/*.ts`. Keep the registration\n * order stable — some MCP clients cache the tool list ordering.\n */\nexport function registerMcpTools(server: McpServer): void {\n registerSecretTools(server);\n registerProjectTools(server);\n registerTunnelTools(server);\n registerTeleportTools(server);\n registerAuditTools(server);\n registerValidationTools(server);\n registerHookTools(server);\n registerToolingTools(server);\n registerAgentTools(server);\n registerPolicyTools(server);\n}\n"],"mappings":"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","names":["z","c","opts","projectPath","server","z","registry","opts","opts","projectPath","registry","teamId","orgId","scope","projectPath","env","server","result","z","server","z","z","randomBytes","z","teamId","orgId","scope","projectPath","server","z","z","teamId","orgId","scope","projectPath","server","z","z","teamId","orgId","scope","projectPath","server","z","registry","z","server","z","z","text","opts","readFileSync","readFileSync","readFileSync","opts","readFileSync","teamId","orgId","scope","projectPath","server","z","z","server","z","z","projectPath","server","z","server","server"]}