Skip to content
Open
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
8412c4d
fix(daemon/remote): publish bundle extractions by swap, not destroy-t…
beardthelion Aug 28, 2026
efa6adc
fix(daemon/remote): refuse link ids that can name a staging directory
beardthelion Aug 28, 2026
cce928e
fix(daemon/remote): survive an interrupted extract and a second daemon
beardthelion Aug 28, 2026
6936d99
fix(dictation): keep the previous engine install if promotion fails
beardthelion Aug 28, 2026
f0fce95
fix(daemon/remote): do not let startup recovery take a live extract's…
beardthelion Aug 28, 2026
af745d0
fix(daemon/remote): stop recovery from destroying the tree it should …
beardthelion Aug 28, 2026
db658d7
fix(dictation): restore an install left aside by an interrupted promo…
beardthelion Aug 28, 2026
23da589
fix(dictation): restore an interrupted model promotion, and the newes…
beardthelion Aug 30, 2026
1179915
fix(daemon/remote): order bundle recovery by the extract, not by mtimes
beardthelion Aug 30, 2026
46d12d8
fix(dictation): find holders by prefix rather than by glob pattern
beardthelion Aug 30, 2026
572dc1f
test(daemon/remote): cover bundle recovery end to end
beardthelion Aug 30, 2026
3974d58
test(dictation): keep the awkward-path names to ones Windows can hold
beardthelion Sep 1, 2026
61f5816
fix(daemon/remote): keep a retained backup across the next recovery pass
beardthelion Sep 1, 2026
2aac6e4
test(dictation): cover a stamped holder winning over an unstamped one
beardthelion Sep 1, 2026
aa68c04
fix(daemon/remote,dictation): order crash recovery by a sequence, not…
beardthelion Sep 1, 2026
1580a59
fix(daemon/remote): read only the names the staging allocator owns
beardthelion Sep 1, 2026
e17255e
fix(dictation,daemon/remote): stop a failed cleanup from stranding an…
beardthelion Sep 1, 2026
b57cacb
fix(dictation): reap a holder only for a destination that is actually…
beardthelion Sep 1, 2026
2f41eed
test: name the mode the allocator sets, not the one MkdirTemp used to
beardthelion Sep 1, 2026
6d65b71
test(daemon/remote,dictation): route every filesystem step through on…
beardthelion Sep 3, 2026
efc472e
fix(daemon/remote): prove which transaction owns a staged backup, and…
beardthelion Sep 3, 2026
60351fc
fix(dictation): hold one lock across a destination's whole install li…
beardthelion Sep 3, 2026
3ad135b
fix(daemon/remote): let the allocator read only the names it wrote
beardthelion Sep 3, 2026
064b4e1
fix(dictation): attribute a holder by its marker, not by its name
beardthelion Sep 3, 2026
f21290f
fix(daemon/remote): decide recovery from proof on disk, not from what…
beardthelion Sep 3, 2026
9af200c
fix(dictation): apply the caller's own usability test to every candidate
beardthelion Sep 3, 2026
062c88d
test(daemon/remote,dictation): run the crash states as a table
beardthelion Sep 3, 2026
0750b3f
feat(cli): let an operator see and reclaim the copies recovery keeps
beardthelion Sep 3, 2026
053857e
test(daemon/remote,dictation): fail every recovery step, on either pa…
beardthelion Sep 3, 2026
dbbdba4
fix(daemon/remote): treat an unreadable work-tree probe as a work tree
beardthelion Sep 3, 2026
d45d828
fix(daemon/remote,dictation,cli): close the gaps a full review of the…
beardthelion Sep 3, 2026
90503c7
test(daemon/remote,dictation,cli): make the guards a mutation run wal…
beardthelion Sep 3, 2026
29fe455
fix(daemon/remote): bound the wait for an extract already running in …
beardthelion Sep 3, 2026
942710a
fix(daemon/remote,dictation,cli): unwrap not-exist, refuse aliasing l…
beardthelion Sep 3, 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
12 changes: 11 additions & 1 deletion internal/daemon/remote/bridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,14 +100,24 @@ func NewBridge(opts BridgeOptions) (*Bridge, error) {
if maxBundleBytes <= 0 {
maxBundleBytes = defaultMaxBundleBytes
}
bundleDir := strings.TrimSpace(opts.BundleDir)
if bundleDir != "" {
// A previous run may have died mid-swap, leaving a link's only tree in a
// staging dir. Nothing serves yet, so repair before the first upload.
recoverBundleDir(bundleDir, func(format string, args ...any) {
if opts.Log != nil {
opts.Log(fmt.Sprintf(format, args...))
}
})
}
return &Bridge{
server: opts.Server,
auth: opts.Authenticator,
attest: attest,
minVersion: minVersion,
handshakeTimeout: handshakeTimeout,
authFailDelay: authFailDelay,
bundleDir: strings.TrimSpace(opts.BundleDir),
bundleDir: bundleDir,
maxBundleBytes: maxBundleBytes,
log: opts.Log,
sem: make(chan struct{}, maxConns),
Expand Down
Loading
Loading