Repository navigation
feat(external-history): find Claude Code, Pi and OpenCode conversations without typed paths - #116
Open
ScriptedAlchemy wants to merge 18 commits into
Open
ScriptedAlchemy wants to merge 18 commits into
ScriptedAlchemy wants to merge 18 commits into
Conversation
Co-Authored-By: Claude Fable 5.2 <[email protected]>
Co-Authored-By: Claude Fable 5.2 <[email protected]>
Co-Authored-By: Claude Fable 5.2 <[email protected]>
Co-Authored-By: Claude Fable 5.2 <[email protected]>
Show source availability and supported filters before search on web and mobile. Keep manual ChatGPT exports in a collapsed section and describe automatic discovery to agents and users. Co-Authored-By: Claude Fable 5.2 <[email protected]>
… has 20 matches A search examined one thread per request, so a no-hit search over 1,843 Claude sessions took about 1,800 "Continue search" clicks. A request now walks threads newest first until it has 20 matches or has read about 4M characters of text or 2,000 threads, then returns a stateless cursor bound to source, query and cwd. Threads that cannot be parsed or change mid-search are skipped instead of ending the search. Claude and OpenCode stores answer "can this thread contain the query" from raw bytes (a streamed regex over the JSONL file, an instr over message data) before the full parse, only for plain ASCII queries. A skipped thread can only be a thread that the full parse would also have missed, except for an OpenCode hit made solely of U+212A or U+017F. Measured on this Mac (load average 30+, 1,645 Claude files / 1.1 GiB, 184 OpenCode sessions): a no-hit Claude search went from 26 s of parsing in 1,645 requests to 1.8 to 2.9 s in 1 request, OpenCode from 4.8 s to 0.5 to 0.9 s. Co-Authored-By: Claude Fable 5.2 <[email protected]>
… by stored id Only Claude records with the t3-code entrypoint were skipped, and older T3 runs lack it. T3 keeps each provider's native session id on its provider thread, so one batched ProjectionStore lookup per search request now answers which of the listed session ids are T3 threads, and the engine skips those without loading them. On this Mac the stored id equals the Claude session id and file name for all 1,645 sessions: 304 are T3 threads and only 6 of those carried the marker. For OpenCode it equals the session id for 179 of 184 top-level sessions. Pi stays unmatched because T3 stores Pi's session file path, not its session id. Co-Authored-By: Claude Fable 5.2 <[email protected]>
Keep valid messages when another JSONL record cannot decode. Accept repeated native IDs using the latest record, skip messages without an ID, and reject files with no transcript records. Raise the cumulative selected-parser allocation budget from 32 MiB to 128 MiB. A read-only census of 1,645 real Claude sessions changed from 1,640 successful loads and five allocation failures to 1,645 successful loads and no failures. Selected allocation in the failed files peaked at 58,058,328 bytes. One file also contained 12 malformed JSON lines. These are single census runs, not latency benchmarks. Keep the 32 MiB cache, 100,000-record ceiling, depth ceiling, 64 KiB read chunks, and search budgets. Focused store and engine tests cover malformed-line recovery and search plus digest-verified reads of a 34 MiB session. Implemented with GPT-6.1 Sol through the Codex harness. Co-Authored-By: Claude Fable 5.2 <[email protected]>
Keep searching through empty pages until matches appear or the source is exhausted. Show cumulative progress and let the user stop and resume scanning. Share paging transitions between web and mobile in a pure reducer. Only pages with matches enter previous-page navigation. Ignore stale and duplicate responses, and unsubscribe from the query while stopped or displaying results. Query hooks have no component result callback, so each client delivers completed responses through a reasoned effect. Update the existing client tests and user guide for automatic following. Pure reducer tests cover consecutive empty pages, exhaustion, previous navigation, and stop and resume. Focused tests and check:changed against ee442a979a pass. Implemented with GPT-6.1 Sol through the Codex harness. Co-Authored-By: Claude Fable 5.2 <[email protected]>
…istory External history now only lists automatically discovered sources. Drops the chatGptExportPaths setting, the chatgpt_export source kind, the export reader, the path editor in web and mobile, and the related copy and docs. Stored settings and older-client patches that still carry chatGptExportPaths decode and ignore it. Co-Authored-By: Claude Fable 5.2 <[email protected]>
The page still said external history reads configured ChatGPT exports, which no longer exist. Co-Authored-By: Claude Fable 5.2 <[email protected]>
|
Merge current main; fix escaped-text matching, updated-session ordering, Pi ownership, stable OpenCode evidence, unavailable transcripts, and scanner memory bounds. Keep the legacy ChatGPT export reader, configuration and UI deleted. Reduce external-history tool context below the main baseline.
Bind search continuations to the ordered listing and resumed transcript version. Recover from individual inaccessible or disappearing entries without caching incomplete listings. Isolate invalid Claude profiles while retaining full deletion of legacy export history.
Effect's typecheck rejects JSON.stringify inside Effect code, which failed CI. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Fable 5.2 <[email protected]>
Co-Authored-By: Claude Fable 5.2 <[email protected]>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
External history found only Codex conversations automatically. Every other source needed a file path typed into the dialog, and the dialog opened on that path box. Conversations from Claude Code, Pi and OpenCode on the same machine were invisible.
Change
Scope
t3_external_historytool text, and the user docs.Tradeoffs
Blast Radius
Saved export-path keys are ignored during settings decoding. The legacy export reader, path setting, and path-entry UI are fully removed. New source kinds are sent only to clients that ask for them, so older web and mobile builds still decode the source list. Reads never write to a provider folder, and folders under the T3 home or
~/Downloadsare skipped.Before and after
Web was rechecked on the current head after the export path removal: the dialog has no path input, Codex, Claude Code and OpenCode show as Ready with nothing typed, and a Claude Code search for one word returned matches from 2,108 items with no extra clicks.
Mobile (iPhone 17e simulator, iOS 27)
Mobile was checked on a simulator paired to the same isolated dev server: the same three sources show as Ready, a Codex search and a Claude Code search both returned results (Claude Code: 2,108 items searched), and switching source clears the query. The run found that the keyboard covered the search field and the Search button; the screen now scrolls above the keyboard like the other settings screens.
Two JSONL history store tests failed on macOS only, because the temp folder resolves through a symlink there. The tests now use the resolved path.
vp run check:changedpasses on the pushed head.Still not checked: the tool text against a live model (no
ANTHROPIC_API_KEYand no Codex proxy on this machine; both cases build in a dry run), and Pi against real data (no Pi sessions on this machine; fixtures cover it).Additional audit fixes
Initial audit follow-up
mainand retained full deletion of the legacy ChatGPT export implementation. No export reader, export-path setting, or path-entry UI remains. The only old-key reference is a regression test confirming stored unknown keys are ignored.main(67,419); no budget gate was weakened.ANTHROPIC_API_KEY; browser verification is blocked before assertions by the environment's Unix-socket restriction. Native device verification remains incomplete.Original implementation verification
vp run check:changedpasses after the rebase (format, lint, knip, typecheck of 42 packages, 19 test files).Built by Claude Fable 5.2 in Claude Code inside T3 Code, with Codex GPT-6.1 Sol and Claude Sonnet 5.5 as delegates.
🤖 Generated with Claude Code