{"version":3,"file":"codecs.cjs","names":["z","ClaudeCodePermissionMode","AgentPermissionPolicy","normaliseStringRule","collectRules","ruleToString","PermissionBehavior","CodexApprovalMode","CodexSandboxMode","CodexFilesystemAccess","CodexDomainAccess"],"sources":["../../src/compat/codecs.ts"],"sourcesContent":["/**\n * Agent compatibility codecs — bidirectional transforms between our canonical\n * `.agents/permissions.json` format and each agent's native permission config.\n *\n * Usage:\n *   decode: agent native config → canonical AgentPermissionPolicy\n *   encode: canonical AgentPermissionPolicy → agent native config\n *\n *   import { claudeCodeCodec } from \"./compat/codecs.js\";\n *\n *   // Read Claude Code settings and convert to canonical\n *   const canonical = claudeCodeCodec.decode(claudeSettings.permissions);\n *\n *   // Write canonical policy back out as Claude Code settings\n *   const claudePermBlock = z.encode(claudeCodeCodec, canonical);\n */\n\nimport * as z from \"zod\";\nimport {\n  AgentPermissionPolicy,\n  type PermissionTiers,\n  type Rule,\n  type Sandbox,\n} from \"../schema.ts\";\nimport {\n  normaliseStringRule,\n  ruleToString,\n  collectRules,\n} from \"../evaluate.ts\";\nimport {\n  ClaudeCodePermissionMode,\n  CodexApprovalMode,\n  CodexDomainAccess,\n  CodexFilesystemAccess,\n  CodexSandboxMode,\n  PermissionBehavior,\n} from \"./enums.ts\";\n\n// ---------------------------------------------------------------------------\n// Canonical agent identifiers\n// ---------------------------------------------------------------------------\n\nexport const agentId = z.enum([\n  \"claude-code\",\n  \"codex\",\n  \"kiro\",\n  \"opencode\",\n  \"crush\",\n]);\n\nexport type AgentId = z.infer<typeof agentId>;\n\n// ---------------------------------------------------------------------------\n// Claude Code codec\n// ---------------------------------------------------------------------------\n// Claude Code uses `Tool(pattern)` rule strings in allow/deny/ask arrays.\n// Our spec is a compatible superset — same rule syntax, same tiers.\n// Conversion is mostly structural: our top-level defaultMode maps to/from\n// their permissions.defaultMode (which we also accept inside permissions).\n\nconst claudeCodeNative = z\n  .object({\n    allow: z.array(z.string()).optional(),\n    deny: z.array(z.string()).optional(),\n    ask: z.array(z.string()).optional(),\n    defaultMode: ClaudeCodePermissionMode.optional(),\n    additionalDirectories: z.array(z.string()).optional(),\n  })\n  .partial()\n  .strict();\n\ntype ClaudeCodeNative = z.infer<typeof claudeCodeNative>;\n\nexport const claudeCodeCodec = z.codec(\n  claudeCodeNative,\n  AgentPermissionPolicy,\n  {\n    decode(native) {\n      const rules: Rule[] = [];\n\n      if (native.deny) {\n        rules.push(...native.deny.map((r) => normaliseStringRule(r, \"deny\")));\n      }\n      if (native.ask) {\n        rules.push(...native.ask.map((r) => normaliseStringRule(r, \"ask\")));\n      }\n      if (native.allow) {\n        rules.push(...native.allow.map((r) => normaliseStringRule(r, \"allow\")));\n      }\n\n      const result: Partial<AgentPermissionPolicy> = {};\n      if (rules.length > 0) result.rules = rules;\n      if (native.additionalDirectories?.length) {\n        result.permissions = {\n          additionalDirectories: native.additionalDirectories,\n        };\n      }\n      if (native.defaultMode) {\n        result.defaultMode = native.defaultMode;\n      }\n\n      return result;\n    },\n    encode(canonical) {\n      const result: Partial<ClaudeCodeNative> = {};\n\n      const allRules = collectRules(canonical);\n      if (allRules.length > 0) {\n        result.deny = allRules\n          .filter((r) => r.tier === \"deny\")\n          .map(ruleToString);\n        result.ask = allRules.filter((r) => r.tier === \"ask\").map(ruleToString);\n        result.allow = allRules\n          .filter((r) => r.tier === \"allow\")\n          .map(ruleToString);\n      }\n\n      if (canonical.permissions?.additionalDirectories?.length) {\n        result.additionalDirectories =\n          canonical.permissions.additionalDirectories;\n      }\n\n      // defaultMode — only include modes that Claude Code accepts\n      const ccDefaultMode =\n        canonical.defaultMode ?? canonical.permissions?.defaultMode;\n      if (ccDefaultMode) {\n        const claudeCodeModes = [\n          \"acceptEdits\",\n          \"auto\",\n          \"bypassPermissions\",\n          \"default\",\n          \"dontAsk\",\n          \"plan\",\n        ] as const;\n        const match = claudeCodeModes.find((m) => m === ccDefaultMode);\n        if (match) {\n          result.defaultMode = match;\n        }\n      }\n\n      return result;\n    },\n  },\n);\n\n// ---------------------------------------------------------------------------\n// OpenCode codec\n// ---------------------------------------------------------------------------\n// OpenCode uses `{ tool: { pattern: \"action\" } }` with last-match-wins.\n// Pattern syntax differs: space-separated (`\"git *\"`) vs our `:*` prefix.\n// Tool names differ: lowercase (`edit`, `list`) vs our PascalCase (`Edit`, `Glob`).\n\nconst ocAction = PermissionBehavior;\n\nconst ocRule = z.union([ocAction, z.record(z.string(), ocAction)]);\n\nconst opencodeNative = z.union([\n  ocAction,\n  z\n    .object({\n      read: ocRule.optional(),\n      edit: ocRule.optional(),\n      glob: ocRule.optional(),\n      grep: ocRule.optional(),\n      list: ocRule.optional(),\n      bash: ocRule.optional(),\n      task: ocRule.optional(),\n      external_directory: ocRule.optional(),\n      todowrite: ocAction.optional(),\n      question: ocAction.optional(),\n      webfetch: ocAction.optional(),\n      websearch: ocAction.optional(),\n      lsp: ocRule.optional(),\n      doom_loop: ocAction.optional(),\n      skill: ocRule.optional(),\n    })\n    .strict(),\n]);\n\n/**\n * Map OpenCode tool names to our canonical names.\n * OpenCode uses lowercase; we use PascalCase.\n */\nconst ocToCanonical: Record<string, string> = {\n  bash: \"Bash\",\n  read: \"Read\",\n  edit: \"Edit\",\n  glob: \"Glob\",\n  grep: \"Grep\",\n  list: \"Glob\", // list ≈ Glob\n  webfetch: \"WebFetch\",\n  websearch: \"WebFetch\", // websearch ≈ WebFetch\n  task: \"Agent\", // subagent spawning ≈ Agent\n  codesearch: \"Grep\", // codesearch ≈ Grep\n};\n\n/**\n * Map canonical tool names back to OpenCode tool names.\n * Each canonical tool maps to the primary OpenCode equivalent.\n */\nconst canonicalToOc: Record<string, string> = {\n  Bash: \"bash\",\n  Read: \"read\",\n  Write: \"edit\", // write → edit in OpenCode\n  Edit: \"edit\",\n  Glob: \"glob\",\n  Grep: \"grep\",\n  WebFetch: \"webfetch\",\n  Agent: \"task\",\n};\n\n/** Tools with no canonical mapping — silently skipped during decode. */\nconst OC_UNMAPPED_TOOLS = new Set([\n  \"doom_loop\",\n  \"lsp\",\n  \"skill\",\n  \"question\",\n  \"todowrite\",\n]);\n\nexport const opencodeCodec = z.codec(opencodeNative, AgentPermissionPolicy, {\n  decode(native) {\n    // Shorthand \"allow\"/\"deny\" applies to everything\n    if (typeof native === \"string\") {\n      const mode =\n        native === \"allow\"\n          ? (\"autonomous\" as const)\n          : native === \"deny\"\n            ? (\"restricted\" as const)\n            : (\"standard\" as const);\n      return { defaultMode: mode };\n    }\n\n    const rules: Rule[] = [];\n    let sandbox: Partial<Sandbox> | undefined;\n    const additionalDirectories: string[] = [];\n\n    for (const [ocTool, rule] of Object.entries(native)) {\n      if (rule === undefined) continue;\n      if (OC_UNMAPPED_TOOLS.has(ocTool)) continue;\n\n      if (ocTool === \"external_directory\") {\n        if (typeof rule === \"object\") {\n          for (const [dir, action] of Object.entries(rule)) {\n            if (action === \"allow\") additionalDirectories.push(dir);\n          }\n        }\n        continue;\n      }\n\n      if (typeof rule === \"string\") {\n        // Shorthand action for entire tool\n        const canonicalTool = ocToCanonical[ocTool] ?? ocTool;\n        rules.push({\n          tool: canonicalTool,\n          tier: rule,\n        });\n      } else {\n        // Granular patterns: { \"git *\": \"allow\", \"rm *\": \"deny\" }\n        for (const [pattern, action] of Object.entries(rule)) {\n          const canonicalTool = ocToCanonical[ocTool] ?? ocTool;\n          rules.push({\n            tool: canonicalTool,\n            // Wrap bare pattern — no Tool(...) wrapper needed in structured rules\n            pattern,\n            tier: action,\n          });\n        }\n      }\n    }\n\n    const result: Partial<AgentPermissionPolicy> = {};\n    if (rules.length > 0) result.rules = rules;\n    if (additionalDirectories.length > 0) {\n      result.permissions = { additionalDirectories };\n      sandbox = { writableRoots: additionalDirectories };\n    }\n    if (sandbox) result.sandbox = sandbox;\n    return result;\n  },\n  encode(canonical) {\n    const allRules = collectRules(canonical);\n    if (allRules.length === 0) return { bash: \"ask\" };\n\n    const result: Record<string, Record<string, \"allow\" | \"deny\" | \"ask\">> = {};\n\n    for (const rule of allRules) {\n      const ocTool = canonicalToOc[rule.tool];\n      if (!ocTool) continue;\n\n      const pattern = rule.pattern ? rule.pattern.replace(/:\\*$/, \" *\") : \"*\";\n\n      let toolRules = result[ocTool];\n      if (!toolRules) {\n        toolRules = {};\n        result[ocTool] = toolRules;\n      }\n      toolRules[pattern] = rule.tier;\n    }\n\n    // Map sandbox.writableRoots → external_directory\n    if (canonical.sandbox?.writableRoots?.length) {\n      const extDir: Record<string, \"allow\"> = {};\n      for (const root of canonical.sandbox.writableRoots) {\n        extDir[root] = \"allow\";\n      }\n      result.external_directory = extDir;\n    }\n\n    // If any tool has only a single \"*\" pattern, simplify to shorthand\n    const simplified: Record<string, unknown> = { ...result };\n    for (const [tool, patterns] of Object.entries(result)) {\n      if (tool === \"external_directory\") continue;\n      const keys = Object.keys(patterns);\n      if (keys.length === 1 && keys[0] === \"*\") {\n        simplified[tool] = patterns[\"*\"];\n      }\n    }\n\n    return simplified;\n  },\n});\n\n// ---------------------------------------------------------------------------\n// Crush codec\n// ---------------------------------------------------------------------------\n// Crush has a simple allowlist: `permissions.allowed_tools: string[]`.\n// No deny, no ask, no patterns. Tool names are lowercase.\n\nconst crushNative = z\n  .object({\n    allowed_tools: z.array(z.string()),\n  })\n  .strict();\n\n/**\n * Map Crush tool names to canonical names.\n */\nconst crushToCanonical: Record<string, string> = {\n  view: \"Read\",\n  ls: \"Glob\",\n  grep: \"Grep\",\n  edit: \"Edit\",\n  multiedit: \"Edit\",\n  write: \"Write\",\n  bash: \"Bash\",\n  fetch: \"WebFetch\",\n  agentic_fetch: \"WebFetch\",\n  glob: \"Glob\",\n  download: \"WebFetch\",\n  sourcegraph: \"Grep\",\n  agent: \"Agent\",\n  todos: \"Agent\",\n};\n\nconst canonicalToCrush: Record<string, string> = {\n  Read: \"view\",\n  Glob: \"glob\",\n  Grep: \"grep\",\n  Edit: \"edit\",\n  Write: \"write\",\n  Bash: \"bash\",\n  WebFetch: \"fetch\",\n  Agent: \"agent\",\n};\n\nexport const crushCodec = z.codec(crushNative, AgentPermissionPolicy, {\n  decode(native) {\n    const rules: Rule[] = [];\n    for (const tool of native.allowed_tools) {\n      // MCP tools pass through as-is (mcp_server_tool format)\n      const canonical = crushToCanonical[tool] ?? tool;\n      rules.push({ tool: canonical, tier: \"allow\" });\n    }\n    return { rules };\n  },\n  encode(canonical) {\n    const allRules = collectRules(canonical);\n    const allowed: string[] = [];\n    for (const rule of allRules) {\n      // Only bare allow rules — Crush has no deny, no patterns\n      if (rule.tier !== \"allow\") continue;\n      if (rule.pattern !== undefined) continue;\n      const crushTool = canonicalToCrush[rule.tool];\n      if (crushTool) allowed.push(crushTool);\n    }\n    return { allowed_tools: allowed };\n  },\n});\n\n// ---------------------------------------------------------------------------\n// Kiro (Amazon) codec\n// ---------------------------------------------------------------------------\n// Kiro uses declarative per-agent JSON configs with interactive tiered trust.\n// No SDK — alignment by manual review of https://kiro.dev/docs/.\n//\n// Key concepts:\n//   allowedTools: auto-approved tools (glob patterns with * and ?)\n//   toolsSettings.shell.allowedCommands/deniedCommands: regex patterns\n//   toolsSettings.shell.autoAllowReadonly / denyByDefault: booleans\n//   toolsSettings.<tool>.allowedPaths/deniedPaths: path globs\n//   toolsSettings.aws.allowedServices/deniedServices: service names\n//   toolsSettings.web_fetch.trusted/blocked: regex URL patterns\n//\n// Mapping:\n//   allowedTools → allow rules (bare tool or MCP glob)\n//   toolsSettings.shell.deniedCommands → deny Bash rules\n//   toolsSettings.shell.allowedCommands → allow Bash rules\n//   toolsSettings.<tool>.deniedPaths → deny rules for that tool\n//   toolsSettings.<tool>.allowedPaths → allow rules for that tool\n//   toolsSettings.web_fetch.blocked/trusted → deny/allow WebFetch (domain: regex)\n//   toolsSettings.shell.denyByDefault → defaultMode \"restricted\"\n//   toolsSettings.shell.autoAllowReadonly → allow Bash rules for readonly\n\n/** Kiro → canonical tool name mapping. */\nconst kiroToCanonical: Record<string, string> = {\n  read: \"Read\",\n  write: \"Write\",\n  shell: \"Bash\",\n  aws: \"Aws\",\n  glob: \"Glob\",\n  grep: \"Grep\",\n  web_search: \"WebSearch\",\n  web_fetch: \"WebFetch\",\n  code: \"Code\",\n  delegate: \"Delegate\",\n  subagent: \"Agent\",\n};\n\n/** Canonical → Kiro tool name mapping (reverse of kiroToCanonical). */\nconst canonicalToKiro: Record<string, string> = {};\nfor (const [kiro, canonical] of Object.entries(kiroToCanonical)) {\n  canonicalToKiro[canonical] = kiro;\n}\n\n/**\n * Strip Kiro regex anchors (\\A → ^, \\z → $) from a pattern for canonical use.\n * Kiro auto-anchors with \\A/\\z; we store the pattern without anchors.\n */\nfunction stripKiroAnchors(pattern: string): string {\n  return pattern.replace(/^\\\\A/, \"\").replace(/\\\\z$/, \"\");\n}\n\n/** Add Kiro regex anchors to a pattern for native output. */\nfunction addKiroAnchors(pattern: string): string {\n  return `\\\\A${pattern}\\\\z`;\n}\n\n/**\n * Check if a Kiro allowedTools entry is an MCP reference\n * (starts with @) vs a built-in tool name.\n */\nfunction isKiroMcpRef(entry: string): boolean {\n  return entry.startsWith(\"@\");\n}\n\n/**\n * Convert a Kiro allowedTools glob pattern to canonical pattern syntax.\n * Kiro uses * and ? globs; MCP refs use @server/tool format.\n */\nfunction kiroGlobToPattern(glob: string): string | undefined {\n  if (!isKiroMcpRef(glob) && !glob.includes(\"*\") && !glob.includes(\"?\"))\n    return undefined;\n  return glob;\n}\n\nconst kiroNative = z.object({\n  allowedTools: z.array(z.string()).optional(),\n  toolsSettings: z\n    .object({\n      shell: z\n        .object({\n          allowedCommands: z.array(z.string()).optional(),\n          deniedCommands: z.array(z.string()).optional(),\n          autoAllowReadonly: z.boolean().optional(),\n          denyByDefault: z.boolean().optional(),\n        })\n        .partial()\n        .optional(),\n      read: z\n        .object({\n          allowedPaths: z.array(z.string()).optional(),\n          deniedPaths: z.array(z.string()).optional(),\n        })\n        .partial()\n        .optional(),\n      write: z\n        .object({\n          allowedPaths: z.array(z.string()).optional(),\n          deniedPaths: z.array(z.string()).optional(),\n        })\n        .partial()\n        .optional(),\n      aws: z\n        .object({\n          allowedServices: z.array(z.string()).optional(),\n          deniedServices: z.array(z.string()).optional(),\n          autoAllowReadonly: z.boolean().optional(),\n        })\n        .partial()\n        .optional(),\n      web_fetch: z\n        .object({\n          trusted: z.array(z.string()).optional(),\n          blocked: z.array(z.string()).optional(),\n        })\n        .partial()\n        .optional(),\n    })\n    .partial()\n    .optional(),\n});\n\ntype KiroNative = z.infer<typeof kiroNative>;\n\nexport const kiroCodec = z.codec(kiroNative, AgentPermissionPolicy, {\n  decode(native) {\n    const rules: Rule[] = [];\n    const result: Partial<AgentPermissionPolicy> = {};\n\n    // --- allowedTools → allow rules ---\n    if (native.allowedTools) {\n      for (const entry of native.allowedTools) {\n        if (isKiroMcpRef(entry)) {\n          // MCP reference: @server, @server/tool, @server/prefix_*\n          rules.push({ tool: entry, tier: \"allow\" });\n        } else {\n          const canonical = kiroToCanonical[entry] ?? entry;\n          const pattern = kiroGlobToPattern(entry);\n          rules.push({\n            tool: canonical,\n            tier: \"allow\",\n            ...(pattern && { pattern }),\n          });\n        }\n      }\n    }\n\n    // --- toolsSettings ---\n    const ts = native.toolsSettings;\n    if (ts) {\n      // Shell (Bash)\n      if (ts.shell) {\n        if (ts.shell.deniedCommands) {\n          for (const cmd of ts.shell.deniedCommands) {\n            rules.push({\n              tool: \"Bash\",\n              pattern: stripKiroAnchors(cmd),\n              tier: \"deny\",\n            });\n          }\n        }\n        if (ts.shell.allowedCommands) {\n          for (const cmd of ts.shell.allowedCommands) {\n            rules.push({\n              tool: \"Bash\",\n              pattern: stripKiroAnchors(cmd),\n              tier: \"allow\",\n            });\n          }\n        }\n        if (ts.shell.denyByDefault) {\n          result.defaultMode = \"restricted\";\n        }\n        // autoAllowReadonly is a Kiro-specific behaviour flag; no canonical mapping\n      }\n\n      // Read paths\n      if (ts.read) {\n        if (ts.read.deniedPaths) {\n          for (const path of ts.read.deniedPaths) {\n            rules.push({ tool: \"Read\", pattern: path, tier: \"deny\" });\n          }\n        }\n        if (ts.read.allowedPaths) {\n          for (const path of ts.read.allowedPaths) {\n            rules.push({ tool: \"Read\", pattern: path, tier: \"allow\" });\n          }\n        }\n      }\n\n      // Write paths\n      if (ts.write) {\n        if (ts.write.deniedPaths) {\n          for (const path of ts.write.deniedPaths) {\n            rules.push({ tool: \"Write\", pattern: path, tier: \"deny\" });\n          }\n        }\n        if (ts.write.allowedPaths) {\n          for (const path of ts.write.allowedPaths) {\n            rules.push({ tool: \"Write\", pattern: path, tier: \"allow\" });\n          }\n        }\n      }\n\n      // AWS services\n      if (ts.aws) {\n        if (ts.aws.deniedServices) {\n          for (const svc of ts.aws.deniedServices) {\n            rules.push({\n              tool: \"Aws\",\n              pattern: `service:${svc}`,\n              tier: \"deny\",\n            });\n          }\n        }\n        if (ts.aws.allowedServices) {\n          for (const svc of ts.aws.allowedServices) {\n            rules.push({\n              tool: \"Aws\",\n              pattern: `service:${svc}`,\n              tier: \"allow\",\n            });\n          }\n        }\n      }\n\n      // Web fetch (URL regex → domain-like patterns)\n      if (ts.web_fetch) {\n        if (ts.web_fetch.blocked) {\n          for (const urlPattern of ts.web_fetch.blocked) {\n            rules.push({\n              tool: \"WebFetch\",\n              pattern: `url:${stripKiroAnchors(urlPattern)}`,\n              tier: \"deny\",\n            });\n          }\n        }\n        if (ts.web_fetch.trusted) {\n          for (const urlPattern of ts.web_fetch.trusted) {\n            rules.push({\n              tool: \"WebFetch\",\n              pattern: `url:${stripKiroAnchors(urlPattern)}`,\n              tier: \"allow\",\n            });\n          }\n        }\n      }\n    }\n\n    if (rules.length > 0) result.rules = rules;\n    return result;\n  },\n\n  encode(canonical) {\n    const allRules = collectRules(canonical);\n    const result: Partial<KiroNative> = {};\n\n    const allowedTools: string[] = [];\n    const shellSettings: NonNullable<KiroNative[\"toolsSettings\"]>[\"shell\"] = {};\n    const readSettings: NonNullable<KiroNative[\"toolsSettings\"]>[\"read\"] = {};\n    const writeSettings: NonNullable<KiroNative[\"toolsSettings\"]>[\"write\"] = {};\n    const awsSettings: NonNullable<KiroNative[\"toolsSettings\"]>[\"aws\"] = {};\n    const webFetchSettings: NonNullable<\n      KiroNative[\"toolsSettings\"]\n    >[\"web_fetch\"] = {};\n\n    for (const rule of allRules) {\n      const kiroTool = canonicalToKiro[rule.tool];\n\n      // Bare allow rules (no pattern) → allowedTools\n      if (rule.tier === \"allow\" && rule.pattern === undefined) {\n        if (isKiroMcpRef(rule.tool)) {\n          allowedTools.push(rule.tool);\n        } else if (kiroTool) {\n          allowedTools.push(kiroTool);\n        }\n        continue;\n      }\n\n      // Patterned rules → toolsSettings\n      if (rule.tool === \"Bash\" && rule.pattern !== undefined) {\n        if (rule.tier === \"deny\") {\n          shellSettings.deniedCommands ??= [];\n          shellSettings.deniedCommands.push(addKiroAnchors(rule.pattern));\n        } else if (rule.tier === \"allow\") {\n          shellSettings.allowedCommands ??= [];\n          shellSettings.allowedCommands.push(addKiroAnchors(rule.pattern));\n        }\n      } else if (rule.tool === \"Read\" && rule.pattern !== undefined) {\n        if (rule.tier === \"deny\") {\n          readSettings.deniedPaths ??= [];\n          readSettings.deniedPaths.push(rule.pattern);\n        } else if (rule.tier === \"allow\") {\n          readSettings.allowedPaths ??= [];\n          readSettings.allowedPaths.push(rule.pattern);\n        }\n      } else if (rule.tool === \"Write\" && rule.pattern !== undefined) {\n        if (rule.tier === \"deny\") {\n          writeSettings.deniedPaths ??= [];\n          writeSettings.deniedPaths.push(rule.pattern);\n        } else if (rule.tier === \"allow\") {\n          writeSettings.allowedPaths ??= [];\n          writeSettings.allowedPaths.push(rule.pattern);\n        }\n      } else if (rule.tool === \"Aws\" && rule.pattern?.startsWith(\"service:\")) {\n        const svc = rule.pattern.slice(\"service:\".length);\n        if (rule.tier === \"deny\") {\n          awsSettings.deniedServices ??= [];\n          awsSettings.deniedServices.push(svc);\n        } else if (rule.tier === \"allow\") {\n          awsSettings.allowedServices ??= [];\n          awsSettings.allowedServices.push(svc);\n        }\n      } else if (rule.tool === \"WebFetch\" && rule.pattern?.startsWith(\"url:\")) {\n        const urlPattern = rule.pattern.slice(\"url:\".length);\n        if (rule.tier === \"deny\") {\n          webFetchSettings.blocked ??= [];\n          webFetchSettings.blocked.push(addKiroAnchors(urlPattern));\n        } else if (rule.tier === \"allow\") {\n          webFetchSettings.trusted ??= [];\n          webFetchSettings.trusted.push(addKiroAnchors(urlPattern));\n        }\n      }\n    }\n\n    if (canonical.defaultMode === \"restricted\") {\n      shellSettings.denyByDefault = true;\n    }\n\n    if (allowedTools.length > 0) result.allowedTools = allowedTools;\n\n    const toolsSettings: NonNullable<KiroNative[\"toolsSettings\"]> = {};\n    if (Object.keys(shellSettings).length > 0)\n      toolsSettings.shell = shellSettings;\n    if (Object.keys(readSettings).length > 0) toolsSettings.read = readSettings;\n    if (Object.keys(writeSettings).length > 0)\n      toolsSettings.write = writeSettings;\n    if (Object.keys(awsSettings).length > 0) toolsSettings.aws = awsSettings;\n    if (Object.keys(webFetchSettings).length > 0)\n      toolsSettings.web_fetch = webFetchSettings;\n    if (Object.keys(toolsSettings).length > 0)\n      result.toolsSettings = toolsSettings;\n\n    return result;\n  },\n});\n\n// ---------------------------------------------------------------------------\n// Codex (OpenAI) codec\n// ---------------------------------------------------------------------------\n// Codex uses OS-level sandboxing + an approval_policy field, not rule strings.\n// TOML serialisation is a file-I/O concern, not the codec's job.\n// The codec works on the JS object that any TOML parser produces.\n//\n// Key concepts:\n//   approval_policy: \"untrusted\" | \"on-request\" | \"on-failure\" | \"never\" | { granular: {...} }\n//   sandbox_mode: \"read-only\" | \"workspace-write\" | \"danger-full-access\"\n//   permissions: named profiles with filesystem + network rules\n//   default_permissions: name of the active profile\n//   sandbox_workspace_write: writable_roots, network_access\n//\n// Mapping:\n//   approval_policy ↔ defaultMode\n//   sandbox_mode → sandbox.mode + defaultMode\n//   sandbox_workspace_write → sandbox.writableRoots + sandbox.networkAccess\n//   permissions.<name>.filesystem → deny rules with Read/Write/Edit patterns\n//   permissions.<name>.network.domains → network.domains + WebFetch rules\n//   named profiles → profiles record + activeProfile\n\nconst codexApprovalPolicy = z.union([\n  CodexApprovalMode,\n  z.object({\n    granular: z.object({\n      sandbox_approval: z.boolean(),\n      rules: z.boolean(),\n      mcp_elicitations: z.boolean(),\n      request_permissions: z.boolean().optional(),\n      skill_approval: z.boolean().optional(),\n    }),\n  }),\n]);\n\ntype CodexApprovalPolicy = z.infer<typeof codexApprovalPolicy>;\n\n/**\n * Codex native config object — what a TOML parser produces from codex config.\n * Only the permission-relevant fields; the full schema has 60+ keys.\n */\nconst codexNative = z.object({\n  approval_policy: codexApprovalPolicy.optional(),\n  sandbox_mode: CodexSandboxMode.optional(),\n  default_permissions: z.string().optional(),\n  sandbox_workspace_write: z\n    .object({\n      writable_roots: z.array(z.string()).optional(),\n      network_access: z.boolean().optional(),\n      exclude_slash_tmp: z.boolean().optional(),\n      exclude_tmpdir_env_var: z.boolean().optional(),\n    })\n    .partial()\n    .optional(),\n  // Named permission profiles: { [name]: { filesystem: { ... }, network: { ... } } }\n  permissions: z\n    .record(\n      z.string(),\n      z.object({\n        filesystem: z\n          .union([\n            // Shorthand: apply single mode to entire workspace\n            CodexFilesystemAccess,\n            // Granular: { \"/path\": \"read\" | \"write\" | \"none\" }\n            z.record(z.string(), CodexFilesystemAccess),\n          ])\n          .optional(),\n        network: z\n          .object({\n            enabled: z.boolean().optional(),\n            domains: z.record(z.string(), CodexDomainAccess).optional(),\n          })\n          .partial()\n          .optional(),\n      }),\n    )\n    .optional(),\n});\n\ntype CodexNative = z.infer<typeof codexNative>;\ntype CodexSandboxWorkspaceWrite = NonNullable<\n  CodexNative[\"sandbox_workspace_write\"]\n>;\n\nexport interface CodexProfile {\n  filesystem?:\n    | CodexFilesystemAccess\n    | Record<string, CodexFilesystemAccess>\n    | undefined;\n  network?:\n    | {\n        enabled?: boolean | undefined;\n        domains?: Record<string, \"allow\" | \"deny\"> | undefined;\n      }\n    | undefined;\n}\n\n/**\n * Map Codex approval_policy to canonical defaultMode.\n */\nfunction codexApprovalToMode(\n  policy: CodexApprovalPolicy,\n): AgentPermissionPolicy[\"defaultMode\"] {\n  if (typeof policy === \"string\") {\n    switch (policy) {\n      case \"untrusted\":\n        return \"restricted\";\n      case \"on-request\":\n        return \"standard\";\n      case \"on-failure\":\n        return \"standard\";\n      case \"never\":\n        return \"autonomous\";\n    }\n  }\n  // Granular — treat as standard (some ops auto-approved, some ask)\n  return \"standard\";\n}\n\n/**\n * Map canonical defaultMode back to Codex approval_policy.\n */\nfunction modeToCodexApproval(\n  mode: AgentPermissionPolicy[\"defaultMode\"],\n): CodexApprovalPolicy {\n  if (\n    mode === \"autonomous\" ||\n    mode === \"bypassPermissions\" ||\n    mode === \"dontAsk\"\n  ) {\n    return \"never\";\n  }\n  if (mode === \"restricted\" || mode === \"plan\" || mode === \"readonly\") {\n    return \"untrusted\";\n  }\n  // standard, acceptEdits, default\n  return \"on-request\";\n}\n\n/**\n * Map Codex sandbox_mode to canonical sandbox.mode.\n */\nfunction codexSandboxToCanonical(\n  mode: z.infer<typeof CodexSandboxMode>,\n): \"readonly\" | \"workspace-write\" | \"full-access\" {\n  switch (mode) {\n    case \"read-only\":\n      return \"readonly\";\n    case \"workspace-write\":\n      return \"workspace-write\";\n    case \"danger-full-access\":\n      return \"full-access\";\n  }\n}\n\n/**\n * Map canonical sandbox.mode back to Codex sandbox_mode.\n */\nfunction canonicalSandboxToCodex(\n  mode: \"readonly\" | \"workspace-write\" | \"full-access\",\n): z.infer<typeof CodexSandboxMode> {\n  switch (mode) {\n    case \"readonly\":\n      return \"read-only\";\n    case \"workspace-write\":\n      return \"workspace-write\";\n    case \"full-access\":\n      return \"danger-full-access\";\n  }\n}\n\n/**\n * Map Codex filesystem access mode to canonical deny rules.\n * Codex paths are absolute; we convert to relative where possible.\n */\nfunction codexFilesystemToRules(\n  fs: CodexFilesystemAccess | Record<string, CodexFilesystemAccess>,\n  rules: Rule[],\n): void {\n  if (typeof fs === \"string\") {\n    if (fs === \"read\") {\n      rules.push(\n        { tool: \"Write\", tier: \"deny\" },\n        { tool: \"Edit\", tier: \"deny\" },\n      );\n    } else if (fs === \"none\") {\n      rules.push(\n        { tool: \"Read\", tier: \"deny\" },\n        { tool: \"Write\", tier: \"deny\" },\n        { tool: \"Edit\", tier: \"deny\" },\n      );\n    }\n    return;\n  }\n\n  for (const [path, mode] of Object.entries(fs)) {\n    const rulePath = path.startsWith(\"/\") ? `.${path}` : path;\n    if (mode === \"none\") {\n      rules.push(\n        { tool: \"Read\", pattern: rulePath, tier: \"deny\" },\n        { tool: \"Write\", pattern: rulePath, tier: \"deny\" },\n        { tool: \"Edit\", pattern: rulePath, tier: \"deny\" },\n      );\n    } else if (mode === \"read\") {\n      rules.push(\n        { tool: \"Write\", pattern: rulePath, tier: \"deny\" },\n        { tool: \"Edit\", pattern: rulePath, tier: \"deny\" },\n      );\n    }\n  }\n}\n\nexport const codexCodec = z.codec(codexNative, AgentPermissionPolicy, {\n  decode(native) {\n    const rules: Rule[] = [];\n    const networkDomains: Record<string, \"allow\" | \"deny\"> = {};\n    const namedProfiles: Record<string, Partial<PermissionTiers>> = {};\n\n    // --- approval_policy → defaultMode ---\n    let defaultMode: AgentPermissionPolicy[\"defaultMode\"] | undefined;\n    if (native.approval_policy) {\n      defaultMode = codexApprovalToMode(native.approval_policy);\n    }\n\n    // --- sandbox_mode → sandbox.mode ---\n    let sandbox: Partial<Sandbox> | undefined;\n    if (native.sandbox_mode) {\n      sandbox = { mode: codexSandboxToCanonical(native.sandbox_mode) };\n    }\n\n    // --- sandbox_workspace_write → sandbox fields ---\n    if (native.sandbox_workspace_write) {\n      sandbox ??= {};\n      if (native.sandbox_workspace_write.writable_roots?.length) {\n        sandbox.writableRoots = native.sandbox_workspace_write.writable_roots;\n      }\n      if (native.sandbox_workspace_write.network_access !== undefined) {\n        sandbox.networkAccess = native.sandbox_workspace_write.network_access;\n      }\n    }\n\n    // --- sandbox_mode \"read-only\" override ---\n    if (native.sandbox_mode === \"read-only\") {\n      defaultMode = \"readonly\";\n      rules.push(\n        { tool: \"Write\", tier: \"deny\" },\n        { tool: \"Edit\", tier: \"deny\" },\n      );\n    } else if (native.sandbox_mode === \"danger-full-access\") {\n      if (!native.approval_policy) defaultMode = \"autonomous\";\n    }\n\n    // --- Named permission profiles ---\n    const allProfiles = native.permissions ?? {};\n    const activeProfileName = native.default_permissions;\n\n    for (const [name, profile] of Object.entries(allProfiles)) {\n      const profileRules: Rule[] = [];\n\n      if (profile.filesystem) {\n        codexFilesystemToRules(profile.filesystem, profileRules);\n      }\n\n      if (profile.network?.domains) {\n        for (const [domain, action] of Object.entries(\n          profile.network.domains,\n        )) {\n          profileRules.push({\n            tool: \"WebFetch\",\n            pattern: `domain:${domain}`,\n            tier: action === \"allow\" ? \"allow\" : \"deny\",\n          });\n        }\n      }\n\n      // If this is the active profile, contribute to top-level rules\n      if (!activeProfileName || name === activeProfileName) {\n        rules.push(...profileRules);\n\n        if (profile.network?.domains) {\n          Object.assign(networkDomains, profile.network.domains);\n        }\n      }\n\n      // Store as named profile (using string arrays for compat)\n      if (profileRules.length > 0) {\n        namedProfiles[name] = {\n          deny: profileRules.filter((r) => r.tier === \"deny\").map(ruleToString),\n          allow: profileRules\n            .filter((r) => r.tier === \"allow\")\n            .map(ruleToString),\n        };\n      }\n    }\n\n    // Build result\n    const result: Partial<AgentPermissionPolicy> = {};\n    if (defaultMode !== undefined) result.defaultMode = defaultMode;\n    if (sandbox) result.sandbox = sandbox;\n    if (rules.length > 0) result.rules = rules;\n\n    if (Object.keys(namedProfiles).length > 0) {\n      result.profiles = namedProfiles;\n      if (activeProfileName) result.activeProfile = activeProfileName;\n    }\n\n    if (Object.keys(networkDomains).length > 0) {\n      result.network = { domains: networkDomains };\n    }\n\n    return result;\n  },\n  encode(canonical) {\n    const result: Partial<CodexNative> = {};\n\n    // --- defaultMode → approval_policy ---\n    if (canonical.defaultMode) {\n      result.approval_policy = modeToCodexApproval(canonical.defaultMode);\n    }\n\n    // --- sandbox → sandbox_mode + sandbox_workspace_write ---\n    if (canonical.sandbox) {\n      if (canonical.sandbox.mode) {\n        result.sandbox_mode = canonicalSandboxToCodex(canonical.sandbox.mode);\n      }\n      if (\n        canonical.sandbox.writableRoots?.length ||\n        canonical.sandbox.networkAccess !== undefined\n      ) {\n        const sw: Partial<CodexSandboxWorkspaceWrite> = {};\n        if (canonical.sandbox.writableRoots?.length) {\n          sw.writable_roots = canonical.sandbox.writableRoots;\n        }\n        if (canonical.sandbox.networkAccess !== undefined) {\n          sw.network_access = canonical.sandbox.networkAccess;\n        }\n        result.sandbox_workspace_write = sw;\n      }\n    } else if (canonical.defaultMode) {\n      // Derive sandbox_mode from defaultMode if no explicit sandbox\n      if (canonical.defaultMode === \"readonly\") {\n        result.sandbox_mode = \"read-only\";\n      } else if (\n        canonical.defaultMode === \"autonomous\" ||\n        canonical.defaultMode === \"bypassPermissions\"\n      ) {\n        result.sandbox_mode = \"danger-full-access\";\n      } else {\n        result.sandbox_mode = \"workspace-write\";\n      }\n    }\n\n    // --- additionalDirectories → writable_roots ---\n    if (\n      canonical.permissions?.additionalDirectories?.length &&\n      !result.sandbox_workspace_write\n    ) {\n      result.sandbox_workspace_write = {\n        writable_roots: canonical.permissions.additionalDirectories,\n      };\n    }\n\n    // --- Collect all rules and extract Codex-relevant info ---\n    const allRules = collectRules(canonical);\n    const domains: Record<string, \"allow\" | \"deny\"> = {};\n    const filesystemDenyTools: Record<string, Set<string>> = {};\n\n    // Extract network domains from canonical network config\n    if (canonical.network?.domains) {\n      for (const [domain, action] of Object.entries(\n        canonical.network.domains,\n      )) {\n        domains[domain] = action;\n      }\n    }\n\n    for (const rule of allRules) {\n      // Extract WebFetch domain rules\n      if (rule.tool === \"WebFetch\" && rule.pattern?.startsWith(\"domain:\")) {\n        const domain = rule.pattern.slice(7);\n        domains[domain] = rule.tier === \"deny\" ? \"deny\" : \"allow\";\n        continue;\n      }\n\n      // Extract path-based deny rules for filesystem mapping\n      if (\n        rule.tier === \"deny\" &&\n        (rule.tool === \"Read\" ||\n          rule.tool === \"Write\" ||\n          rule.tool === \"Edit\") &&\n        rule.pattern !== undefined\n      ) {\n        let tools = filesystemDenyTools[rule.pattern];\n        if (!tools) {\n          tools = new Set();\n          filesystemDenyTools[rule.pattern] = tools;\n        }\n        tools.add(rule.tool);\n      }\n    }\n\n    // Convert collected path denies to Codex filesystem modes\n    const filesystem: Record<string, CodexFilesystemAccess> = {};\n    for (const [path, tools] of Object.entries(filesystemDenyTools)) {\n      if (tools.has(\"Read\")) {\n        filesystem[path] = \"none\";\n      } else if (tools.has(\"Write\") || tools.has(\"Edit\")) {\n        filesystem[path] = \"read\";\n      }\n    }\n\n    // --- profiles → named Codex profiles ---\n    if (canonical.profiles && Object.keys(canonical.profiles).length > 0) {\n      const codexProfiles: Record<string, CodexProfile> = {};\n      for (const [name, profileTiers] of Object.entries(canonical.profiles)) {\n        const profile: CodexProfile = {};\n        const profDenyTools: Record<string, Set<string>> = {};\n        const profDomains: Record<string, \"allow\" | \"deny\"> = {};\n\n        const profileRules = collectRules({ permissions: profileTiers });\n        for (const rule of profileRules) {\n          if (rule.tool === \"WebFetch\" && rule.pattern?.startsWith(\"domain:\")) {\n            const domain = rule.pattern.slice(7);\n            profDomains[domain] = rule.tier === \"deny\" ? \"deny\" : \"allow\";\n          }\n          if (\n            rule.tier === \"deny\" &&\n            (rule.tool === \"Read\" ||\n              rule.tool === \"Write\" ||\n              rule.tool === \"Edit\") &&\n            rule.pattern !== undefined\n          ) {\n            let tools = profDenyTools[rule.pattern];\n            if (!tools) {\n              tools = new Set();\n              profDenyTools[rule.pattern] = tools;\n            }\n            tools.add(rule.tool);\n          }\n        }\n\n        const profFs: Record<string, CodexFilesystemAccess> = {};\n        for (const [path, tools] of Object.entries(profDenyTools)) {\n          if (tools.has(\"Read\")) profFs[path] = \"none\";\n          else if (tools.has(\"Write\") || tools.has(\"Edit\"))\n            profFs[path] = \"read\";\n        }\n\n        if (Object.keys(profFs).length > 0) {\n          const absoluteFs: Record<string, CodexFilesystemAccess> = {};\n          for (const [p, m] of Object.entries(profFs)) {\n            absoluteFs[p.startsWith(\".\") ? p.slice(1) : p] = m;\n          }\n          profile.filesystem = absoluteFs;\n        }\n        if (Object.keys(profDomains).length > 0) {\n          profile.network = { domains: profDomains };\n        }\n\n        if (Object.keys(profile).length > 0) {\n          codexProfiles[name] = profile;\n        }\n      }\n\n      if (Object.keys(codexProfiles).length > 0) {\n        result.permissions = codexProfiles;\n        if (canonical.activeProfile) {\n          result.default_permissions = canonical.activeProfile;\n        }\n      }\n    } else if (\n      Object.keys(filesystem).length > 0 ||\n      Object.keys(domains).length > 0\n    ) {\n      // No named profiles — create a single \"default\" profile from rules\n      const profile: CodexProfile = {};\n      if (Object.keys(filesystem).length > 0) {\n        const absoluteFs: Record<string, CodexFilesystemAccess> = {};\n        for (const [p, m] of Object.entries(filesystem)) {\n          absoluteFs[p.startsWith(\".\") ? p.slice(1) : p] = m;\n        }\n        profile.filesystem = absoluteFs;\n      }\n      if (Object.keys(domains).length > 0) {\n        profile.network = { domains };\n      }\n      if (Object.keys(profile).length > 0) {\n        result.permissions = { default: profile };\n        result.default_permissions = \"default\";\n      }\n    }\n\n    return result;\n  },\n});\n\n// ---------------------------------------------------------------------------\n// Codec registry\n// ---------------------------------------------------------------------------\n\nexport const CODECS = {\n  \"claude-code\": claudeCodeCodec,\n  codex: codexCodec,\n  kiro: kiroCodec,\n  opencode: opencodeCodec,\n  crush: crushCodec,\n} as const;\n\nexport type Codecs = typeof CODECS;\n"],"mappings":"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"}