@i4ctime/q-ring 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +286 -0
- package/dist/index.js +1525 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.js +1339 -0
- package/dist/mcp.js.map +1 -0
- package/package.json +45 -0
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/mcp.ts","../src/mcp/server.ts","../src/core/keyring.ts","../src/utils/hash.ts","../src/core/scope.ts","../src/core/envelope.ts","../src/core/collapse.ts","../src/core/observer.ts","../src/core/entanglement.ts","../src/core/noise.ts","../src/utils/colors.ts","../src/core/agent.ts","../src/core/tunnel.ts","../src/core/teleport.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 exportSecrets,\n type KeyringOptions,\n} from \"../core/keyring.js\";\nimport { runHealthScan } from \"../core/agent.js\";\nimport { checkDecay, collapseValue } from \"../core/envelope.js\";\nimport { collapseEnvironment } from \"../core/collapse.js\";\nimport type { Scope } from \"../core/scope.js\";\nimport { queryAudit, detectAnomalies } 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\";\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}): KeyringOptions {\n return {\n scope: params.scope as Scope | undefined,\n projectPath: params.projectPath ?? process.cwd(),\n env: params.env,\n source: \"mcp\",\n };\n}\n\nexport function createMcpServer(): McpServer {\n const server = new McpServer({\n name: \"q-ring\",\n version: \"0.2.0\",\n });\n\n const scopeSchema = z\n .enum([\"global\", \"project\"])\n .optional()\n .describe(\"Scope: global or project\");\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 },\n async (params) => {\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 },\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.\",\n {\n scope: scopeSchema,\n projectPath: projectPathSchema,\n },\n async (params) => {\n const entries = listSecrets(opts(params));\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 },\n async (params) => {\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 });\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 });\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 },\n async (params) => {\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 },\n async (params) => {\n return text(hasSecret(params.key, opts(params)) ? \"true\" : \"false\");\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 },\n async (params) => {\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 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 },\n async (params) => {\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 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 // ─── 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 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 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 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 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 },\n async (params) => {\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 dryRun: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Preview without importing\"),\n },\n async (params) => {\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 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 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 },\n async (params) => {\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 // ─── 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 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 return server;\n}\n","import { Entry, findCredentials } from \"@napi-rs/keyring\";\nimport {\n resolveScope,\n globalService,\n projectService,\n type Scope,\n} from \"./scope.js\";\nimport {\n type QuantumEnvelope,\n type Environment,\n createEnvelope,\n parseEnvelope,\n wrapLegacy,\n serializeEnvelope,\n collapseValue,\n checkDecay,\n recordAccess,\n type DecayStatus,\n type EntanglementLink,\n} from \"./envelope.js\";\nimport { collapseEnvironment, type CollapseContext } from \"./collapse.js\";\nimport { logAudit, type AuditAction } from \"./observer.js\";\nimport { findEntangled, entangle as entangleLink } from \"./entanglement.js\";\n\nexport interface SecretEntry {\n key: string;\n scope: Scope;\n value?: string;\n envelope?: QuantumEnvelope;\n decay?: DecayStatus;\n}\n\nexport interface KeyringOptions {\n scope?: Scope;\n projectPath?: string;\n /** Environment for superposition collapse */\n env?: Environment;\n /** Audit source */\n source?: \"cli\" | \"mcp\" | \"agent\" | \"api\";\n}\n\nexport interface SetSecretOptions extends KeyringOptions {\n /** Environment states for superposition */\n states?: Record<Environment, string>;\n /** Default environment */\n defaultEnv?: Environment;\n /** TTL in seconds (quantum decay) */\n ttlSeconds?: number;\n /** Expiry timestamp */\n expiresAt?: string;\n /** Description */\n description?: string;\n /** Tags */\n tags?: string[];\n}\n\nfunction readEnvelope(service: string, key: string): QuantumEnvelope | null {\n const entry = new Entry(service, key);\n const raw = entry.getPassword();\n if (raw === null) return null;\n\n const envelope = parseEnvelope(raw);\n return envelope ?? wrapLegacy(raw);\n}\n\nfunction writeEnvelope(\n service: string,\n key: string,\n envelope: QuantumEnvelope,\n): void {\n const entry = new Entry(service, key);\n entry.setPassword(serializeEnvelope(envelope));\n}\n\nfunction resolveEnv(opts: KeyringOptions): Environment | undefined {\n if (opts.env) return opts.env;\n const result = collapseEnvironment({ projectPath: opts.projectPath });\n return result?.env;\n}\n\n/**\n * Retrieve a secret by key, with scope resolution and superposition collapse.\n * Records the access in the audit log (observer effect).\n */\nexport function getSecret(\n key: string,\n opts: KeyringOptions = {},\n): string | null {\n const scopes = resolveScope(opts);\n const env = resolveEnv(opts);\n const source = opts.source ?? \"cli\";\n\n for (const { service, scope } of scopes) {\n const envelope = readEnvelope(service, key);\n if (!envelope) continue;\n\n // Check decay\n const decay = checkDecay(envelope);\n if (decay.isExpired) {\n logAudit({\n action: \"read\",\n key,\n scope,\n source,\n detail: \"blocked: secret expired (quantum decay)\",\n });\n continue;\n }\n\n // Collapse superposition\n const value = collapseValue(envelope, env);\n if (value === null) continue;\n\n // Observer effect: record access and persist\n const updated = recordAccess(envelope);\n writeEnvelope(service, key, updated);\n\n logAudit({ action: \"read\", key, scope, env, source });\n\n return value;\n }\n\n return null;\n}\n\n/**\n * Get the full envelope for a secret (for inspection, no value extraction).\n */\nexport function getEnvelope(\n key: string,\n opts: KeyringOptions = {},\n): { envelope: QuantumEnvelope; scope: Scope } | null {\n const scopes = resolveScope(opts);\n\n for (const { service, scope } of scopes) {\n const envelope = readEnvelope(service, key);\n if (envelope) return { envelope, scope };\n }\n\n return null;\n}\n\n/**\n * Store a secret with quantum metadata.\n */\nexport function setSecret(\n key: string,\n value: string,\n opts: SetSecretOptions = {},\n): void {\n const scope = opts.scope ?? \"global\";\n const scopes = resolveScope({ ...opts, scope });\n const { service } = scopes[0];\n const source = opts.source ?? \"cli\";\n\n // Check if there's an existing envelope to preserve metadata\n const existing = readEnvelope(service, key);\n\n let envelope: QuantumEnvelope;\n\n if (opts.states) {\n envelope = createEnvelope(\"\", {\n states: opts.states,\n defaultEnv: opts.defaultEnv,\n description: opts.description,\n tags: opts.tags,\n ttlSeconds: opts.ttlSeconds,\n expiresAt: opts.expiresAt,\n entangled: existing?.meta.entangled,\n });\n } else {\n envelope = createEnvelope(value, {\n description: opts.description,\n tags: opts.tags,\n ttlSeconds: opts.ttlSeconds,\n expiresAt: opts.expiresAt,\n entangled: existing?.meta.entangled,\n });\n }\n\n // Preserve access count from existing\n if (existing) {\n envelope.meta.createdAt = existing.meta.createdAt;\n envelope.meta.accessCount = existing.meta.accessCount;\n }\n\n writeEnvelope(service, key, envelope);\n logAudit({ action: \"write\", key, scope, source });\n\n // Propagate to entangled secrets\n const entangled = findEntangled({ service, key });\n for (const target of entangled) {\n try {\n const targetEnvelope = readEnvelope(target.service, target.key);\n if (targetEnvelope) {\n if (opts.states) {\n targetEnvelope.states = opts.states;\n } else {\n targetEnvelope.value = value;\n }\n targetEnvelope.meta.updatedAt = new Date().toISOString();\n writeEnvelope(target.service, target.key, targetEnvelope);\n logAudit({\n action: \"entangle\",\n key: target.key,\n scope: \"global\",\n source,\n detail: `propagated from ${key}`,\n });\n }\n } catch {\n // entangled target may not exist\n }\n }\n}\n\n/**\n * Delete a secret from the specified scope (or both if unscoped).\n */\nexport function deleteSecret(\n key: string,\n opts: KeyringOptions = {},\n): boolean {\n const scopes = resolveScope(opts);\n const source = opts.source ?? \"cli\";\n let deleted = false;\n\n for (const { service, scope } of scopes) {\n const entry = new Entry(service, key);\n try {\n if (entry.deleteCredential()) {\n deleted = true;\n logAudit({ action: \"delete\", key, scope, source });\n }\n } catch {\n // not found\n }\n }\n\n return deleted;\n}\n\n/**\n * Check whether a secret exists in any applicable scope.\n */\nexport function hasSecret(\n key: string,\n opts: KeyringOptions = {},\n): boolean {\n const scopes = resolveScope(opts);\n\n for (const { service } of scopes) {\n const envelope = readEnvelope(service, key);\n if (envelope) {\n const decay = checkDecay(envelope);\n if (!decay.isExpired) return true;\n }\n }\n\n return false;\n}\n\n/**\n * List all secrets across applicable scopes with quantum metadata.\n */\nexport function listSecrets(opts: KeyringOptions = {}): SecretEntry[] {\n const source = opts.source ?? \"cli\";\n const services: { service: string; scope: Scope }[] = [];\n\n if (!opts.scope || opts.scope === \"global\") {\n services.push({ service: globalService(), scope: \"global\" });\n }\n\n if ((!opts.scope || opts.scope === \"project\") && opts.projectPath) {\n services.push({\n service: projectService(opts.projectPath),\n scope: \"project\",\n });\n }\n\n const results: SecretEntry[] = [];\n const seen = new Set<string>();\n\n for (const { service, scope } of services) {\n try {\n const credentials = findCredentials(service);\n for (const cred of credentials) {\n const id = `${scope}:${cred.account}`;\n if (seen.has(id)) continue;\n seen.add(id);\n\n const envelope = parseEnvelope(cred.password) ?? wrapLegacy(cred.password);\n const decay = checkDecay(envelope);\n\n results.push({\n key: cred.account,\n scope,\n envelope,\n decay,\n });\n }\n } catch {\n // keyring unavailable\n }\n }\n\n logAudit({ action: \"list\", source });\n\n return results.sort((a, b) => a.key.localeCompare(b.key));\n}\n\n/**\n * Export all secrets with their values (for .env or JSON export).\n * Collapses superposition based on detected environment.\n */\nexport function exportSecrets(\n opts: KeyringOptions & { format?: \"env\" | \"json\" } = {},\n): string {\n const format = opts.format ?? \"env\";\n const env = resolveEnv(opts);\n const entries = listSecrets(opts);\n const source = opts.source ?? \"cli\";\n\n const merged = new Map<string, string>();\n\n const globalEntries = entries.filter((e) => e.scope === \"global\");\n const projectEntries = entries.filter((e) => e.scope === \"project\");\n\n for (const entry of [...globalEntries, ...projectEntries]) {\n if (entry.envelope) {\n const decay = checkDecay(entry.envelope);\n if (decay.isExpired) continue;\n\n const value = collapseValue(entry.envelope, env);\n if (value !== null) {\n merged.set(entry.key, value);\n }\n }\n }\n\n logAudit({ action: \"export\", source, detail: `format=${format}` });\n\n if (format === \"json\") {\n const obj: Record<string, string> = {};\n for (const [key, value] of merged) {\n obj[key] = value;\n }\n return JSON.stringify(obj, null, 2);\n }\n\n const lines: string[] = [];\n for (const [key, value] of merged) {\n const escaped = value\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\");\n lines.push(`${key}=\"${escaped}\"`);\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * Create an entanglement between two secrets.\n */\nexport function entangleSecrets(\n sourceKey: string,\n sourceOpts: KeyringOptions,\n targetKey: string,\n targetOpts: KeyringOptions,\n): void {\n const sourceScopes = resolveScope({ ...sourceOpts, scope: sourceOpts.scope ?? \"global\" });\n const targetScopes = resolveScope({ ...targetOpts, scope: targetOpts.scope ?? \"global\" });\n\n const source = { service: sourceScopes[0].service, key: sourceKey };\n const target = { service: targetScopes[0].service, key: targetKey };\n\n entangleLink(source, target);\n logAudit({\n action: \"entangle\",\n key: sourceKey,\n source: sourceOpts.source ?? \"cli\",\n detail: `entangled with ${targetKey}`,\n });\n}\n","import { createHash } from \"node:crypto\";\n\nexport function hashProjectPath(projectPath: string): string {\n return createHash(\"sha256\").update(projectPath).digest(\"hex\").slice(0, 12);\n}\n","import { hashProjectPath } from \"../utils/hash.js\";\n\nconst SERVICE_PREFIX = \"q-ring\";\n\nexport type Scope = \"global\" | \"project\";\n\nexport interface ResolvedScope {\n scope: Scope;\n service: string;\n projectPath?: string;\n}\n\nexport function globalService(): string {\n return `${SERVICE_PREFIX}:global`;\n}\n\nexport function projectService(projectPath: string): string {\n const hash = hashProjectPath(projectPath);\n return `${SERVICE_PREFIX}:project:${hash}`;\n}\n\nexport function resolveScope(opts: {\n scope?: Scope;\n projectPath?: string;\n}): ResolvedScope[] {\n const { scope, projectPath } = opts;\n\n if (scope === \"global\") {\n return [{ scope: \"global\", service: globalService() }];\n }\n\n if (scope === \"project\") {\n if (!projectPath) {\n throw new Error(\"Project path is required for project scope\");\n }\n return [\n { scope: \"project\", service: projectService(projectPath), projectPath },\n ];\n }\n\n // No explicit scope: return project-first for resolution (project overrides global)\n if (projectPath) {\n return [\n { scope: \"project\", service: projectService(projectPath), projectPath },\n { scope: \"global\", service: globalService() },\n ];\n }\n\n return [{ scope: \"global\", service: globalService() }];\n}\n\nexport function parseServiceName(service: string): ResolvedScope {\n if (service === globalService()) {\n return { scope: \"global\", service };\n }\n\n if (service.startsWith(`${SERVICE_PREFIX}:project:`)) {\n return { scope: \"project\", service };\n }\n\n return { scope: \"global\", service };\n}\n","/**\n * Quantum Envelope: the storage format for all q-ring secrets.\n *\n * Instead of storing raw strings, every secret is wrapped in an envelope\n * that carries quantum metadata: environment states (superposition),\n * TTL/expiry (decay), entanglement links, and access tracking (observer).\n */\n\nexport type Environment = string; // \"dev\" | \"staging\" | \"prod\" | custom\n\nexport interface EntanglementLink {\n /** Service name of the entangled scope */\n service: string;\n /** Key name in the entangled scope */\n key: string;\n}\n\nexport interface SecretMetadata {\n createdAt: string;\n updatedAt: string;\n /** ISO timestamp when this secret expires (quantum decay) */\n expiresAt?: string;\n /** TTL in seconds from creation/update */\n ttlSeconds?: number;\n /** Human-readable description */\n description?: string;\n /** Tags for organization */\n tags?: string[];\n /** Entanglement links to other secrets */\n entangled?: EntanglementLink[];\n /** Total number of times this secret has been read */\n accessCount: number;\n /** ISO timestamp of last read */\n lastAccessedAt?: string;\n /** Whether this secret is ephemeral (tunneling - not persisted to keyring) */\n ephemeral?: boolean;\n}\n\nexport interface QuantumEnvelope {\n /** Schema version for forward compatibility */\n v: 1;\n /** Simple value (when not in superposition) */\n value?: string;\n /** Superposition: environment-keyed values */\n states?: Record<Environment, string>;\n /** Default environment to collapse to when no context is available */\n defaultEnv?: Environment;\n /** Quantum metadata */\n meta: SecretMetadata;\n}\n\nexport function createEnvelope(\n value: string,\n opts?: Partial<Pick<QuantumEnvelope, \"states\" | \"defaultEnv\">> & {\n description?: string;\n tags?: string[];\n ttlSeconds?: number;\n expiresAt?: string;\n entangled?: EntanglementLink[];\n },\n): QuantumEnvelope {\n const now = new Date().toISOString();\n\n let expiresAt = opts?.expiresAt;\n if (!expiresAt && opts?.ttlSeconds) {\n expiresAt = new Date(Date.now() + opts.ttlSeconds * 1000).toISOString();\n }\n\n return {\n v: 1,\n value: opts?.states ? undefined : value,\n states: opts?.states,\n defaultEnv: opts?.defaultEnv,\n meta: {\n createdAt: now,\n updatedAt: now,\n expiresAt,\n ttlSeconds: opts?.ttlSeconds,\n description: opts?.description,\n tags: opts?.tags,\n entangled: opts?.entangled,\n accessCount: 0,\n },\n };\n}\n\nexport function parseEnvelope(raw: string): QuantumEnvelope | null {\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\" && parsed.v === 1) {\n return parsed as QuantumEnvelope;\n }\n } catch {\n // Not a quantum envelope - legacy raw string\n }\n return null;\n}\n\n/**\n * Wrap a legacy raw string value into a quantum envelope.\n * Used for backward compatibility with secrets stored before the envelope format.\n */\nexport function wrapLegacy(rawValue: string): QuantumEnvelope {\n const now = new Date().toISOString();\n return {\n v: 1,\n value: rawValue,\n meta: {\n createdAt: now,\n updatedAt: now,\n accessCount: 0,\n },\n };\n}\n\nexport function serializeEnvelope(envelope: QuantumEnvelope): string {\n return JSON.stringify(envelope);\n}\n\n/**\n * Resolve the concrete value from a quantum envelope.\n * If in superposition, collapses based on the provided environment.\n */\nexport function collapseValue(\n envelope: QuantumEnvelope,\n env?: Environment,\n): string | null {\n if (envelope.states) {\n const targetEnv = env ?? envelope.defaultEnv;\n if (targetEnv && envelope.states[targetEnv]) {\n return envelope.states[targetEnv];\n }\n // If no env match, try default, then return null\n if (envelope.defaultEnv && envelope.states[envelope.defaultEnv]) {\n return envelope.states[envelope.defaultEnv];\n }\n // Last resort: return the first state\n const keys = Object.keys(envelope.states);\n if (keys.length > 0) {\n return envelope.states[keys[0]];\n }\n return null;\n }\n\n return envelope.value ?? null;\n}\n\nexport interface DecayStatus {\n isExpired: boolean;\n isStale: boolean;\n /** Percentage of lifetime elapsed (0-100+) */\n lifetimePercent: number;\n /** Seconds remaining until expiry, or negative if expired */\n secondsRemaining: number | null;\n /** Human-readable time remaining */\n timeRemaining: string | null;\n}\n\nexport function checkDecay(envelope: QuantumEnvelope): DecayStatus {\n if (!envelope.meta.expiresAt) {\n return {\n isExpired: false,\n isStale: false,\n lifetimePercent: 0,\n secondsRemaining: null,\n timeRemaining: null,\n };\n }\n\n const now = Date.now();\n const expires = new Date(envelope.meta.expiresAt).getTime();\n const created = new Date(envelope.meta.createdAt).getTime();\n const totalLifetime = expires - created;\n const elapsed = now - created;\n const remaining = expires - now;\n\n const lifetimePercent =\n totalLifetime > 0 ? Math.round((elapsed / totalLifetime) * 100) : 100;\n\n const secondsRemaining = Math.floor(remaining / 1000);\n\n let timeRemaining: string | null = null;\n if (remaining > 0) {\n const days = Math.floor(remaining / 86400000);\n const hours = Math.floor((remaining % 86400000) / 3600000);\n const minutes = Math.floor((remaining % 3600000) / 60000);\n\n if (days > 0) timeRemaining = `${days}d ${hours}h`;\n else if (hours > 0) timeRemaining = `${hours}h ${minutes}m`;\n else timeRemaining = `${minutes}m`;\n } else {\n timeRemaining = \"expired\";\n }\n\n return {\n isExpired: remaining <= 0,\n isStale: lifetimePercent >= 75,\n lifetimePercent,\n secondsRemaining,\n timeRemaining,\n };\n}\n\n/**\n * Record an access event on the envelope (observer effect).\n * Returns a new envelope with updated access metadata.\n */\nexport function recordAccess(envelope: QuantumEnvelope): QuantumEnvelope {\n return {\n ...envelope,\n meta: {\n ...envelope.meta,\n accessCount: envelope.meta.accessCount + 1,\n lastAccessedAt: new Date().toISOString(),\n },\n };\n}\n","/**\n * Wavefunction Collapse: auto-detect the current environment context.\n *\n * Resolution order (first match wins):\n * 1. Explicit --env flag\n * 2. QRING_ENV environment variable\n * 3. NODE_ENV environment variable\n * 4. Git branch heuristics (main/master → prod, develop → dev, staging → staging)\n * 5. .q-ring.json project config\n * 6. Default environment from the envelope\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Environment } from \"./envelope.js\";\n\nconst BRANCH_ENV_MAP: Record<string, Environment> = {\n main: \"prod\",\n master: \"prod\",\n production: \"prod\",\n develop: \"dev\",\n development: \"dev\",\n dev: \"dev\",\n staging: \"staging\",\n stage: \"staging\",\n test: \"test\",\n testing: \"test\",\n};\n\nfunction detectGitBranch(cwd?: string): string | null {\n try {\n const branch = execSync(\"git rev-parse --abbrev-ref HEAD\", {\n cwd: cwd ?? process.cwd(),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n encoding: \"utf8\",\n timeout: 3000,\n }).trim();\n return branch || null;\n } catch {\n return null;\n }\n}\n\nexport interface ProjectConfig {\n env?: Environment;\n defaultEnv?: Environment;\n branchMap?: Record<string, Environment>;\n}\n\nfunction readProjectConfig(projectPath?: string): ProjectConfig | null {\n const configPath = join(projectPath ?? process.cwd(), \".q-ring.json\");\n try {\n if (existsSync(configPath)) {\n return JSON.parse(readFileSync(configPath, \"utf8\"));\n }\n } catch {\n // invalid config\n }\n return null;\n}\n\nexport interface CollapseContext {\n /** Explicitly provided environment */\n explicit?: Environment;\n /** Project path for git/config detection */\n projectPath?: string;\n}\n\nexport interface CollapseResult {\n env: Environment;\n source:\n | \"explicit\"\n | \"QRING_ENV\"\n | \"NODE_ENV\"\n | \"git-branch\"\n | \"project-config\"\n | \"default\";\n}\n\nexport function collapseEnvironment(\n ctx: CollapseContext = {},\n): CollapseResult | null {\n if (ctx.explicit) {\n return { env: ctx.explicit, source: \"explicit\" };\n }\n\n const qringEnv = process.env.QRING_ENV;\n if (qringEnv) {\n return { env: qringEnv, source: \"QRING_ENV\" };\n }\n\n const nodeEnv = process.env.NODE_ENV;\n if (nodeEnv) {\n const mapped = mapEnvName(nodeEnv);\n return { env: mapped, source: \"NODE_ENV\" };\n }\n\n const config = readProjectConfig(ctx.projectPath);\n if (config?.env) {\n return { env: config.env, source: \"project-config\" };\n }\n\n const branch = detectGitBranch(ctx.projectPath);\n if (branch) {\n const branchMap = { ...BRANCH_ENV_MAP, ...config?.branchMap };\n const mapped = branchMap[branch];\n if (mapped) {\n return { env: mapped, source: \"git-branch\" };\n }\n }\n\n if (config?.defaultEnv) {\n return { env: config.defaultEnv, source: \"project-config\" };\n }\n\n return null;\n}\n\nfunction mapEnvName(raw: string): Environment {\n const lower = raw.toLowerCase();\n if (lower === \"production\") return \"prod\";\n if (lower === \"development\") return \"dev\";\n return lower;\n}\n","/**\n * Observer Effect: every secret read/write/delete is logged.\n * Audit trail stored at ~/.config/q-ring/audit.jsonl\n *\n * The act of observation changes the state — each access increments\n * the envelope's access counter and records a timestamp.\n */\n\nimport { existsSync, mkdirSync, appendFileSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport type AuditAction =\n | \"read\"\n | \"write\"\n | \"delete\"\n | \"list\"\n | \"export\"\n | \"generate\"\n | \"entangle\"\n | \"tunnel\"\n | \"teleport\"\n | \"collapse\";\n\nexport interface AuditEvent {\n timestamp: string;\n action: AuditAction;\n key?: string;\n scope?: string;\n env?: string;\n source: \"cli\" | \"mcp\" | \"agent\" | \"api\";\n /** Additional context */\n detail?: string;\n /** Process ID for tracking */\n pid: number;\n}\n\nfunction getAuditDir(): 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 getAuditPath(): string {\n return join(getAuditDir(), \"audit.jsonl\");\n}\n\nexport function logAudit(event: Omit<AuditEvent, \"timestamp\" | \"pid\">): void {\n const full: AuditEvent = {\n ...event,\n timestamp: new Date().toISOString(),\n pid: process.pid,\n };\n\n try {\n appendFileSync(getAuditPath(), JSON.stringify(full) + \"\\n\");\n } catch {\n // audit logging should never crash the app\n }\n}\n\nexport interface AuditQuery {\n key?: string;\n action?: AuditAction;\n since?: string;\n limit?: number;\n}\n\nexport function queryAudit(query: AuditQuery = {}): AuditEvent[] {\n const path = getAuditPath();\n if (!existsSync(path)) return [];\n\n try {\n const lines = readFileSync(path, \"utf8\")\n .split(\"\\n\")\n .filter((l) => l.trim());\n\n let events: AuditEvent[] = lines\n .map((line) => {\n try {\n return JSON.parse(line) as AuditEvent;\n } catch {\n return null;\n }\n })\n .filter((e): e is AuditEvent => e !== null);\n\n if (query.key) {\n events = events.filter((e) => e.key === query.key);\n }\n if (query.action) {\n events = events.filter((e) => e.action === query.action);\n }\n if (query.since) {\n const since = new Date(query.since).getTime();\n events = events.filter(\n (e) => new Date(e.timestamp).getTime() >= since,\n );\n }\n\n events.sort(\n (a, b) =>\n new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n\n if (query.limit) {\n events = events.slice(0, query.limit);\n }\n\n return events;\n } catch {\n return [];\n }\n}\n\nexport interface AccessAnomaly {\n type: \"burst\" | \"unusual-hour\" | \"new-source\";\n description: string;\n events: AuditEvent[];\n}\n\n/**\n * Detect anomalous access patterns in the audit log.\n */\nexport function detectAnomalies(key?: string): AccessAnomaly[] {\n const recent = queryAudit({\n key,\n action: \"read\",\n since: new Date(Date.now() - 3600000).toISOString(), // last hour\n });\n\n const anomalies: AccessAnomaly[] = [];\n\n // Burst detection: more than 50 reads of the same key in an hour\n if (key && recent.length > 50) {\n anomalies.push({\n type: \"burst\",\n description: `${recent.length} reads of \"${key}\" in the last hour`,\n events: recent.slice(0, 10),\n });\n }\n\n // Unusual hour detection: access between 1am-5am local time\n const nightAccess = recent.filter((e) => {\n const hour = new Date(e.timestamp).getHours();\n return hour >= 1 && hour < 5;\n });\n\n if (nightAccess.length > 0) {\n anomalies.push({\n type: \"unusual-hour\",\n description: `${nightAccess.length} access(es) during unusual hours (1am-5am)`,\n events: nightAccess,\n });\n }\n\n return anomalies;\n}\n","/**\n * Quantum Entanglement: link secrets across projects.\n * When one entangled secret is rotated, all linked copies update.\n *\n * Entanglement is stored as metadata in the envelope. The entanglement\n * registry at ~/.config/q-ring/entanglement.json provides a reverse\n * lookup: given a secret, find all its entangled partners.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport interface EntanglementPair {\n /** Source: service/key */\n source: { service: string; key: string };\n /** Target: service/key */\n target: { service: string; key: string };\n /** When this entanglement was created */\n createdAt: string;\n}\n\ninterface EntanglementRegistry {\n pairs: EntanglementPair[];\n}\n\nfunction getRegistryPath(): string {\n const dir = join(homedir(), \".config\", \"q-ring\");\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n return join(dir, \"entanglement.json\");\n}\n\nfunction loadRegistry(): EntanglementRegistry {\n const path = getRegistryPath();\n if (!existsSync(path)) {\n return { pairs: [] };\n }\n try {\n return JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n return { pairs: [] };\n }\n}\n\nfunction saveRegistry(registry: EntanglementRegistry): void {\n writeFileSync(getRegistryPath(), JSON.stringify(registry, null, 2));\n}\n\nexport function entangle(\n source: { service: string; key: string },\n target: { service: string; key: string },\n): void {\n const registry = loadRegistry();\n\n const exists = registry.pairs.some(\n (p) =>\n p.source.service === source.service &&\n p.source.key === source.key &&\n p.target.service === target.service &&\n p.target.key === target.key,\n );\n\n if (!exists) {\n registry.pairs.push({\n source,\n target,\n createdAt: new Date().toISOString(),\n });\n // Bidirectional: add reverse link too\n registry.pairs.push({\n source: target,\n target: source,\n createdAt: new Date().toISOString(),\n });\n saveRegistry(registry);\n }\n}\n\nexport function disentangle(\n source: { service: string; key: string },\n target: { service: string; key: string },\n): void {\n const registry = loadRegistry();\n registry.pairs = registry.pairs.filter(\n (p) =>\n !(\n (p.source.service === source.service &&\n p.source.key === source.key &&\n p.target.service === target.service &&\n p.target.key === target.key) ||\n (p.source.service === target.service &&\n p.source.key === target.key &&\n p.target.service === source.service &&\n p.target.key === source.key)\n ),\n );\n saveRegistry(registry);\n}\n\n/**\n * Find all entangled partners for a given secret.\n */\nexport function findEntangled(\n source: { service: string; key: string },\n): { service: string; key: string }[] {\n const registry = loadRegistry();\n return registry.pairs\n .filter(\n (p) =>\n p.source.service === source.service && p.source.key === source.key,\n )\n .map((p) => p.target);\n}\n\n/**\n * List all entanglement pairs.\n */\nexport function listEntanglements(): EntanglementPair[] {\n return loadRegistry().pairs;\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 { 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 newValue = generateSecret({ format: \"api-key\" });\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 }\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 Tunneling: ephemeral secrets that exist only in memory.\n *\n * Tunneled secrets are never persisted to the OS keyring. They live\n * in a process-scoped in-memory store with optional auto-expiry.\n * Useful for passing secrets between agents without touching disk.\n */\n\ninterface TunnelEntry {\n value: string;\n createdAt: number;\n expiresAt?: number;\n accessCount: number;\n /** Max number of reads before auto-destruct */\n maxReads?: number;\n}\n\nconst tunnelStore = new Map<string, TunnelEntry>();\n\nlet cleanupInterval: ReturnType<typeof setInterval> | null = null;\n\nfunction ensureCleanup(): void {\n if (cleanupInterval) return;\n cleanupInterval = setInterval(() => {\n const now = Date.now();\n for (const [id, entry] of tunnelStore) {\n if (entry.expiresAt && now >= entry.expiresAt) {\n tunnelStore.delete(id);\n }\n }\n if (tunnelStore.size === 0 && cleanupInterval) {\n clearInterval(cleanupInterval);\n cleanupInterval = null;\n }\n }, 5000);\n\n // Don't prevent process exit\n if (cleanupInterval && typeof cleanupInterval === \"object\" && \"unref\" in cleanupInterval) {\n cleanupInterval.unref();\n }\n}\n\nexport interface TunnelOptions {\n /** TTL in seconds */\n ttlSeconds?: number;\n /** Self-destruct after N reads */\n maxReads?: number;\n}\n\n/**\n * Create a tunneled (ephemeral) secret. Returns a tunnel ID.\n */\nexport function tunnelCreate(\n value: string,\n opts: TunnelOptions = {},\n): string {\n const id = `tun_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n const now = Date.now();\n\n tunnelStore.set(id, {\n value,\n createdAt: now,\n expiresAt: opts.ttlSeconds ? now + opts.ttlSeconds * 1000 : undefined,\n accessCount: 0,\n maxReads: opts.maxReads,\n });\n\n ensureCleanup();\n return id;\n}\n\n/**\n * Read a tunneled secret by ID. Returns null if expired or not found.\n * Each read increments the access counter; auto-destructs after maxReads.\n */\nexport function tunnelRead(id: string): string | null {\n const entry = tunnelStore.get(id);\n if (!entry) return null;\n\n if (entry.expiresAt && Date.now() >= entry.expiresAt) {\n tunnelStore.delete(id);\n return null;\n }\n\n entry.accessCount++;\n\n if (entry.maxReads && entry.accessCount >= entry.maxReads) {\n const value = entry.value;\n tunnelStore.delete(id);\n return value;\n }\n\n return entry.value;\n}\n\n/**\n * Destroy a tunneled secret immediately.\n */\nexport function tunnelDestroy(id: string): boolean {\n return tunnelStore.delete(id);\n}\n\n/**\n * List all active tunnel IDs (never exposes values).\n */\nexport function tunnelList(): {\n id: string;\n createdAt: number;\n expiresAt?: number;\n accessCount: number;\n maxReads?: number;\n}[] {\n const now = Date.now();\n const result: ReturnType<typeof tunnelList> = [];\n\n for (const [id, entry] of tunnelStore) {\n if (entry.expiresAt && now >= entry.expiresAt) {\n tunnelStore.delete(id);\n continue;\n }\n result.push({\n id,\n createdAt: entry.createdAt,\n expiresAt: entry.expiresAt,\n accessCount: entry.accessCount,\n maxReads: entry.maxReads,\n });\n }\n\n return result;\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"],"mappings":";AAAA,SAAS,4BAA4B;;;ACArC,SAAS,iBAAiB;AAC1B,SAAS,SAAS;;;ACDlB,SAAS,OAAO,uBAAuB;;;ACAvC,SAAS,kBAAkB;AAEpB,SAAS,gBAAgB,aAA6B;AAC3D,SAAO,WAAW,QAAQ,EAAE,OAAO,WAAW,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAC3E;;;ACFA,IAAM,iBAAiB;AAUhB,SAAS,gBAAwB;AACtC,SAAO,GAAG,cAAc;AAC1B;AAEO,SAAS,eAAe,aAA6B;AAC1D,QAAM,OAAO,gBAAgB,WAAW;AACxC,SAAO,GAAG,cAAc,YAAY,IAAI;AAC1C;AAEO,SAAS,aAAaA,OAGT;AAClB,QAAM,EAAE,OAAO,YAAY,IAAIA;AAE/B,MAAI,UAAU,UAAU;AACtB,WAAO,CAAC,EAAE,OAAO,UAAU,SAAS,cAAc,EAAE,CAAC;AAAA,EACvD;AAEA,MAAI,UAAU,WAAW;AACvB,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AACA,WAAO;AAAA,MACL,EAAE,OAAO,WAAW,SAAS,eAAe,WAAW,GAAG,YAAY;AAAA,IACxE;AAAA,EACF;AAGA,MAAI,aAAa;AACf,WAAO;AAAA,MACL,EAAE,OAAO,WAAW,SAAS,eAAe,WAAW,GAAG,YAAY;AAAA,MACtE,EAAE,OAAO,UAAU,SAAS,cAAc,EAAE;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO,CAAC,EAAE,OAAO,UAAU,SAAS,cAAc,EAAE,CAAC;AACvD;;;ACEO,SAAS,eACd,OACAC,OAOiB;AACjB,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,MAAI,YAAYA,OAAM;AACtB,MAAI,CAAC,aAAaA,OAAM,YAAY;AAClC,gBAAY,IAAI,KAAK,KAAK,IAAI,IAAIA,MAAK,aAAa,GAAI,EAAE,YAAY;AAAA,EACxE;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAOA,OAAM,SAAS,SAAY;AAAA,IAClC,QAAQA,OAAM;AAAA,IACd,YAAYA,OAAM;AAAA,IAClB,MAAM;AAAA,MACJ,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,MACA,YAAYA,OAAM;AAAA,MAClB,aAAaA,OAAM;AAAA,MACnB,MAAMA,OAAM;AAAA,MACZ,WAAWA,OAAM;AAAA,MACjB,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAEO,SAAS,cAAc,KAAqC;AACjE,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,UAAU,OAAO,WAAW,YAAY,OAAO,MAAM,GAAG;AAC1D,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAMO,SAAS,WAAW,UAAmC;AAC5D,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO;AAAA,IACP,MAAM;AAAA,MACJ,WAAW;AAAA,MACX,WAAW;AAAA,MACX,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,UAAmC;AACnE,SAAO,KAAK,UAAU,QAAQ;AAChC;AAMO,SAAS,cACd,UACA,KACe;AACf,MAAI,SAAS,QAAQ;AACnB,UAAM,YAAY,OAAO,SAAS;AAClC,QAAI,aAAa,SAAS,OAAO,SAAS,GAAG;AAC3C,aAAO,SAAS,OAAO,SAAS;AAAA,IAClC;AAEA,QAAI,SAAS,cAAc,SAAS,OAAO,SAAS,UAAU,GAAG;AAC/D,aAAO,SAAS,OAAO,SAAS,UAAU;AAAA,IAC5C;AAEA,UAAM,OAAO,OAAO,KAAK,SAAS,MAAM;AACxC,QAAI,KAAK,SAAS,GAAG;AACnB,aAAO,SAAS,OAAO,KAAK,CAAC,CAAC;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,SAAS;AAC3B;AAaO,SAAS,WAAW,UAAwC;AACjE,MAAI,CAAC,SAAS,KAAK,WAAW;AAC5B,WAAO;AAAA,MACL,WAAW;AAAA,MACX,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,UAAU,IAAI,KAAK,SAAS,KAAK,SAAS,EAAE,QAAQ;AAC1D,QAAM,UAAU,IAAI,KAAK,SAAS,KAAK,SAAS,EAAE,QAAQ;AAC1D,QAAM,gBAAgB,UAAU;AAChC,QAAM,UAAU,MAAM;AACtB,QAAM,YAAY,UAAU;AAE5B,QAAM,kBACJ,gBAAgB,IAAI,KAAK,MAAO,UAAU,gBAAiB,GAAG,IAAI;AAEpE,QAAM,mBAAmB,KAAK,MAAM,YAAY,GAAI;AAEpD,MAAI,gBAA+B;AACnC,MAAI,YAAY,GAAG;AACjB,UAAM,OAAO,KAAK,MAAM,YAAY,KAAQ;AAC5C,UAAM,QAAQ,KAAK,MAAO,YAAY,QAAY,IAAO;AACzD,UAAM,UAAU,KAAK,MAAO,YAAY,OAAW,GAAK;AAExD,QAAI,OAAO,EAAG,iBAAgB,GAAG,IAAI,KAAK,KAAK;AAAA,aACtC,QAAQ,EAAG,iBAAgB,GAAG,KAAK,KAAK,OAAO;AAAA,QACnD,iBAAgB,GAAG,OAAO;AAAA,EACjC,OAAO;AACL,oBAAgB;AAAA,EAClB;AAEA,SAAO;AAAA,IACL,WAAW,aAAa;AAAA,IACxB,SAAS,mBAAmB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAMO,SAAS,aAAa,UAA4C;AACvE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM;AAAA,MACJ,GAAG,SAAS;AAAA,MACZ,aAAa,SAAS,KAAK,cAAc;AAAA,MACzC,iBAAgB,oBAAI,KAAK,GAAE,YAAY;AAAA,IACzC;AAAA,EACF;AACF;;;AC5MA,SAAS,gBAAgB;AACzB,SAAS,YAAY,oBAAoB;AACzC,SAAS,YAAY;AAGrB,IAAM,iBAA8C;AAAA,EAClD,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,aAAa;AAAA,EACb,KAAK;AAAA,EACL,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AACX;AAEA,SAAS,gBAAgB,KAA6B;AACpD,MAAI;AACF,UAAM,SAAS,SAAS,mCAAmC;AAAA,MACzD,KAAK,OAAO,QAAQ,IAAI;AAAA,MACxB,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC,EAAE,KAAK;AACR,WAAO,UAAU;AAAA,EACnB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQA,SAAS,kBAAkB,aAA4C;AACrE,QAAM,aAAa,KAAK,eAAe,QAAQ,IAAI,GAAG,cAAc;AACpE,MAAI;AACF,QAAI,WAAW,UAAU,GAAG;AAC1B,aAAO,KAAK,MAAM,aAAa,YAAY,MAAM,CAAC;AAAA,IACpD;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAoBO,SAAS,oBACd,MAAuB,CAAC,GACD;AACvB,MAAI,IAAI,UAAU;AAChB,WAAO,EAAE,KAAK,IAAI,UAAU,QAAQ,WAAW;AAAA,EACjD;AAEA,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,UAAU;AACZ,WAAO,EAAE,KAAK,UAAU,QAAQ,YAAY;AAAA,EAC9C;AAEA,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,SAAS;AACX,UAAM,SAAS,WAAW,OAAO;AACjC,WAAO,EAAE,KAAK,QAAQ,QAAQ,WAAW;AAAA,EAC3C;AAEA,QAAM,SAAS,kBAAkB,IAAI,WAAW;AAChD,MAAI,QAAQ,KAAK;AACf,WAAO,EAAE,KAAK,OAAO,KAAK,QAAQ,iBAAiB;AAAA,EACrD;AAEA,QAAM,SAAS,gBAAgB,IAAI,WAAW;AAC9C,MAAI,QAAQ;AACV,UAAM,YAAY,EAAE,GAAG,gBAAgB,GAAG,QAAQ,UAAU;AAC5D,UAAM,SAAS,UAAU,MAAM;AAC/B,QAAI,QAAQ;AACV,aAAO,EAAE,KAAK,QAAQ,QAAQ,aAAa;AAAA,IAC7C;AAAA,EACF;AAEA,MAAI,QAAQ,YAAY;AACtB,WAAO,EAAE,KAAK,OAAO,YAAY,QAAQ,iBAAiB;AAAA,EAC5D;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,KAA0B;AAC5C,QAAM,QAAQ,IAAI,YAAY;AAC9B,MAAI,UAAU,aAAc,QAAO;AACnC,MAAI,UAAU,cAAe,QAAO;AACpC,SAAO;AACT;;;ACpHA,SAAS,cAAAC,aAAY,WAAW,gBAAgB,gBAAAC,qBAAoB;AACpE,SAAS,QAAAC,aAAY;AACrB,SAAS,eAAe;AA2BxB,SAAS,cAAsB;AAC7B,QAAM,MAAMA,MAAK,QAAQ,GAAG,WAAW,QAAQ;AAC/C,MAAI,CAACF,YAAW,GAAG,GAAG;AACpB,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACA,SAAO;AACT;AAEA,SAAS,eAAuB;AAC9B,SAAOE,MAAK,YAAY,GAAG,aAAa;AAC1C;AAEO,SAAS,SAAS,OAAoD;AAC3E,QAAM,OAAmB;AAAA,IACvB,GAAG;AAAA,IACH,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,KAAK,QAAQ;AAAA,EACf;AAEA,MAAI;AACF,mBAAe,aAAa,GAAG,KAAK,UAAU,IAAI,IAAI,IAAI;AAAA,EAC5D,QAAQ;AAAA,EAER;AACF;AASO,SAAS,WAAW,QAAoB,CAAC,GAAiB;AAC/D,QAAM,OAAO,aAAa;AAC1B,MAAI,CAACF,YAAW,IAAI,EAAG,QAAO,CAAC;AAE/B,MAAI;AACF,UAAM,QAAQC,cAAa,MAAM,MAAM,EACpC,MAAM,IAAI,EACV,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;AAEzB,QAAI,SAAuB,MACxB,IAAI,CAAC,SAAS;AACb,UAAI;AACF,eAAO,KAAK,MAAM,IAAI;AAAA,MACxB,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,CAAC,EACA,OAAO,CAAC,MAAuB,MAAM,IAAI;AAE5C,QAAI,MAAM,KAAK;AACb,eAAS,OAAO,OAAO,CAAC,MAAM,EAAE,QAAQ,MAAM,GAAG;AAAA,IACnD;AACA,QAAI,MAAM,QAAQ;AAChB,eAAS,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,MAAM;AAAA,IACzD;AACA,QAAI,MAAM,OAAO;AACf,YAAM,QAAQ,IAAI,KAAK,MAAM,KAAK,EAAE,QAAQ;AAC5C,eAAS,OAAO;AAAA,QACd,CAAC,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,MAC5C;AAAA,IACF;AAEA,WAAO;AAAA,MACL,CAAC,GAAG,MACF,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AAAA,IACpE;AAEA,QAAI,MAAM,OAAO;AACf,eAAS,OAAO,MAAM,GAAG,MAAM,KAAK;AAAA,IACtC;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAWO,SAAS,gBAAgB,KAA+B;AAC7D,QAAM,SAAS,WAAW;AAAA,IACxB;AAAA,IACA,QAAQ;AAAA,IACR,OAAO,IAAI,KAAK,KAAK,IAAI,IAAI,IAAO,EAAE,YAAY;AAAA;AAAA,EACpD,CAAC;AAED,QAAM,YAA6B,CAAC;AAGpC,MAAI,OAAO,OAAO,SAAS,IAAI;AAC7B,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,aAAa,GAAG,OAAO,MAAM,cAAc,GAAG;AAAA,MAC9C,QAAQ,OAAO,MAAM,GAAG,EAAE;AAAA,IAC5B,CAAC;AAAA,EACH;AAGA,QAAM,cAAc,OAAO,OAAO,CAAC,MAAM;AACvC,UAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,SAAS;AAC5C,WAAO,QAAQ,KAAK,OAAO;AAAA,EAC7B,CAAC;AAED,MAAI,YAAY,SAAS,GAAG;AAC1B,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,aAAa,GAAG,YAAY,MAAM;AAAA,MAClC,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ACtJA,SAAS,cAAAE,aAAY,gBAAAC,eAAc,eAAe,aAAAC,kBAAiB;AACnE,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAexB,SAAS,kBAA0B;AACjC,QAAM,MAAMD,MAAKC,SAAQ,GAAG,WAAW,QAAQ;AAC/C,MAAI,CAACJ,YAAW,GAAG,GAAG;AACpB,IAAAE,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACA,SAAOC,MAAK,KAAK,mBAAmB;AACtC;AAEA,SAAS,eAAqC;AAC5C,QAAM,OAAO,gBAAgB;AAC7B,MAAI,CAACH,YAAW,IAAI,GAAG;AACrB,WAAO,EAAE,OAAO,CAAC,EAAE;AAAA,EACrB;AACA,MAAI;AACF,WAAO,KAAK,MAAMC,cAAa,MAAM,MAAM,CAAC;AAAA,EAC9C,QAAQ;AACN,WAAO,EAAE,OAAO,CAAC,EAAE;AAAA,EACrB;AACF;AAEA,SAAS,aAAa,UAAsC;AAC1D,gBAAc,gBAAgB,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AACpE;AAEO,SAAS,SACd,QACA,QACM;AACN,QAAM,WAAW,aAAa;AAE9B,QAAM,SAAS,SAAS,MAAM;AAAA,IAC5B,CAAC,MACC,EAAE,OAAO,YAAY,OAAO,WAC5B,EAAE,OAAO,QAAQ,OAAO,OACxB,EAAE,OAAO,YAAY,OAAO,WAC5B,EAAE,OAAO,QAAQ,OAAO;AAAA,EAC5B;AAEA,MAAI,CAAC,QAAQ;AACX,aAAS,MAAM,KAAK;AAAA,MAClB;AAAA,MACA;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAED,aAAS,MAAM,KAAK;AAAA,MAClB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AACD,iBAAa,QAAQ;AAAA,EACvB;AACF;AA0BO,SAAS,cACd,QACoC;AACpC,QAAM,WAAW,aAAa;AAC9B,SAAO,SAAS,MACb;AAAA,IACC,CAAC,MACC,EAAE,OAAO,YAAY,OAAO,WAAW,EAAE,OAAO,QAAQ,OAAO;AAAA,EACnE,EACC,IAAI,CAAC,MAAM,EAAE,MAAM;AACxB;;;AN1DA,SAAS,aAAa,SAAiB,KAAqC;AAC1E,QAAM,QAAQ,IAAI,MAAM,SAAS,GAAG;AACpC,QAAM,MAAM,MAAM,YAAY;AAC9B,MAAI,QAAQ,KAAM,QAAO;AAEzB,QAAM,WAAW,cAAc,GAAG;AAClC,SAAO,YAAY,WAAW,GAAG;AACnC;AAEA,SAAS,cACP,SACA,KACA,UACM;AACN,QAAM,QAAQ,IAAI,MAAM,SAAS,GAAG;AACpC,QAAM,YAAY,kBAAkB,QAAQ,CAAC;AAC/C;AAEA,SAAS,WAAWI,OAA+C;AACjE,MAAIA,MAAK,IAAK,QAAOA,MAAK;AAC1B,QAAM,SAAS,oBAAoB,EAAE,aAAaA,MAAK,YAAY,CAAC;AACpE,SAAO,QAAQ;AACjB;AAMO,SAAS,UACd,KACAA,QAAuB,CAAC,GACT;AACf,QAAM,SAAS,aAAaA,KAAI;AAChC,QAAM,MAAM,WAAWA,KAAI;AAC3B,QAAM,SAASA,MAAK,UAAU;AAE9B,aAAW,EAAE,SAAS,MAAM,KAAK,QAAQ;AACvC,UAAM,WAAW,aAAa,SAAS,GAAG;AAC1C,QAAI,CAAC,SAAU;AAGf,UAAM,QAAQ,WAAW,QAAQ;AACjC,QAAI,MAAM,WAAW;AACnB,eAAS;AAAA,QACP,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AACD;AAAA,IACF;AAGA,UAAM,QAAQ,cAAc,UAAU,GAAG;AACzC,QAAI,UAAU,KAAM;AAGpB,UAAM,UAAU,aAAa,QAAQ;AACrC,kBAAc,SAAS,KAAK,OAAO;AAEnC,aAAS,EAAE,QAAQ,QAAQ,KAAK,OAAO,KAAK,OAAO,CAAC;AAEpD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKO,SAAS,YACd,KACAA,QAAuB,CAAC,GAC4B;AACpD,QAAM,SAAS,aAAaA,KAAI;AAEhC,aAAW,EAAE,SAAS,MAAM,KAAK,QAAQ;AACvC,UAAM,WAAW,aAAa,SAAS,GAAG;AAC1C,QAAI,SAAU,QAAO,EAAE,UAAU,MAAM;AAAA,EACzC;AAEA,SAAO;AACT;AAKO,SAAS,UACd,KACA,OACAA,QAAyB,CAAC,GACpB;AACN,QAAM,QAAQA,MAAK,SAAS;AAC5B,QAAM,SAAS,aAAa,EAAE,GAAGA,OAAM,MAAM,CAAC;AAC9C,QAAM,EAAE,QAAQ,IAAI,OAAO,CAAC;AAC5B,QAAM,SAASA,MAAK,UAAU;AAG9B,QAAM,WAAW,aAAa,SAAS,GAAG;AAE1C,MAAI;AAEJ,MAAIA,MAAK,QAAQ;AACf,eAAW,eAAe,IAAI;AAAA,MAC5B,QAAQA,MAAK;AAAA,MACb,YAAYA,MAAK;AAAA,MACjB,aAAaA,MAAK;AAAA,MAClB,MAAMA,MAAK;AAAA,MACX,YAAYA,MAAK;AAAA,MACjB,WAAWA,MAAK;AAAA,MAChB,WAAW,UAAU,KAAK;AAAA,IAC5B,CAAC;AAAA,EACH,OAAO;AACL,eAAW,eAAe,OAAO;AAAA,MAC/B,aAAaA,MAAK;AAAA,MAClB,MAAMA,MAAK;AAAA,MACX,YAAYA,MAAK;AAAA,MACjB,WAAWA,MAAK;AAAA,MAChB,WAAW,UAAU,KAAK;AAAA,IAC5B,CAAC;AAAA,EACH;AAGA,MAAI,UAAU;AACZ,aAAS,KAAK,YAAY,SAAS,KAAK;AACxC,aAAS,KAAK,cAAc,SAAS,KAAK;AAAA,EAC5C;AAEA,gBAAc,SAAS,KAAK,QAAQ;AACpC,WAAS,EAAE,QAAQ,SAAS,KAAK,OAAO,OAAO,CAAC;AAGhD,QAAM,YAAY,cAAc,EAAE,SAAS,IAAI,CAAC;AAChD,aAAW,UAAU,WAAW;AAC9B,QAAI;AACF,YAAM,iBAAiB,aAAa,OAAO,SAAS,OAAO,GAAG;AAC9D,UAAI,gBAAgB;AAClB,YAAIA,MAAK,QAAQ;AACf,yBAAe,SAASA,MAAK;AAAA,QAC/B,OAAO;AACL,yBAAe,QAAQ;AAAA,QACzB;AACA,uBAAe,KAAK,aAAY,oBAAI,KAAK,GAAE,YAAY;AACvD,sBAAc,OAAO,SAAS,OAAO,KAAK,cAAc;AACxD,iBAAS;AAAA,UACP,QAAQ;AAAA,UACR,KAAK,OAAO;AAAA,UACZ,OAAO;AAAA,UACP;AAAA,UACA,QAAQ,mBAAmB,GAAG;AAAA,QAChC,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAKO,SAAS,aACd,KACAA,QAAuB,CAAC,GACf;AACT,QAAM,SAAS,aAAaA,KAAI;AAChC,QAAM,SAASA,MAAK,UAAU;AAC9B,MAAI,UAAU;AAEd,aAAW,EAAE,SAAS,MAAM,KAAK,QAAQ;AACvC,UAAM,QAAQ,IAAI,MAAM,SAAS,GAAG;AACpC,QAAI;AACF,UAAI,MAAM,iBAAiB,GAAG;AAC5B,kBAAU;AACV,iBAAS,EAAE,QAAQ,UAAU,KAAK,OAAO,OAAO,CAAC;AAAA,MACnD;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,UACd,KACAA,QAAuB,CAAC,GACf;AACT,QAAM,SAAS,aAAaA,KAAI;AAEhC,aAAW,EAAE,QAAQ,KAAK,QAAQ;AAChC,UAAM,WAAW,aAAa,SAAS,GAAG;AAC1C,QAAI,UAAU;AACZ,YAAM,QAAQ,WAAW,QAAQ;AACjC,UAAI,CAAC,MAAM,UAAW,QAAO;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,YAAYA,QAAuB,CAAC,GAAkB;AACpE,QAAM,SAASA,MAAK,UAAU;AAC9B,QAAM,WAAgD,CAAC;AAEvD,MAAI,CAACA,MAAK,SAASA,MAAK,UAAU,UAAU;AAC1C,aAAS,KAAK,EAAE,SAAS,cAAc,GAAG,OAAO,SAAS,CAAC;AAAA,EAC7D;AAEA,OAAK,CAACA,MAAK,SAASA,MAAK,UAAU,cAAcA,MAAK,aAAa;AACjE,aAAS,KAAK;AAAA,MACZ,SAAS,eAAeA,MAAK,WAAW;AAAA,MACxC,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,UAAyB,CAAC;AAChC,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,EAAE,SAAS,MAAM,KAAK,UAAU;AACzC,QAAI;AACF,YAAM,cAAc,gBAAgB,OAAO;AAC3C,iBAAW,QAAQ,aAAa;AAC9B,cAAM,KAAK,GAAG,KAAK,IAAI,KAAK,OAAO;AACnC,YAAI,KAAK,IAAI,EAAE,EAAG;AAClB,aAAK,IAAI,EAAE;AAEX,cAAM,WAAW,cAAc,KAAK,QAAQ,KAAK,WAAW,KAAK,QAAQ;AACzE,cAAM,QAAQ,WAAW,QAAQ;AAEjC,gBAAQ,KAAK;AAAA,UACX,KAAK,KAAK;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,WAAS,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAEnC,SAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,cAAc,EAAE,GAAG,CAAC;AAC1D;AAuDO,SAAS,gBACd,WACA,YACA,WACA,YACM;AACN,QAAM,eAAe,aAAa,EAAE,GAAG,YAAY,OAAO,WAAW,SAAS,SAAS,CAAC;AACxF,QAAM,eAAe,aAAa,EAAE,GAAG,YAAY,OAAO,WAAW,SAAS,SAAS,CAAC;AAExF,QAAM,SAAS,EAAE,SAAS,aAAa,CAAC,EAAE,SAAS,KAAK,UAAU;AAClE,QAAM,SAAS,EAAE,SAAS,aAAa,CAAC,EAAE,SAAS,KAAK,UAAU;AAElE,WAAa,QAAQ,MAAM;AAC3B,WAAS;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,QAAQ,WAAW,UAAU;AAAA,IAC7B,QAAQ,kBAAkB,SAAS;AAAA,EACrC,CAAC;AACH;;;AO1XA,SAAS,aAAa,iBAAiB;AAmBvC,IAAM,YACJ;AACF,IAAM,iBACJ;AAEF,SAAS,aAAa,SAAiB,QAAwB;AAC7D,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,cAAU,QAAQ,UAAU,QAAQ,MAAM,CAAC;AAAA,EAC7C;AACA,SAAO;AACT;AAEO,SAAS,eAAeC,QAAqB,CAAC,GAAW;AAC9D,QAAM,SAASA,MAAK,UAAU;AAE9B,UAAQ,QAAQ;AAAA,IACd,KAAK,OAAO;AACV,YAAM,MAAMA,MAAK,UAAU;AAC3B,aAAO,YAAY,GAAG,EAAE,SAAS,KAAK;AAAA,IACxC;AAAA,IAEA,KAAK,UAAU;AACb,YAAM,MAAMA,MAAK,UAAU;AAC3B,aAAO,YAAY,GAAG,EAAE,SAAS,WAAW;AAAA,IAC9C;AAAA,IAEA,KAAK,gBAAgB;AACnB,YAAM,MAAMA,MAAK,UAAU;AAC3B,aAAO,aAAa,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,KAAK,QAAQ;AACX,YAAM,QAAQ,YAAY,EAAE;AAC5B,YAAM,CAAC,IAAK,MAAM,CAAC,IAAI,KAAQ;AAC/B,YAAM,CAAC,IAAK,MAAM,CAAC,IAAI,KAAQ;AAC/B,YAAM,MAAM,MAAM,SAAS,KAAK;AAChC,aAAO;AAAA,QACL,IAAI,MAAM,GAAG,CAAC;AAAA,QACd,IAAI,MAAM,GAAG,EAAE;AAAA,QACf,IAAI,MAAM,IAAI,EAAE;AAAA,QAChB,IAAI,MAAM,IAAI,EAAE;AAAA,QAChB,IAAI,MAAM,IAAI,EAAE;AAAA,MAClB,EAAE,KAAK,GAAG;AAAA,IACZ;AAAA,IAEA,KAAK,WAAW;AACd,YAAM,SAASA,MAAK,UAAU;AAC9B,YAAM,MAAMA,MAAK,UAAU;AAC3B,aAAO,SAAS,aAAa,WAAW,GAAG;AAAA,IAC7C;AAAA,IAEA,KAAK,SAAS;AACZ,YAAM,SAASA,MAAK,UAAU;AAC9B,YAAM,MAAMA,MAAK,UAAU;AAC3B,aAAO,SAAS,YAAY,GAAG,EAAE,SAAS,WAAW;AAAA,IACvD;AAAA,IAEA,KAAK,YAAY;AACf,YAAM,MAAMA,MAAK,UAAU;AAC3B,UAAI,KAAK,aAAa,gBAAgB,GAAG;AAGzC,YAAM,WAAW,QAAQ,KAAK,EAAE;AAChC,YAAM,WAAW,QAAQ,KAAK,EAAE;AAChC,YAAM,WAAW,QAAQ,KAAK,EAAE;AAChC,YAAM,aAAa,eAAe,KAAK,EAAE;AAEzC,UAAI,CAAC,SAAU,MAAK,UAAU,IAAI,UAAU,GAAG,GAAG,aAAa,8BAA8B,CAAC,CAAC;AAC/F,UAAI,CAAC,SAAU,MAAK,UAAU,IAAI,UAAU,GAAG,GAAG,aAAa,8BAA8B,CAAC,CAAC;AAC/F,UAAI,CAAC,SAAU,MAAK,UAAU,IAAI,UAAU,GAAG,GAAG,aAAa,cAAc,CAAC,CAAC;AAC/E,UAAI,CAAC,WAAY,MAAK,UAAU,IAAI,UAAU,GAAG,GAAG,aAAa,kBAAkB,CAAC,CAAC;AAErF,aAAO;AAAA,IACT;AAAA,IAEA;AACE,aAAO,YAAY,EAAE,EAAE,SAAS,KAAK;AAAA,EACzC;AACF;AAEA,SAAS,UAAU,KAAa,OAAe,MAAsB;AACnE,SAAO,IAAI,MAAM,GAAG,KAAK,IAAI,OAAO,IAAI,MAAM,QAAQ,CAAC;AACzD;AAKO,SAAS,gBAAgB,QAAwB;AACtD,QAAM,WAAW;AAAA,IACf,EAAE,OAAO,SAAS,MAAM,GAAG;AAAA,IAC3B,EAAE,OAAO,SAAS,MAAM,GAAG;AAAA,IAC3B,EAAE,OAAO,SAAS,MAAM,GAAG;AAAA,IAC3B,EAAE,OAAO,gBAAgB,MAAM,GAAG;AAAA,EACpC;AAEA,MAAI,WAAW;AACf,aAAW,EAAE,OAAO,KAAK,KAAK,UAAU;AACtC,QAAI,MAAM,KAAK,MAAM,EAAG,aAAY;AAAA,EACtC;AAEA,SAAO,WAAW,IAAI,KAAK,MAAM,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,IAAI;AAC1E;;;AC1HA,IAAM,UAAU,QAAQ,OAAO,UAAU,SAAS,CAAC,QAAQ,IAAI;;;ACqC/D,SAAS,gBAA6B;AACpC,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,cAAc,CAAC,QAAQ,IAAI,CAAC;AAAA,IAC5B,SAAS;AAAA,EACX;AACF;AAEO,SAAS,cAAc,SAA+B,CAAC,GAAgB;AAC5E,QAAM,MAAM,EAAE,GAAG,cAAc,GAAG,GAAG,OAAO;AAE5C,QAAM,SAAsB;AAAA,IAC1B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,cAAc;AAAA,IACd,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS,CAAC;AAAA,IACV,UAAU,CAAC;AAAA,EACb;AAGA,QAAM,gBAAgB,YAAY,EAAE,OAAO,UAAU,QAAQ,QAAQ,CAAC;AAGtE,QAAM,iBAAiB,IAAI,aAAa;AAAA,IAAQ,CAAC,OAC/C,YAAY,EAAE,OAAO,WAAW,aAAa,IAAI,QAAQ,QAAQ,CAAC;AAAA,EACpE;AAEA,QAAM,aAAa,CAAC,GAAG,eAAe,GAAG,cAAc;AACvD,SAAO,eAAe,WAAW;AAEjC,aAAW,SAAS,YAAY;AAC9B,QAAI,CAAC,MAAM,SAAU;AAErB,UAAM,QAAQ,WAAW,MAAM,QAAQ;AAEvC,QAAI,MAAM,WAAW;AACnB,aAAO;AACP,aAAO,SAAS;AAAA,QACd,YAAY,MAAM,GAAG,KAAK,MAAM,KAAK,oBAAe,MAAM,aAAa;AAAA,MACzE;AAEA,UAAI,IAAI,YAAY;AAClB,cAAM,WAAW,eAAe,EAAE,QAAQ,UAAU,CAAC;AACrD,kBAAU,MAAM,KAAK,UAAU;AAAA,UAC7B,OAAO,MAAM;AAAA,UACb,aAAa,IAAI,aAAa,CAAC;AAAA,UAC/B,QAAQ;AAAA,QACV,CAAC;AACD,eAAO,QAAQ,KAAK,MAAM,GAAG;AAC7B,iBAAS;AAAA,UACP,QAAQ;AAAA,UACR,KAAK,MAAM;AAAA,UACX,OAAO,MAAM;AAAA,UACb,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,WAAW,MAAM,SAAS;AACxB,aAAO;AACP,aAAO,SAAS;AAAA,QACd,UAAU,MAAM,GAAG,KAAK,MAAM,KAAK,YAAO,MAAM,eAAe,eAAe,MAAM,aAAa;AAAA,MACnG;AAAA,IACF,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,YAAY,gBAAgB;AAClC,SAAO,YAAY,UAAU;AAC7B,aAAW,KAAK,WAAW;AACzB,WAAO,SAAS,KAAK,YAAY,EAAE,IAAI,MAAM,EAAE,WAAW,EAAE;AAAA,EAC9D;AAEA,SAAO;AACT;;;ACvGA,IAAM,cAAc,oBAAI,IAAyB;AAEjD,IAAI,kBAAyD;AAE7D,SAAS,gBAAsB;AAC7B,MAAI,gBAAiB;AACrB,oBAAkB,YAAY,MAAM;AAClC,UAAM,MAAM,KAAK,IAAI;AACrB,eAAW,CAAC,IAAI,KAAK,KAAK,aAAa;AACrC,UAAI,MAAM,aAAa,OAAO,MAAM,WAAW;AAC7C,oBAAY,OAAO,EAAE;AAAA,MACvB;AAAA,IACF;AACA,QAAI,YAAY,SAAS,KAAK,iBAAiB;AAC7C,oBAAc,eAAe;AAC7B,wBAAkB;AAAA,IACpB;AAAA,EACF,GAAG,GAAI;AAGP,MAAI,mBAAmB,OAAO,oBAAoB,YAAY,WAAW,iBAAiB;AACxF,oBAAgB,MAAM;AAAA,EACxB;AACF;AAYO,SAAS,aACd,OACAC,QAAsB,CAAC,GACf;AACR,QAAM,KAAK,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACnF,QAAM,MAAM,KAAK,IAAI;AAErB,cAAY,IAAI,IAAI;AAAA,IAClB;AAAA,IACA,WAAW;AAAA,IACX,WAAWA,MAAK,aAAa,MAAMA,MAAK,aAAa,MAAO;AAAA,IAC5D,aAAa;AAAA,IACb,UAAUA,MAAK;AAAA,EACjB,CAAC;AAED,gBAAc;AACd,SAAO;AACT;AAMO,SAAS,WAAW,IAA2B;AACpD,QAAM,QAAQ,YAAY,IAAI,EAAE;AAChC,MAAI,CAAC,MAAO,QAAO;AAEnB,MAAI,MAAM,aAAa,KAAK,IAAI,KAAK,MAAM,WAAW;AACpD,gBAAY,OAAO,EAAE;AACrB,WAAO;AAAA,EACT;AAEA,QAAM;AAEN,MAAI,MAAM,YAAY,MAAM,eAAe,MAAM,UAAU;AACzD,UAAM,QAAQ,MAAM;AACpB,gBAAY,OAAO,EAAE;AACrB,WAAO;AAAA,EACT;AAEA,SAAO,MAAM;AACf;AAKO,SAAS,cAAc,IAAqB;AACjD,SAAO,YAAY,OAAO,EAAE;AAC9B;AAKO,SAAS,aAMZ;AACF,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,SAAwC,CAAC;AAE/C,aAAW,CAAC,IAAI,KAAK,KAAK,aAAa;AACrC,QAAI,MAAM,aAAa,OAAO,MAAM,WAAW;AAC7C,kBAAY,OAAO,EAAE;AACrB;AAAA,IACF;AACA,WAAO,KAAK;AAAA,MACV;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,WAAW,MAAM;AAAA,MACjB,aAAa,MAAM;AAAA,MACnB,UAAU,MAAM;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AC1HA;AAAA,EACE,eAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,IAAM,YAAY;AAClB,IAAM,aAAa;AACnB,IAAM,YAAY;AAClB,IAAM,cAAc;AAEpB,IAAM,oBAAoB;AAyB1B,SAAS,UAAU,YAAoB,MAAsB;AAC3D,SAAO,WAAW,YAAY,MAAM,mBAAmB,YAAY,QAAQ;AAC7E;AAKO,SAAS,aACd,SACA,YACQ;AACR,QAAM,UAA2B;AAAA,IAC/B;AAAA,IACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,EACrC;AAEA,QAAM,YAAY,KAAK,UAAU,OAAO;AACxC,QAAM,OAAOC,aAAY,WAAW;AACpC,QAAM,KAAKA,aAAY,SAAS;AAChC,QAAM,MAAM,UAAU,YAAY,IAAI;AAEtC,QAAM,SAAS,eAAe,WAAW,KAAK,EAAE;AAChD,QAAM,YAAY,OAAO,OAAO;AAAA,IAC9B,OAAO,OAAO,WAAW,MAAM;AAAA,IAC/B,OAAO,MAAM;AAAA,EACf,CAAC;AACD,QAAM,MAAM,OAAO,WAAW;AAE9B,QAAM,SAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,MAAM,UAAU,SAAS,QAAQ;AAAA,IACjC,MAAM,KAAK,SAAS,QAAQ;AAAA,IAC5B,IAAI,GAAG,SAAS,QAAQ;AAAA,IACxB,KAAK,IAAI,SAAS,QAAQ;AAAA,IAC1B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,OAAO,QAAQ;AAAA,EACjB;AAEA,SAAO,OAAO,KAAK,KAAK,UAAU,MAAM,CAAC,EAAE,SAAS,QAAQ;AAC9D;AAKO,SAAS,eACd,SACA,YACiB;AACjB,QAAM,aAAa,OAAO,KAAK,SAAS,QAAQ,EAAE,SAAS,MAAM;AACjE,QAAM,SAAyB,KAAK,MAAM,UAAU;AAEpD,MAAI,OAAO,MAAM,GAAG;AAClB,UAAM,IAAI,MAAM,wCAAwC,OAAO,CAAC,EAAE;AAAA,EACpE;AAEA,QAAM,OAAO,OAAO,KAAK,OAAO,MAAM,QAAQ;AAC9C,QAAM,KAAK,OAAO,KAAK,OAAO,IAAI,QAAQ;AAC1C,QAAM,MAAM,OAAO,KAAK,OAAO,KAAK,QAAQ;AAC5C,QAAM,YAAY,OAAO,KAAK,OAAO,MAAM,QAAQ;AACnD,QAAM,MAAM,UAAU,YAAY,IAAI;AAEtC,QAAM,WAAW,iBAAiB,WAAW,KAAK,EAAE;AACpD,WAAS,WAAW,GAAG;AAEvB,QAAM,YAAY,OAAO,OAAO;AAAA,IAC9B,SAAS,OAAO,SAAS;AAAA,IACzB,SAAS,MAAM;AAAA,EACjB,CAAC;AAED,SAAO,KAAK,MAAM,UAAU,SAAS,MAAM,CAAC;AAC9C;;;AZpFA,SAAS,KAAK,GAAW,UAAU,OAAO;AACxC,SAAO;AAAA,IACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,EAAE,CAAC;AAAA,IAC5C,GAAI,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,EACrC;AACF;AAEA,SAAS,KAAK,QAIK;AACjB,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,aAAa,OAAO,eAAe,QAAQ,IAAI;AAAA,IAC/C,KAAK,OAAO;AAAA,IACZ,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,kBAA6B;AAC3C,QAAMC,UAAS,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AAED,QAAM,cAAc,EACjB,KAAK,CAAC,UAAU,SAAS,CAAC,EAC1B,SAAS,EACT,SAAS,0BAA0B;AACtC,QAAM,oBAAoB,EACvB,OAAO,EACP,SAAS,EACT,SAAS,8CAA8C;AAC1D,QAAM,YAAY,EACf,OAAO,EACP,SAAS,EACT,SAAS,mEAAmE;AAI/E,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,KAAK,EAAE,OAAO,EAAE,SAAS,qBAAqB;AAAA,MAC9C,OAAO;AAAA,MACP,aAAa;AAAA,MACb,KAAK;AAAA,IACP;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,QAAQ,UAAU,OAAO,KAAK,KAAK,MAAM,CAAC;AAChD,UAAI,UAAU,KAAM,QAAO,KAAK,WAAW,OAAO,GAAG,eAAe,IAAI;AACxE,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,UAAU,YAAY,KAAK,MAAM,CAAC;AACxC,UAAI,QAAQ,WAAW,EAAG,QAAO,KAAK,kBAAkB;AAExD,YAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM;AAC/B,cAAM,QAAQ,CAAC,IAAI,EAAE,KAAK,KAAK,EAAE,GAAG,EAAE;AAEtC,YAAI,EAAE,UAAU,QAAQ;AACtB,gBAAM,KAAK,WAAW,OAAO,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,GAAG,CAAC,GAAG;AAAA,QACnE;AACA,YAAI,EAAE,OAAO,WAAW;AACtB,gBAAM,KAAK,SAAS;AAAA,QACtB,WAAW,EAAE,OAAO,SAAS;AAC3B,gBAAM,KAAK,SAAS,EAAE,MAAM,eAAe,IAAI;AAAA,QACjD;AACA,YAAI,EAAE,OAAO,iBAAiB,CAAC,EAAE,MAAM,WAAW;AAChD,gBAAM,KAAK,OAAO,EAAE,MAAM,aAAa,EAAE;AAAA,QAC3C;AACA,YAAI,EAAE,UAAU,KAAK,WAAW,QAAQ;AACtC,gBAAM,KAAK,aAAa,EAAE,SAAS,KAAK,UAAU,MAAM,EAAE;AAAA,QAC5D;AACA,YAAI,EAAE,YAAY,EAAE,SAAS,KAAK,cAAc,GAAG;AACjD,gBAAM,KAAK,SAAS,EAAE,SAAS,KAAK,WAAW,EAAE;AAAA,QACnD;AAEA,eAAO,MAAM,KAAK,KAAK;AAAA,MACzB,CAAC;AAED,aAAO,KAAK,MAAM,KAAK,IAAI,CAAC;AAAA,IAC9B;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,KAAK,EAAE,OAAO,EAAE,SAAS,qBAAqB;AAAA,MAC9C,OAAO,EAAE,OAAO,EAAE,SAAS,kBAAkB;AAAA,MAC7C,OAAO,YAAY,QAAQ,QAAQ;AAAA,MACnC,aAAa;AAAA,MACb,KAAK,EACF,OAAO,EACP,SAAS,EACT,SAAS,2EAA2E;AAAA,MACvF,YAAY,EACT,OAAO,EACP,SAAS,EACT,SAAS,yCAAyC;AAAA,MACrD,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4BAA4B;AAAA,MACxE,MAAM,EACH,MAAM,EAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,uBAAuB;AAAA,IACrC;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,IAAI,KAAK,MAAM;AAErB,UAAI,OAAO,KAAK;AACd,cAAM,WAAW,YAAY,OAAO,KAAK,CAAC;AAC1C,cAAM,SAAS,UAAU,UAAU,UAAU,CAAC;AAC9C,eAAO,OAAO,GAAG,IAAI,OAAO;AAE5B,YAAI,UAAU,UAAU,SAAS,CAAC,OAAO,SAAS,GAAG;AACnD,iBAAO,SAAS,IAAI,SAAS,SAAS;AAAA,QACxC;AAEA,kBAAU,OAAO,KAAK,IAAI;AAAA,UACxB,GAAG;AAAA,UACH;AAAA,UACA,YAAY,UAAU,UAAU,cAAc,OAAO;AAAA,UACrD,YAAY,OAAO;AAAA,UACnB,aAAa,OAAO;AAAA,UACpB,MAAM,OAAO;AAAA,QACf,CAAC;AAED,eAAO,KAAK,IAAI,OAAO,SAAS,QAAQ,KAAK,OAAO,GAAG,gBAAgB,OAAO,GAAG,EAAE;AAAA,MACrF;AAEA,gBAAU,OAAO,KAAK,OAAO,OAAO;AAAA,QAClC,GAAG;AAAA,QACH,YAAY,OAAO;AAAA,QACnB,aAAa,OAAO;AAAA,QACpB,MAAM,OAAO;AAAA,MACf,CAAC;AAED,aAAO,KAAK,IAAI,OAAO,SAAS,QAAQ,KAAK,OAAO,GAAG,QAAQ;AAAA,IACjE;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,KAAK,EAAE,OAAO,EAAE,SAAS,qBAAqB;AAAA,MAC9C,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,UAAU,aAAa,OAAO,KAAK,KAAK,MAAM,CAAC;AACrD,aAAO;AAAA,QACL,UAAU,YAAY,OAAO,GAAG,MAAM,WAAW,OAAO,GAAG;AAAA,QAC3D,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,KAAK,EAAE,OAAO,EAAE,SAAS,qBAAqB;AAAA,MAC9C,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,OAAO,WAAW;AAChB,aAAO,KAAK,UAAU,OAAO,KAAK,KAAK,MAAM,CAAC,IAAI,SAAS,OAAO;AAAA,IACpE;AAAA,EACF;AAIA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,KAAK,EAAE,OAAO,EAAE,SAAS,qBAAqB;AAAA,MAC9C,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,YAAY,OAAO,KAAK,KAAK,MAAM,CAAC;AACnD,UAAI,CAAC,OAAQ,QAAO,KAAK,WAAW,OAAO,GAAG,eAAe,IAAI;AAEjE,YAAM,EAAE,UAAU,MAAM,IAAI;AAC5B,YAAM,QAAQ,WAAW,QAAQ;AAEjC,YAAM,OAAgC;AAAA,QACpC,KAAK,OAAO;AAAA,QACZ;AAAA,QACA,MAAM,SAAS,SAAS,kBAAkB;AAAA,QAC1C,SAAS,SAAS,KAAK;AAAA,QACvB,SAAS,SAAS,KAAK;AAAA,QACvB,aAAa,SAAS,KAAK;AAAA,QAC3B,cAAc,SAAS,KAAK,kBAAkB;AAAA,MAChD;AAEA,UAAI,SAAS,QAAQ;AACnB,aAAK,eAAe,OAAO,KAAK,SAAS,MAAM;AAC/C,aAAK,aAAa,SAAS;AAAA,MAC7B;AAEA,UAAI,MAAM,eAAe;AACvB,aAAK,QAAQ;AAAA,UACX,SAAS,MAAM;AAAA,UACf,OAAO,MAAM;AAAA,UACb,iBAAiB,MAAM;AAAA,UACvB,eAAe,MAAM;AAAA,QACvB;AAAA,MACF;AAEA,UAAI,SAAS,KAAK,WAAW,QAAQ;AACnC,aAAK,YAAY,SAAS,KAAK;AAAA,MACjC;AAEA,UAAI,SAAS,KAAK,YAAa,MAAK,cAAc,SAAS,KAAK;AAChE,UAAI,SAAS,KAAK,MAAM,OAAQ,MAAK,OAAO,SAAS,KAAK;AAE1D,aAAO,KAAK,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,IAC3C;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,IACf;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,oBAAoB;AAAA,QACjC,aAAa,OAAO,eAAe,QAAQ,IAAI;AAAA,MACjD,CAAC;AAED,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,UACL;AAAA,QACF;AAAA,MACF;AAEA,aAAO,KAAK,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,QAAQ,EACL,KAAK,CAAC,OAAO,UAAU,gBAAgB,QAAQ,WAAW,SAAS,UAAU,CAAC,EAC9E,SAAS,EACT,QAAQ,SAAS,EACjB,SAAS,eAAe;AAAA,MAC3B,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAAA,MACtE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iCAAiC;AAAA,MACxE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2DAA2D;AAAA,MAClG,OAAO,YAAY,QAAQ,QAAQ;AAAA,MACnC,aAAa;AAAA,IACf;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,eAAe;AAAA,QAC5B,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,MACjB,CAAC;AAED,UAAI,OAAO,QAAQ;AACjB,kBAAU,OAAO,QAAQ,QAAQ;AAAA,UAC/B,GAAG,KAAK,MAAM;AAAA,UACd,aAAa,aAAa,OAAO,MAAM;AAAA,QACzC,CAAC;AACD,cAAM,UAAU,gBAAgB,MAAM;AACtC,eAAO;AAAA,UACL,2BAA2B,OAAO,MAAM,MAAM,OAAO,MAAM,MAAM,OAAO;AAAA,QAC1E;AAAA,MACF;AAEA,aAAO,KAAK,MAAM;AAAA,IACpB;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW,EAAE,OAAO,EAAE,SAAS,mBAAmB;AAAA,MAClD,WAAW,EAAE,OAAO,EAAE,SAAS,mBAAmB;AAAA,MAClD,aAAa,YAAY,QAAQ,QAAQ;AAAA,MACzC,aAAa,YAAY,QAAQ,QAAQ;AAAA,MACzC,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,MACvC,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,IACzC;AAAA,IACA,OAAO,WAAW;AAChB;AAAA,QACE,OAAO;AAAA,QACP;AAAA,UACE,OAAO,OAAO;AAAA,UACd,aAAa,OAAO,qBAAqB,QAAQ,IAAI;AAAA,UACrD,QAAQ;AAAA,QACV;AAAA,QACA,OAAO;AAAA,QACP;AAAA,UACE,OAAO,OAAO;AAAA,UACd,aAAa,OAAO,qBAAqB,QAAQ,IAAI;AAAA,UACrD,QAAQ;AAAA,QACV;AAAA,MACF;AAEA,aAAO,KAAK,cAAc,OAAO,SAAS,QAAQ,OAAO,SAAS,EAAE;AAAA,IACtE;AAAA,EACF;AAIA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO,EAAE,OAAO,EAAE,SAAS,kBAAkB;AAAA,MAC7C,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,MACxE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,IACxE;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,KAAK,aAAa,OAAO,OAAO;AAAA,QACpC,YAAY,OAAO;AAAA,QACnB,UAAU,OAAO;AAAA,MACnB,CAAC;AACD,aAAO,KAAK,EAAE;AAAA,IAChB;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,IAAI,EAAE,OAAO,EAAE,SAAS,WAAW;AAAA,IACrC;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,QAAQ,WAAW,OAAO,EAAE;AAClC,UAAI,UAAU,MAAM;AAClB,eAAO,KAAK,WAAW,OAAO,EAAE,0BAA0B,IAAI;AAAA,MAChE;AACA,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,YAAY;AACV,YAAM,UAAU,WAAW;AAC3B,UAAI,QAAQ,WAAW,EAAG,QAAO,KAAK,mBAAmB;AAEzD,YAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM;AAC/B,cAAM,QAAQ,CAAC,EAAE,EAAE;AACnB,cAAM,KAAK,SAAS,EAAE,WAAW,EAAE;AACnC,YAAI,EAAE,SAAU,OAAM,KAAK,OAAO,EAAE,QAAQ,EAAE;AAC9C,YAAI,EAAE,WAAW;AACf,gBAAM,MAAM,KAAK,IAAI,GAAG,KAAK,OAAO,EAAE,YAAY,KAAK,IAAI,KAAK,GAAI,CAAC;AACrE,gBAAM,KAAK,WAAW,GAAG,GAAG;AAAA,QAC9B;AACA,eAAO,MAAM,KAAK,KAAK;AAAA,MACzB,CAAC;AAED,aAAO,KAAK,MAAM,KAAK,IAAI,CAAC;AAAA,IAC9B;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,IAAI,EAAE,OAAO,EAAE,SAAS,WAAW;AAAA,IACrC;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,YAAY,cAAc,OAAO,EAAE;AACzC,aAAO;AAAA,QACL,YAAY,aAAa,OAAO,EAAE,KAAK,WAAW,OAAO,EAAE;AAAA,QAC3D,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAIA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAM,EACH,MAAM,EAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,wCAAwC;AAAA,MACpD,YAAY,EAAE,OAAO,EAAE,SAAS,uBAAuB;AAAA,MACvD,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,IAAI,KAAK,MAAM;AACrB,YAAM,UAAU,YAAY,CAAC;AAE7B,YAAM,UAA4D,CAAC;AACnE,iBAAW,SAAS,SAAS;AAC3B,YAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,SAAS,MAAM,GAAG,EAAG;AACrD,cAAM,QAAQ,UAAU,MAAM,KAAK,EAAE,GAAG,GAAG,OAAO,MAAM,MAAM,CAAC;AAC/D,YAAI,UAAU,MAAM;AAClB,kBAAQ,KAAK,EAAE,KAAK,MAAM,KAAK,OAAO,OAAO,MAAM,MAAM,CAAC;AAAA,QAC5D;AAAA,MACF;AAEA,UAAI,QAAQ,WAAW,EAAG,QAAO,KAAK,sBAAsB,IAAI;AAEhE,YAAM,SAAS,aAAa,SAAS,OAAO,UAAU;AACtD,aAAO,KAAK,MAAM;AAAA,IACpB;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,QAAQ,EAAE,OAAO,EAAE,SAAS,iCAAiC;AAAA,MAC7D,YAAY,EAAE,OAAO,EAAE,SAAS,uBAAuB;AAAA,MACvD,OAAO,YAAY,QAAQ,QAAQ;AAAA,MACnC,aAAa;AAAA,MACb,QAAQ,EACL,QAAQ,EACR,SAAS,EACT,QAAQ,KAAK,EACb,SAAS,2BAA2B;AAAA,IACzC;AAAA,IACA,OAAO,WAAW;AAChB,UAAI;AACF,cAAM,UAAU,eAAe,OAAO,QAAQ,OAAO,UAAU;AAE/D,YAAI,OAAO,QAAQ;AACjB,gBAAM,UAAU,QAAQ,QACrB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,SAAS,QAAQ,GAAG,EAC9C,KAAK,IAAI;AACZ,iBAAO,KAAK,gBAAgB,QAAQ,QAAQ,MAAM;AAAA,EAAc,OAAO,EAAE;AAAA,QAC3E;AAEA,cAAM,IAAI,KAAK,MAAM;AACrB,mBAAW,KAAK,QAAQ,SAAS;AAC/B,oBAAU,EAAE,KAAK,EAAE,OAAO,CAAC;AAAA,QAC7B;AAEA,eAAO,KAAK,YAAY,QAAQ,QAAQ,MAAM,iCAAiC;AAAA,MACjF,QAAQ;AACN,eAAO,KAAK,0DAA0D,IAAI;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AAIA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,eAAe;AAAA,MACnD,QAAQ,EACL,KAAK,CAAC,QAAQ,SAAS,UAAU,QAAQ,UAAU,YAAY,YAAY,UAAU,YAAY,UAAU,CAAC,EAC5G,SAAS,EACT,SAAS,kBAAkB;AAAA,MAC9B,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,SAAS,sBAAsB;AAAA,IAC1E;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,WAAW;AAAA,QACxB,KAAK,OAAO;AAAA,QACZ,QAAQ,OAAO;AAAA,QACf,OAAO,OAAO;AAAA,MAChB,CAAC;AAED,UAAI,OAAO,WAAW,EAAG,QAAO,KAAK,uBAAuB;AAE5D,YAAM,QAAQ,OAAO,IAAI,CAAC,MAAM;AAC9B,cAAM,QAAQ,CAAC,EAAE,WAAW,EAAE,MAAM;AACpC,YAAI,EAAE,IAAK,OAAM,KAAK,EAAE,GAAG;AAC3B,YAAI,EAAE,MAAO,OAAM,KAAK,IAAI,EAAE,KAAK,GAAG;AACtC,YAAI,EAAE,IAAK,OAAM,KAAK,OAAO,EAAE,GAAG,EAAE;AACpC,YAAI,EAAE,OAAQ,OAAM,KAAK,EAAE,MAAM;AACjC,eAAO,MAAM,KAAK,KAAK;AAAA,MACzB,CAAC;AAED,aAAO,KAAK,MAAM,KAAK,IAAI,CAAC;AAAA,IAC9B;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,IAC1E;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,YAAY,gBAAgB,OAAO,GAAG;AAC5C,UAAI,UAAU,WAAW,EAAG,QAAO,KAAK,uBAAuB;AAE/D,YAAM,QAAQ,UAAU;AAAA,QACtB,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,EAAE,WAAW;AAAA,MACrC;AACA,aAAO,KAAK,MAAM,KAAK,IAAI,CAAC;AAAA,IAC9B;AAAA,EACF;AAIA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,UAAU,YAAY,KAAK,MAAM,CAAC;AACxC,YAAM,YAAY,gBAAgB;AAElC,UAAI,UAAU;AACd,UAAI,QAAQ;AACZ,UAAI,UAAU;AACd,UAAI,UAAU;AACd,YAAM,SAAmB,CAAC;AAE1B,iBAAW,SAAS,SAAS;AAC3B,YAAI,CAAC,MAAM,OAAO,eAAe;AAC/B;AACA;AAAA,QACF;AACA,YAAI,MAAM,MAAM,WAAW;AACzB;AACA,iBAAO,KAAK,YAAY,MAAM,GAAG,EAAE;AAAA,QACrC,WAAW,MAAM,MAAM,SAAS;AAC9B;AACA,iBAAO;AAAA,YACL,UAAU,MAAM,GAAG,KAAK,MAAM,MAAM,eAAe,MAAM,MAAM,MAAM,aAAa;AAAA,UACpF;AAAA,QACF,OAAO;AACL;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU;AAAA,QACd,YAAY,QAAQ,MAAM;AAAA,QAC1B,YAAY,OAAO,aAAa,KAAK,eAAe,OAAO,gBAAgB,OAAO;AAAA,QAClF,cAAc,UAAU,MAAM;AAAA,MAChC;AAEA,UAAI,OAAO,SAAS,GAAG;AACrB,gBAAQ,KAAK,IAAI,WAAW,GAAG,MAAM;AAAA,MACvC;AACA,UAAI,UAAU,SAAS,GAAG;AACxB,gBAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA,GAAG,UAAU,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,EAAE,WAAW,EAAE;AAAA,QACxD;AAAA,MACF;AAEA,aAAO,KAAK,QAAQ,KAAK,IAAI,CAAC;AAAA,IAChC;AAAA,EACF;AAIA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,KAAK,EACb,SAAS,mDAAmD;AAAA,MAC/D,cAAc,EACX,MAAM,EAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,0BAA0B;AAAA,IACxC;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,cAAc;AAAA,QAC3B,YAAY,OAAO;AAAA,QACnB,cAAc,OAAO,gBAAgB,CAAC,QAAQ,IAAI,CAAC;AAAA,MACrD,CAAC;AACD,aAAO,KAAK,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,SAAOA;AACT;;;ADvnBA,IAAM,SAAS,gBAAgB;AAC/B,IAAM,YAAY,IAAI,qBAAqB;AAC3C,MAAM,OAAO,QAAQ,SAAS;","names":["opts","opts","existsSync","readFileSync","join","existsSync","readFileSync","mkdirSync","join","homedir","opts","opts","opts","randomBytes","randomBytes","server"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@i4ctime/q-ring",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Quantum keyring for AI coding tools — Cursor, Kiro, Claude Code. Secrets, superposition, entanglement, MCP.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"qring": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/mcp.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsup",
|
|
17
|
+
"dev": "tsup --watch",
|
|
18
|
+
"typecheck": "tsc --noEmit",
|
|
19
|
+
"prepublishOnly": "npm run build"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"keyring",
|
|
23
|
+
"secrets",
|
|
24
|
+
"mcp",
|
|
25
|
+
"cursor",
|
|
26
|
+
"claude-code",
|
|
27
|
+
"kiro",
|
|
28
|
+
"api-keys"
|
|
29
|
+
],
|
|
30
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=18"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
36
|
+
"@napi-rs/keyring": "^1.2.0",
|
|
37
|
+
"commander": "^14.0.3",
|
|
38
|
+
"zod": "^4.3.6"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/node": "^25.5.0",
|
|
42
|
+
"tsup": "^8.5.1",
|
|
43
|
+
"typescript": "^5.9.3"
|
|
44
|
+
}
|
|
45
|
+
}
|