• v1.13.5: opencode truncate.ts port — full tool output retrievable via opaque id

    indifferentketchup released this 2026-05-22 07:55:55 +00:00 | 103 commits to main since this release

    • New services/truncate.ts. Tmpfs storage at /tmp/boocode-truncations/
      (BOOCODE_TRUNCATION_DIR env var overrides for tests). 12-char base32
      opaque ids (~60 bits entropy, "tr_"). Three exports: storeTruncation,
      readTruncation, truncateIfNeeded (wrap-or-passthrough helper).
      cleanupTruncations does TTL-pass (7 days) + orphan-reap (parts query on
      payload->'output'->>'outputPath') in one shot.
    • Wired four tools through truncateIfNeeded: view_file (raw full file),
      list_dir (full filtered+secret-filtered entries serialized one-per-line),
      web_fetch (textRaw pre-slice), codecontext_client (body.result pre-slice).
      Each returns the existing sliced view plus an optional outputPath field
      when truncation fires.
    • New view_truncated_output ToolDef. Resolves opaque id → on-disk content
      internally; model never sees the truncation dir. Same start_line /
      end_line slicing semantics as view_file. Registered in ALL_TOOLS (alpha
      sort places it after view_file automatically) and READ_ONLY_TOOL_NAMES.
    • cleanupTruncations piggybacks on the v1.13.3 stuck-row sweeper's 60s
      setInterval. No-op when truncation dir is empty.

    Not wired (TODO follow-up): grep and find_files. file_ops returns post-cap
    results to the tool execute path, so the "full content" isn't recoverable
    without a refactor of fileOps.grep / fileOps.findFiles to expose the
    uncapped result. web_search is silent-slice (no truncated flag); outside
    scope. Five sites of seven covered; the remaining two are the only ones
    needing a file_ops change.

    Tests: 7 new in truncate.test.ts (roundtrip, unknown id, malformed id,
    truncateIfNeeded false/true/over-cap/storage-failure paths). 186 total
    (was 179). cleanupTruncations file-system half implicitly via TTL pass;
    orphan-reap branch covered by the live container smoke.

    Smoke verified end-to-end against the live container:

    • view_file with start_line=1, end_line=3 on CLAUDE.md → tool_result part
      carried outputPath "tr_cdpn1o04k6ma" + truncated=true.
    • /tmp/boocode-truncations/tr_cdpn1o04k6ma exists, 15876 bytes, mode 0o600,
      parent dir mode 0o700.
    • Follow-up view_truncated_output(id, start_line=50, end_line=55) returned
      the actual lines 50-55 of CLAUDE.md (the 808notes/BooCode bullets).
    • ALL_TOOLS count=20 (was 19); alpha sort places view_truncated_output
      between view_file and watch_changes.

    Closes a v1.12 catalog row that was scoped but deferred. The v1.13 parts
    table made outputPath ride on the existing tool_result payload with no
    schema change beyond the storage helper itself.

    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com

    Downloads