codemap.md 2.3 KB

apply-patch

Responsibility

Provide a resilient preprocessor for tool.execute.before on apply_patch that rewrites recoverable stale hunks, validates workspace boundaries, and blocks unsafe patches before they reach OpenCode’s native patch executor.

Design

  • Entry point is createApplyPatchHook in index.ts, bound to tool.execute.before.
  • rewritePatch (operations.ts) is the main pipeline used by the hook and is backed by:
    • parseValidatedPatch / createPatchExecutionContext (execution-context.ts) for patch parsing and path/state validation.
    • parsePatch / parsePatchStrict / formatPatch (codec.ts) for patch AST conversion and serialization.
    • resolveChunkStart, locateChunk, resolveUpdateChunks, applyHits (resolution.ts) for context matching.
    • resolveBy... helpers in matching.ts (seek, seekMatch, list, rescueByPrefixSuffix, rescueByLcs) for tolerant matching.
  • types.ts defines domain contracts used across modules (PatchChunk, PatchHunk, ResolvedChunk, ApplyPatchErrorKind, etc.).
  • Error semantics are centralized in errors.ts (ApplyPatchError, createApplyPatchBlockedError, createApplyPatchVerificationError, isApplyPatchError) and surfaced in hook logging and thrown errors.
  • No additional runtime configuration is exposed; behavior is controlled by constant APPLY_PATCH_RESCUE_OPTIONS (prefixSuffix + lcsRescue).

Flow

  1. createApplyPatchHook filters only input.tool === 'apply_patch'.
  2. It requires output.args.patchText to be a string.
  3. It resolves root and worktree from input.directory / ctx.directory / ctx.worktree.
  4. It calls rewritePatch(root, patchText, options, worktree).
  5. On result.changed, it replaces output.args.patchText with canonicalized patch text.
  6. On failure, it normalizes to ApplyPatchError, logs blocked | validation | verification | internal, and rethrows so native execution is prevented.

Integration

  • Consumed by src/index.ts through createApplyPatchHook.
  • Acts before native tool execution via OpenCode hook point tool.execute.before.
  • Downstream dependencies include ctx.client indirectly only for context, and utils/logger for structured hook telemetry.
  • Uses Patch parser/resolver modules to keep new_lines byte-preserving while only mutating stale anchors and chunk context.