{"version":3,"file":"fileEditDependencies-CAnZUtLx.mjs","names":[],"sources":["../src/services/editorConfigService/index.ts","../src/services/commandLine/index.ts","../src/services/editorLauncher/index.ts","../src/services/gitDiffService/index.ts","../src/tui/fileEditOverlay.ts","../src/tui/fileEditWorkflow.ts","../src/tui/fileEditDependencies.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { globalDoomConfigPath } from '@agimon-ai/doompi-config';\n\nimport type { IEditorConfigService } from '../../types/editorConfigService';\n\nconst commandPattern = /^\\s*command:\\s*(.+?)\\s*$/mu;\n\nfunction agentDirectory(): string {\n  return process.env.PI_CODING_AGENT_DIR || path.join(os.homedir(), '.pi', 'agent');\n}\n\nexport class EditorConfigService implements IEditorConfigService {\n  path(): string {\n    return globalDoomConfigPath();\n  }\n\n  packagePath(): string {\n    return path.join(agentDirectory(), 'doom-file-edit', 'config.yaml');\n  }\n\n  async command(): Promise<string | undefined> {\n    // Shared Doom config owns `editor:`; the package-scoped file is the\n    // fallback for standalone installs that have no Doom config.\n    return (await this.read(this.path())) ?? (await this.read(this.packagePath()));\n  }\n\n  private async read(filePath: string): Promise<string | undefined> {\n    try {\n      const content = await fs.readFile(filePath, 'utf8');\n      const editorSection = /^editor:\\s*\\n((?:[ \\t]+.*(?:\\n|$))*)/mu.exec(content)?.[1];\n      if (!editorSection) return undefined;\n      const value = commandPattern.exec(editorSection)?.[1]?.trim();\n      if (!value) return undefined;\n      if (/^(?:[-+]?\\d+(?:\\.\\d+)?|true|false|null)$/u.test(value)) {\n        throw new Error(`${filePath}: editor.command must be a string`);\n      }\n      return value.replace(/^(?:\"([\\s\\S]*)\"|'([\\s\\S]*)')$/u, '$1$2');\n    } catch (error) {\n      if (error instanceof Error && 'code' in error && error.code === 'ENOENT') return undefined;\n      throw error;\n    }\n  }\n}\n","export function splitCommandLine(template: string): string[] {\n  const result: string[] = [];\n  let current = '';\n  let quote: 'single' | 'double' | undefined;\n  let escaped = false;\n  for (const character of template.trim()) {\n    if (escaped) {\n      current += character;\n      escaped = false;\n    } else if (character === '\\\\' && quote !== 'single') {\n      escaped = true;\n    } else if (character === \"'\" && quote !== 'double') {\n      quote = quote === 'single' ? undefined : 'single';\n    } else if (character === '\"' && quote !== 'single') {\n      quote = quote === 'double' ? undefined : 'double';\n    } else if (/\\s/u.test(character) && quote === undefined) {\n      if (current) result.push(current);\n      current = '';\n    } else {\n      current += character;\n    }\n  }\n  if (escaped) current += '\\\\';\n  if (quote !== undefined) throw new Error('Editor command has an unterminated quote');\n  if (current) result.push(current);\n  if (result.length === 0) throw new Error('Editor command must not be empty');\n  return result;\n}\n\nexport function validateEditorTemplate(template: string): void {\n  for (const match of template.matchAll(/\\{([^}]+)\\}/gu)) {\n    if (match[1] !== 'file' && match[1] !== 'line') {\n      throw new Error(`Unsupported editor placeholder: {${match[1]}}`);\n    }\n  }\n  splitCommandLine(template);\n}\n\nexport function expandEditorTemplate(template: string, file: string, line: number): string[] {\n  validateEditorTemplate(template);\n  const hasFile = template.includes('{file}');\n  const values = splitCommandLine(template).map((part) =>\n    part.replaceAll('{file}', file).replaceAll('{line}', String(line)),\n  );\n  if (!hasFile) values.push(file);\n  return values;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport spawn from 'cross-spawn';\n\nimport type { ResolvedEditor } from '../../types/domain';\nimport type { IEditorConfigService } from '../../types/editorConfigService';\nimport type { EditorLaunchResult, EditorTui, IEditorLauncher } from '../../types/editorLauncher';\nimport { expandEditorTemplate, splitCommandLine } from '../commandLine';\n\nexport class EditorLauncher implements IEditorLauncher {\n  constructor(private readonly config: IEditorConfigService) {}\n\n  async resolve(\n    env: NodeJS.ProcessEnv = process.env,\n    platform: NodeJS.Platform = process.platform,\n  ): Promise<ResolvedEditor | undefined> {\n    const configured = await this.config.command();\n    const candidates: ResolvedEditor[] = [\n      ...(configured ? [{ template: configured, source: 'configured' as const }] : []),\n      ...(env.VISUAL ? [{ template: env.VISUAL, source: 'VISUAL' as const }] : []),\n      ...(env.EDITOR ? [{ template: env.EDITOR, source: 'EDITOR' as const }] : []),\n      { template: platform === 'win32' ? 'notepad {file}' : 'nano {file}', source: 'fallback' },\n    ];\n    for (const candidate of candidates) {\n      const executable = splitCommandLine(candidate.template)[0];\n      if (executable && (await this.isExecutable(executable, env, platform))) return candidate;\n    }\n    return undefined;\n  }\n\n  async launch(filePath: string, line: number, tui: EditorTui): Promise<EditorLaunchResult> {\n    try {\n      const editor = await this.resolve();\n      if (!editor) return { success: false, error: 'No editor command could be resolved' };\n      const [command, ...args] = expandEditorTemplate(editor.template, filePath, line);\n      if (!command) return { success: false, error: 'Editor command must not be empty' };\n      tui.stop();\n      try {\n        await new Promise<void>((resolve, reject) => {\n          const child = spawn(command, args, { stdio: 'inherit', shell: false });\n          child.once('error', reject);\n          child.once('exit', () => resolve());\n        });\n      } finally {\n        tui.start();\n        tui.requestRender(true);\n      }\n      return { success: true };\n    } catch (error) {\n      return { success: false, error: error instanceof Error ? error.message : String(error) };\n    }\n  }\n\n  private async isExecutable(command: string, env: NodeJS.ProcessEnv, platform: NodeJS.Platform): Promise<boolean> {\n    const extensions = platform === 'win32' ? (env.PATHEXT ?? '.EXE;.CMD;.BAT').split(';') : [''];\n    const locations =\n      path.isAbsolute(command) || command.includes(path.sep) ? [''] : (env.PATH ?? '').split(path.delimiter);\n    for (const location of locations) {\n      for (const extension of extensions) {\n        const candidate = location ? path.join(location, `${command}${extension}`) : `${command}${extension}`;\n        try {\n          await fs.access(candidate, platform === 'win32' ? fs.constants.F_OK : fs.constants.X_OK);\n          return true;\n        } catch (error) {\n          if (!(error instanceof Error && 'code' in error && (error.code === 'ENOENT' || error.code === 'EACCES')))\n            throw error;\n        }\n      }\n    }\n    return false;\n  }\n}\n","import { spawnSync } from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type { FileDiff, FileEditState } from '../../types/domain';\nimport type { IGitDiffService } from '../../types/gitDiffService';\n\nexport const MAX_DIFF_LINES = 200;\nexport const MAX_DIFF_BYTES = 256 * 1024;\nconst BINARY_SAMPLE_BYTES = 8192;\n\nfunction capLines(lines: string[], byteTruncated: boolean): { lines: string[]; truncated: boolean } {\n  const truncated = byteTruncated || lines.length > MAX_DIFF_LINES;\n  const visible = lines.slice(0, MAX_DIFF_LINES);\n  if (truncated) visible.push(`... diff truncated at ${MAX_DIFF_LINES} lines / ${MAX_DIFF_BYTES} bytes ...`);\n  return { lines: visible, truncated };\n}\n\nfunction summarize(pathValue: string, state: FileEditState, tracked: boolean, raw: Buffer): FileDiff {\n  const byteTruncated = raw.byteLength >= MAX_DIFF_BYTES;\n  if (raw.subarray(0, BINARY_SAMPLE_BYTES).includes(0)) {\n    return {\n      path: pathValue,\n      state: 'binary',\n      lines: [`Binary file changed (${raw.byteLength} bytes shown by git)`],\n      additions: 0,\n      removals: 0,\n      tracked,\n      truncated: byteTruncated,\n      suggestedLine: 1,\n    };\n  }\n  const capped = capLines(raw.subarray(0, MAX_DIFF_BYTES).toString('utf8').split('\\n'), byteTruncated);\n  const additions = capped.lines.filter((line) => line.startsWith('+') && !line.startsWith('+++')).length;\n  const removals = capped.lines.filter((line) => line.startsWith('-') && !line.startsWith('---')).length;\n  const hunk = capped.lines.find((line) => line.startsWith('@@'))?.match(/\\+(\\d+)/u);\n  return {\n    path: pathValue,\n    state,\n    lines: capped.lines,\n    additions,\n    removals,\n    tracked,\n    truncated: capped.truncated,\n    suggestedLine: Number(hunk?.[1] ?? 1),\n  };\n}\n\nexport class GitDiffService implements IGitDiffService {\n  async diff(cwd: string, filePath: string): Promise<FileDiff> {\n    const absolute = path.resolve(cwd, filePath);\n    const relative = path.relative(cwd, absolute);\n    const tracked = this.isTracked(cwd, relative);\n    let exists = true;\n    try {\n      await fs.access(absolute);\n    } catch (error) {\n      if (error instanceof Error && 'code' in error && error.code === 'ENOENT') exists = false;\n      else throw error;\n    }\n    if (!tracked && !exists) return summarize(absolute, 'deleted', false, Buffer.from('File no longer exists'));\n    if (!tracked) return this.fullAdd(absolute);\n    const result = spawnSync('git', ['diff', '--no-ext-diff', '--no-color', '--unified=3', 'HEAD', '--', relative], {\n      cwd,\n      encoding: 'buffer',\n      maxBuffer: MAX_DIFF_BYTES,\n    });\n    const output = result.stdout ?? Buffer.alloc(0);\n    if (exists && /^(Binary files .* differ|GIT binary patch)$/mu.test(output.toString('utf8'))) {\n      return {\n        path: absolute,\n        state: 'binary',\n        lines: ['Binary tracked file changed'],\n        additions: 0,\n        removals: 0,\n        tracked: true,\n        truncated: false,\n        suggestedLine: 1,\n      };\n    }\n    const state: FileEditState = exists ? (output.length > 0 ? 'modified' : 'unchanged') : 'deleted';\n    return summarize(absolute, state, true, output);\n  }\n\n  private isTracked(cwd: string, relative: string): boolean {\n    return spawnSync('git', ['ls-files', '--error-unmatch', '--', relative], { cwd, stdio: 'ignore' }).status === 0;\n  }\n\n  private async fullAdd(filePath: string): Promise<FileDiff> {\n    const handle = await fs.open(filePath, 'r');\n    try {\n      const buffer = Buffer.alloc(MAX_DIFF_BYTES);\n      const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);\n      const sample = buffer.subarray(0, bytesRead);\n      if (sample.subarray(0, BINARY_SAMPLE_BYTES).includes(0)) {\n        return summarize(filePath, 'binary', false, Buffer.from(`Binary untracked file (${bytesRead}+ bytes)`));\n      }\n      const body = sample\n        .toString('utf8')\n        .split('\\n')\n        .map((line) => `+${line}`)\n        .join('\\n');\n      const header = `--- /dev/null\\n+++ b/${path.basename(filePath)}\\n@@ -0,0 +1 @@\\n`;\n      return summarize(filePath, 'added', false, Buffer.from(header + body));\n    } finally {\n      await handle.close();\n    }\n  }\n}\n","import path from 'node:path';\n\nimport {\n  DOOM_OVERLAY_ACCENT,\n  DoomOverlay,\n  type DoomOverlayChrome,\n  type DoomOverlayTui,\n} from '@agimon-ai/doompi-ui/doomOverlay';\nimport type { Theme } from '@earendil-works/pi-coding-agent';\nimport { matchesKey, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';\n\nimport type { FileDiff, FileEditEntry, FileEditState, ResolvedEditor } from '../types/domain';\n\nexport type FileEditOverlayAction = 'close' | 'copy' | 'refresh' | 'open';\n\nexport interface FileEditOverlayResult {\n  action: FileEditOverlayAction;\n  index: number;\n}\n\nexport interface FileEditOverlayView {\n  cwd: string;\n  entries: FileEditEntry[];\n  diffs: FileDiff[];\n  editor: ResolvedEditor | undefined;\n  configPath: string;\n}\n\nconst MIN_WIDTH = 60;\nconst LEFT_RATIO = 0.55;\nconst EDITOR_ROWS = 5;\nconst ENTRY_ROWS = 2;\n\n/** The palette names are not exported, so take the union from the method. */\ntype ThemeColor = Parameters<Theme['fg']>[0];\n\nconst DIM: ThemeColor = 'dim';\nconst ACCENT: ThemeColor = 'accent';\nconst ADDED: ThemeColor = 'success';\nconst REMOVED: ThemeColor = 'error';\nconst CHANGED: ThemeColor = 'warning';\nconst BODY: ThemeColor = 'text';\nconst RULE: ThemeColor = 'borderMuted';\n\n/**\n * The states this surface branches on. `external` is the fallback for an entry\n * with no diff, so it is named here rather than repeated as a literal.\n */\nconst STATE = { added: 'added', deleted: 'deleted', external: 'external' } as const satisfies Record<\n  string,\n  FileEditState\n>;\n\n/** Diff-hunk prefixes, which decide a line's colour. */\nconst HUNK_PREFIX = '@@';\nconst ADDED_PREFIX = '+';\nconst REMOVED_PREFIX = '-';\n\nfunction pad(text: string, width: number): string {\n  const visible = visibleWidth(text);\n  return visible > width ? truncateToWidth(text, width) : text + ' '.repeat(width - visible);\n}\n\nfunction time(at: number): string {\n  return new Date(at).toTimeString().slice(0, 5);\n}\n\nexport class FileEditOverlayComponent extends DoomOverlay {\n  private selected = 0;\n\n  constructor(\n    tui: DoomOverlayTui,\n    theme: Theme,\n    private readonly view: FileEditOverlayView,\n    private readonly done: (result: FileEditOverlayResult) => void,\n  ) {\n    super(tui, theme);\n  }\n\n  protected getChrome(): DoomOverlayChrome {\n    const totalEdits = this.view.entries.reduce((sum, entry) => sum + entry.count, 0);\n    return {\n      title: 'FILE EDITS',\n      accent: DOOM_OVERLAY_ACCENT,\n      breadcrumb: 'SPC › e / editor › f / files',\n      headerRight: `${this.view.entries.length} files · ${totalEdits} edits · this session`,\n      footer: '↑↓ select · enter open · y copy path · r refresh · esc close',\n      footerHints: [\n        ['↑↓', 'select'],\n        ['enter', 'open'],\n        ['y', 'copy path'],\n        ['r', 'refresh'],\n        ['esc', 'close'],\n      ],\n      footerRight: this.view.entries.length > 0 ? `${this.selected + 1}/${this.view.entries.length}` : 'empty',\n    };\n  }\n\n  handleInput(data: string): void {\n    if (matchesKey(data, 'escape') || matchesKey(data, 'ctrl+c') || data === 'q') return this.finish('close');\n    if (matchesKey(data, 'up')) this.selected = Math.max(0, this.selected - 1);\n    else if (matchesKey(data, 'down')) this.selected = Math.min(this.view.entries.length - 1, this.selected + 1);\n    else if (matchesKey(data, 'enter') && this.view.entries.length > 0) return this.finish('open');\n    else if (data.toLowerCase() === 'y' && this.view.entries.length > 0) return this.finish('copy');\n    else if (data.toLowerCase() === 'r') return this.finish('refresh');\n    this.tui.requestRender();\n  }\n\n  protected renderBody(width: number, height: number): string[] {\n    if (width < MIN_WIDTH) {\n      const leftHeight = Math.max(1, Math.floor((height - 1) / 2));\n      const rightHeight = Math.max(0, height - leftHeight - 1);\n      return [\n        ...this.leftColumn(width, leftHeight),\n        this.theme.fg(RULE, '─'.repeat(width)),\n        ...this.rightColumn(width, rightHeight),\n      ];\n    }\n\n    const leftWidth = Math.floor(width * LEFT_RATIO);\n    const rightWidth = width - leftWidth - 1;\n    // A blank column each side of the divider: flush columns let a long path in\n    // one pane run straight into the other pane's heading.\n    const leftContent = Math.max(1, leftWidth - 1);\n    const rightContent = Math.max(1, rightWidth - 1);\n    const left = this.leftColumn(leftContent, height);\n    const right = this.rightColumn(rightContent, height);\n    const divider = this.theme.fg(RULE, '│');\n    return Array.from(\n      { length: height },\n      (_, index) => `${pad(left[index] ?? '', leftContent)} ${divider} ${pad(right[index] ?? '', rightContent)}`,\n    );\n  }\n\n  private finish(action: FileEditOverlayAction): void {\n    this.done({ action, index: this.selected });\n  }\n\n  private leftColumn(width: number, height: number): string[] {\n    const lines = [this.theme.fg(DIM, ' EDITED THIS SESSION · most recent first')];\n    if (this.view.entries.length === 0) {\n      lines.push('', this.theme.fg(DIM, ' No files edited in this session yet.'));\n    }\n\n    const editorRows = height >= EDITOR_ROWS + ENTRY_ROWS ? EDITOR_ROWS : 0;\n    const availableEntryRows = Math.max(0, height - lines.length - editorRows);\n    const visibleEntries = Math.max(1, Math.floor(availableEntryRows / ENTRY_ROWS));\n    const maxStart = Math.max(0, this.view.entries.length - visibleEntries);\n    const start = Math.min(maxStart, Math.max(0, this.selected - visibleEntries + 1));\n    const entries = this.view.entries.slice(start, start + visibleEntries);\n    for (const [offset, entry] of entries.entries()) {\n      const index = start + offset;\n      const diff = this.view.diffs[index];\n      const selected = index === this.selected ? this.theme.fg(ACCENT, '▌') : ' ';\n      const relative = path.relative(this.view.cwd, entry.path) || path.basename(entry.path);\n      const state = diff?.state ?? STATE.external;\n      lines.push(`${selected}${time(entry.at)}  ${entry.count}x  ${entry.tool.padEnd(5)}  ${relative}`);\n      lines.push(\n        `  ${this.theme.fg(state === STATE.deleted ? REMOVED : state === STATE.added ? ADDED : CHANGED, state)}`,\n      );\n    }\n    if (editorRows > 0) {\n      lines.push('', this.theme.fg(DIM, ' EDITOR LAUNCH'));\n      lines.push(` ${this.view.editor?.template ?? 'no command available'}`);\n      lines.push(` ${this.theme.fg(DIM, this.view.editor?.source ?? this.view.configPath)}`);\n      lines.push(this.theme.fg(DIM, ' configured → VISUAL → EDITOR → fallback; TUI suspends for terminal editors'));\n      // Changing it lives in the config panel now, which this overlay cannot open\n      // without depending on the package that depends on it.\n      lines.push(this.theme.fg(DIM, ' SPC e c to change'));\n    }\n    return lines.slice(0, height).map((line) => truncateToWidth(line, width));\n  }\n\n  private rightColumn(width: number, height: number): string[] {\n    const entry = this.view.entries[this.selected];\n    const diff = this.view.diffs[this.selected];\n    if (!entry || !diff) return [this.theme.fg(DIM, ' Select a file to review its diff.')];\n    const name = path.basename(entry.path);\n    const base = diff.tracked ? 'vs git HEAD' : 'full add';\n    const lines = [` ${name}  ${this.theme.fg(DIM, base)}`];\n    lines.push(\n      ` ${this.theme.fg(ADDED, `+${diff.additions}`)} ${this.theme.fg(REMOVED, `-${diff.removals}`)} · ${entry.count} edits · ${diff.state}`,\n    );\n    for (const line of diff.lines) {\n      const color = line.startsWith(HUNK_PREFIX)\n        ? ACCENT\n        : line.startsWith(ADDED_PREFIX)\n          ? ADDED\n          : line.startsWith(REMOVED_PREFIX)\n            ? REMOVED\n            : BODY;\n      lines.push(this.theme.fg(color, line));\n    }\n    return lines.slice(0, height).map((line) => truncateToWidth(line, width));\n  }\n}\n","import { copyToClipboard, type ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport type { IEditorConfigService } from '../types/editorConfigService';\nimport type { EditorTui, IEditorLauncher } from '../types/editorLauncher';\nimport type { IFileEditWorkflow } from '../types/fileEditWorkflow';\nimport type { IGitDiffService } from '../types/gitDiffService';\nimport type { ITimelineStore } from '../types/timelineStore';\nimport { FileEditOverlayComponent, type FileEditOverlayResult } from './fileEditOverlay';\n\nconst FULLSCREEN_UI_OPTIONS = {\n  overlay: true,\n  overlayOptions: { anchor: 'top-left' as const, width: '100%' as const, maxHeight: '100%' as const, margin: 0 },\n};\nconst ACTION_CLOSE = 'close';\nconst ACTION_COPY = 'copy';\nconst ACTION_OPEN = 'open';\nconst ACTION_REFRESH = 'refresh';\nconst LEVEL_INFO = 'info';\nconst LEVEL_ERROR = 'error';\n\nexport class FileEditWorkflow implements IFileEditWorkflow {\n  constructor(\n    private readonly timeline: ITimelineStore,\n    private readonly diffs: IGitDiffService,\n    private readonly config: IEditorConfigService,\n    private readonly launcher: IEditorLauncher,\n  ) {}\n\n  async open(ctx: ExtensionContext): Promise<void> {\n    let keepOpen = true;\n    while (keepOpen) {\n      const entries = await this.timeline.list();\n      const diffs = await Promise.all(entries.map((entry) => this.diffs.diff(ctx.cwd, entry.path)));\n      const editor = await this.launcher.resolve();\n      let terminal: EditorTui | undefined;\n      const result = await ctx.ui.custom<FileEditOverlayResult>((tui, theme, _keybindings, done) => {\n        terminal = tui;\n        return new FileEditOverlayComponent(\n          tui,\n          theme,\n          {\n            cwd: ctx.cwd,\n            entries,\n            diffs,\n            editor,\n            configPath: this.config.path(),\n          },\n          done,\n        );\n      }, FULLSCREEN_UI_OPTIONS);\n      if (result.action === ACTION_CLOSE) return;\n      const selected = entries[result.index];\n      const diff = diffs[result.index];\n      if (!selected || !diff) continue;\n      if (result.action === ACTION_COPY) {\n        await copyToClipboard(selected.path);\n        ctx.ui.notify(`Copied ${selected.path}`, LEVEL_INFO);\n      } else if (result.action === ACTION_OPEN) {\n        if (!terminal) {\n          ctx.ui.notify('Terminal editor is unavailable outside the interactive overlay', LEVEL_ERROR);\n          continue;\n        }\n        const launched = await this.launcher.launch(selected.path, diff.suggestedLine, terminal);\n        if (!launched.success) ctx.ui.notify(`Could not open editor: ${launched.error}`, LEVEL_ERROR);\n      } else if (result.action === ACTION_REFRESH) {\n        keepOpen = true;\n      }\n    }\n  }\n}\n","import { EditorConfigService } from '../services/editorConfigService';\nimport { EditorLauncher } from '../services/editorLauncher';\nimport { EditTracker } from '../services/editTracker';\nimport { FileEditPaths } from '../services/fileEditPaths';\nimport { GitDiffService } from '../services/gitDiffService';\nimport { NodeGitStatusAdapter } from '../services/gitStatus';\nimport { NodeSnapshotStoreAdapter } from '../services/snapshotStore';\nimport { TimelineStore } from '../services/timelineStore';\nimport { NodeTreeManifestAdapter } from '../services/treeManifest';\nimport type { FileEditDependencies } from '../types';\nimport { FileEditWorkflow } from './fileEditWorkflow';\n\n/**\n * Compose the file-edit runtime.\n *\n * Construction order is the dependency order, so the graph is readable top to\n * bottom and a cycle is a compile error rather than a resolution failure at\n * runtime. Pass overrides to substitute a double in tests.\n */\nexport function createFileEditDependencies(overrides: Partial<FileEditDependencies> = {}): FileEditDependencies {\n  const paths = overrides.paths ?? new FileEditPaths();\n  const timeline = overrides.timeline ?? new TimelineStore();\n  const snapshots = overrides.snapshots ?? new NodeSnapshotStoreAdapter();\n  const manifests = overrides.manifests ?? new NodeTreeManifestAdapter();\n  const diffs = overrides.diffs ?? new GitDiffService();\n  const editorConfig = overrides.editorConfig ?? new EditorConfigService();\n  const editTracker =\n    overrides.editTracker ?? new EditTracker(timeline, snapshots, manifests, { git: new NodeGitStatusAdapter() });\n  const editorLauncher = overrides.editorLauncher ?? new EditorLauncher(editorConfig);\n  const workflow = overrides.workflow ?? new FileEditWorkflow(timeline, diffs, editorConfig, editorLauncher);\n\n  return { paths, timeline, snapshots, manifests, diffs, editorConfig, editTracker, editorLauncher, workflow };\n}\n"],"mappings":"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"}