{"version":3,"file":"dev-tools.mjs","names":[],"sources":["../../src/batteries/dev_tools/exceptions.ts","../../src/batteries/dev_tools/matcher.ts","../../src/batteries/dev_tools/registry.ts","../../src/batteries/dev_tools/runtime.ts","../../src/batteries/dev_tools/index.ts"],"sourcesContent":["import { createException } from '../../factories'\n\n/** Fatal configuration error for a development-tools pipeline. */\nexport const E_INVALID_DEV_PIPELINE_CONFIG = createException<[string]>(\n  'E_INVALID_DEV_PIPELINE_CONFIG',\n  'Invalid dev pipeline config: %s',\n  'E_INVALID_DEV_PIPELINE_CONFIG',\n  529,\n  true\n)\n/** Unknown development step. */\nexport const E_DEV_UNKNOWN_STEP = createException<[string]>(\n  'E_DEV_UNKNOWN_STEP',\n  '%s',\n  'E_DEV_UNKNOWN_STEP',\n  422,\n  false\n)\n/** Invalid development-step argument. */\nexport const E_DEV_BAD_ARG = createException<[string]>(\n  'E_DEV_BAD_ARG',\n  '%s',\n  'E_DEV_BAD_ARG',\n  422,\n  false\n)\n/** A requested engine capability is not configured. */\nexport const E_DEV_ENGINE_REQUIRED = createException<[string]>(\n  'E_DEV_ENGINE_REQUIRED',\n  '%s',\n  'E_DEV_ENGINE_REQUIRED',\n  422,\n  false\n)\n/** A development step failed during execution or validation. */\nexport const E_DEV_STEP_FAILED = createException<[string, string]>(\n  'E_DEV_STEP_FAILED',\n  'step \"%s\" failed: %s',\n  'E_DEV_STEP_FAILED',\n  500,\n  false\n)\n/** A step implementation is not available. */\nexport const E_DEV_STEP_UNAVAILABLE = createException<[string]>(\n  'E_DEV_STEP_UNAVAILABLE',\n  'no step implementation is registered for \"%s\"',\n  'E_DEV_STEP_UNAVAILABLE',\n  501,\n  false\n)\n/** Workspace bounds were exceeded. */\nexport const E_DEV_WORKSPACE_BOUNDS = createException<[string]>(\n  'E_DEV_WORKSPACE_BOUNDS',\n  '%s',\n  'E_DEV_WORKSPACE_BOUNDS',\n  422,\n  false\n)\n/** A gate declined a step. */\nexport const E_DEV_GATE_DECLINED = createException<[string]>(\n  'E_DEV_GATE_DECLINED',\n  '%s',\n  'E_DEV_GATE_DECLINED',\n  403,\n  false\n)\n","/** Small, case-sensitive matcher for the dev-tools path grammar. */\nexport const isPattern = (s: string): boolean => s.includes('*')\n\n/** Validate and normalize one dev-tools path pattern. */\nexport const validatePattern = (input: string): string => {\n  const parts = input.trim().replaceAll('\\\\', '/').split('/').filter(Boolean)\n  for (const part of parts) {\n    if (part.includes('**') && part !== '**') throw new Error(`invalid glob segment \"${part}\"`)\n    if (/[?\\[\\]{}!^]/.test(part)) throw new Error(`unsupported glob syntax in \"${part}\"`)\n  }\n  const out: string[] = []\n  for (const part of parts) if (part !== '**' || out[out.length - 1] !== '**') out.push(part)\n  return out.join('/')\n}\n\nconst segment = (pattern: string, name: string): boolean => {\n  let p = 0\n  let n = 0\n  let star = -1\n  let mark = 0\n  while (n < name.length) {\n    if (p < pattern.length && pattern[p] !== '*' && pattern[p] === name[n]) {\n      p++\n      n++\n      continue\n    }\n    if (p < pattern.length && pattern[p] === '*') {\n      star = p++\n      mark = n\n      continue\n    }\n    if (star >= 0) {\n      p = star + 1\n      n = ++mark\n      continue\n    }\n    return false\n  }\n  while (p < pattern.length && pattern[p] === '*') p++\n  return p === pattern.length\n}\n\n/** Match a normalized glob against a workspace-relative path. */\nexport const globMatches = (pattern: string, path: string): boolean => {\n  const patterns = pattern.split('/')\n  const paths = path.split('/')\n  const go = (i: number, j: number): boolean => {\n    if (i === patterns.length) return j === paths.length\n    if (patterns[i] === '**') {\n      if (go(i + 1, j)) return true\n      return j < paths.length && !paths[j].startsWith('.') && go(i, j + 1)\n    }\n    if (j === paths.length) return false\n    if (paths[j].startsWith('.') && !patterns[i].startsWith('.')) return false\n    return segment(patterns[i], paths[j]) && go(i + 1, j + 1)\n  }\n  return go(0, 0)\n}\n\n/** Match either a literal path or a glob path. */\nexport const pathMatches = (pattern: string, path: string): boolean =>\n  isPattern(pattern) ? globMatches(pattern, path) : pattern === path\n\n/** Return the extension after the final dot, excluding dot-leading names. */\nexport const extensionOf = (path: string): string => {\n  const name = path.split('/').pop() ?? ''\n  const i = name.lastIndexOf('.')\n  return i <= 0 ? '' : name.slice(i + 1).toLowerCase()\n}\n\nconst segmentOverlap = (a: string, b: string): boolean => {\n  const chars = new Set([...a, ...b].filter((char) => char !== '*'))\n  chars.add('a')\n  const queue: Array<[number, number]> = [[0, 0]]\n  const seen = new Set<string>()\n  while (queue.length > 0) {\n    const [i, j] = queue.shift()!\n    const key = `${i},${j}`\n    if (seen.has(key)) continue\n    seen.add(key)\n    if (i === a.length && j === b.length) return true\n    if (i < a.length && a[i] === '*') queue.push([i + 1, j])\n    if (j < b.length && b[j] === '*') queue.push([i, j + 1])\n    if (i >= a.length || j >= b.length) continue\n    if (a[i] === '*' && b[j] === '*') {\n      queue.push([i + 1, j], [i, j + 1])\n      continue\n    }\n    if (a[i] === '*') {\n      if (b[j] !== '*') queue.push([i, j + 1], [i + 1, j])\n      continue\n    }\n    if (b[j] === '*') {\n      queue.push([i + 1, j], [i, j + 1])\n      continue\n    }\n    if (a[i] === b[j]) queue.push([i + 1, j + 1])\n  }\n  return false\n}\n\n/** Determine whether two normalized patterns have a common matching path. */\nexport const patternsOverlap = (a: string, b: string): boolean => {\n  const aa = a.split('/')\n  const bb = b.split('/')\n  const go = (i: number, j: number): boolean => {\n    if (i === aa.length && j === bb.length) return true\n    if (i === aa.length) return j < bb.length && bb[j] === '**' && go(i, j + 1)\n    if (j === bb.length) return i < aa.length && aa[i] === '**' && go(i + 1, j)\n    if (aa[i] === '**') {\n      // ** may consume only non-dot path segments.\n      return go(i + 1, j) || (bb[j] !== '**' && !bb[j].startsWith('.') && go(i, j + 1))\n    }\n    if (bb[j] === '**') return go(i, j + 1) || (!aa[i].startsWith('.') && go(i + 1, j))\n    if (aa[i].startsWith('.') !== bb[j].startsWith('.')) return false\n    return segmentOverlap(aa[i], bb[j]) && go(i + 1, j + 1)\n  }\n  return go(0, 0)\n}\n\n/** Determine whether a directory prefix can still contain a path matching a pattern. */\nexport const patternCanContinue = (pattern: string, prefix: string): boolean => {\n  const parts = pattern.split('/').filter(Boolean)\n  const prefixParts = prefix.split('/').filter(Boolean)\n  const walk = (i: number, j: number): boolean => {\n    if (j === prefixParts.length) return i < parts.length\n    if (i === parts.length) return false\n    if (parts[i] === '**') {\n      return walk(i + 1, j) || (!prefixParts[j].startsWith('.') && walk(i, j + 1))\n    }\n    if (prefixParts[j].startsWith('.') && !parts[i].startsWith('.')) return false\n    return segment(parts[i], prefixParts[j]) && walk(i + 1, j + 1)\n  }\n  return walk(0, 0)\n}\n","import { isError } from '@nhtio/adk/guards'\nimport { Middleware } from '@nhtio/middleware'\nimport { normalizeSandboxPath } from '../sandbox/paths'\nimport { E_INVALID_DEV_PIPELINE_CONFIG, E_DEV_STEP_FAILED } from './exceptions'\nimport { extensionOf, isPattern, pathMatches, validatePattern } from './matcher'\nimport type {\n  DevCapabilityProbe,\n  DevEngine,\n  DevEngineRegistry,\n  DevDispatchContext,\n  DevInvocation,\n  DevPlanRequest,\n  DevPlanResult,\n  DevSelectionContext,\n  DevCandidate,\n  StampedDelta,\n  WorkspaceDelta,\n} from './types'\n\nconst fail = (engine: string, index: number, reason: string): never => {\n  throw new E_INVALID_DEV_PIPELINE_CONFIG([\n    `engine \"${engine}\", capability index ${index}: ${reason}`,\n  ])\n}\n\n/** Validate one declared capability, including the runtime-only parts of its contract. */\nconst validateCapability = (engine: string, index: number, cap: any, kind: string): any => {\n  if (!cap || typeof cap !== 'object' || Array.isArray(cap))\n    fail(engine, index, `${kind} capability must be an object`)\n  const method = kind === 'format' ? 'format' : kind === 'lint' ? 'lint' : 'check'\n  if (typeof cap[method] !== 'function')\n    fail(engine, index, `${kind} capability method is required`)\n  if (!Array.isArray(cap.extensions) || cap.extensions.length === 0)\n    fail(engine, index, `${kind} extensions must be a non-empty array`)\n  if (kind === 'lint' && typeof cap.fixable !== 'boolean')\n    fail(engine, index, 'lint fixable must be a boolean')\n  for (const ext of cap.extensions) {\n    if (typeof ext !== 'string' || ext !== ext.toLowerCase() || ext.includes('.'))\n      fail(engine, index, `invalid extension ${String(ext)}`)\n  }\n  for (const field of ['inPlace', 'generates', 'fixable'] as const) {\n    if (cap[field] !== undefined && typeof cap[field] !== 'boolean')\n      fail(engine, index, `${field} must be a boolean`)\n  }\n  if (cap.scope !== undefined) {\n    if (!Array.isArray(cap.scope) || cap.scope.some((value: unknown) => typeof value !== 'string'))\n      fail(engine, index, 'scope must be an array of strings')\n    if (cap.scope.length === 0 && cap.inPlace)\n      fail(engine, index, 'inPlace capabilities require a non-empty scope')\n    try {\n      cap.scope = [\n        ...new Set(\n          cap.scope.map((value: string) => {\n            const normalized = normalizeSandboxPath(value.trim())\n            return isPattern(normalized) ? validatePattern(normalized) : normalized\n          })\n        ),\n      ].sort()\n    } catch (error) {\n      fail(engine, index, `invalid scope: ${isError(error) ? error.message : String(error)}`)\n    }\n  } else if (cap.inPlace) {\n    fail(engine, index, 'inPlace capabilities require a non-empty scope')\n  }\n  if (cap.needs !== undefined) {\n    if (!Array.isArray(cap.needs) || cap.needs.some((value: unknown) => typeof value !== 'string'))\n      fail(engine, index, 'needs must be a string array')\n    const allowed = new Set(['delete', 'rename', 'mkdir'])\n    for (const need of cap.needs)\n      if (!allowed.has(need)) fail(engine, index, `unknown needs value ${String(need)}`)\n    cap.needs = [...new Set(cap.needs)]\n  }\n  if (kind === 'lint' && cap.generates === true && cap.fixable !== true)\n    fail(engine, index, 'generates requires fixable: true')\n  return cap\n}\n\n/** Duck-type guard for a complete engine declaration. */\nconst implementsDevEngine = (engine: unknown, engineIndex: number): engine is DevEngine => {\n  const value = engine as any\n  const name = value && typeof value.id === 'string' ? value.id : `index ${engineIndex}`\n  if (!value || typeof value !== 'object' || Array.isArray(value))\n    throw new E_INVALID_DEV_PIPELINE_CONFIG([\n      `engine \"${name}\", capability index 0: engine must be an object`,\n    ])\n  if (typeof value.id !== 'string')\n    throw new E_INVALID_DEV_PIPELINE_CONFIG([\n      `engine \"${name}\", capability index 0: id must be a string`,\n    ])\n  return true\n}\n\n/** Build a declaration-only, stateless development engine registry. */\nexport const buildDevRegistry = (\n  engines: readonly DevEngine[],\n  selection: readonly any[] = []\n): DevEngineRegistry => {\n  const ids = new Set<string>()\n  const normalized: DevEngine[] = []\n  engines.forEach((engine, ei) => {\n    implementsDevEngine(engine, ei)\n    if (ids.has(engine.id))\n      throw new E_INVALID_DEV_PIPELINE_CONFIG([`duplicate engine id \"${engine.id}\"`])\n    ids.add(engine.id)\n    const copy: any = { ...engine }\n    for (const kind of ['formats', 'lints', 'checks'] as const) {\n      if (copy[kind] === undefined) continue\n      if (!Array.isArray(copy[kind]))\n        throw new E_INVALID_DEV_PIPELINE_CONFIG([\n          `engine \"${engine.id}\", capability index 0: ${kind} must be an array`,\n        ])\n      copy[kind] = copy[kind].map((capability: unknown, index: number) =>\n        validateCapability(engine.id, index, capability, kind.slice(0, -1))\n      )\n    }\n    normalized.push(copy)\n  })\n  const probe: DevCapabilityProbe = {\n    hasFormat: (extension) =>\n      normalized.some((x) =>\n        (x.formats ?? []).some(\n          (c) =>\n            extension === undefined ||\n            c.extensions.includes('*') ||\n            c.extensions.includes(extension)\n        )\n      ),\n    hasLint: (extension) =>\n      normalized.some((x) =>\n        (x.lints ?? []).some(\n          (c) =>\n            extension === undefined ||\n            c.extensions.includes('*') ||\n            c.extensions.includes(extension)\n        )\n      ),\n    hasCheck: (extension) =>\n      normalized.some((x) =>\n        (x.checks ?? []).some(\n          (c) =>\n            extension === undefined ||\n            c.extensions.includes('*') ||\n            c.extensions.includes(extension)\n        )\n      ),\n  }\n  const matchesExtension = (extensions: readonly string[], extension: string): boolean =>\n    extensions.includes('*') || extensions.includes(extension)\n  const inScope = (scope: readonly string[] | undefined, path: string): boolean =>\n    scope === undefined || scope.some((pattern) => pathMatches(pattern, path))\n  const entries = (kind: 'format' | 'lint' | 'check') =>\n    normalized.flatMap((engine) =>\n      (engine[kind === 'format' ? 'formats' : kind === 'lint' ? 'lints' : 'checks'] ?? []).map(\n        (capability: any, capabilityIndex: number) => ({ engine, capability, capabilityIndex })\n      )\n    )\n  const arbitrate = async (\n    kind: DevSelectionContext['kind'],\n    group: string | null,\n    request: { paths: readonly string[]; extensions: readonly string[] },\n    candidates: DevCandidate[]\n  ): Promise<DevCandidate[]> => {\n    if (selection.length === 0 || candidates.length <= 1) return candidates\n    const context: DevSelectionContext = { kind, group, request, candidates: [...candidates] }\n    const middleware = new Middleware<any>()\n    for (const fn of selection) middleware.add(fn)\n    let failed: unknown\n    // Flag, not a value test: `throw undefined` is legal JS and `failed !== undefined` cannot\n    // tell it from \"no error\", so a stage rejecting with undefined would be silently ignored.\n    let didFail = false\n    await middleware\n      .runner()\n      .errorHandler(async (error) => {\n        didFail = true\n        failed = error\n      })\n      .finalHandler(async () => {})\n      .run((fn, next) => Promise.resolve(fn(context, next)))\n    if (didFail) throw failed\n    const original = new Set(\n      candidates.map((candidate) => `${candidate.engineId}\\\\0${candidate.capabilityIndex}`)\n    )\n    const seen = new Set<string>()\n    return context.candidates.filter((candidate) => {\n      const key = `${candidate.engineId}\\\\0${candidate.capabilityIndex}`\n      if (!original.has(key) || seen.has(key)) return false\n      seen.add(key)\n      return true\n    })\n  }\n  const plan = async (request: DevPlanRequest): Promise<DevPlanResult> => {\n    const invocations: DevInvocation[] = []\n    const skipped: Array<DevPlanResult['skipped'][number]> = []\n    const scopeExcluded: Array<DevPlanResult['scopeExcluded'][number]> = []\n    const all = entries(request.kind)\n    const lookup = new Map(\n      all.map((entry) => [`${entry.engine.id}\\\\0${entry.capabilityIndex}`, entry])\n    )\n    const groups = [...new Set(request.paths.map(extensionOf))].sort()\n    const selected = new Map<\n      string,\n      { candidate: DevCandidate; groups: string[]; paths: string[]; order: number }\n    >()\n    for (let groupIndex = 0; request.kind !== 'check' && groupIndex < groups.length; groupIndex++) {\n      const group = groups[groupIndex]\n      const paths = request.paths.filter((path) => extensionOf(path) === group)\n      const candidates = all\n        .filter(\n          (entry) =>\n            matchesExtension(entry.capability.extensions, group) && !entry.capability.generates\n        )\n        .map((entry) => ({\n          engineId: entry.engine.id,\n          capabilityIndex: entry.capabilityIndex,\n          extensions: entry.capability.extensions,\n          inPlace: entry.capability.inPlace === true,\n        }))\n      if (candidates.length === 0) {\n        skipped.push({ group, reason: 'no-capability', extensions: [group] })\n        continue\n      }\n      const survivors = await arbitrate(\n        request.kind,\n        group,\n        { paths, extensions: [group] },\n        candidates\n      )\n      if (survivors.length === 0) {\n        skipped.push({ group, reason: 'suppressed-by-selection', extensions: [group] })\n        continue\n      }\n      for (const candidate of request.kind === 'format' ? survivors.slice(0, 1) : survivors) {\n        const key = `${candidate.engineId}\\\\0${candidate.capabilityIndex}`\n        const current = selected.get(key)\n        const admitted = paths.filter((path) => inScope(lookup.get(key)!.capability.scope, path))\n        if (current) {\n          current.groups.push(group)\n          current.paths.push(...admitted)\n        } else selected.set(key, { candidate, groups: [group], paths: admitted, order: groupIndex })\n      }\n    }\n    if (request.kind === 'check') {\n      const extensions = [\n        ...new Set(\n          request.extensions.length > 0 ? request.extensions : request.paths.map(extensionOf)\n        ),\n      ].sort()\n      const candidates = all\n        .filter((entry) =>\n          extensions.some((extension) => matchesExtension(entry.capability.extensions, extension))\n        )\n        .map((entry) => ({\n          engineId: entry.engine.id,\n          capabilityIndex: entry.capabilityIndex,\n          extensions: entry.capability.extensions,\n          inPlace: false,\n        }))\n      if (candidates.length === 0) {\n        skipped.push({ group: null, reason: 'no-capability', extensions })\n      } else {\n        const survivors = await arbitrate('check', null, { paths: [], extensions }, candidates)\n        if (survivors.length === 0)\n          skipped.push({ group: null, reason: 'suppressed-by-selection', extensions })\n        for (const candidate of survivors)\n          selected.set(`${candidate.engineId}\\\\0${candidate.capabilityIndex}`, {\n            candidate,\n            groups: [],\n            paths: [],\n            order: 0,\n          })\n      }\n    }\n    const generators = all\n      .filter((entry) => entry.capability.generates === true)\n      .map((entry) => ({\n        engineId: entry.engine.id,\n        capabilityIndex: entry.capabilityIndex,\n        extensions: entry.capability.extensions,\n        inPlace: entry.capability.inPlace === true,\n      }))\n    for (const candidate of await arbitrate(\n      request.kind,\n      null,\n      { paths: [], extensions: [] },\n      generators\n    )) {\n      const entry = lookup.get(`${candidate.engineId}\\\\0${candidate.capabilityIndex}`)!\n      const paths = request.paths.filter((path) => inScope(entry.capability.scope, path))\n      selected.set(`${candidate.engineId}\\\\0${candidate.capabilityIndex}`, {\n        candidate,\n        groups: [],\n        paths,\n        order: groups.length + selected.size,\n      })\n    }\n    for (const item of [...selected.values()].sort((left, right) => left.order - right.order)) {\n      const entry = lookup.get(`${item.candidate.engineId}\\\\0${item.candidate.capabilityIndex}`)!\n      const capability: any = entry.capability\n      const excluded = request.paths.filter(\n        (path) =>\n          matchesExtension(capability.extensions, extensionOf(path)) &&\n          capability.scope !== undefined &&\n          !inScope(capability.scope, path)\n      ).length\n      if (excluded > 0)\n        scopeExcluded.push({\n          engineId: item.candidate.engineId,\n          capabilityIndex: item.candidate.capabilityIndex,\n          count: excluded,\n        })\n      invocations.push({\n        engineId: item.candidate.engineId,\n        capabilityIndex: item.candidate.capabilityIndex,\n        kind: request.kind,\n        groups: item.groups,\n        paths: [...new Set(item.paths)],\n        selector: request.selector,\n        fix: request.fix && capability.fixable === true,\n        inPlace: capability.inPlace === true,\n        scope: capability.scope ?? null,\n        needs: capability.needs ?? [],\n        generates: capability.generates === true,\n        fixable: capability.fixable === true,\n      })\n    }\n    return { invocations, skipped, scopeExcluded }\n  }\n  const dispatch = async (\n    invocation: DevInvocation,\n    context: DevDispatchContext\n  ): Promise<StampedDelta> => {\n    const list = normalized.find((engine) => engine.id === invocation.engineId)?.[\n      invocation.kind === 'format' ? 'formats' : invocation.kind === 'lint' ? 'lints' : 'checks'\n    ] as any[] | undefined\n    const capability: any = list?.[invocation.capabilityIndex]\n    if (!capability)\n      throw new E_DEV_STEP_FAILED([\n        invocation.kind,\n        `engine \"${invocation.engineId}\" capability ${invocation.capabilityIndex} is unavailable`,\n      ])\n    const files = new Map([...context.files].map(([path, file]) => [path, { ...file }]))\n    const request: any =\n      invocation.kind === 'check'\n        ? { files, root: context.root, signal: context.signal }\n        : {\n            files,\n            paths: invocation.paths,\n            selector: invocation.selector,\n            root: context.root,\n            signal: context.signal,\n            ...(invocation.inPlace ? { access: context.makeAccess(invocation) } : {}),\n            ...(invocation.kind === 'lint' ? { fix: invocation.fix } : {}),\n          }\n    try {\n      const delta: WorkspaceDelta =\n        await capability[\n          invocation.kind === 'format' ? 'format' : invocation.kind === 'lint' ? 'lint' : 'check'\n        ](request)\n      return {\n        ...delta,\n        diagnostics: (delta.diagnostics ?? []).map((diagnostic) => ({\n          ...diagnostic,\n          engineId: invocation.engineId,\n        })),\n      }\n    } catch (error) {\n      throw new E_DEV_STEP_FAILED(\n        [\n          invocation.kind,\n          `engine \"${invocation.engineId}\": ${isError(error) ? error.message : String(error)}`,\n        ],\n        { cause: error }\n      )\n    }\n  }\n  return { ...probe, engines: normalized, plan, dispatch }\n}\n","/** Runtime helpers for the development-tools pipeline. */\nimport { isError, isInstanceOf } from '@nhtio/adk/guards'\n// KNOWN DEVIATION from \"Batteries — barrel imports only\": no barrel re-exports these two, and\n// `common` is value classes, so neither belongs there. Media reaches them the same way. The\n// documented fix is to add the re-export to a barrel; that is a public-surface decision and is\n// tracked separately rather than smuggled in here.\nimport { isTextual } from '@nhtio/adk/lib/mime/is_textual'\nimport { decodeText } from '@nhtio/adk/lib/text/decode_text'\nimport { resolveMime } from '../sandbox/defaults/extension_mime'\nimport { globMatches, isPattern, validatePattern } from './matcher'\nimport { applyOperations, normalizeWorkspacePath } from '../../lib/patch'\nimport { E_DEV_BAD_ARG, E_DEV_STEP_FAILED, E_DEV_WORKSPACE_BOUNDS } from './exceptions'\nimport {\n  classifySandboxPathRejection,\n  createExistingSymlinkGuard,\n  normalizeSandboxPath,\n} from '../sandbox/paths'\nimport type { FsNode } from '../sandbox/node/fs_node'\nimport type { ParsedApplyPatch, WorkspaceFile } from '../../lib/patch'\nimport type { MimeResolver } from '../sandbox/contracts/mime_resolver'\nimport type { SandboxFileSystem } from '../sandbox/contracts/file_system'\nimport type { PathTranslator } from '../sandbox/contracts/path_translator'\nimport type { DevFileAccess, DevInvocation, FileChangeSummary } from './types'\nimport type {\n  Diagnostic,\n  ExecutionState,\n  RawDiagnostic,\n  StampedDelta,\n  WorkspaceBounds,\n} from './types'\n\n/** Internal provenance marker for runtime diagnostics that name an engine. */\nexport const runtimeDiagnostic = Symbol('runtimeDiagnostic')\n\n/** Whole-file names that are known textual despite having no useful extension. */\nexport const DEV_FILENAME_MIME: Readonly<Record<string, string>> = Object.fromEntries(\n  `Makefile makefile GNUmakefile Dockerfile Containerfile Jenkinsfile Procfile Rakefile Gemfile Brewfile Vagrantfile Justfile justfile CODEOWNERS LICENSE LICENCE NOTICE AUTHORS CHANGELOG README TODO VERSION .gitignore .gitattributes .gitmodules .dockerignore .npmignore .npmrc .nvmrc .editorconfig .prettierrc .eslintrc .babelrc .env .env.example .browserslistrc`\n    .split(' ')\n    .map((name) => [name, 'text/plain'])\n)\n\n/** Resolve an admission MIME, giving the normative filename map precedence. */\nexport const resolveDevMime = async (\n  path: string,\n  resolver: MimeResolver | undefined,\n  bytes: Uint8Array\n): Promise<string | undefined> => {\n  const name = path.split('/').pop() ?? path\n  return (\n    DEV_FILENAME_MIME[name] ??\n    resolveMime(path, resolver, { peek: async (count) => bytes.slice(0, count) })\n  )\n}\n\n/** Canonicalize an absolute host workspace root for comparisons and engine requests. */\nexport const canonicalizeDevRoot = (value: string): string => {\n  const normalized = value.replaceAll('\\\\', '/').replace(/\\/+/g, '/')\n  return normalized === '/' ? '/' : normalized.replace(/\\/$/, '') || '/'\n}\n\nconst readBytes = async (fileSystem: SandboxFileSystem, path: string): Promise<Uint8Array> => {\n  const stream = await fileSystem.read(path)\n  const reader = stream.getReader()\n  const chunks: Uint8Array[] = []\n  let length = 0\n  for (;;) {\n    const next = await reader.read()\n    if (next.done) break\n    chunks.push(next.value)\n    length += next.value.length\n  }\n  const bytes = new Uint8Array(length)\n  let offset = 0\n  for (const chunk of chunks) {\n    bytes.set(chunk, offset)\n    offset += chunk.length\n  }\n  return bytes\n}\n\n/** Check all workspace resource limits against a proposed map. */\nexport const assertBounds = (\n  files: ReadonlyMap<string, WorkspaceFile>,\n  bounds: WorkspaceBounds\n): void => {\n  if (files.size > bounds.maxFiles)\n    throw new E_DEV_WORKSPACE_BOUNDS([\n      `maxFiles limit ${bounds.maxFiles} exceeded by ${files.size}`,\n    ])\n  let total = 0\n  for (const [path, file] of files) {\n    const size = new TextEncoder().encode(file.text).length\n    if (size > bounds.maxBytesPerFile)\n      throw new E_DEV_WORKSPACE_BOUNDS([\n        `maxBytesPerFile limit ${bounds.maxBytesPerFile} exceeded by ${path} (${size})`,\n      ])\n    total += size\n  }\n  if (total > bounds.maxTotalBytes)\n    throw new E_DEV_WORKSPACE_BOUNDS([\n      `maxTotalBytes limit ${bounds.maxTotalBytes} exceeded by ${total}`,\n    ])\n}\n\n/** Resolve acquisition paths without reading file contents. */\nexport const resolveAcquisitionTargets = async (options: {\n  paths: readonly string[]\n  fileSystem: SandboxFileSystem\n  pathTranslator: PathTranslator\n  signal?: AbortSignal\n}): Promise<string[]> => {\n  const root = canonicalizeDevRoot(options.pathTranslator.toBackendPath('') as string)\n  const concrete = new Set<string>()\n  for (const authored of options.paths) {\n    if (typeof authored !== 'string') throw new E_DEV_BAD_ARG(['acquisition paths must be strings'])\n    const value = authored.trim()\n    if (!isPattern(value)) {\n      try {\n        concrete.add(await options.pathTranslator.toRelative(value))\n      } catch (error) {\n        throw new E_DEV_BAD_ARG([\n          `acquisition path \"${authored}\" does not exist: ${isError(error) ? error.message : String(error)}`,\n        ])\n      }\n      continue\n    }\n    let pattern: string\n    try {\n      pattern = validatePattern(normalizeSandboxPath(value))\n    } catch (error) {\n      throw new E_DEV_BAD_ARG([\n        `invalid acquisition pattern \"${authored}\": ${isError(error) ? error.message : String(error)}`,\n      ])\n    }\n    let done = false\n    let matched = false\n    for await (const frame of options.fileSystem.list(root, {\n      maxDepth: 20,\n      signal: options.signal,\n    })) {\n      if (frame.kind === 'done') {\n        done = true\n        continue\n      }\n      if (frame.entryKind !== 'file') continue\n      const relative =\n        frame.path === root\n          ? ''\n          : frame.path.startsWith(`${root}/`)\n            ? frame.path.slice(root.length + 1)\n            : frame.path\n      if (globMatches(pattern, relative)) {\n        concrete.add(normalizeSandboxPath(relative))\n        matched = true\n      }\n    }\n    if (!done)\n      throw new E_DEV_STEP_FAILED(['acquire', 'filesystem list ended without a done frame'])\n    if (!matched) throw new E_DEV_BAD_ARG([`acquisition pattern \"${authored}\" matched no files`])\n  }\n  return [...concrete].sort()\n}\n\n/** Acquire explicitly requested files, expanding only entries containing an asterisk. */\nexport const acquireWorkspace = async (options: {\n  paths: readonly string[]\n  fileSystem: SandboxFileSystem\n  pathTranslator: PathTranslator\n  bounds: WorkspaceBounds\n  mimeResolver?: MimeResolver\n  signal?: AbortSignal\n  /** Previously resolved targets, used to keep approval and acquisition consistent. */\n  targets?: readonly string[]\n}): Promise<Map<string, WorkspaceFile>> => {\n  const files = new Map<string, WorkspaceFile>()\n  for (const input of options.targets ?? (await resolveAcquisitionTargets(options))) {\n    // A real translator probes symlink components in toRelative. Probe literals first so an\n    // absent literal remains the caller's bad argument rather than a translator failure.\n    if (!isPattern(input)) {\n      try {\n        await options.fileSystem.stat(options.pathTranslator.toBackendPath(input) as string)\n      } catch (error) {\n        throw new E_DEV_BAD_ARG([\n          `acquisition path \"${input}\" does not exist: ${isError(error) ? error.message : String(error)}`,\n        ])\n      }\n    }\n    let relative: string\n    try {\n      relative = await options.pathTranslator.toRelative(input)\n    } catch (error) {\n      throw new E_DEV_STEP_FAILED([\n        'acquire',\n        `cannot acquire \"${input}\": ${isError(error) ? error.message : String(error)}`,\n      ])\n    }\n    if (relative.split('/').length > 20)\n      throw new E_DEV_WORKSPACE_BOUNDS([`path \"${relative}\" exceeds depth limit 20`])\n    const backend = options.pathTranslator.toBackendPath(relative) as string\n    let metadata: Awaited<ReturnType<SandboxFileSystem['stat']>>\n    try {\n      metadata = await options.fileSystem.stat(backend)\n    } catch (error) {\n      throw new E_DEV_BAD_ARG([\n        `acquisition path \"${input}\" does not exist: ${isError(error) ? error.message : String(error)}`,\n      ])\n    }\n    if (metadata.kind !== 'file')\n      throw new E_DEV_BAD_ARG([`\"${input}\" is not a file; use a glob to acquire files`])\n    const bytes = await readBytes(options.fileSystem, backend)\n    const mimeType = await resolveDevMime(relative, options.mimeResolver, bytes)\n    if (mimeType === undefined || !isTextual(mimeType))\n      throw new E_DEV_STEP_FAILED(['acquire', `\"${relative}\" has no textual MIME type`])\n    files.set(relative, { text: decodeText(bytes), mimeType })\n    assertBounds(files, options.bounds)\n  }\n  return files\n}\n\n/**\n * Derive the canonical workspace delta for a completely parsed structured patch.\n *\n * The patch primitive mutates its input map, so this always applies it to a clone and returns\n * nothing until the entire operation list has succeeded.\n */\nexport const derivePatchOutcome = (files: Map<string, WorkspaceFile>, parsed: ParsedApplyPatch) => {\n  const clone = new Map(files)\n  applyOperations(clone, parsed)\n  const moves = new Map<string, string>()\n  const deletedThenAdded = new Set<string>()\n  const absent = new Set<string>()\n  for (const operation of parsed.operations) {\n    if (operation.type === 'delete') absent.add(operation.path)\n    if (operation.type === 'add') {\n      if (absent.has(operation.path) && files.has(operation.path))\n        deletedThenAdded.add(operation.path)\n      absent.delete(operation.path)\n    }\n    if (operation.type === 'update' && operation.movePath) {\n      const origin = moves.get(operation.path) ?? operation.path\n      moves.delete(operation.path)\n      if (origin !== operation.movePath) moves.set(operation.movePath, origin)\n      absent.add(operation.path)\n      absent.delete(operation.movePath)\n    }\n  }\n  const renamed = new Map<string, string>()\n  for (const [to, from] of moves) {\n    if (to !== from && files.has(from) && clone.has(to)) renamed.set(from, to)\n  }\n  const destinations = new Set(renamed.values())\n  const sources = new Set(renamed.keys())\n  const added = new Map<string, WorkspaceFile>()\n  const deleted = new Set<string>()\n  const changed = new Map<string, string>()\n  for (const [path, file] of clone) {\n    const original = files.get(path)\n    if (!original) {\n      const source = [...renamed].find(([, destination]) => destination === path)?.[0]\n      if (source !== undefined && files.get(source)?.text !== file.text)\n        changed.set(path, file.text)\n      else if (!destinations.has(path)) added.set(path, file)\n    } else if (sources.has(path)) {\n      added.set(path, file)\n    } else if (original.text !== file.text) changed.set(path, file.text)\n  }\n  for (const path of files.keys()) if (!clone.has(path) && !sources.has(path)) deleted.add(path)\n  return {\n    delta: { changed, added, deleted, renamed, diagnostics: [] },\n    recreated: deletedThenAdded,\n  }\n}\n\nconst normalizedDeltaPath = (path: string): string => {\n  if (classifySandboxPathRejection(path) !== undefined)\n    throw new E_DEV_STEP_FAILED(['delta', `invalid path \"${path}\"`])\n  try {\n    return normalizeWorkspacePath(path)\n  } catch (error) {\n    throw new E_DEV_STEP_FAILED([\n      'delta',\n      `invalid path \"${path}\": ${isError(error) ? error.message : String(error)}`,\n    ])\n  }\n}\n\n/** Normalize, validate, and apply one engine delta without mutating it. */\nexport const applyDelta = async (options: {\n  delta: StampedDelta\n  files: Map<string, WorkspaceFile>\n  state: ExecutionState\n  bounds: WorkspaceBounds\n  fileSystem: SandboxFileSystem\n  pathTranslator: PathTranslator\n  mimeResolver?: MimeResolver\n  persistedPaths?: Map<string, string>\n  pendingDeletions?: Map<string, string>\n  recreated?: Set<string>\n  renames?: Map<string, string>\n  /** Paths vacated earlier in this execution by a deletion or rename. */\n  vacated?: Set<string>\n  unreadable?: ReadonlySet<string>\n  engineId?: string\n  /** Resolved existing paths this engine invocation was authorized to modify. */\n  invocationPaths?: readonly string[]\n  /** Authored selector patterns; additions must match these when present. */\n  selector?: readonly string[] | null\n  /** Structured patch additions are textual by construction and retain their inferred MIME. */\n  skipAddedMimeResolution?: boolean\n}): Promise<StampedDelta> => {\n  const changed = new Map<string, string>()\n  const added = new Map<string, WorkspaceFile>()\n  const deleted = new Set<string>()\n  const renamed = new Map<string, string>()\n  const addUnique = <T>(target: Map<string, T>, path: string, value: T): void => {\n    if (target.has(path)) throw new E_DEV_STEP_FAILED(['delta', `duplicate path \"${path}\"`])\n    target.set(path, value)\n  }\n  for (const [path, text] of options.delta.changed ?? [])\n    addUnique(changed, normalizedDeltaPath(path), text)\n  for (const [path, file] of options.delta.added ?? [])\n    addUnique(added, normalizedDeltaPath(path), file)\n  for (const rawPath of options.delta.deleted ?? []) {\n    const path = normalizedDeltaPath(rawPath)\n    if (deleted.has(path)) throw new E_DEV_STEP_FAILED(['delta', `duplicate path \"${path}\"`])\n    deleted.add(path)\n  }\n  for (const [from, to] of options.delta.renamed ?? []) {\n    const source = normalizedDeltaPath(from)\n    const destination = normalizedDeltaPath(to)\n    if (renamed.has(source) || [...renamed.values()].includes(destination))\n      throw new E_DEV_STEP_FAILED([\n        'delta',\n        `duplicate rename path \"${source === from ? destination : source}\"`,\n      ])\n    renamed.set(source, destination)\n  }\n  const noOpChanges: string[] = []\n  for (const [path, text] of [...changed]) {\n    if (options.files.get(path)?.text === text) {\n      changed.delete(path)\n      noOpChanges.push(path)\n    }\n  }\n  const destinations = new Set(renamed.values())\n  const sources = new Set(renamed.keys())\n  const collide = (path: string, reason: string): never => {\n    throw new E_DEV_STEP_FAILED(['delta', `${reason}: \"${path}\"`])\n  }\n  // Existing-file mutations are confined to precisely the paths dispatch resolved.\n  // Additions instead use the authored selector: a resolved path set contains no absent paths.\n  if (options.invocationPaths !== undefined) {\n    const allowed = new Set(options.invocationPaths)\n    const selector = options.selector ?? null\n    const unauthorized = (path: string): never => {\n      throw new E_DEV_STEP_FAILED([\n        options.engineId ?? 'delta',\n        `path \"${path}\" is outside the authorized selector \"${selector?.join(', ') ?? '(workspace root)'}\"`,\n      ])\n    }\n    for (const path of changed.keys()) if (!allowed.has(path)) unauthorized(path)\n    for (const path of deleted) if (!allowed.has(path)) unauthorized(path)\n    for (const path of sources) if (!allowed.has(path)) unauthorized(path)\n    // A rename destination is authorized by its source, so it is intentionally not selector-bound.\n    if (selector !== null)\n      for (const path of added.keys())\n        if (!selector.some((pattern) => globMatches(pattern, path))) unauthorized(path)\n  }\n  for (const path of added.keys())\n    if (deleted.has(path)) collide(path, 'path is both added and deleted')\n  for (const path of changed.keys())\n    if (sources.has(path)) collide(path, 'changed path is a rename source')\n  for (const path of destinations) {\n    if (options.files.has(path)) collide(path, 'rename destination already exists')\n    if (sources.has(path)) collide(path, 'rename chain is not allowed')\n    if (deleted.has(path)) collide(path, 'rename destination is also deleted')\n  }\n  for (const path of sources) {\n    if (deleted.has(path)) collide(path, 'rename source is also deleted')\n    if (!options.files.has(path)) collide(path, 'rename source is absent')\n  }\n  for (const path of deleted)\n    if (destinations.has(path)) collide(path, 'deleted path is a rename destination')\n  for (const path of changed.keys()) {\n    if (deleted.has(path)) collide(path, 'changed path is also deleted')\n    if (!options.files.has(path) && !added.has(path) && !destinations.has(path))\n      collide(path, 'changed path is absent')\n  }\n  for (const [path, file] of added) {\n    if (options.files.has(path) && !sources.has(path)) collide(path, 'added path already exists')\n    const bytes = new TextEncoder().encode(file.text)\n    const mimeType = options.skipAddedMimeResolution\n      ? file.mimeType\n      : await resolveDevMime(path, options.mimeResolver, bytes)\n    if (mimeType === undefined || !isTextual(mimeType)) collide(path, 'added file is not textual')\n    added.set(path, { ...file, mimeType: mimeType! })\n    const exempt =\n      options.recreated?.has(path) === true ||\n      options.persistedPaths?.has(path) === true ||\n      options.unreadable?.has(path) === true ||\n      sources.has(path)\n    if (!exempt) {\n      try {\n        await options.fileSystem.stat(options.pathTranslator.toBackendPath(path) as string)\n        collide(path, 'added path exists but was not acquired')\n      } catch (error) {\n        if (isInstanceOf(error, 'E_DEV_STEP_FAILED', E_DEV_STEP_FAILED)) throw error\n      }\n    }\n  }\n  for (const [from, to] of renamed) {\n    const file = options.files.get(from)!\n    options.files.delete(from)\n    options.files.set(to, file)\n    options.vacated?.add(from)\n    options.vacated?.delete(to)\n    const onDisk = options.persistedPaths?.get(from)\n    if (onDisk !== undefined) {\n      options.persistedPaths!.delete(from)\n      options.persistedPaths!.set(to, onDisk)\n    }\n    if (options.recreated?.delete(from)) {\n      options.recreated.add(to)\n      // This is a newly-created identity, not the acquired file's rename.\n      options.renames?.delete(to)\n    } else {\n      // Resolve a source that was renamed by an earlier step before checking the\n      // acquisition baseline: b→c after a→b is still the acquired a→c identity.\n      const origin = options.renames?.get(from)\n      if (origin !== undefined) {\n        options.renames!.set(to, origin)\n        options.renames!.delete(from)\n      } else if (options.state.acquisitionBaseline.has(from)) {\n        options.renames?.set(to, from)\n        options.renames?.delete(from)\n      }\n    }\n  }\n  for (const path of deleted) {\n    options.files.delete(path)\n    options.vacated?.add(path)\n    const onDisk = options.persistedPaths?.get(path)\n    if (onDisk !== undefined) {\n      options.persistedPaths!.delete(path)\n      options.pendingDeletions?.set(path, onDisk)\n    }\n    options.recreated?.delete(path)\n    options.renames?.delete(path)\n  }\n  for (const [path, file] of added) {\n    if (\n      options.state.acquisitionBaseline.has(path) &&\n      (options.vacated?.has(path) ||\n        sources.has(path) ||\n        deleted.has(path) ||\n        options.pendingDeletions?.has(path))\n    )\n      options.recreated?.add(path)\n    options.vacated?.delete(path)\n    if (sources.has(path)) options.state.addedBy.set(path, 'delta')\n    options.files.set(path, file)\n  }\n  for (const [path, text] of changed) {\n    const file = options.files.get(path)\n    if (!file) collide(path, 'changed path is absent')\n    options.files.set(path, { ...file!, text })\n  }\n  assertBounds(options.files, options.bounds)\n  const diagnostics = [...options.delta.diagnostics]\n  if (noOpChanges.length > 0) {\n    const warning = {\n      path: null,\n      severity: 'warning' as const,\n      message: `engine \"${options.engineId ?? 'unknown'}\" reported ${noOpChanges.length} unchanged changed entr${noOpChanges.length === 1 ? 'y' : 'ies'}; ignored`,\n      engineId: options.engineId ?? 'unknown',\n      [runtimeDiagnostic]: true,\n    }\n    diagnostics.push(warning as unknown as (typeof diagnostics)[number])\n  }\n  return { ...options.delta, diagnostics, changed, added, deleted, renamed }\n}\n\n/** Normalize and scope-stamp diagnostics after the workspace mutation has completed. */\n/** Build the deliberately narrow disk API handed to an in-place engine. */\nexport const makeDevFileAccess = (options: {\n  invocation: DevInvocation\n  allowlist: readonly string[]\n  fileSystem: SandboxFileSystem\n  pathTranslator: PathTranslator\n  policy: FsNode | undefined\n  selector: readonly string[] | null\n  signal?: AbortSignal\n  renameDestinations: Set<string>\n}): DevFileAccess => {\n  const fail = (message: string): never => {\n    throw new E_DEV_STEP_FAILED([options.invocation.engineId, message])\n  }\n  const guard = createExistingSymlinkGuard(\n    options.pathTranslator.toBackendPath('') as string,\n    options.fileSystem\n  )\n  const scope = [...new Set(options.allowlist)].sort()\n  const lexical = (input: string): { relative: string; backend: string } => {\n    if (input.startsWith('/'))\n      fail(`path \"${input}\" must be workspace-relative (leading / is not allowed)`)\n    if (classifySandboxPathRejection(input) !== undefined) fail(`path \"${input}\" is rejected`)\n    let relative = ''\n    try {\n      relative = normalizeSandboxPath(input)\n    } catch {\n      return fail(`path \"${input}\" is rejected`)\n    }\n    return { relative, backend: options.pathTranslator.toBackendPath(relative) as string }\n  }\n  const policy = (backend: string, read: boolean): void => {\n    const node = options.policy\n    if (!node) return fail('effective policy was unavailable')\n    if (!node.canWrite(backend) || (read && !node.canRead(backend)))\n      fail(`path is refused by sandbox policy: ${backend}`)\n  }\n  const createAuthorized = (path: string): boolean =>\n    options.invocation.scope !== null &&\n    options.invocation.scope.some((pattern) => globMatches(pattern, path)) &&\n    (options.selector === null || options.selector.some((pattern) => globMatches(pattern, path)))\n  const permitted = (path: string, create = false): void => {\n    if (scope.includes(path)) return\n    if (create && createAuthorized(path)) return\n    fail(\n      `path \"${path}\" is outside the allowlist (${scope.length} paths) and declared scope (${options.invocation.scope?.join(', ') ?? ''})`\n    )\n  }\n  const absent = async (backend: string): Promise<boolean> => {\n    try {\n      await options.fileSystem.stat(backend)\n      return false\n    } catch {\n      return true\n    }\n  }\n  const mutation = async (\n    input: string,\n    create = false\n  ): Promise<{ relative: string; backend: string }> => {\n    const target = lexical(input)\n    permitted(target.relative, create)\n    policy(target.backend, false)\n    await guard(target.relative)\n    return target\n  }\n  const mkdirParents = async (relative: string): Promise<void> => {\n    const parts = relative.split('/').slice(0, -1)\n    for (let i = 1; i <= parts.length; i++) {\n      const parent = parts.slice(0, i).join('/')\n      const backend = options.pathTranslator.toBackendPath(parent) as string\n      try {\n        const stat = await options.fileSystem.stat(backend)\n        if (stat.kind !== 'dir') fail(`parent \"${parent}\" is not a directory`)\n      } catch (error) {\n        if (isInstanceOf(error, 'E_DEV_STEP_FAILED', E_DEV_STEP_FAILED)) throw error\n        if (!options.invocation.needs.includes('mkdir'))\n          fail('parent creation requires \"mkdir\" to be declared in needs')\n        if (!options.fileSystem.mkdir)\n          fail(`parent directory \"${parent}\" does not exist and filesystem cannot create it`)\n        policy(backend, false)\n        await guard(parent)\n        await options.fileSystem.mkdir!(backend, { signal: options.signal })\n      }\n    }\n  }\n  return {\n    scope,\n    async read(path) {\n      const target = lexical(path)\n      permitted(target.relative)\n      policy(target.backend, true)\n      await guard(target.relative)\n      return decodeText(await readBytes(options.fileSystem, target.backend))\n    },\n    async exists(path) {\n      const target = lexical(path)\n      permitted(target.relative, true)\n      policy(target.backend, true)\n      try {\n        await options.fileSystem.stat(target.backend)\n        return true\n      } catch {\n        return false\n      }\n    },\n    async write(path, text) {\n      const target = await mutation(path, true)\n      if (!scope.includes(target.relative) && !(await absent(target.backend)))\n        fail(`create target \"${target.relative}\" already exists`)\n      if (target.relative.split('/').length > 20)\n        fail(`path \"${target.relative}\" exceeds depth limit 20`)\n      await mkdirParents(target.relative)\n      await guard(target.relative)\n      await options.fileSystem.write(target.backend, new TextEncoder().encode(text), {\n        signal: options.signal,\n      })\n    },\n    async delete(path) {\n      if (!options.invocation.needs.includes('delete')) fail('delete was not declared in needs')\n      const target = await mutation(path)\n      if (!options.fileSystem.delete) return fail('filesystem does not support delete')\n      await options.fileSystem.delete(target.backend, { signal: options.signal })\n    },\n    async rename(from, to) {\n      if (!options.invocation.needs.includes('rename')) fail('rename was not declared in needs')\n      const source = await mutation(from)\n      const destination = await mutation(to, true)\n      if (!(await absent(destination.backend)))\n        fail(`rename destination \"${destination.relative}\" already exists`)\n      if (!options.fileSystem.rename) return fail('filesystem does not support rename')\n      await mkdirParents(destination.relative)\n      await guard(source.relative)\n      await guard(destination.relative)\n      await options.fileSystem.rename(source.backend, destination.backend, {\n        signal: options.signal,\n      })\n      options.renameDestinations.add(destination.relative)\n    },\n    async mkdir(path) {\n      if (!options.invocation.needs.includes('mkdir')) fail('mkdir was not declared in needs')\n      const target = lexical(path)\n      if (\n        !(options.invocation.scope ?? []).some((pattern) =>\n          globMatches(pattern, `${target.relative}/x`)\n        ) ||\n        (options.selector !== null &&\n          !options.selector.some((pattern) => globMatches(pattern, `${target.relative}/x`)))\n      )\n        fail(`mkdir \"${target.relative}\" is outside declared scope`)\n      policy(target.backend, false)\n      if (!options.fileSystem.mkdir) fail('filesystem does not support mkdir')\n      await mkdirParents(`${target.relative}/x`)\n      try {\n        const stat = await options.fileSystem.stat(target.backend)\n        if (stat.kind !== 'dir') fail(`\"${target.relative}\" exists as ${stat.kind}`)\n      } catch (error) {\n        if (isInstanceOf(error, 'E_DEV_STEP_FAILED', E_DEV_STEP_FAILED)) throw error\n        await guard(target.relative)\n        await options.fileSystem.mkdir!(target.backend, { signal: options.signal })\n      }\n    },\n  }\n}\n\n/** Snapshot an in-place authorization envelope before its capability mutates disk. */\nexport const snapshotInPlaceEnvelope = async (options: {\n  envelope: readonly (readonly string[])[]\n  excluded?: ReadonlySet<string>\n  files: ReadonlyMap<string, WorkspaceFile>\n  fileSystem: SandboxFileSystem\n  pathTranslator: PathTranslator\n  signal?: AbortSignal\n}): Promise<{ paths: Set<string>; diagnostics: RawDiagnostic[] }> => {\n  const root = options.pathTranslator.toBackendPath('') as string\n  const paths = new Set<string>()\n  const diagnostics: RawDiagnostic[] = []\n  const matches = (path: string) =>\n    !options.excluded?.has(path) &&\n    options.envelope.some((patterns) => patterns.every((pattern) => globMatches(pattern, path)))\n  try {\n    for await (const frame of options.fileSystem.list(root, {\n      maxDepth: 20,\n      signal: options.signal,\n    })) {\n      if (frame.kind !== 'item' || frame.entryKind !== 'file') continue\n      const path = frame.path.startsWith(`${root}/`)\n        ? frame.path.slice(root.length + 1)\n        : frame.path\n      if (matches(path)) paths.add(path)\n    }\n  } catch (error) {\n    diagnostics.push({\n      path: null,\n      severity: 'error',\n      message: `could not enumerate re-read envelope (${options.envelope.join(', ')}): ${isError(error) ? error.message : String(error)}`,\n    })\n    for (const path of options.files.keys()) if (matches(path)) paths.add(path)\n  }\n  return { paths, diagnostics }\n}\n\n/** Assemble final-state changes, retaining rename identity rather than guessing from text. */\n/** Re-read an in-place invocation's authorized envelope against its pre-step snapshot. */\nexport const rereadInPlace = async (options: {\n  envelope: readonly (readonly string[])[]\n  /** Dirty workspace paths whose disk copies must not be admitted by this re-read. */\n  excluded?: ReadonlySet<string>\n  beforeSnapshot?: Set<string>\n  files: Map<string, WorkspaceFile>\n  unreadable: Set<string>\n  persistedPaths: Map<string, string>\n  persistedBaseline: Map<string, WorkspaceFile>\n  renames: Map<string, string>\n  recreated: Set<string>\n  fileSystem: SandboxFileSystem\n  pathTranslator: PathTranslator\n  bounds: WorkspaceBounds\n  mimeResolver?: MimeResolver\n  signal?: AbortSignal\n}): Promise<{ changed: Set<string>; diagnostics: RawDiagnostic[] }> => {\n  const root = options.pathTranslator.toBackendPath('') as string\n  const before = options.beforeSnapshot ?? new Set<string>()\n  const diagnostics: RawDiagnostic[] = []\n  const matches = (path: string) =>\n    !options.excluded?.has(path) &&\n    options.envelope.some((patterns) => patterns.every((pattern) => globMatches(pattern, path)))\n  if (!options.beforeSnapshot) {\n    const snapshot = await snapshotInPlaceEnvelope(options)\n    for (const path of snapshot.paths) before.add(path)\n    diagnostics.push(...snapshot.diagnostics)\n  }\n  const after = new Set<string>()\n  try {\n    for await (const frame of options.fileSystem.list(root, {\n      maxDepth: 20,\n      signal: options.signal,\n    })) {\n      if (frame.kind !== 'item' || frame.entryKind !== 'file') continue\n      const path = frame.path.startsWith(`${root}/`)\n        ? frame.path.slice(root.length + 1)\n        : frame.path\n      if (matches(path)) after.add(path)\n    }\n  } catch (error) {\n    diagnostics.push({\n      path: null,\n      severity: 'error',\n      message: `could not re-read envelope (${options.envelope.join(', ')}): ${isError(error) ? error.message : String(error)}`,\n    })\n  }\n  const changed = new Set<string>()\n  for (const path of new Set([...before, ...after, ...options.files.keys()])) {\n    if (!matches(path)) continue\n    const existing = options.files.get(path)\n    if (!after.has(path)) {\n      if (existing) {\n        options.files.delete(path)\n        options.persistedPaths.delete(path)\n        options.persistedBaseline.delete(path)\n        options.renames.delete(path)\n        options.recreated.delete(path)\n        changed.add(path)\n      }\n      continue\n    }\n    // Do not import a pre-existing file the workspace never acquired. unreadable is tracked ownership.\n    if (!existing && before.has(path) && !options.unreadable.has(path)) continue\n    try {\n      const bytes = await readBytes(\n        options.fileSystem,\n        options.pathTranslator.toBackendPath(path) as string\n      )\n      const mimeType = await resolveDevMime(path, options.mimeResolver, bytes)\n      if (!mimeType || !isTextual(mimeType) || bytes.length > options.bounds.maxBytesPerFile)\n        throw new Error(\n          !mimeType || !isTextual(mimeType) ? 'not textual' : 'exceeds maxBytesPerFile'\n        )\n      const file = { text: decodeText(bytes), mimeType }\n      if (!existing && options.files.size >= options.bounds.maxFiles)\n        throw new Error('exceeds maxFiles')\n      if (existing?.text !== file.text || !existing) changed.add(path)\n      options.files.set(path, file)\n      options.persistedPaths.set(path, path)\n      options.persistedBaseline.set(path, { ...file })\n      options.unreadable.delete(path)\n    } catch (error) {\n      if (existing) {\n        options.files.delete(path)\n        options.persistedPaths.delete(path)\n        options.persistedBaseline.delete(path)\n        options.unreadable.add(path)\n        changed.add(path)\n      }\n      diagnostics.push({\n        path,\n        severity: 'error',\n        message: `could not admit re-read file \"${path}\": ${isError(error) ? error.message : String(error)}`,\n      })\n    }\n  }\n  return { changed, diagnostics }\n}\n\nexport const assembleChanges = async (\n  baseline: ReadonlyMap<string, WorkspaceFile>,\n  files: ReadonlyMap<string, WorkspaceFile>,\n  renames: ReadonlyMap<string, string>,\n  recreated: ReadonlySet<string>,\n  unreadable: ReadonlySet<string>\n): Promise<{ changes: FileChangeSummary[]; lineCountsAvailable: boolean }> => {\n  let diffLines:\n    | ((a: string, b: string) => Array<{ added?: boolean; removed?: boolean; count?: number }>)\n    | undefined\n  try {\n    const diffModule = await import('diff')\n    diffLines = diffModule.diffLines\n  } catch {\n    /* optional peer */\n  }\n  const rows: FileChangeSummary[] = []\n  const consumed = new Set<string>()\n  const counts = (before: string, after: string): Pick<FileChangeSummary, 'added' | 'removed'> => {\n    if (!diffLines) return {}\n    let added = 0\n    let removed = 0\n    for (const part of diffLines(before, after)) {\n      if (part.added) added += part.count ?? 0\n      if (part.removed) removed += part.count ?? 0\n    }\n    return { added, removed }\n  }\n  for (const [path, from] of renames) {\n    if (unreadable.has(path) || unreadable.has(from) || !files.has(path)) continue\n    const before = baseline.get(from)\n    const after = files.get(path)!\n    if (!before) continue\n    rows.push({ path, kind: 'renamed', from, ...counts(before.text, after.text) })\n    consumed.add(path)\n    consumed.add(from)\n  }\n  for (const [path, file] of files) {\n    if (consumed.has(path) || unreadable.has(path)) continue\n    const before = baseline.get(path)\n    if (!before || recreated.has(path)) rows.push({ path, kind: 'added', ...counts('', file.text) })\n    else if (before.text !== file.text)\n      rows.push({ path, kind: 'modified', ...counts(before.text, file.text) })\n  }\n  for (const [path, file] of baseline)\n    if (!consumed.has(path) && !unreadable.has(path) && !files.has(path))\n      rows.push({ path, kind: 'deleted', ...counts(file.text, '') })\n  rows.sort((a, b) => a.path.localeCompare(b.path))\n  return { changes: rows, lineCountsAvailable: diffLines !== undefined }\n}\n\nexport const stampDiagnostics = (\n  diagnostics: readonly (RawDiagnostic & { engineId: string | null })[],\n  files: ReadonlyMap<string, WorkspaceFile>,\n  root: string,\n  translator: PathTranslator,\n  fallbackEngineId: string | null = null\n): Diagnostic[] => {\n  let trimmedCount = 0\n  const stamped: Diagnostic[] = diagnostics.map((diagnostic) => {\n    const { line, column, endLine, endColumn, ...rest } = diagnostic\n    const valid = (value: number | undefined): value is number =>\n      typeof value === 'number' && Number.isInteger(value) && value > 0\n    const coordinates: Pick<Diagnostic, 'line' | 'column' | 'endLine' | 'endColumn'> = {}\n    if (valid(line)) {\n      coordinates.line = line\n      if (valid(endLine) && endLine >= line) coordinates.endLine = endLine\n      if (valid(column)) {\n        coordinates.column = column\n        if (\n          valid(endColumn) &&\n          (coordinates.endLine === undefined || coordinates.endLine === line\n            ? endColumn >= column\n            : true)\n        )\n          coordinates.endColumn = endColumn\n      }\n    }\n    if (\n      (line !== undefined && !valid(line)) ||\n      (column !== undefined && (!valid(line) || !valid(column))) ||\n      (endLine !== undefined && (!valid(line) || !valid(endLine) || endLine < line!)) ||\n      (endColumn !== undefined &&\n        (!valid(line) ||\n          !valid(column) ||\n          !valid(endColumn) ||\n          ((endLine === undefined || endLine === line) && endColumn < column!)))\n    )\n      trimmedCount++\n    const isRuntimeDiagnostic =\n      (diagnostic as typeof diagnostic & { [runtimeDiagnostic]?: boolean })[runtimeDiagnostic] ===\n      true\n    // An explicit null denotes a runtime diagnostic with no reporting engine; only\n    // diagnostics that omit the field receive the dispatch engine as a fallback.\n    const engineId = Object.hasOwn(diagnostic, 'engineId') ? diagnostic.engineId : fallbackEngineId\n    if (diagnostic.path === null) {\n      if (engineId !== null && !isRuntimeDiagnostic && diagnostic.engineId !== null)\n        throw new E_DEV_STEP_FAILED([engineId, 'returned a diagnostic without a path'])\n      return { ...rest, ...coordinates, engineId, outOfScope: false }\n    }\n    const raw = diagnostic.path\n    let path = raw\n    let normalized: string | undefined\n    if (classifySandboxPathRejection(raw) === undefined) {\n      try {\n        const canonicalRoot = canonicalizeDevRoot(root)\n        const rootPrefix = canonicalRoot === '/' ? '/' : `${canonicalRoot}/`\n        const direct = raw.startsWith(rootPrefix) ? raw.slice(rootPrefix.length) : raw\n        if (raw.startsWith('/') && !raw.startsWith(rootPrefix))\n          throw new Error('host path outside root')\n        normalized = normalizeSandboxPath(direct)\n        path = normalized\n      } catch {\n        /* redact below */\n      }\n    }\n    if (normalized === undefined) path = translator.redact(raw)\n    return {\n      ...rest,\n      ...coordinates,\n      engineId,\n      path,\n      outOfScope: normalized === undefined || !files.has(normalized),\n    }\n  })\n  if (trimmedCount > 0 && fallbackEngineId !== null)\n    stamped.push({\n      path: null,\n      severity: 'warning',\n      message: `engine \"${fallbackEngineId}\" returned ${trimmedCount} diagnostic(s) with invalid coordinates; coordinates were trimmed`,\n      engineId: fallbackEngineId,\n      outOfScope: false,\n    })\n  return stamped\n}\n","/**\n * Typed development-editing pipeline contracts and factory.\n *\n * @module @nhtio/adk/batteries/dev-tools\n */\nimport { DEV_ARG_SPECS } from './arg_specs'\nimport { validator } from '@nhtio/validation'\nimport { buildDevRegistry } from './registry'\nimport { narratingPath } from '../sandbox/tools'\nimport { createFsNode } from '../sandbox/node/fs_node'\nimport { runOnion } from '../../lib/middleware/run_onion'\nimport { isError, isInstanceOf, isObject } from '@nhtio/adk/guards'\nimport { E_LLM_EXECUTION_GATE_NOT_SUPPORTED } from '../../exceptions'\nimport { extensionOf, globMatches, patternsOverlap, validatePattern } from './matcher'\nimport { applyUpdateHunks, isStructuredPatch, parseStructuredPatch } from '../../lib/patch'\nimport {\n  classifySandboxPathRejection,\n  createExistingSymlinkGuard,\n  normalizeSandboxPath,\n} from '../sandbox/paths'\nimport {\n  E_DEV_BAD_ARG,\n  E_DEV_ENGINE_REQUIRED,\n  E_DEV_GATE_DECLINED,\n  E_DEV_STEP_FAILED,\n  E_DEV_STEP_UNAVAILABLE,\n  E_DEV_UNKNOWN_STEP,\n  E_INVALID_DEV_PIPELINE_CONFIG,\n} from './exceptions'\nimport {\n  acquireWorkspace,\n  applyDelta,\n  assembleChanges,\n  canonicalizeDevRoot,\n  derivePatchOutcome,\n  makeDevFileAccess,\n  rereadInPlace,\n  resolveAcquisitionTargets,\n  runtimeDiagnostic,\n  snapshotInPlaceEnvelope,\n  stampDiagnostics,\n} from './runtime'\nimport type { SandboxHandle } from '../sandbox/manager'\nimport type { EngineResolver } from '../media/contracts'\nimport type { ParsedApplyPatch, ParsedHunk } from '../../lib/patch'\nimport type { MimeResolver } from '../sandbox/contracts/mime_resolver'\nimport type { SandboxFileSystem } from '../sandbox/contracts/file_system'\nimport type { PathTranslator } from '../sandbox/contracts/path_translator'\nimport type {\n  DevChain,\n  DevOp,\n  DevPlan,\n  DevResult,\n  RunOptions,\n  ExecutionState,\n  DevGateContext,\n  DevGateFn,\n  RawDiagnostic,\n} from './types'\nimport type {\n  DevEngine,\n  DevPipeline,\n  DevSelectionMiddlewareFn,\n  DevStepMiddlewareFn,\n  DevStepContext,\n  DevWorkspace,\n  DevWorkspaceToken,\n  WorkspaceBounds,\n} from './types'\n\n/** Configuration for {@link createDevPipeline}. */\ninterface DevPipelineConfig {\n  /** Required sandbox handle supplying effective policy and epoch discipline. */\n  handle: SandboxHandle\n  /** Required filesystem adapter; optional mutation methods determine capability availability. */\n  fileSystem: SandboxFileSystem\n  /** Required translator; backend locators must be absolute host paths under root. */\n  pathTranslator: PathTranslator\n  /** Required gate called once for each executable step. */\n  gate: DevGateFn\n  /** Absolute host directory forming the workspace boundary. */\n  root: string\n  /** Engines or asynchronous engine resolvers, resolved at construction. */\n  engines?: EngineResolver<DevEngine>[]\n  /** Selection onion stages, used to narrow or reorder candidates. */\n  selection?: DevSelectionMiddlewareFn[]\n  /** Step onion stages surrounding each step implementation. */\n  use?: DevStepMiddlewareFn[]\n  /** Optional overrides for workspace resource limits. */\n  bounds?: Partial<WorkspaceBounds>\n  /** Optional MIME resolver used for acquisition and delta admission. */\n  mimeResolver?: MimeResolver\n}\n\nconst defaults: WorkspaceBounds = {\n  maxFiles: 500,\n  maxBytesPerFile: 2 * 1024 * 1024,\n  maxTotalBytes: 32 * 1024 * 1024,\n}\n\nconst configSchema = validator\n  .object({\n    handle: validator.any().optional(),\n    fileSystem: validator.any().optional(),\n    pathTranslator: validator.any().optional(),\n    gate: validator.any().optional(),\n    root: validator.any().optional(),\n    engines: validator.any().optional(),\n    selection: validator.any().optional(),\n    use: validator.any().optional(),\n    bounds: validator.any().optional(),\n    mimeResolver: validator.any().optional(),\n  })\n  .unknown(false)\n\nconst resolveEngine = async (\n  entry: EngineResolver<DevEngine>,\n  index: number\n): Promise<DevEngine> => {\n  let value: unknown = entry\n  if (typeof value === 'function') {\n    try {\n      value = await (value as () => unknown)()\n    } catch (error) {\n      throw new E_INVALID_DEV_PIPELINE_CONFIG([\n        `engines[${index}] resolver failed: ${isError(error) ? error.message : String(error)}`,\n      ])\n    }\n    if (isObject(value) && 'default' in value && !('id' in value))\n      value = (value as { default: unknown }).default\n  }\n  if (value === null || typeof value !== 'object' || typeof (value as DevEngine).id !== 'string')\n    throw new E_INVALID_DEV_PIPELINE_CONFIG([\n      `engines[${index}] does not implement the DevEngine contract`,\n    ])\n  return value as DevEngine\n}\n\nconst validateArgs = (step: DevOp): DevOp => {\n  const spec = DEV_ARG_SPECS[step.step]\n  if (spec === undefined) throw new E_DEV_UNKNOWN_STEP([`unknown development step \"${step.step}\"`])\n  if (\n    step === null ||\n    typeof step !== 'object' ||\n    step.args === null ||\n    typeof step.args !== 'object' ||\n    Array.isArray(step.args)\n  )\n    throw new E_DEV_BAD_ARG([`step \"${step.step}\" args must be an object`])\n  for (const key of Object.keys(step.args)) {\n    if (!(key in spec))\n      throw new E_DEV_BAD_ARG([`step \"${step.step}\" has unknown argument \"${key}\"`])\n  }\n  for (const [key, rule] of Object.entries(spec)) {\n    const value = step.args[key]\n    if (value === undefined) {\n      if (rule.required) throw new E_DEV_BAD_ARG([`step \"${step.step}\" requires \"${key}\"`])\n      continue\n    }\n    if (rule.type === 'array') {\n      if (!Array.isArray(value) || (rule.nonEmpty && value.length === 0))\n        throw new E_DEV_BAD_ARG([`step \"${step.step}\" argument \"${key}\" must be a non-empty array`])\n      if (rule.element === 'string' && value.some((item) => typeof item !== 'string'))\n        throw new E_DEV_BAD_ARG([`step \"${step.step}\" argument \"${key}\" must contain strings`])\n      if (typeof rule.element === 'object') {\n        for (const item of value) {\n          if (item === null || typeof item !== 'object' || Array.isArray(item))\n            throw new E_DEV_BAD_ARG([`step \"${step.step}\" argument \"${key}\" must contain objects`])\n          const fields = rule.element.fields\n          for (const field of Object.keys(item)) {\n            if (!(field in fields))\n              throw new E_DEV_BAD_ARG([\n                `step \"${step.step}\" argument \"${key}\" has unknown field \"${field}\"`,\n              ])\n          }\n          for (const [field, declaredRule] of Object.entries(fields)) {\n            const fieldRule =\n              typeof declaredRule === 'string' ? { type: declaredRule } : declaredRule\n            const fieldValue = (item as Record<string, unknown>)[field]\n            const invalidField =\n              fieldValue === undefined ||\n              !isDeclaredType(fieldValue, fieldRule.type) ||\n              (fieldRule.nonEmpty && typeof fieldValue === 'string' && fieldValue.length === 0)\n            if (invalidField)\n              throw new E_DEV_BAD_ARG([\n                `step \"${step.step}\" argument \"${key}\" field \"${field}\" has invalid type`,\n              ])\n          }\n        }\n      }\n    } else if (\n      !isDeclaredType(value, rule.type) ||\n      (rule.nonEmpty && typeof value === 'string' && value.length === 0)\n    ) {\n      throw new E_DEV_BAD_ARG([`step \"${step.step}\" argument \"${key}\" has invalid type`])\n    }\n    const invalidLineNumber =\n      step.step === 'read_lines' &&\n      (key === 'start' || key === 'end') &&\n      (!Number.isInteger(value) || (value as number) < 1)\n    if (invalidLineNumber)\n      throw new E_DEV_BAD_ARG([`step \"${step.step}\" argument \"${key}\" must be a positive integer`])\n  }\n  return {\n    step: step.step,\n    args: { ...step.args },\n    ...(step.label === undefined ? {} : { label: step.label }),\n  }\n}\n\nconst hasMutation = (delta: {\n  changed?: Map<unknown, unknown>\n  added?: Map<unknown, unknown>\n  deleted?: Set<unknown>\n  renamed?: Map<unknown, unknown>\n}): boolean =>\n  Boolean(delta.changed?.size || delta.added?.size || delta.deleted?.size || delta.renamed?.size)\n\nconst isDeclaredType = (value: unknown, type: string): boolean => {\n  if (type === 'object') return isObject(value)\n  if (type === 'string') return typeof value === 'string'\n  if (type === 'number') return typeof value === 'number'\n  if (type === 'boolean') return typeof value === 'boolean'\n  return false\n}\n\nconst normalizeSelectors = (paths: readonly string[]): string[] => {\n  const normalized: string[] = []\n  for (const raw of paths) {\n    if (typeof raw !== 'string') throw new E_DEV_BAD_ARG(['step paths must be strings'])\n    try {\n      const value = normalizeSandboxPath(raw.trim())\n      const normalizedSelector = value.includes('*') ? validatePattern(value) : value\n      if (!normalized.includes(normalizedSelector)) normalized.push(normalizedSelector)\n    } catch (error) {\n      throw new E_DEV_BAD_ARG([\n        `invalid step selector \"${raw}\": ${isError(error) ? error.message : String(error)}`,\n      ])\n    }\n  }\n  return normalized\n}\n\nconst validateSelectors = (\n  paths: readonly string[],\n  files: ReadonlyMap<string, unknown>\n): string[] => {\n  const selected: string[] = []\n  for (const value of paths) {\n    if (value.includes('*')) {\n      for (const path of files.keys())\n        if (globMatches(value, path) && !selected.includes(path)) selected.push(path)\n    } else if (files.has(value) && !selected.includes(value)) selected.push(value)\n  }\n  return selected\n}\n\n/** Construct a development-editing pipeline. */\nexport const createDevPipeline = async (config: DevPipelineConfig): Promise<DevPipeline> => {\n  const { error: validationError } = configSchema.validate(config, { abortEarly: true })\n  if (validationError) throw new E_INVALID_DEV_PIPELINE_CONFIG([validationError.message])\n  if (config === null || !isObject(config))\n    throw new E_INVALID_DEV_PIPELINE_CONFIG(['config must be an object'])\n  if (\n    typeof config.root !== 'string' ||\n    !config.root ||\n    config.root.includes('\\0') ||\n    !config.root.startsWith('/')\n  )\n    throw new E_INVALID_DEV_PIPELINE_CONFIG([\n      `root must be a non-empty absolute host path: ${String(config.root)}`,\n    ])\n  if (\n    !config.handle ||\n    !config.fileSystem ||\n    !config.pathTranslator ||\n    typeof config.gate !== 'function'\n  )\n    throw new E_INVALID_DEV_PIPELINE_CONFIG([\n      'handle, fileSystem, pathTranslator, and gate are required',\n    ])\n  const bounds = { ...defaults, ...(config.bounds ?? {}) }\n  for (const [name, value] of Object.entries(bounds))\n    if (!Number.isInteger(value) || value < 1)\n      throw new E_INVALID_DEV_PIPELINE_CONFIG([\n        `${name} must be an integer >= 1; got ${String(value)}`,\n      ])\n  const root = canonicalizeDevRoot(config.root)\n  let translatedRoot: string\n  try {\n    translatedRoot = config.pathTranslator.toBackendPath('') as string\n  } catch (error) {\n    throw new E_INVALID_DEV_PIPELINE_CONFIG([\n      `pathTranslator.toBackendPath('') failed for root \"${config.root}\": ${isError(error) ? error.message : String(error)}`,\n    ])\n  }\n  if (typeof translatedRoot !== 'string' || canonicalizeDevRoot(translatedRoot) !== root)\n    throw new E_INVALID_DEV_PIPELINE_CONFIG([\n      `pathTranslator.toBackendPath('') (${String(translatedRoot)}) must resolve to configured root (${config.root}); backend locators must be absolute host paths under root`,\n    ])\n  const resolved = await Promise.all((config.engines ?? []).map(resolveEngine))\n  // Preserve declaration-array positions: registry candidate identities are (engineId, index).\n  // An unavailable capability is a hole, rather than a compacted sibling array.\n  const available = resolved.map((engine) => {\n    const omitUnavailable = <T extends { needs?: readonly string[] }>(\n      capabilities: readonly T[] | undefined\n    ): T[] | undefined => {\n      if (capabilities === undefined) return undefined\n      const retained = [...capabilities]\n      capabilities.forEach((capability, index) => {\n        if (\n          (capability.needs ?? []).some(\n            (need) => typeof config.fileSystem[need as keyof SandboxFileSystem] !== 'function'\n          )\n        )\n          delete retained[index]\n      })\n      return retained\n    }\n    return {\n      ...engine,\n      formats: omitUnavailable(engine.formats),\n      lints: omitUnavailable(engine.lints),\n    }\n  })\n  const registry = buildDevRegistry(available, config.selection ?? [])\n  const compile = (ops: DevOp[]): DevPlan => {\n    const steps = ops.map(validateArgs)\n    for (const step of steps) {\n      const kind = step.step as 'format' | 'lint' | 'check'\n      if (!['format', 'lint', 'check'].includes(kind)) continue\n      if (\n        (kind === 'format' && !registry.hasFormat()) ||\n        (kind === 'lint' && !registry.hasLint()) ||\n        (kind === 'check' && !registry.hasCheck())\n      )\n        throw new E_DEV_ENGINE_REQUIRED([\n          `no ${kind} capability is configured; register an engine before retrying`,\n        ])\n    }\n    return { steps }\n  }\n  const execute = async (\n    paths: readonly string[],\n    plan: DevPlan,\n    options?: RunOptions,\n    granularPersistence = false\n  ): Promise<DevResult> => {\n    // Forged granular mutations have no workspace lifetime. Persist them through the\n    // ordinary write machinery, while the step's approval remains the sole write gate.\n    if (\n      granularPersistence &&\n      plan.steps.length === 1 &&\n      ['edit', 'apply_patch', 'format', 'lint'].includes(plan.steps[0]!.step)\n    ) {\n      const step = plan.steps[0]!\n      return execute(\n        paths,\n        {\n          steps: [\n            { ...step, args: { ...step.args, persists: true } },\n            { step: 'write', args: {} },\n          ],\n        },\n        options\n      )\n    }\n    const gateContext: DevGateContext = {\n      ...options?.gateContext,\n      waitFor:\n        options?.gateContext?.waitFor ??\n        (() => Promise.reject(new E_LLM_EXECUTION_GATE_NOT_SUPPORTED())),\n    }\n    const acquisitionTargets = await resolveAcquisitionTargets({\n      paths,\n      fileSystem: config.fileSystem,\n      pathTranslator: config.pathTranslator,\n      signal: options?.signal,\n    })\n    const acquisitionGate = await config.gate(gateContext, {\n      step: 'acquire',\n      args: { paths },\n      targets: acquisitionTargets,\n    })\n    if (acquisitionGate && !acquisitionGate.approved)\n      throw new E_DEV_GATE_DECLINED([\n        acquisitionGate.note ?? 'Approval was declined for acquisition.',\n      ])\n    let files = await acquireWorkspace({\n      paths,\n      targets: acquisitionTargets,\n      fileSystem: config.fileSystem,\n      pathTranslator: config.pathTranslator,\n      bounds,\n      mimeResolver: config.mimeResolver,\n      signal: options?.signal,\n    })\n    const state: ExecutionState = {\n      acquisitionBaseline: new Map(files),\n      persistedBaseline: new Map(files),\n      addedBy: new Map(),\n    }\n    let bookkeeping = {\n      persistedPaths: new Map([...files.keys()].map((path) => [path, path])),\n      pendingDeletions: new Map<string, string>(),\n      recreated: new Set<string>(),\n      renames: new Map<string, string>(),\n      vacated: new Set<string>(),\n      unreadable: new Set<string>(),\n    }\n    let diagnostics: DevResult['diagnostics'] = []\n    const reads: Record<string, string> = {}\n    const written: string[] = []\n    const writeFailure = (reason: string) => {\n      const error = new E_DEV_STEP_FAILED(['write', reason])\n      Object.assign(error, { written: [...written] })\n      return error\n    }\n    const stash = new Map<string, unknown>()\n    const issuedTokens = new Set<DevWorkspaceToken>()\n    const mintToken = (): DevWorkspaceToken => {\n      const token = {} as DevWorkspaceToken\n      issuedTokens.add(token)\n      return token\n    }\n    let workspace: DevWorkspace = {\n      files,\n      unreadable: bookkeeping.unreadable,\n      token: mintToken(),\n      diagnostics,\n      renames: bookkeeping.renames,\n      persistedPaths: bookkeeping.persistedPaths,\n      pendingDeletions: bookkeeping.pendingDeletions,\n      recreated: bookkeeping.recreated,\n    }\n    const syncFromWorkspace = () => {\n      files = workspace.files\n      diagnostics = workspace.diagnostics\n      bookkeeping = {\n        ...bookkeeping,\n        unreadable: workspace.unreadable,\n        renames: workspace.renames,\n        persistedPaths: workspace.persistedPaths,\n        pendingDeletions: workspace.pendingDeletions,\n        recreated: workspace.recreated,\n      }\n    }\n    const syncToWorkspace = () => {\n      workspace.files = files\n      workspace.diagnostics = diagnostics\n      workspace.unreadable = bookkeeping.unreadable\n      workspace.renames = bookkeeping.renames\n      workspace.persistedPaths = bookkeeping.persistedPaths\n      workspace.pendingDeletions = bookkeeping.pendingDeletions\n      workspace.recreated = bookkeeping.recreated\n    }\n    const mutationTarget = async (stepName: string, input: string, createParents = false) => {\n      if (classifySandboxPathRejection(input) !== undefined)\n        throw writeFailure(`path \"${input}\" is rejected`)\n      let relative: string\n      try {\n        relative = normalizeSandboxPath(input)\n      } catch (error) {\n        throw writeFailure(\n          `path \"${input}\" is rejected: ${isError(error) ? error.message : String(error)}`\n        )\n      }\n      const translateMutationPath = async (path: string): Promise<string> => {\n        try {\n          return (await narratingPath(\n            () => config.pathTranslator.toBackendPath(path),\n            path\n          )) as string\n        } catch (error) {\n          throw new E_DEV_STEP_FAILED([stepName, isError(error) ? error.message : String(error)], {\n            cause: isError(error) ? error : undefined,\n          })\n        }\n      }\n      const backend = await translateMutationPath(relative)\n      const policy = config.handle.effectivePolicy?.()\n      if (policy === undefined)\n        throw new E_DEV_STEP_FAILED([stepName, 'effective sandbox write policy is unavailable'])\n      if (!createFsNode(policy).canWrite(backend))\n        throw new E_DEV_STEP_FAILED([\n          stepName,\n          `path is refused by sandbox write policy: ${relative}`,\n        ])\n      const guard = createExistingSymlinkGuard(await translateMutationPath(''), config.fileSystem)\n      if (createParents) {\n        const parts = relative.split('/').slice(0, -1)\n        for (let index = 1; index <= parts.length; index++) {\n          const parent = parts.slice(0, index).join('/')\n          const parentBackend = await translateMutationPath(parent)\n          try {\n            const stat = await config.fileSystem.stat(parentBackend)\n            if (stat.kind !== 'dir') throw writeFailure(`parent \"${parent}\" is not a directory`)\n          } catch (error) {\n            if (isInstanceOf(error, 'E_DEV_STEP_FAILED', E_DEV_STEP_FAILED)) throw error\n            if (!config.fileSystem.mkdir)\n              throw writeFailure(\n                `parent directory \"${parent}\" does not exist and filesystem cannot create it`\n              )\n            const parentPolicy = config.handle.effectivePolicy?.()\n            if (parentPolicy === undefined)\n              throw new E_DEV_STEP_FAILED([\n                stepName,\n                'effective sandbox write policy is unavailable',\n              ])\n            if (!createFsNode(parentPolicy).canWrite(parentBackend))\n              throw new E_DEV_STEP_FAILED([\n                stepName,\n                `path is refused by sandbox write policy: ${parent}`,\n              ])\n            await guard(parent)\n            try {\n              await config.fileSystem.mkdir(parentBackend, { signal: options?.signal })\n            } catch (mkdirError) {\n              throw writeFailure(\n                `mkdir \"${parent}\" failed: ${isError(mkdirError) ? mkdirError.message : String(mkdirError)}`\n              )\n            }\n          }\n        }\n      }\n      try {\n        await guard(relative)\n      } catch (error) {\n        throw new E_DEV_STEP_FAILED([stepName, isError(error) ? error.message : String(error)])\n      }\n      return { relative, backend }\n    }\n    const executeStep = async (step: DevOp): Promise<void> => {\n      if (step.step === 'read_lines') {\n        const path = step.args.path as string\n        const start = step.args.start as number\n        const end = step.args.end as number | undefined\n        const file = files.get(path)\n        if (!file)\n          throw new E_DEV_BAD_ARG([`read_lines path \"${path}\" is not in the current workspace`])\n        const lines = file.text.split('\\n')\n        if (lines.at(-1) === '') lines.pop()\n        if (start > lines.length)\n          throw new E_DEV_BAD_ARG([\n            `read_lines start ${start} is beyond the file's ${lines.length} lines`,\n          ])\n        if (end !== undefined && end < start)\n          throw new E_DEV_BAD_ARG([\n            `read_lines end ${end} is before start ${start}; use an ascending range`,\n          ])\n        const gate = await config.gate(gateContext, {\n          step: 'read_lines',\n          args: step.args,\n          targets: [path],\n        })\n        if (gate && !gate.approved)\n          throw new E_DEV_GATE_DECLINED([\n            gate.note ?? 'Approval was declined for step \"read_lines\".',\n          ])\n        const label = step.label ?? path\n        if (Object.hasOwn(reads, label))\n          throw new E_DEV_BAD_ARG([`read_lines label \"${label}\" is duplicated`])\n        reads[label] = lines.slice(start - 1, end === undefined ? lines.length : end).join('\\n')\n        return\n      }\n      if (step.step === 'edit') {\n        const path = step.args.path as string\n        const file = files.get(path)\n        if (!file) throw new E_DEV_BAD_ARG([`edit path \"${path}\" is not in the current workspace`])\n        const gate = await config.gate(gateContext, {\n          step: 'edit',\n          args: step.args,\n          targets: [path],\n        })\n        if (gate && !gate.approved)\n          throw new E_DEV_GATE_DECLINED([gate.note ?? 'Approval was declined for step \"edit\".'])\n        let text = file.text\n        try {\n          for (const edit of step.args.edits as readonly { find: string; replace: string }[]) {\n            const hunk: ParsedHunk = {\n              oldLines: edit.find.replace(/\\r\\n/g, '\\n').split('\\n'),\n              newLines: edit.replace.replace(/\\r\\n/g, '\\n').split('\\n'),\n              added: 0,\n              removed: 0,\n            }\n            text = applyUpdateHunks(text, [hunk])\n          }\n        } catch (error) {\n          throw new E_DEV_STEP_FAILED(['edit', isError(error) ? error.message : String(error)])\n        }\n        if (text !== file.text)\n          await applyDelta({\n            delta: { changed: new Map([[path, text]]), diagnostics: [] },\n            files,\n            state,\n            bounds,\n            fileSystem: config.fileSystem,\n            pathTranslator: config.pathTranslator,\n            mimeResolver: config.mimeResolver,\n            ...bookkeeping,\n          })\n        return\n      }\n      if (step.step === 'apply_patch') {\n        const patch = step.args.patch as string\n        if (!isStructuredPatch(patch))\n          throw new E_DEV_BAD_ARG([\n            'apply_patch requires a structured \"*** Begin Patch\" envelope; use edit for single-file changes',\n          ])\n        let parsed: ParsedApplyPatch\n        try {\n          parsed = parseStructuredPatch(patch)\n        } catch (error) {\n          throw new E_DEV_BAD_ARG([\n            `apply_patch has an invalid structured envelope: ${isError(error) ? error.message : String(error)}`,\n          ])\n        }\n        const targets = [\n          ...new Set(\n            parsed.operations.flatMap((operation) =>\n              operation.type === 'update' && operation.movePath !== undefined\n                ? [operation.path, operation.movePath]\n                : [operation.path]\n            )\n          ),\n        ].sort()\n        const mayCreate = [\n          ...new Set(\n            parsed.operations.flatMap((operation) =>\n              operation.type === 'add'\n                ? [operation.path]\n                : operation.type === 'update' && operation.movePath !== undefined\n                  ? [operation.movePath]\n                  : []\n            )\n          ),\n        ].sort()\n        const gate = await config.gate(gateContext, {\n          step: 'apply_patch',\n          args: step.args,\n          targets,\n          mayCreate,\n        })\n        if (gate && !gate.approved)\n          throw new E_DEV_GATE_DECLINED([\n            gate.note ?? 'Approval was declined for step \"apply_patch\".',\n          ])\n        let outcome: ReturnType<typeof derivePatchOutcome>\n        try {\n          outcome = derivePatchOutcome(files, parsed)\n        } catch (error) {\n          throw new E_DEV_STEP_FAILED([\n            'apply_patch',\n            isError(error) ? error.message : String(error),\n          ])\n        }\n        for (const path of outcome.recreated) bookkeeping.recreated.add(path)\n        await applyDelta({\n          delta: outcome.delta,\n          files,\n          state,\n          bounds,\n          fileSystem: config.fileSystem,\n          pathTranslator: config.pathTranslator,\n          mimeResolver: config.mimeResolver,\n          ...bookkeeping,\n          skipAddedMimeResolution: true,\n        })\n        return\n      }\n      if (step.step === 'write') {\n        const requested =\n          step.args.paths === undefined\n            ? undefined\n            : normalizeSelectors(step.args.paths as readonly string[])\n        const matchesRequested = (path: string): boolean =>\n          requested?.some((candidate) =>\n            candidate.includes('*') ? globMatches(candidate, path) : candidate === path\n          ) === true\n        // Structural paths are selected from the collapsed end state: a pending rename is one\n        // operation, so either its workspace destination or former on-disk source selects both.\n        const selected =\n          requested === undefined ? [...files.keys()] : validateSelectors(requested, files)\n        const pendingRenames = [...bookkeeping.persistedPaths].filter(([path, disk]) => {\n          const matches =\n            files.has(path) &&\n            path !== disk &&\n            (requested === undefined || matchesRequested(path) || matchesRequested(disk))\n          if (matches && !selected.includes(path)) selected.push(path)\n          return matches\n        })\n        const pendingDeletes = [...bookkeeping.pendingDeletions].filter(\n          ([path, disk]) =>\n            requested === undefined || matchesRequested(path) || matchesRequested(disk)\n        )\n        const writes = [...files].filter(([path, file]) => {\n          if (requested !== undefined && !selected.includes(path)) return false\n          const diskPath = bookkeeping.persistedPaths.get(path)\n          // A renamed destination may retain its acquisition name as `path`, while its\n          // on-disk source is a different baseline entry. Compare against that source.\n          const baseline =\n            diskPath !== undefined && diskPath !== path\n              ? state.persistedBaseline.get(diskPath)\n              : state.persistedBaseline.get(path)\n          return baseline?.text !== file.text\n        })\n        const targets = [\n          ...new Set([\n            ...selected,\n            ...pendingRenames.flatMap(([path, disk]) => [path, disk]),\n            ...pendingDeletes.flatMap(([path, disk]) => [path, disk]),\n          ]),\n        ].sort()\n        const mayCreate = writes\n          .filter(([path]) => !bookkeeping.persistedPaths.has(path))\n          .map(([path]) => path)\n          .sort()\n        const implicitGranularWrite =\n          plan.steps.length === 2 && plan.steps[0]!.args.persists === true\n        const gate = implicitGranularWrite\n          ? undefined\n          : await config.gate(gateContext, {\n              step: 'write',\n              args: step.args,\n              targets,\n              mayCreate,\n            })\n        if (gate && !gate.approved)\n          throw new E_DEV_GATE_DECLINED([gate.note ?? 'Approval was declined for step \"write\".'])\n        if (pendingRenames.length > 0 && !config.fileSystem.rename)\n          throw new E_DEV_STEP_FAILED(['write', 'filesystem does not support rename'])\n        if (pendingDeletes.length > 0 && !config.fileSystem.delete)\n          throw new E_DEV_STEP_FAILED(['write', 'filesystem does not support delete'])\n        // A destination must move before an operation that would overwrite it as a source.\n        // Break a genuine cycle by first moving one source to a stat-checked sibling temporary.\n        const remaining = new Map(pendingRenames)\n        while (remaining.size) {\n          const disks = new Set(remaining.values())\n          const ready = [...remaining]\n            .filter(([destination]) => !disks.has(destination))\n            .sort(([a], [b]) => a.localeCompare(b))\n          if (!ready.length) {\n            const [destination, disk] = [...remaining].sort(([a], [b]) => a.localeCompare(b))[0]!\n            const directory = destination.includes('/')\n              ? destination.slice(0, destination.lastIndexOf('/'))\n              : ''\n            let temporary: string | undefined\n            for (let attempt = 0; attempt < 8; attempt++) {\n              const candidate = `${directory ? `${directory}/` : ''}.dev-tools-rename-${Math.random().toString(36).slice(2)}`\n              try {\n                await config.fileSystem.stat(\n                  config.pathTranslator.toBackendPath(candidate) as string\n                )\n              } catch {\n                temporary = candidate\n                break\n              }\n            }\n            if (!temporary)\n              throw writeFailure(\n                `could not allocate a temporary rename path in \"${directory || '.'}\"`\n              )\n            try {\n              const source = await mutationTarget('write', disk)\n              const temporaryTarget = await mutationTarget('write', temporary, true)\n              await config.fileSystem.rename!(source.backend, temporaryTarget.backend, {\n                signal: options?.signal,\n              })\n            } catch (error) {\n              throw writeFailure(\n                `rename cycle temporary \"${temporary}\" failed: ${isError(error) ? error.message : String(error)}`\n              )\n            }\n            remaining.set(destination, temporary)\n            continue\n          }\n          for (const [destination, disk] of ready) {\n            try {\n              const source = await mutationTarget('write', disk)\n              const target = await mutationTarget('write', destination, true)\n              await config.fileSystem.rename!(source.backend, target.backend, {\n                signal: options?.signal,\n              })\n            } catch (error) {\n              throw writeFailure(\n                `rename to \"${destination}\" failed: ${isError(error) ? error.message : String(error)}`\n              )\n            }\n            bookkeeping.persistedPaths.set(destination, destination)\n            state.persistedBaseline.set(destination, { ...files.get(destination)! })\n            if (!written.includes(destination)) written.push(destination)\n            remaining.delete(destination)\n          }\n        }\n        for (const [path, disk] of pendingDeletes.sort(([a], [b]) => a.localeCompare(b))) {\n          try {\n            const target = await mutationTarget('write', disk)\n            await config.fileSystem.delete!(target.backend, { signal: options?.signal })\n          } catch (error) {\n            throw writeFailure(\n              `delete \"${path}\" failed: ${isError(error) ? error.message : String(error)}`\n            )\n          }\n          bookkeeping.pendingDeletions.delete(path)\n          state.persistedBaseline.delete(path)\n        }\n        for (const [path, file] of writes.sort(([a], [b]) => a.localeCompare(b))) {\n          try {\n            const target = await mutationTarget('write', path, true)\n            await config.fileSystem.write(target.backend, new TextEncoder().encode(file.text), {\n              signal: options?.signal,\n            })\n          } catch (error) {\n            throw writeFailure(\n              `write \"${path}\" failed: ${isError(error) ? error.message : String(error)}`\n            )\n          }\n          bookkeeping.persistedPaths.set(path, path)\n          state.persistedBaseline.set(path, { ...file })\n          if (!written.includes(path)) written.push(path)\n        }\n        return\n      }\n      if (!['format', 'lint', 'check'].includes(step.step))\n        throw new E_DEV_STEP_UNAVAILABLE([step.step])\n      const kind = step.step as 'format' | 'lint' | 'check'\n      if (\n        (kind === 'format' && !registry.hasFormat()) ||\n        (kind === 'lint' && !registry.hasLint()) ||\n        (kind === 'check' && !registry.hasCheck())\n      )\n        throw new E_DEV_ENGINE_REQUIRED([`no ${kind} capability is configured`])\n      const authoredSelector = step.args.paths as readonly string[] | undefined\n      const selector = authoredSelector === undefined ? null : normalizeSelectors(authoredSelector)\n      const selected = selector === null ? [...files.keys()] : validateSelectors(selector, files)\n      const eligibleGenerator =\n        selector !== null &&\n        registry.engines.some((engine) => {\n          const capabilities =\n            kind === 'format' ? engine.formats : kind === 'lint' ? engine.lints : undefined\n          return (\n            capabilities?.some((capability) => {\n              if (capability?.generates !== true) return false\n              return (\n                capability.scope === undefined ||\n                capability.scope.some((scope) =>\n                  selector.some((pattern) => patternsOverlap(scope, pattern))\n                )\n              )\n            }) === true\n          )\n        })\n      if (selector !== null && selected.length === 0 && !eligibleGenerator)\n        throw new E_DEV_BAD_ARG([`selector \"${selector.join(', ')}\" matches no workspace file`])\n      const planned = await registry.plan({\n        kind,\n        paths: selected,\n        extensions: [...new Set([...files.keys()].map(extensionOf))],\n        selector,\n        fix: step.args.fix === true,\n      })\n      const runtimeDiagnostics = [\n        ...planned.skipped.map((item) => ({\n          path: null,\n          severity: 'info' as const,\n          message:\n            item.reason === 'no-capability'\n              ? `no ${kind} capability is configured for extension group ${item.group ?? item.extensions.join(', ')}`\n              : `selection suppressed ${kind} capability for extension group ${item.group ?? item.extensions.join(', ')}`,\n          engineId: null,\n        })),\n        ...planned.scopeExcluded.map((item) => ({\n          path: null,\n          severity: 'info' as const,\n          message: `${item.count} file(s) excluded by scope for engine \"${item.engineId}\" capability ${item.capabilityIndex}`,\n          engineId: null,\n        })),\n      ]\n      diagnostics.push(...stampDiagnostics(runtimeDiagnostics, files, root, config.pathTranslator))\n      const mayCreate =\n        kind === 'check'\n          ? []\n          : [\n              ...new Set(\n                planned.invocations.flatMap((invocation) => {\n                  if (!invocation.inPlace) return ['**']\n                  return invocation.selector === null\n                    ? (invocation.scope ?? [])\n                    : invocation.selector\n                })\n              ),\n            ].sort()\n      const gate = await config.gate(gateContext, {\n        step: kind,\n        args: step.args,\n        targets: selected,\n        mayCreate: mayCreate.includes('**') ? ['**'] : mayCreate,\n        engines: planned.invocations.map((invocation) => ({\n          engineId: invocation.engineId,\n          extensions: invocation.groups,\n          inPlace: invocation.inPlace,\n          ...(invocation.scope === null ? {} : { scope: invocation.scope }),\n        })),\n      })\n      if (gate && !gate.approved)\n        throw new E_DEV_GATE_DECLINED([gate.note ?? `Approval was declined for step \"${kind}\".`])\n      for (const invocation of planned.invocations) {\n        // The preflight is only safe for files whose current workspace text is on disk.\n        // Keep in-memory changes out of later in-place requests: an external fixer would\n        // otherwise rewrite the stale disk version and its re-read would lose that change.\n        // An in-place re-read refreshes persistedBaseline, so its own changes deliberately\n        // become eligible for the next fixer in this same step.\n        const dirtyPaths = new Set(\n          [...files].flatMap(([path, file]) => {\n            const persisted = state.persistedBaseline.get(path)\n            return persisted === undefined || file.text !== persisted.text ? [path] : []\n          })\n        )\n        const invocationPaths = invocation.inPlace\n          ? invocation.paths.filter((path) => !dirtyPaths.has(path))\n          : invocation.paths\n        const effectiveInvocation = invocation.inPlace\n          ? { ...invocation, paths: invocationPaths }\n          : invocation\n        // `paths` is extension-narrowed work selection.  The façade instead gets every\n        // current workspace file in declared scope (then the explicit step boundary), so\n        // a formatter can access its scoped non-source configuration and prior-step output.\n        const allowlist = effectiveInvocation.inPlace\n          ? [...files.keys()].filter(\n              (path) =>\n                effectiveInvocation.scope!.some((scope) => globMatches(scope, path)) &&\n                (effectiveInvocation.selector === null ||\n                  effectiveInvocation.selector.some((candidate) => globMatches(candidate, path))) &&\n                !dirtyPaths.has(path)\n            )\n          : []\n        const renameDestinations = new Set<string>()\n        const policy = effectiveInvocation.inPlace ? config.handle.effectivePolicy() : undefined\n        const access = effectiveInvocation.inPlace\n          ? makeDevFileAccess({\n              invocation: effectiveInvocation,\n              allowlist,\n              fileSystem: config.fileSystem,\n              pathTranslator: config.pathTranslator,\n              policy: policy === undefined ? undefined : createFsNode(policy),\n              selector: effectiveInvocation.selector,\n              signal: options?.signal,\n              renameDestinations,\n            })\n          : undefined\n        // Each envelope entry is a conjunction.  With a selector, re-reading either\n        // side alone would admit files the façade was not allowed to create.\n        const envelope: string[][] =\n          invocation.scope === null\n            ? []\n            : invocation.selector === null\n              ? invocation.scope.map((scope) => [scope])\n              : invocation.scope.flatMap((scope) =>\n                  invocation\n                    .selector!.filter((candidate) => patternsOverlap(scope, candidate))\n                    .map((candidate) => [scope, candidate])\n                )\n        const preRead = effectiveInvocation.inPlace\n          ? await snapshotInPlaceEnvelope({\n              envelope,\n              excluded: dirtyPaths,\n              files,\n              fileSystem: config.fileSystem,\n              pathTranslator: config.pathTranslator,\n              signal: options?.signal,\n            })\n          : undefined\n        const delta = await registry.dispatch(effectiveInvocation, {\n          files,\n          root,\n          signal: options?.signal,\n          makeAccess: () =>\n            access ??\n            (() => {\n              throw new E_DEV_STEP_UNAVAILABLE(['DevFileAccess'])\n            })(),\n        })\n        if (kind === 'check' && hasMutation(delta))\n          throw new E_DEV_STEP_FAILED([\n            effectiveInvocation.engineId,\n            'check returned mutation fields',\n          ])\n        if (\n          effectiveInvocation.paths.length === 0 &&\n          !effectiveInvocation.generates &&\n          hasMutation(delta)\n        )\n          throw new E_DEV_BAD_ARG([\n            `engine \"${effectiveInvocation.engineId}\" mutated an empty invocation without generates`,\n          ])\n        if (effectiveInvocation.inPlace) {\n          const reRead = await rereadInPlace({\n            envelope: [...envelope, ...[...renameDestinations].map((path) => [path])],\n            excluded: dirtyPaths,\n            beforeSnapshot: preRead?.paths,\n            files,\n            unreadable: bookkeeping.unreadable,\n            persistedPaths: bookkeeping.persistedPaths,\n            persistedBaseline: state.persistedBaseline,\n            renames: bookkeeping.renames,\n            recreated: bookkeeping.recreated,\n            fileSystem: config.fileSystem,\n            pathTranslator: config.pathTranslator,\n            bounds,\n            mimeResolver: config.mimeResolver,\n            signal: options?.signal,\n          })\n          const advisory = new Set<string>([\n            ...(delta.changed?.keys() ?? []),\n            ...(delta.added?.keys() ?? []),\n            ...(delta.deleted ?? []),\n            ...[...(delta.renamed ?? [])].flatMap(([from, to]) => [from, to]),\n          ])\n          const missing = [...reRead.changed].filter((path) => !advisory.has(path))\n          const extra = [...advisory].filter((path) => !reRead.changed.has(path))\n          const rereadDiagnostics: Array<\n            RawDiagnostic & { engineId: string | null; [runtimeDiagnostic]?: boolean }\n          > = [\n            ...delta.diagnostics,\n            ...(preRead?.diagnostics ?? []).map((diagnostic) => ({\n              ...diagnostic,\n              engineId: null,\n              [runtimeDiagnostic]: true,\n            })),\n            ...reRead.diagnostics.map((diagnostic) => ({\n              ...diagnostic,\n              engineId: null,\n              [runtimeDiagnostic]: true,\n            })),\n          ]\n          if (missing.length || extra.length)\n            rereadDiagnostics.push({\n              path: null,\n              severity: 'warning',\n              message: `engine advisory delta disagreed with re-read (unclaimed: ${missing.join(', ') || 'none'}; not observed: ${extra.join(', ') || 'none'})`,\n              engineId: invocation.engineId,\n              [runtimeDiagnostic]: true,\n            })\n          diagnostics.push(\n            ...stampDiagnostics(\n              rereadDiagnostics,\n              files,\n              root,\n              config.pathTranslator,\n              invocation.engineId\n            )\n          )\n        } else {\n          const applied = await applyDelta({\n            delta,\n            files,\n            state,\n            bounds,\n            fileSystem: config.fileSystem,\n            pathTranslator: config.pathTranslator,\n            mimeResolver: config.mimeResolver,\n            ...bookkeeping,\n            engineId: invocation.engineId,\n            invocationPaths: invocation.paths,\n            selector: invocation.selector,\n          })\n          diagnostics.push(\n            ...stampDiagnostics(\n              applied.diagnostics,\n              files,\n              root,\n              config.pathTranslator,\n              invocation.engineId\n            )\n          )\n        }\n      }\n    }\n    for (const [stepIndex, step] of plan.steps.entries()) {\n      const context: DevStepContext = {\n        plan,\n        stepIndex,\n        step,\n        workspace,\n        stash,\n        signal: options?.signal,\n        engines: registry,\n        shortCircuit: (replacement): never => {\n          throw { devToolsShortCircuit: true, workspace: replacement }\n        },\n      }\n      try {\n        await runOnion(\n          context,\n          config.use ?? [],\n          async () => {\n            syncFromWorkspace()\n            await executeStep(step)\n            syncToWorkspace()\n            if (step.step === 'write') {\n              const token = mintToken()\n              ;(workspace as { token: DevWorkspaceToken }).token = token\n            }\n          },\n          () => {\n            throw new E_DEV_STEP_FAILED([step.step, 'middleware returned without calling next()'])\n          }\n        )\n      } catch (error) {\n        if (isObject(error) && error.devToolsShortCircuit === true && 'workspace' in error) {\n          const replacement = error.workspace as DevWorkspace\n          if (!issuedTokens.has(replacement.token) || replacement.token !== workspace.token)\n            throw new E_DEV_STEP_FAILED([\n              step.step,\n              'middleware shortCircuit workspace is stale or foreign',\n            ])\n          workspace = replacement\n          syncFromWorkspace()\n          continue\n        }\n        throw error\n      }\n    }\n    const summary = await assembleChanges(\n      state.acquisitionBaseline,\n      files,\n      bookkeeping.renames,\n      bookkeeping.recreated,\n      bookkeeping.unreadable\n    )\n    return {\n      diagnostics,\n      changes: summary.changes,\n      reads,\n      written,\n      unreadable: [...bookkeeping.unreadable].sort(),\n      ok: !diagnostics.some((item) => item.severity === 'error'),\n      lineCountsAvailable: summary.lineCountsAvailable,\n    }\n  }\n  const pipeline = ((paths: readonly string[], options?: RunOptions): DevChain => {\n    const make = (ops: DevOp[], open?: RunOptions): DevChain => {\n      const append = (step: string, args: Record<string, unknown> = {}): DevChain =>\n        make([...ops, { step, args }], open)\n      return {\n        readLines: (args) =>\n          make(\n            [\n              ...ops,\n              {\n                step: 'read_lines',\n                args: {\n                  path: args.path,\n                  start: args.start,\n                  ...(args.end === undefined ? {} : { end: args.end }),\n                },\n                ...(args.label === undefined ? {} : { label: args.label }),\n              },\n            ],\n            open\n          ),\n        edit: (args) => append('edit', args),\n        applyPatch: (args) => append('apply_patch', args),\n        write: (args) => append('write', args ?? {}),\n        format: (args) => append('format', args ?? {}),\n        lint: (args) => append('lint', args ?? {}),\n        check: () => append('check'),\n        run: (override) => execute(paths, compile(ops), { ...open, ...override }),\n        then: (onfulfilled, onrejected) =>\n          execute(paths, compile(ops), open).then(onfulfilled, onrejected),\n        toOps: () => ops.map((op) => ({ ...op, args: { ...op.args } })),\n      }\n    }\n    return make([], options)\n  }) as DevPipeline\n  Object.defineProperties(pipeline, {\n    ops: {\n      value: (paths: readonly string[], ops: DevOp[], options?: RunOptions) =>\n        execute(paths, compile(ops), options),\n    },\n    compile: { value: compile },\n    capabilities: { value: registry },\n    engines: { value: registry.engines },\n    _runGranular: {\n      value: (paths: readonly string[], ops: DevOp[], options?: RunOptions) =>\n        execute(paths, compile(ops), options, true),\n    },\n  })\n  return pipeline\n}\n\nexport type {\n  DevCapabilityProbe,\n  Severity,\n  RawDiagnostic,\n  Diagnostic,\n  WorkspaceDelta,\n  FileChangeSummary,\n  DevResult,\n  FormatCapability,\n  LintCapability,\n  CheckCapability,\n  DevEngine,\n  FormatRequest,\n  LintRequest,\n  CheckRequest,\n  DevFileAccess,\n  DevWorkspaceToken,\n  DevWorkspace,\n  DevGateVerdict,\n  DevGateContext,\n  DevGateCall,\n  DevGateFn,\n  DevCandidate,\n  DevSelectionContext,\n  DevStep,\n  DevPlan,\n  DevOp,\n  WorkspaceBounds,\n  RunOptions,\n  DevStepContext,\n  DevStepMiddlewareFn,\n  DevSelectionMiddlewareFn,\n  DevChain,\n  DevPipeline,\n} from './types'\nexport * from './exceptions'\n"],"mappings":"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"}