@i4ctime/q-ring 0.9.6 → 0.9.8

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/core/noise.ts","../src/utils/colors.ts","../src/core/agent.ts","../src/core/teleport.ts","../src/core/import.ts","../src/core/exec.ts","../src/core/scan.ts","../src/core/linter.ts","../src/core/validate.ts","../src/core/context.ts","../src/core/memory.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 { z } from \"zod\";\nimport {\n getSecret,\n setSecret,\n deleteSecret,\n hasSecret,\n listSecrets,\n getEnvelope,\n entangleSecrets,\n disentangleSecrets,\n exportSecrets,\n type KeyringOptions,\n} from \"../core/keyring.js\";\nimport { runHealthScan } from \"../core/agent.js\";\nimport { checkDecay, collapseValue } from \"../core/envelope.js\";\nimport { collapseEnvironment, readProjectConfig } from \"../core/collapse.js\";\nimport type { Scope } from \"../core/scope.js\";\nimport { queryAudit, detectAnomalies, verifyAuditChain, exportAudit } from \"../core/observer.js\";\nimport {\n generateSecret,\n estimateEntropy,\n type NoiseFormat,\n} from \"../core/noise.js\";\nimport {\n tunnelCreate,\n tunnelRead,\n tunnelDestroy,\n tunnelList,\n} from \"../core/tunnel.js\";\nimport { teleportPack, teleportUnpack } from \"../core/teleport.js\";\nimport { importDotenv, parseDotenv } from \"../core/import.js\";\nimport { execCommand } from \"../core/exec.js\";\nimport { scanCodebase } from \"../core/scan.js\";\nimport { lintFiles } from \"../core/linter.js\";\nimport { getProjectContext } from \"../core/context.js\";\nimport { remember, recall, listMemory, forget } from \"../core/memory.js\";\nimport { checkToolPolicy, checkKeyReadPolicy, checkExecPolicy, getPolicySummary } from \"../core/policy.js\";\nimport { validateSecret, rotateWithProvider, ciValidateBatch, registry as providerRegistry } from \"../core/validate.js\";\nimport {\n registerHook,\n removeHook,\n listHooks as listAllHooks,\n type HookType,\n type HookAction,\n} from \"../core/hooks.js\";\n\nfunction text(t: string, isError = false) {\n return {\n content: [{ type: \"text\" as const, text: t }],\n ...(isError ? { isError: true } : {}),\n };\n}\n\nfunction 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\nfunction enforceToolPolicy(toolName: string, projectPath?: string) {\n const decision = checkToolPolicy(toolName, projectPath);\n if (!decision.allowed) {\n return text(`Policy Denied: ${decision.reason} (source: ${decision.policySource})`, true);\n }\n return null;\n}\n\nexport function createMcpServer(): McpServer {\n const server = new McpServer({\n name: \"q-ring\",\n version: \"0.2.0\",\n });\n\n const teamIdSchema = z.string().optional().describe(\"Team identifier for team-scoped secrets\");\n const orgIdSchema = z.string().optional().describe(\"Org identifier for org-scoped secrets\");\n const scopeSchema = z\n .enum([\"global\", \"project\", \"team\", \"org\"])\n .optional()\n .describe(\"Scope: global, project, team, or org\");\n const projectPathSchema = z\n .string()\n .optional()\n .describe(\"Project root path for project-scoped secrets\");\n const envSchema = z\n .string()\n .optional()\n .describe(\"Environment for superposition collapse (e.g., dev, staging, prod)\");\n\n // ─── Core Tools ───\n\n server.tool(\n \"get_secret\",\n \"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: scopeSchema,\n projectPath: projectPathSchema,\n env: envSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"get_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n try {\n const keyBlock = checkKeyReadPolicy(params.key, undefined, params.projectPath);\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(value);\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 \"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: scopeSchema,\n projectPath: projectPathSchema,\n tag: z.string().optional().describe(\"Filter by tag\"),\n expired: z.boolean().optional().describe(\"Show only expired secrets\"),\n stale: z.boolean().optional().describe(\"Show only stale secrets (75%+ decay)\"),\n filter: z.string().optional().describe(\"Glob pattern on key name (e.g., 'API_*')\"),\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 const regex = new RegExp(\n \"^\" + params.filter.replace(/\\*/g, \".*\") + \"$\",\n \"i\",\n );\n entries = entries.filter((e) => regex.test(e.key));\n }\n if (entries.length === 0) return text(\"No secrets found\");\n\n const lines = entries.map((e) => {\n const parts = [`[${e.scope}] ${e.key}`];\n\n if (e.envelope?.states) {\n parts.push(`states:[${Object.keys(e.envelope.states).join(\",\")}]`);\n }\n if (e.decay?.isExpired) {\n parts.push(\"EXPIRED\");\n } else if (e.decay?.isStale) {\n parts.push(`stale(${e.decay.lifetimePercent}%)`);\n }\n if (e.decay?.timeRemaining && !e.decay.isExpired) {\n parts.push(`ttl:${e.decay.timeRemaining}`);\n }\n if (e.envelope?.meta.entangled?.length) {\n parts.push(`entangled:${e.envelope.meta.entangled.length}`);\n }\n if (e.envelope && e.envelope.meta.accessCount > 0) {\n parts.push(`reads:${e.envelope.meta.accessCount}`);\n }\n\n return parts.join(\" | \");\n });\n\n return text(lines.join(\"\\n\"));\n },\n );\n\n server.tool(\n \"set_secret\",\n \"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: scopeSchema.default(\"global\"),\n projectPath: projectPathSchema,\n env: z\n .string()\n .optional()\n .describe(\"If provided, sets the value for this specific environment (superposition)\"),\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\n .array(z.string())\n .optional()\n .describe(\"Tags for organization\"),\n rotationFormat: z\n .enum([\"hex\", \"base64\", \"alphanumeric\", \"uuid\", \"api-key\", \"token\", \"password\"])\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: teamIdSchema,\n orgId: orgIdSchema,\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(`[${params.scope ?? \"global\"}] ${params.key} set for env:${params.env}`);\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 \"Remove a secret from the keyring.\",\n {\n key: z.string().describe(\"The secret key name\"),\n scope: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 \"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: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 \"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: scopeSchema,\n projectPath: projectPathSchema,\n env: envSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 \"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: scopeSchema.default(\"global\"),\n projectPath: projectPathSchema,\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 ? \"Dry run — no changes made\" : `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 \"check_project\",\n \"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: projectPathSchema,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"check_project\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const projectPath = params.projectPath ?? process.cwd();\n const config = readProjectConfig(projectPath);\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, source: \"mcp\" });\n\n if (!result) {\n const status = manifest.required !== false ? \"missing\" : \"optional_missing\";\n if (manifest.required !== false) missingCount++;\n results.push({ key, status, required: manifest.required !== false, description: manifest.description });\n continue;\n }\n\n const decay = checkDecay(result.envelope);\n\n if (decay.isExpired) {\n expiredCount++;\n results.push({ key, status: \"expired\", timeRemaining: decay.timeRemaining, description: manifest.description });\n } else if (decay.isStale) {\n staleCount++;\n results.push({ key, status: \"stale\", lifetimePercent: decay.lifetimePercent, timeRemaining: decay.timeRemaining, description: manifest.description });\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 \"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: projectPathSchema,\n env: envSchema,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"env_generate\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const projectPath = params.projectPath ?? process.cwd();\n const config = readProjectConfig(projectPath);\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,\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, 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 = 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 // ─── Quantum Tools ───\n\n server.tool(\n \"inspect_secret\",\n \"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: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 } = result;\n const decay = checkDecay(envelope);\n\n const info: Record<string, unknown> = {\n key: params.key,\n scope,\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) 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 \"detect_environment\",\n \"Detect the current environment context (wavefunction collapse). Returns the detected environment and its source (NODE_ENV, git branch, project config, etc.).\",\n {\n projectPath: projectPathSchema,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"detect_environment\", params.projectPath);\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 \"generate_secret\",\n \"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([\"hex\", \"base64\", \"alphanumeric\", \"uuid\", \"api-key\", \"token\", \"password\"])\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.string().optional().describe(\"If provided, save the generated secret with this key name\"),\n scope: scopeSchema.default(\"global\"),\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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(secret);\n },\n );\n\n server.tool(\n \"entangle_secrets\",\n \"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: scopeSchema.default(\"global\"),\n targetScope: scopeSchema.default(\"global\"),\n sourceProjectPath: z.string().optional(),\n targetProjectPath: z.string().optional(),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"entangle_secrets\", params.sourceProjectPath);\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 \"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: scopeSchema.default(\"global\"),\n targetScope: scopeSchema.default(\"global\"),\n sourceProjectPath: z.string().optional(),\n targetProjectPath: z.string().optional(),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"disentangle_secrets\", params.sourceProjectPath);\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 // ─── Tunneling Tools ───\n\n server.tool(\n \"tunnel_create\",\n \"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(id);\n },\n );\n\n server.tool(\n \"tunnel_read\",\n \"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(value);\n },\n );\n\n server.tool(\n \"tunnel_list\",\n \"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(0, Math.floor((t.expiresAt - Date.now()) / 1000));\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 \"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 // ─── Teleportation Tools ───\n\n server.tool(\n \"teleport_pack\",\n \"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: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 \"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: scopeSchema.default(\"global\"),\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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(`Would import ${payload.secrets.length} secrets:\\n${preview}`);\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(`Imported ${payload.secrets.length} secret(s) from teleport bundle`);\n } catch {\n return text(\"Failed to unpack: wrong passphrase or corrupted bundle\", true);\n }\n },\n );\n\n // ─── Observer / Audit Tools ───\n\n server.tool(\n \"audit_log\",\n \"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([\"read\", \"write\", \"delete\", \"list\", \"export\", \"generate\", \"entangle\", \"tunnel\", \"teleport\", \"collapse\"])\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 \"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(\n (a) => `[${a.type}] ${a.description}`,\n );\n return text(lines.join(\"\\n\"));\n },\n );\n\n // ─── Health ───\n\n server.tool(\n \"health_check\",\n \"Run a comprehensive health check on all secrets: decay status, staleness, anomalies, entropy assessment.\",\n {\n scope: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 // ─── Validation Tools ───\n\n server.tool(\n \"validate_secret\",\n \"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.string().optional().describe(\"Force a specific provider (openai, stripe, github, aws, http)\"),\n scope: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 \"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 // ─── Hook Tools ───\n\n server.tool(\n \"register_hook\",\n \"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.string().optional().describe(\"Trigger on key glob pattern (e.g. DB_*)\"),\n tag: z.string().optional().describe(\"Trigger on secrets with this tag\"),\n scope: z.enum([\"global\", \"project\"]).optional().describe(\"Trigger only for this scope\"),\n actions: z.array(z.enum([\"write\", \"delete\", \"rotate\"])).optional().default([\"write\", \"delete\", \"rotate\"]).describe(\"Which actions trigger this hook\"),\n command: z.string().optional().describe(\"Shell command to execute (for shell type)\"),\n url: z.string().optional().describe(\"URL to POST to (for http type)\"),\n signalTarget: z.string().optional().describe(\"Process name or PID (for signal type)\"),\n signalName: z.string().optional().default(\"SIGHUP\").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(\"At least one match criterion required: key, keyPattern, or tag\", true);\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 ? { target: params.signalTarget, signal: params.signalName } : 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 \"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 \"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 // ─── Exec Tools ───\n\n server.tool(\n \"exec_with_secrets\",\n \"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.array(z.string()).optional().describe(\"Only inject these specific keys\"),\n tags: z.array(z.string()).optional().describe(\"Only inject secrets with these tags\"),\n profile: z.enum([\"unrestricted\", \"restricted\", \"ci\"]).optional().default(\"restricted\").describe(\"Exec profile: unrestricted, restricted, or ci\"),\n scope: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 = [];\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(`Execution failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n },\n );\n\n // ─── Scan Tools ───\n\n server.tool(\n \"scan_codebase_for_secrets\",\n \"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.string().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 \n return text(JSON.stringify(results, null, 2));\n } catch (err) {\n return text(`Scan failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n },\n );\n\n // ─── AI Agent Tools ───\n\n server.tool(\n \"get_project_context\",\n \"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: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"get_project_context\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const context = getProjectContext(opts(params));\n return text(JSON.stringify(context, null, 2));\n },\n );\n\n server.tool(\n \"agent_remember\",\n \"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 \"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) return text(`No memory found for \"${params.key}\"`, true);\n return text(value);\n },\n );\n\n server.tool(\n \"agent_forget\",\n \"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(removed ? `Forgot \"${params.key}\"` : `No memory found for \"${params.key}\"`, !removed);\n },\n );\n\n server.tool(\n \"lint_files\",\n \"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.boolean().optional().default(false).describe(\"Auto-replace and store secrets\"),\n scope: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 any,\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(`Lint failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n },\n );\n\n server.tool(\n \"analyze_secrets\",\n \"Analyze secret usage patterns and provide optimization suggestions including most accessed, stale, unused, and rotation recommendations.\",\n {\n scope: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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).length,\n neverAccessed: entries.filter(e => (e.envelope?.meta.accessCount ?? 0) === 0).map(e => e.key),\n noRotationFormat: entries.filter(e => !e.envelope?.meta.rotationFormat).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 // ─── Status Dashboard ───\n\n let dashboardInstance: { port: number; close: () => void } | null = null;\n\n server.tool(\n \"status_dashboard\",\n \"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(`Dashboard already running at http://127.0.0.1:${dashboardInstance.port}`);\n }\n\n const { startDashboardServer } = await import(\"../core/dashboard.js\");\n dashboardInstance = startDashboardServer({ port: params.port });\n\n return text(`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 // ─── Agent ───\n\n server.tool(\n \"agent_scan\",\n \"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 // ─── Audit Integrity ───\n\n server.tool(\n \"verify_audit_chain\",\n \"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 \"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.enum([\"jsonl\", \"json\", \"csv\"]).optional().default(\"jsonl\").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 // ─── Rotation & CI ───\n\n server.tool(\n \"rotate_secret\",\n \"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: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 \"CI-oriented batch validation: validates all accessible secrets against their providers and returns a structured pass/fail report.\",\n {\n scope: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"ci_validate_secrets\", params.projectPath);\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, { ...opts(params), scope: e.scope, silent: true });\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 // ─── Governance ───\n\n server.tool(\n \"check_policy\",\n \"Check if an action is allowed by the project's governance policy. Returns the policy decision and source.\",\n {\n action: z.enum([\"tool\", \"key_read\", \"exec\"]).describe(\"Type of policy check\"),\n toolName: z.string().optional().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.string().optional().describe(\"Command to check (for action=exec)\"),\n projectPath: projectPathSchema,\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(\"Missing required parameter for the selected action type\", true);\n },\n );\n\n server.tool(\n \"get_policy_summary\",\n \"Get a summary of the project's governance policy configuration.\",\n {\n projectPath: projectPathSchema,\n },\n async (params) => {\n const summary = getPolicySummary(params.projectPath);\n return text(JSON.stringify(summary, null, 2));\n },\n );\n\n return server;\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 * 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, getEnvelope, setSecret, type KeyringOptions } from \"./keyring.js\";\nimport { checkDecay, type QuantumEnvelope } from \"./envelope.js\";\nimport { detectAnomalies, logAudit, queryAudit } from \"./observer.js\";\nimport { generateSecret } from \"./noise.js\";\nimport { findEntangled } from \"./entanglement.js\";\nimport { fireHooks } from \"./hooks.js\";\nimport { c, SYMBOLS, decayIndicator } 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 * 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\";\n\nconst ALGORITHM = \"aes-256-gcm\";\nconst KEY_LENGTH = 32;\nconst IV_LENGTH = 16;\nconst SALT_LENGTH = 32;\nconst TAG_LENGTH = 16;\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\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 const bundleJson = Buffer.from(encoded, \"base64\").toString(\"utf8\");\n const bundle: TeleportBundle = JSON.parse(bundleJson);\n\n if (bundle.v !== 1) {\n throw new Error(`Unsupported teleport bundle version: ${bundle.v}`);\n }\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 const decrypted = Buffer.concat([\n decipher.update(encrypted),\n decipher.final(),\n ]);\n\n return JSON.parse(decrypted.toString(\"utf8\"));\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","/**\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) => fullCommand.includes(d));\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\";\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\n// Matches common secret assignments: API_KEY = \"sk-...\" or { password: '...' }\nconst SECRET_KEYWORDS = /((?:api_?key|secret|token|password|auth|credential|access_?key)[a-z0-9_]*)\\s*[:=]\\s*(['\"])([^'\"]+)\\2/i;\n\nfunction 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\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 // Read chunk to check if binary\n content = readFileSync(fullPath, \"utf8\");\n } catch {\n continue; // skip unreadable\n }\n\n // Quick heuristic: ignore files with null bytes\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 // Skip long lines (minified code)\n if (line.length > 500) continue;\n\n const match = line.match(SECRET_KEYWORDS);\n if (match) {\n const varName = match[1];\n const value = match[3];\n\n // Ignore very short strings or obvious placeholders\n if (value.length < 8) continue;\n const lowerValue = value.toLowerCase();\n if (\n lowerValue.includes(\"example\") ||\n lowerValue.includes(\"your_\") ||\n lowerValue.includes(\"placeholder\") ||\n lowerValue.includes(\"replace_me\")\n ) {\n continue;\n }\n\n const entropy = calculateEntropy(value);\n\n // Flag if entropy is decently high (e.g. > 3.5) or looks like a known prefix\n if (entropy > 3.5 || value.startsWith(\"sk-\") || value.startsWith(\"ghp_\")) {\n // Convert absolute path to relative for cleaner output\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: varName,\n match: value,\n context: line.trim(),\n entropy: parseFloat(entropy.toFixed(2)),\n });\n }\n }\n }\n }\n }\n }\n\n walk(dir);\n return results;\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\";\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 SECRET_KEYWORDS =\n /((?:api_?key|secret|token|password|auth|credential|access_?key)[a-z0-9_]*)\\s*[:=]\\s*(['\"])([^'\"]+)\\2/gi;\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 if (line.length > 500) continue;\n\n let match: RegExpExecArray | null;\n SECRET_KEYWORDS.lastIndex = 0;\n\n while ((match = SECRET_KEYWORDS.exec(line)) !== null) {\n const varName = match[1].toUpperCase();\n const quote = match[2];\n const value = match[3];\n\n if (value.length < 8) continue;\n const lv = value.toLowerCase();\n if (\n lv.includes(\"example\") ||\n lv.includes(\"your_\") ||\n lv.includes(\"placeholder\") ||\n lv.includes(\"replace_me\") ||\n lv.includes(\"xxx\")\n ) continue;\n\n const entropy = calculateEntropy(value);\n if (entropy <= 3.5 && !value.startsWith(\"sk-\") && !value.startsWith(\"ghp_\")) continue;\n\n const shouldFix = opts.fix === true;\n\n if (shouldFix) {\n const envRef = getEnvRef(file, varName);\n fixes.push({\n line: i,\n original: `${quote}${value}${quote}`,\n replacement: envRef,\n keyName: varName,\n value,\n });\n }\n\n results.push({\n file,\n line: i + 1,\n keyName: varName,\n match: 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 // Apply fixes in reverse order to preserve line positions\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\nfunction calculateEntropy(str: string): number {\n if (!str) return 0;\n const len = str.length;\n const frequencies = new Map<string, number>();\n for (let i = 0; i < len; i++) {\n const ch = str[i];\n frequencies.set(ch, (frequencies.get(ch) || 0) + 1);\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 return entropy;\n}\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\";\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 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 { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { listSecrets } from \"./keyring.js\";\nimport { collapseEnvironment, readProjectConfig } from \"./collapse.js\";\nimport { checkDecay } from \"./envelope.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","/**\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\";\n\nconst MEMORY_FILE = \"agent-memory.enc\";\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 deriveKey(): Buffer {\n const fingerprint = `qring-memory:${hostname()}:${userInfo().username}`;\n return createHash(\"sha256\").update(fingerprint).digest();\n}\n\nfunction encrypt(data: string): string {\n const key = deriveKey();\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 // Format: iv:tag:ciphertext (all base64)\n return `${iv.toString(\"base64\")}:${tag.toString(\"base64\")}:${encrypted.toString(\"base64\")}`;\n}\n\nfunction decrypt(blob: string): 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 key = deriveKey();\n const decipher = createDecipheriv(\"aes-256-gcm\", key, iv);\n decipher.setAuthTag(tag);\n return decipher.update(encrypted) + decipher.final(\"utf8\");\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"],"mappings":"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","names":["opts","randomBytes","randomBytes","text","opts","readFileSync","readFileSync","opts","readFileSync","SECRET_KEYWORDS","calculateEntropy","registry","opts","opts","registry","existsSync","readFileSync","writeFileSync","join","createCipheriv","createDecipheriv","randomBytes","deriveKey","server","result","registry"]}
1
+ {"version":3,"sources":["../src/mcp.ts","../src/mcp/server.ts","../src/core/noise.ts","../src/utils/colors.ts","../src/core/agent.ts","../src/core/teleport.ts","../src/core/import.ts","../src/core/exec.ts","../src/core/scan.ts","../src/core/linter.ts","../src/core/validate.ts","../src/core/context.ts","../src/core/memory.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 { z } from \"zod\";\nimport {\n getSecret,\n setSecret,\n deleteSecret,\n hasSecret,\n listSecrets,\n getEnvelope,\n entangleSecrets,\n disentangleSecrets,\n exportSecrets,\n type KeyringOptions,\n} from \"../core/keyring.js\";\nimport { runHealthScan } from \"../core/agent.js\";\nimport { checkDecay, collapseValue } from \"../core/envelope.js\";\nimport { collapseEnvironment, readProjectConfig } from \"../core/collapse.js\";\nimport type { Scope } from \"../core/scope.js\";\nimport { queryAudit, detectAnomalies, verifyAuditChain, exportAudit } from \"../core/observer.js\";\nimport {\n generateSecret,\n estimateEntropy,\n type NoiseFormat,\n} from \"../core/noise.js\";\nimport {\n tunnelCreate,\n tunnelRead,\n tunnelDestroy,\n tunnelList,\n} from \"../core/tunnel.js\";\nimport { teleportPack, teleportUnpack } from \"../core/teleport.js\";\nimport { importDotenv, parseDotenv } from \"../core/import.js\";\nimport { execCommand } from \"../core/exec.js\";\nimport { scanCodebase } from \"../core/scan.js\";\nimport { lintFiles } from \"../core/linter.js\";\nimport { getProjectContext } from \"../core/context.js\";\nimport { remember, recall, listMemory, forget } from \"../core/memory.js\";\nimport { checkToolPolicy, checkKeyReadPolicy, checkExecPolicy, getPolicySummary } from \"../core/policy.js\";\nimport { validateSecret, rotateWithProvider, ciValidateBatch, registry as providerRegistry } from \"../core/validate.js\";\nimport {\n registerHook,\n removeHook,\n listHooks as listAllHooks,\n type HookType,\n type HookAction,\n} from \"../core/hooks.js\";\n\nfunction text(t: string, isError = false) {\n return {\n content: [{ type: \"text\" as const, text: t }],\n ...(isError ? { isError: true } : {}),\n };\n}\n\nfunction 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\nfunction enforceToolPolicy(toolName: string, projectPath?: string) {\n const decision = checkToolPolicy(toolName, projectPath);\n if (!decision.allowed) {\n return text(`Policy Denied: ${decision.reason} (source: ${decision.policySource})`, true);\n }\n return null;\n}\n\nexport function createMcpServer(): McpServer {\n const server = new McpServer({\n name: \"q-ring\",\n version: \"0.2.0\",\n });\n\n const teamIdSchema = z.string().optional().describe(\"Team identifier for team-scoped secrets\");\n const orgIdSchema = z.string().optional().describe(\"Org identifier for org-scoped secrets\");\n const scopeSchema = z\n .enum([\"global\", \"project\", \"team\", \"org\"])\n .optional()\n .describe(\"Scope: global, project, team, or org\");\n const projectPathSchema = z\n .string()\n .optional()\n .describe(\"Project root path for project-scoped secrets\");\n const envSchema = z\n .string()\n .optional()\n .describe(\"Environment for superposition collapse (e.g., dev, staging, prod)\");\n\n // ─── Core Tools ───\n\n server.tool(\n \"get_secret\",\n \"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: scopeSchema,\n projectPath: projectPathSchema,\n env: envSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"get_secret\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n try {\n const keyBlock = checkKeyReadPolicy(params.key, undefined, params.projectPath);\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(value);\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 \"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: scopeSchema,\n projectPath: projectPathSchema,\n tag: z.string().optional().describe(\"Filter by tag\"),\n expired: z.boolean().optional().describe(\"Show only expired secrets\"),\n stale: z.boolean().optional().describe(\"Show only stale secrets (75%+ decay)\"),\n filter: z.string().optional().describe(\"Glob pattern on key name (e.g., 'API_*')\"),\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 const escaped = params.filter.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n const regex = new RegExp(\"^\" + escaped + \"$\", \"i\");\n entries = entries.filter((e) => regex.test(e.key));\n }\n if (entries.length === 0) return text(\"No secrets found\");\n\n const lines = entries.map((e) => {\n const parts = [`[${e.scope}] ${e.key}`];\n\n if (e.envelope?.states) {\n parts.push(`states:[${Object.keys(e.envelope.states).join(\",\")}]`);\n }\n if (e.decay?.isExpired) {\n parts.push(\"EXPIRED\");\n } else if (e.decay?.isStale) {\n parts.push(`stale(${e.decay.lifetimePercent}%)`);\n }\n if (e.decay?.timeRemaining && !e.decay.isExpired) {\n parts.push(`ttl:${e.decay.timeRemaining}`);\n }\n if (e.envelope?.meta.entangled?.length) {\n parts.push(`entangled:${e.envelope.meta.entangled.length}`);\n }\n if (e.envelope && e.envelope.meta.accessCount > 0) {\n parts.push(`reads:${e.envelope.meta.accessCount}`);\n }\n\n return parts.join(\" | \");\n });\n\n return text(lines.join(\"\\n\"));\n },\n );\n\n server.tool(\n \"set_secret\",\n \"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: scopeSchema.default(\"global\"),\n projectPath: projectPathSchema,\n env: z\n .string()\n .optional()\n .describe(\"If provided, sets the value for this specific environment (superposition)\"),\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\n .array(z.string())\n .optional()\n .describe(\"Tags for organization\"),\n rotationFormat: z\n .enum([\"hex\", \"base64\", \"alphanumeric\", \"uuid\", \"api-key\", \"token\", \"password\"])\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: teamIdSchema,\n orgId: orgIdSchema,\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(`[${params.scope ?? \"global\"}] ${params.key} set for env:${params.env}`);\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 \"Remove a secret from the keyring.\",\n {\n key: z.string().describe(\"The secret key name\"),\n scope: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 \"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: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 \"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: scopeSchema,\n projectPath: projectPathSchema,\n env: envSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 \"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: scopeSchema.default(\"global\"),\n projectPath: projectPathSchema,\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 ? \"Dry run — no changes made\" : `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 \"check_project\",\n \"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: projectPathSchema,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"check_project\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const projectPath = params.projectPath ?? process.cwd();\n const config = readProjectConfig(projectPath);\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, source: \"mcp\" });\n\n if (!result) {\n const status = manifest.required !== false ? \"missing\" : \"optional_missing\";\n if (manifest.required !== false) missingCount++;\n results.push({ key, status, required: manifest.required !== false, description: manifest.description });\n continue;\n }\n\n const decay = checkDecay(result.envelope);\n\n if (decay.isExpired) {\n expiredCount++;\n results.push({ key, status: \"expired\", timeRemaining: decay.timeRemaining, description: manifest.description });\n } else if (decay.isStale) {\n staleCount++;\n results.push({ key, status: \"stale\", lifetimePercent: decay.lifetimePercent, timeRemaining: decay.timeRemaining, description: manifest.description });\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 \"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: projectPathSchema,\n env: envSchema,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"env_generate\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const projectPath = params.projectPath ?? process.cwd();\n const config = readProjectConfig(projectPath);\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,\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, 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 = 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 // ─── Quantum Tools ───\n\n server.tool(\n \"inspect_secret\",\n \"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: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 } = result;\n const decay = checkDecay(envelope);\n\n const info: Record<string, unknown> = {\n key: params.key,\n scope,\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) 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 \"detect_environment\",\n \"Detect the current environment context (wavefunction collapse). Returns the detected environment and its source (NODE_ENV, git branch, project config, etc.).\",\n {\n projectPath: projectPathSchema,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"detect_environment\", params.projectPath);\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 \"generate_secret\",\n \"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([\"hex\", \"base64\", \"alphanumeric\", \"uuid\", \"api-key\", \"token\", \"password\"])\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.string().optional().describe(\"If provided, save the generated secret with this key name\"),\n scope: scopeSchema.default(\"global\"),\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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(secret);\n },\n );\n\n server.tool(\n \"entangle_secrets\",\n \"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: scopeSchema.default(\"global\"),\n targetScope: scopeSchema.default(\"global\"),\n sourceProjectPath: z.string().optional(),\n targetProjectPath: z.string().optional(),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"entangle_secrets\", params.sourceProjectPath);\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 \"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: scopeSchema.default(\"global\"),\n targetScope: scopeSchema.default(\"global\"),\n sourceProjectPath: z.string().optional(),\n targetProjectPath: z.string().optional(),\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"disentangle_secrets\", params.sourceProjectPath);\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 // ─── Tunneling Tools ───\n\n server.tool(\n \"tunnel_create\",\n \"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(id);\n },\n );\n\n server.tool(\n \"tunnel_read\",\n \"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(value);\n },\n );\n\n server.tool(\n \"tunnel_list\",\n \"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(0, Math.floor((t.expiresAt - Date.now()) / 1000));\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 \"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 // ─── Teleportation Tools ───\n\n server.tool(\n \"teleport_pack\",\n \"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: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 \"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: scopeSchema.default(\"global\"),\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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(`Would import ${payload.secrets.length} secrets:\\n${preview}`);\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(`Imported ${payload.secrets.length} secret(s) from teleport bundle`);\n } catch {\n return text(\"Failed to unpack: wrong passphrase or corrupted bundle\", true);\n }\n },\n );\n\n // ─── Observer / Audit Tools ───\n\n server.tool(\n \"audit_log\",\n \"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([\"read\", \"write\", \"delete\", \"list\", \"export\", \"generate\", \"entangle\", \"tunnel\", \"teleport\", \"collapse\"])\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 \"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(\n (a) => `[${a.type}] ${a.description}`,\n );\n return text(lines.join(\"\\n\"));\n },\n );\n\n // ─── Health ───\n\n server.tool(\n \"health_check\",\n \"Run a comprehensive health check on all secrets: decay status, staleness, anomalies, entropy assessment.\",\n {\n scope: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 // ─── Validation Tools ───\n\n server.tool(\n \"validate_secret\",\n \"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.string().optional().describe(\"Force a specific provider (openai, stripe, github, aws, http)\"),\n scope: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 \"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 // ─── Hook Tools ───\n\n server.tool(\n \"register_hook\",\n \"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.string().optional().describe(\"Trigger on key glob pattern (e.g. DB_*)\"),\n tag: z.string().optional().describe(\"Trigger on secrets with this tag\"),\n scope: z.enum([\"global\", \"project\"]).optional().describe(\"Trigger only for this scope\"),\n actions: z.array(z.enum([\"write\", \"delete\", \"rotate\"])).optional().default([\"write\", \"delete\", \"rotate\"]).describe(\"Which actions trigger this hook\"),\n command: z.string().optional().describe(\"Shell command to execute (for shell type)\"),\n url: z.string().optional().describe(\"URL to POST to (for http type)\"),\n signalTarget: z.string().optional().describe(\"Process name or PID (for signal type)\"),\n signalName: z.string().optional().default(\"SIGHUP\").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(\"At least one match criterion required: key, keyPattern, or tag\", true);\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 ? { target: params.signalTarget, signal: params.signalName } : 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 \"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 \"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 // ─── Exec Tools ───\n\n server.tool(\n \"exec_with_secrets\",\n \"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.array(z.string()).optional().describe(\"Only inject these specific keys\"),\n tags: z.array(z.string()).optional().describe(\"Only inject secrets with these tags\"),\n profile: z.enum([\"unrestricted\", \"restricted\", \"ci\"]).optional().default(\"restricted\").describe(\"Exec profile: unrestricted, restricted, or ci\"),\n scope: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 = [];\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(`Execution failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n },\n );\n\n // ─── Scan Tools ───\n\n server.tool(\n \"scan_codebase_for_secrets\",\n \"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.string().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 \n return text(JSON.stringify(results, null, 2));\n } catch (err) {\n return text(`Scan failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n },\n );\n\n // ─── AI Agent Tools ───\n\n server.tool(\n \"get_project_context\",\n \"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: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"get_project_context\", params.projectPath);\n if (toolBlock) return toolBlock;\n\n const context = getProjectContext(opts(params));\n return text(JSON.stringify(context, null, 2));\n },\n );\n\n server.tool(\n \"agent_remember\",\n \"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 \"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) return text(`No memory found for \"${params.key}\"`, true);\n return text(value);\n },\n );\n\n server.tool(\n \"agent_forget\",\n \"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(removed ? `Forgot \"${params.key}\"` : `No memory found for \"${params.key}\"`, !removed);\n },\n );\n\n server.tool(\n \"lint_files\",\n \"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.boolean().optional().default(false).describe(\"Auto-replace and store secrets\"),\n scope: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 any,\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(`Lint failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n },\n );\n\n server.tool(\n \"analyze_secrets\",\n \"Analyze secret usage patterns and provide optimization suggestions including most accessed, stale, unused, and rotation recommendations.\",\n {\n scope: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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).length,\n neverAccessed: entries.filter(e => (e.envelope?.meta.accessCount ?? 0) === 0).map(e => e.key),\n noRotationFormat: entries.filter(e => !e.envelope?.meta.rotationFormat).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 // ─── Status Dashboard ───\n\n let dashboardInstance: { port: number; close: () => void } | null = null;\n\n server.tool(\n \"status_dashboard\",\n \"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(`Dashboard already running at http://127.0.0.1:${dashboardInstance.port}`);\n }\n\n const { startDashboardServer } = await import(\"../core/dashboard.js\");\n dashboardInstance = startDashboardServer({ port: params.port });\n\n return text(`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 // ─── Agent ───\n\n server.tool(\n \"agent_scan\",\n \"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 // ─── Audit Integrity ───\n\n server.tool(\n \"verify_audit_chain\",\n \"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 \"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.enum([\"jsonl\", \"json\", \"csv\"]).optional().default(\"jsonl\").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 // ─── Rotation & CI ───\n\n server.tool(\n \"rotate_secret\",\n \"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: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\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 \"CI-oriented batch validation: validates all accessible secrets against their providers and returns a structured pass/fail report.\",\n {\n scope: scopeSchema,\n projectPath: projectPathSchema,\n teamId: teamIdSchema,\n orgId: orgIdSchema,\n },\n async (params) => {\n const toolBlock = enforceToolPolicy(\"ci_validate_secrets\", params.projectPath);\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, { ...opts(params), scope: e.scope, silent: true });\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 // ─── Governance ───\n\n server.tool(\n \"check_policy\",\n \"Check if an action is allowed by the project's governance policy. Returns the policy decision and source.\",\n {\n action: z.enum([\"tool\", \"key_read\", \"exec\"]).describe(\"Type of policy check\"),\n toolName: z.string().optional().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.string().optional().describe(\"Command to check (for action=exec)\"),\n projectPath: projectPathSchema,\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(\"Missing required parameter for the selected action type\", true);\n },\n );\n\n server.tool(\n \"get_policy_summary\",\n \"Get a summary of the project's governance policy configuration.\",\n {\n projectPath: projectPathSchema,\n },\n async (params) => {\n const summary = getPolicySummary(params.projectPath);\n return text(JSON.stringify(summary, null, 2));\n },\n );\n\n return server;\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 * 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, getEnvelope, setSecret, type KeyringOptions } from \"./keyring.js\";\nimport { checkDecay, type QuantumEnvelope } from \"./envelope.js\";\nimport { detectAnomalies, logAudit, queryAudit } from \"./observer.js\";\nimport { generateSecret } from \"./noise.js\";\nimport { findEntangled } from \"./entanglement.js\";\nimport { fireHooks } from \"./hooks.js\";\nimport { c, SYMBOLS, decayIndicator } 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 * 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\";\n\nconst ALGORITHM = \"aes-256-gcm\";\nconst KEY_LENGTH = 32;\nconst IV_LENGTH = 16;\nconst SALT_LENGTH = 32;\nconst TAG_LENGTH = 16;\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\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 const bundleJson = Buffer.from(encoded, \"base64\").toString(\"utf8\");\n const bundle: TeleportBundle = JSON.parse(bundleJson);\n\n if (bundle.v !== 1) {\n throw new Error(`Unsupported teleport bundle version: ${bundle.v}`);\n }\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 const decrypted = Buffer.concat([\n decipher.update(encrypted),\n decipher.final(),\n ]);\n\n return JSON.parse(decrypted.toString(\"utf8\"));\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","/**\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\";\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\n// Matches common secret assignments: API_KEY = \"sk-...\" or { password: '...' }\nconst SECRET_KEYWORDS = /((?:api_?key|secret|token|password|auth|credential|access_?key)[a-z0-9_]*)\\s*[:=]\\s*(['\"])([^'\"]+)\\2/i;\n\nfunction 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\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 // Read chunk to check if binary\n content = readFileSync(fullPath, \"utf8\");\n } catch {\n continue; // skip unreadable\n }\n\n // Quick heuristic: ignore files with null bytes\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 // Skip long lines (minified code)\n if (line.length > 500) continue;\n\n const match = line.match(SECRET_KEYWORDS);\n if (match) {\n const varName = match[1];\n const value = match[3];\n\n // Ignore very short strings or obvious placeholders\n if (value.length < 8) continue;\n const lowerValue = value.toLowerCase();\n if (\n lowerValue.includes(\"example\") ||\n lowerValue.includes(\"your_\") ||\n lowerValue.includes(\"placeholder\") ||\n lowerValue.includes(\"replace_me\")\n ) {\n continue;\n }\n\n const entropy = calculateEntropy(value);\n\n // Flag if entropy is decently high (e.g. > 3.5) or looks like a known prefix\n if (entropy > 3.5 || value.startsWith(\"sk-\") || value.startsWith(\"ghp_\")) {\n // Convert absolute path to relative for cleaner output\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: varName,\n match: value,\n context: line.trim(),\n entropy: parseFloat(entropy.toFixed(2)),\n });\n }\n }\n }\n }\n }\n }\n\n walk(dir);\n return results;\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\";\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 SECRET_KEYWORDS =\n /((?:api_?key|secret|token|password|auth|credential|access_?key)[a-z0-9_]*)\\s*[:=]\\s*(['\"])([^'\"]+)\\2/gi;\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 if (line.length > 500) continue;\n\n let match: RegExpExecArray | null;\n SECRET_KEYWORDS.lastIndex = 0;\n\n while ((match = SECRET_KEYWORDS.exec(line)) !== null) {\n const varName = match[1].toUpperCase();\n const quote = match[2];\n const value = match[3];\n\n if (value.length < 8) continue;\n const lv = value.toLowerCase();\n if (\n lv.includes(\"example\") ||\n lv.includes(\"your_\") ||\n lv.includes(\"placeholder\") ||\n lv.includes(\"replace_me\") ||\n lv.includes(\"xxx\")\n ) continue;\n\n const entropy = calculateEntropy(value);\n if (entropy <= 3.5 && !value.startsWith(\"sk-\") && !value.startsWith(\"ghp_\")) continue;\n\n const shouldFix = opts.fix === true;\n\n if (shouldFix) {\n const envRef = getEnvRef(file, varName);\n fixes.push({\n line: i,\n original: `${quote}${value}${quote}`,\n replacement: envRef,\n keyName: varName,\n value,\n });\n }\n\n results.push({\n file,\n line: i + 1,\n keyName: varName,\n match: 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 // Apply fixes in reverse order to preserve line positions\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\nfunction calculateEntropy(str: string): number {\n if (!str) return 0;\n const len = str.length;\n const frequencies = new Map<string, number>();\n for (let i = 0; i < len; i++) {\n const ch = str[i];\n frequencies.set(ch, (frequencies.get(ch) || 0) + 1);\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 return entropy;\n}\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 { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { listSecrets } from \"./keyring.js\";\nimport { collapseEnvironment, readProjectConfig } from \"./collapse.js\";\nimport { checkDecay } from \"./envelope.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","/**\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"],"mappings":"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","names":["opts","randomBytes","randomBytes","text","opts","readFileSync","readFileSync","opts","readFileSync","SECRET_KEYWORDS","calculateEntropy","registry","opts","opts","registry","existsSync","readFileSync","writeFileSync","join","createCipheriv","createDecipheriv","randomBytes","server","result","registry"]}