Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
3479bd2
docs: add implementation plan for rust-resolve-parity
danshapiro Jul 30, 2026
1faf5e6
docs(plan): harden rust-resolve-parity plan from load-bearing validation
danshapiro Jul 30, 2026
fdfdf45
docs(plan): fix two blocking fresheyes findings in rust-resolve-parit…
danshapiro Jul 30, 2026
dde0ef5
docs(plan): fix three blocking fresheyes findings in rust-resolve-par…
danshapiro Jul 30, 2026
a1b6d03
test(shared): extract resume-input parser cases into cross-language f…
danshapiro Jul 30, 2026
063c810
feat(sessions): port resume-input parser to Rust, pinned by shared fi…
danshapiro Jul 30, 2026
82e02f5
feat(sessions): opencode by-id directory lookup for resume-resolve fa…
danshapiro Jul 30, 2026
d1602c2
feat(freshagent): export transcript_cwd for resume-resolve claude fal…
danshapiro Jul 30, 2026
0a479fb
chore(cargo): record regex dependency in lockfile (SYNC-06)
danshapiro Jul 30, 2026
efe4ddf
fix(freshagent): drop unrelated dead helper that leaked into transcri…
danshapiro Jul 30, 2026
975abb0
feat(sessions): resume-resolve matching core for the retired pre-#586…
danshapiro Jul 30, 2026
6b63647
feat(server): POST /api/sessions/resolve implementing the retired pre…
danshapiro Jul 30, 2026
2478577
feat(server): declare sessionResolve feature flag from the Rust serve…
danshapiro Jul 30, 2026
1de87e0
test(e2e): run resume-button spec on both server kinds (SYNC-06 PW-RUST)
danshapiro Jul 30, 2026
5120f79
docs: record SYNC-06 rust resolve parity evidence in completion check…
danshapiro Jul 30, 2026
c6d3d76
docs(server): correct stale test-only note on session metadata store …
danshapiro Jul 30, 2026
bf01f3c
docs: add implementation plan for rust-resolve-parity-hardened
danshapiro Jul 30, 2026
c0f6613
docs(plan): load-bearing validation — correct Node core suite mirror …
danshapiro Jul 30, 2026
e331c2c
docs(plan): fix 16 blocking issues from fresheyes plan review (iterat…
danshapiro Jul 30, 2026
e961c10
docs(plan): fix 10 blocking issues from fresheyes plan review (iterat…
danshapiro Jul 30, 2026
8117357
fix(resolve): align Rust resume-resolve with hardened Node semantics …
danshapiro Jul 30, 2026
65faa6a
fix(resolve): roll back sessionResolve capability and de-matrix resum…
danshapiro Jul 30, 2026
22dc382
docs(checklist): correct false SYNC-06 evidence
danshapiro Jul 30, 2026
6ba6a11
docs(plan): fix 6 blocking issues from fresheyes plan review (iterati…
danshapiro Jul 30, 2026
a9c0323
docs(plan): separate Task 6 heading from preceding horizontal rule
danshapiro Jul 30, 2026
6660cf9
fix(resolve): port Node's budgeted, shape-gated exact-id fallbacks + …
danshapiro Jul 30, 2026
774c42f
docs(resolve): enumerate ALL remaining Node divergences; fix stale re…
danshapiro Jul 30, 2026
22e75dd
test(sessions): pin thread_/task_ known families and the {8,64} suffi…
danshapiro Jul 31, 2026
bbef61f
feat(sessions): hardened #586 resolve core — per-token ranking, case …
danshapiro Jul 31, 2026
f7fb7ef
feat(sessions): hardened opencode exact-id lookup — direct by-id row …
danshapiro Jul 31, 2026
82b761e
feat(sessions): scan-failure tracking + fire-and-forget refresh on Se…
danshapiro Jul 31, 2026
3d1b649
fix(sessions): publish scan failures in a short lock instead of holdi…
danshapiro Jul 31, 2026
3a9b17d
feat(server): hardened resolve wire — providerErrors/unsearchedProvid…
danshapiro Jul 31, 2026
aa0d65b
feat(server): restore sessionResolve capability and re-matrix resume …
danshapiro Jul 31, 2026
6bce84d
docs: record SYNC-06 hardened-contract parity evidence in completion …
danshapiro Jul 31, 2026
7b92ecf
docs(resolve): close stale divergence ledgers post flag re-enable; pi…
danshapiro Jul 31, 2026
48a0e27
fix(sessions): refresh provider health every sweep and publish snapsh…
danshapiro Jul 31, 2026
47c1b27
fix(server): resolve provider homes via HOME||USERPROFILE approximati…
danshapiro Jul 31, 2026
1f98582
docs(plans): replace vacuous plan test bodies with landed-test refere…
danshapiro Jul 31, 2026
8b03fda
fix(server): resolve claude fallback + homeDir via provider_home and …
danshapiro Jul 31, 2026
da0c48f
docs(plans): align resolve-parity docs with landed HOME->USERPROFILE …
danshapiro Jul 31, 2026
b75fed8
docs(plans): remap checklist SHAs after in-history reword of the two …
danshapiro Jul 31, 2026
6b62104
fix(server,sessions): resolve user home via Node os.homedir() platfor…
danshapiro Jul 31, 2026
67c6ae1
fix(server): scope resolve deadline/admission to the fallback dispatc…
danshapiro Jul 31, 2026
502dd39
docs(plans): convert hardened resolve-parity plan into an executed co…
danshapiro Jul 31, 2026
e3664ab
fix(resolve): project matches through Node's post-override view for t…
danshapiro Jul 31, 2026
c7e2877
fix(resolve): bound each fallback dispatch independently — a timeout …
danshapiro Jul 31, 2026
874e6b6
fix(resolve): fail-fast fallback admission before the blocking task e…
danshapiro Jul 31, 2026
50355a9
fix(resolve): port Node's provider-generated-title suppression into t…
danshapiro Jul 31, 2026
4f19dc5
fix(resolve): gate body parsing on express.json()'s Content-Type matcher
danshapiro Jul 31, 2026
e0a3b20
docs(plans): remap SHAs after second in-history reword of three overs…
danshapiro Jul 31, 2026
d9af83d
fix(freshagent): restore fail_json_code_retry_after dropped as dead p…
danshapiro Jul 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

428 changes: 427 additions & 1 deletion crates/freshell-freshagent/src/claude_snapshot.rs

Large diffs are not rendered by default.

13 changes: 9 additions & 4 deletions crates/freshell-freshagent/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,15 @@ pub mod spawn_gate;
pub mod terminal_tabs;

pub use claude::FreshClaudeState;
// Kata 09v1: the ONE claude_snapshot item visible outside this crate — the
// raw-file existence check freshell-server's IndexExistenceProbe shares with
// the attach arm. Keep the rest of claude_snapshot crate-private.
pub use claude_snapshot::locate_transcript;
// Kata 09v1 + SYNC-06: the TWO claude_snapshot items visible outside this
// crate — the raw-file existence check freshell-server's IndexExistenceProbe
// shares with the attach arm, and the original-cwd reader the resume-resolve
// claude fallback pairs with it (`claude-transcript-locator.ts` parity).
// Keep the rest of claude_snapshot crate-private.
pub use claude_snapshot::{
locate_transcript, locate_transcript_checked, transcript_cwd, transcript_cwd_bounded,
transcript_cwd_checked,
};
pub use codex::FreshCodexState;
pub use identity_sink::{
FreshAgentBindingUpsert, FreshAgentSettings, PaneIdentitySink, SharedPaneIdentitySink,
Expand Down
42 changes: 42 additions & 0 deletions crates/freshell-freshagent/tests/transcript_cwd_export.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
//! SYNC-06: the resume-resolve claude fallback needs the transcript's
//! original cwd (`claude-transcript-locator.ts` parity: first line carrying a
//! non-empty string `cwd`, malformed lines skipped). This pins the crate-root
//! export and the first-non-empty-cwd semantics.

use std::io::Write;

fn temp_transcript(lines: &[&str]) -> std::path::PathBuf {
let path = std::env::temp_dir().join(format!(
"freshell-transcript-cwd-{}-{}.jsonl",
std::process::id(),
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_nanos()
));
let mut file = std::fs::File::create(&path).expect("create fixture transcript");
for line in lines {
writeln!(file, "{line}").expect("write fixture line");
}
path
}

#[test]
fn first_non_empty_cwd_wins_and_malformed_lines_are_skipped() {
let path = temp_transcript(&[
"not json at all {",
r#"{"type":"summary","cwd":""}"#,
r#"{"type":"user","cwd":"/repo/gamma","message":{}}"#,
r#"{"type":"assistant","cwd":"/repo/other"}"#,
]);
assert_eq!(
freshell_freshagent::transcript_cwd(&path),
Some("/repo/gamma".to_string())
);
}

#[test]
fn transcript_without_cwd_yields_none() {
let path = temp_transcript(&[r#"{"type":"summary"}"#, r#"{"leafUuid":"x"}"#]);
assert_eq!(freshell_freshagent::transcript_cwd(&path), None);
}
2 changes: 1 addition & 1 deletion crates/freshell-protocol/tests/roundtrip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ fn terminal_inventory_and_settings_parse_from_transcript() {
));
assert_eq!(
s.settings.coding_cli.enabled_providers,
vec!["claude", "codex", "opencode"]
vec!["claude", "codex", "opencode", "amplifier"]
);
}
other => panic!("expected SettingsUpdated, got {other:?}"),
Expand Down
Loading
Loading