Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
650 commits
Select commit Hold shift + click to select a range
0df7ab5
Show where a moved chat stands as the first card when it opens
santoshkumarradha Oct 1, 2026
f760485
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-hero
santoshkumarradha Oct 1, 2026
3bc6d25
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-revoked
santoshkumarradha Oct 1, 2026
f1485fc
Merge branch 'wip/layout-v0-ux-freshcard' into wip/layout-v0-ux-revoked
santoshkumarradha Oct 1, 2026
74a257a
A call's seal holds its result line, and a turn's seal holds its clos…
santoshkumarradha Oct 1, 2026
a9271d7
Merge branch 'wip/layout-v0-vlid-1' into wip/layout-v0-vlid
santoshkumarradha Oct 1, 2026
60a1e4d
Merge branch 'wip/layout-v0' into wip/layout-v0-p1packs
santoshkumarradha Oct 1, 2026
51f330d
Validation rig: count resume cards over repeated takes, record when a…
santoshkumarradha Oct 1, 2026
0f030b1
Raise the arrival card on every take, listed or not
santoshkumarradha Oct 1, 2026
27a8aba
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-hero
santoshkumarradha Oct 1, 2026
39186d8
Ask the sync service about standing only from a home that has been in…
santoshkumarradha Oct 1, 2026
1494d78
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-revoked
santoshkumarradha Oct 1, 2026
a93da40
A take into the person's own folder completes the store and restores …
santoshkumarradha Oct 1, 2026
a7f7a0f
Start a chat's sync the moment a pairing makes the identity, with no …
santoshkumarradha Oct 1, 2026
74d06b8
Send frames root-first and add a partial import for a filling inbox
santoshkumarradha Oct 1, 2026
2ee7d30
Record a withheld folder older than the first command as present before
santoshkumarradha Oct 1, 2026
0a41769
A take imports whole frames while the next ones download
santoshkumarradha Oct 1, 2026
cc8d83a
Merge branch 'wip/layout-v0-p1packs-2' into wip/layout-v0-p1packs
santoshkumarradha Oct 1, 2026
1027bbd
Bound the engine daemon health check so a wedged daemon falls back to…
santoshkumarradha Oct 1, 2026
2e2af91
Merge branch 'wip/layout-v0-vfix-madeby' into wip/layout-v0-vfix
santoshkumarradha Oct 1, 2026
a76699b
Merge branch 'wip/layout-v0-vfix-hang' into wip/layout-v0-vfix
santoshkumarradha Oct 1, 2026
6a65351
Measure how often a kill half a second after a new chat's first call …
santoshkumarradha Oct 1, 2026
f896afc
Draw the door for a listed chat another machine holds; stale window s…
santoshkumarradha Oct 1, 2026
a5a0bb3
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-takedoor
santoshkumarradha Oct 1, 2026
3a9c559
Manual test quotes the example host the page carries
santoshkumarradha Oct 1, 2026
bff55b8
Merge branch 'wip/layout-v0-ux-takedoor' into wip/layout-v0-ux-manual
santoshkumarradha Oct 1, 2026
d1b7426
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-pairmanual
santoshkumarradha Oct 1, 2026
5a2009e
Bound the skill import pass so a stuck skill folder cannot blank the …
santoshkumarradha Oct 1, 2026
48a4ec4
Merge branch 'wip/layout-v0' into wip/layout-v0-vlid
santoshkumarradha Oct 1, 2026
ca9d2df
Classify the skill import wait in the launch goroutine inventory
santoshkumarradha Oct 1, 2026
01f4ede
Add chord registry test for duplicate key claims
santoshkumarradha Oct 1, 2026
1b20c41
Merge branch 'wip/layout-v0-vfix-blank' into wip/layout-v0-vfix
santoshkumarradha Oct 1, 2026
e9c17e0
Close a chat's drive side under the lock-from-a-defer law
santoshkumarradha Oct 1, 2026
293606d
Manual: pages for adding, approving, removing and continuing on anoth…
santoshkumarradha Oct 1, 2026
b166e93
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-manual
santoshkumarradha Oct 1, 2026
dc72f6e
Merge branch 'wip/layout-v0' into wip/layout-v0-vfix
santoshkumarradha Oct 1, 2026
0790d76
Keep a solo identity quiet: no sync request until a fleet starts
santoshkumarradha Oct 1, 2026
5aeb38a
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-freshcard
santoshkumarradha Oct 1, 2026
ab7e1a2
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-manual
santoshkumarradha Oct 1, 2026
127ad29
Merge branch 'wip/layout-v0' into wip/layout-v0-p1packs
santoshkumarradha Oct 1, 2026
008e0e1
Use the solo marker for the launch standing check
santoshkumarradha Oct 1, 2026
4235af8
Merge trunk into the revoked-device lane
santoshkumarradha Oct 1, 2026
637d406
One predicate for whether this machine may reach the sync service
santoshkumarradha Oct 1, 2026
f228d17
Merge freshcard into the revoked-device lane
santoshkumarradha Oct 1, 2026
bfd7ea2
Order the device list stably and tell same-name devices apart
santoshkumarradha Oct 1, 2026
43c9142
Pair link pasted or entered anywhere on home opens the approve screen
santoshkumarradha Oct 1, 2026
116cf74
Merge branch 'wip/layout-v0' into wip/layout-v0-vlid
santoshkumarradha Oct 1, 2026
77e5ff2
Seal the tree when a turn ends so the reply and last tool output repl…
santoshkumarradha Oct 1, 2026
3c40359
Name a chat working in its own folder by that fact, not by the folder…
santoshkumarradha Oct 1, 2026
26cd24b
Name a moved chat by the folder it was left in, marked as a copy here
santoshkumarradha Oct 1, 2026
162f0a5
Home offers the rescue and draws presence from the live feed
santoshkumarradha Oct 1, 2026
9edb9dc
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-contprompt
santoshkumarradha Oct 1, 2026
fc543e5
Merge branch 'wip/layout-v0-ux-devlist' into wip/layout-v0-ux-integ
santoshkumarradha Oct 1, 2026
6d9a5f9
Merge branch 'wip/layout-v0-ux-contprompt' into wip/layout-v0-ux-integ
santoshkumarradha Oct 1, 2026
78f5c6c
Merge branch 'wip/layout-v0-ux-movedtr' into wip/layout-v0-ux-integ
santoshkumarradha Oct 1, 2026
b1b1195
Merge branch 'wip/layout-v0-ux-movedfoot' into wip/layout-v0-ux-integ
santoshkumarradha Oct 1, 2026
842ea93
Merge branch 'wip/layout-v0-ux-cardPaste' into wip/layout-v0-ux-integ
santoshkumarradha Oct 1, 2026
f31c554
Merge branch 'wip/layout-v0-ux-contprompt' into wip/layout-v0-ux-cont…
santoshkumarradha Oct 1, 2026
08b1f76
Merge branch 'wip/layout-v0' into wip/layout-v0-p2mac
santoshkumarradha Oct 1, 2026
22c8b34
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-cardPaste
santoshkumarradha Oct 1, 2026
eddf96e
Start the continue card on the yes when the person chose to continue
santoshkumarradha Oct 1, 2026
7ede187
Serve a static page for pairing links opened in a browser
santoshkumarradha Oct 1, 2026
9f4b334
Put the pairing key in the fragment of the page's app link
santoshkumarradha Oct 1, 2026
c19b2e3
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-devlist
santoshkumarradha Oct 1, 2026
11ec352
Pairing links use the codeaf.agentfield.ai host
santoshkumarradha Oct 1, 2026
f426ca3
Sync tests stop racing the heartbeat and the lease renewal; a rediall…
santoshkumarradha Oct 1, 2026
47e154a
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-movedfoot
santoshkumarradha Oct 1, 2026
952ea08
Home: keep the machine note beside a long chat title
santoshkumarradha Oct 1, 2026
995a7eb
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-runningtitle
santoshkumarradha Oct 1, 2026
1e6dd97
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-contprompt
santoshkumarradha Oct 1, 2026
3ebd0d3
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-contdefault
santoshkumarradha Oct 1, 2026
5b40059
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-revrows
santoshkumarradha Oct 1, 2026
3107d96
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-revokedlive
santoshkumarradha Oct 1, 2026
c574fd3
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-linkpage
santoshkumarradha Oct 1, 2026
3c2458a
Say a removed device is removed while it runs, once
santoshkumarradha Oct 1, 2026
91c8562
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-revokedlive
santoshkumarradha Oct 1, 2026
333cdb6
wip: host waits for its conversations; join test diagnostics
santoshkumarradha Oct 1, 2026
143ffbf
Merge branch 'wip/layout-v0' into wip/layout-v0-pairflake
santoshkumarradha Oct 1, 2026
e64768c
Drop revoked devices from rows and prompts; devices list takes presen…
santoshkumarradha Oct 1, 2026
b931712
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-revrows
santoshkumarradha Oct 1, 2026
4518842
Merge branch 'wip/layout-v0' into wip/layout-v0-hang2
santoshkumarradha Oct 1, 2026
a80f73c
Host returns only after its conversations end; hostile-offerer test w…
santoshkumarradha Oct 1, 2026
6b5a983
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-linkpage
santoshkumarradha Oct 1, 2026
aff4310
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-cardPaste
santoshkumarradha Oct 1, 2026
0bd6bd1
Merge branch 'wip/layout-v0' into wip/layout-v0-pairflake
santoshkumarradha Oct 1, 2026
dadc797
Merge branch 'wip/layout-v0' into wip/layout-v0-vlid
santoshkumarradha Oct 1, 2026
4da2855
Merge wip/layout-v0; keep only the take test for a turn that ended on…
santoshkumarradha Oct 1, 2026
01ee9f3
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-cardPaste
santoshkumarradha Oct 1, 2026
0589860
Merge trunk; take trunk for files outside the home row change
santoshkumarradha Oct 1, 2026
2deeeac
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-movedtr
santoshkumarradha Oct 1, 2026
12e6ac1
Merge branch 'wip/layout-v0' into wip/layout-v0-p1packs
santoshkumarradha Oct 1, 2026
9574633
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-revokedlive
santoshkumarradha Oct 1, 2026
9ac1ae3
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-revrows
santoshkumarradha Oct 1, 2026
14cf4bd
Merge branch 'wip/layout-v0' into wip/layout-v0-p1packs
santoshkumarradha Oct 1, 2026
2e3e111
Merge trunk; take trunk outside the home row change
santoshkumarradha Oct 1, 2026
dbd24db
Respell the handoff page text and cover the hosted sources in the nam…
santoshkumarradha Oct 1, 2026
282f56e
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-runningtitle
santoshkumarradha Oct 1, 2026
5fd142c
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-pagename
santoshkumarradha Oct 1, 2026
fdd6644
Home: a chat on an offline device reads as off, not running
santoshkumarradha Oct 1, 2026
9fd5ba0
Fix the revoke row choice in the pair journey; say 'undo' not 'take b…
santoshkumarradha Oct 1, 2026
c359147
Widen the vocabulary check to every command help string and reword th…
santoshkumarradha Oct 1, 2026
293c10f
Merge branch 'wip/layout-v0-ux-step7' into wip/layout-v0-ux-takeword
santoshkumarradha Oct 1, 2026
4428a30
Reword the last handover phrases in the manual and keyboard notice
santoshkumarradha Oct 1, 2026
646acb6
Carry the validation rig files the continuity scripts import
santoshkumarradha Oct 1, 2026
642391f
Check what a move carries: continuity session, folder fidelity and re…
santoshkumarradha Oct 1, 2026
35cc166
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-takeword
santoshkumarradha Oct 1, 2026
c8d5acf
Merge branch 'wip/layout-v0-vcont' into wip/layout-v0-vfid
santoshkumarradha Oct 1, 2026
3fceb54
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-step7
santoshkumarradha Oct 1, 2026
6cc3a6e
Merge branch 'wip/layout-v0-vcont' into wip/layout-v0-vtasks
santoshkumarradha Oct 1, 2026
71da4db
Keep a kept task branch in the project when its copy is cut again as …
santoshkumarradha Oct 1, 2026
0ce81c2
Takeover card: an offline holder reads as last durable turn only
santoshkumarradha Oct 1, 2026
9e0da25
Narrow the vocabulary check to the handover concept and restore plain…
santoshkumarradha Oct 1, 2026
cf2d55b
Set apart a path that cannot be read instead of failing the seal
santoshkumarradha Oct 1, 2026
f131cc4
Restore read-only directories and fold-colliding names without refusi…
santoshkumarradha Oct 1, 2026
61dff3a
Merge branch 'wip/layout-v0-vfid-1' into wip/layout-v0-vfid
santoshkumarradha Oct 1, 2026
be3b596
Say the guard's notices on the chat screen instead of stderr
santoshkumarradha Oct 1, 2026
4646bf1
Merge branch 'wip/layout-v0' into wip/layout-v0-vcont
santoshkumarradha Oct 1, 2026
9ef55e6
Manual: a file that cannot be read and names that fold; fidelity comp…
santoshkumarradha Oct 1, 2026
4c37a84
Rebuild a moved chat's run rows into the project task index
santoshkumarradha Oct 1, 2026
4fa5fa6
Carry a chat's job logs, saved tool output and task journals when it …
santoshkumarradha Oct 1, 2026
ca45bf9
Merge branch 'wip/layout-v0-vtasks-1' into wip/layout-v0-vtasks
santoshkumarradha Oct 1, 2026
e2a2c74
Manual: what a move carries of a chat's logs, journals, task history …
santoshkumarradha Oct 1, 2026
92b99fb
Memory commands reach the session host, so /remember no longer says m…
santoshkumarradha Oct 1, 2026
3d1da9c
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-staleprompt
santoshkumarradha Oct 1, 2026
e0ed622
A warm take brings the ledger rows of every turn since the older copy…
santoshkumarradha Oct 1, 2026
1666da3
Pin what the trailing seal adds to a scripted session: at most one pu…
santoshkumarradha Oct 1, 2026
31dab51
Manual: odd files get their own section; fidelity rig runs the awkwar…
santoshkumarradha Oct 1, 2026
1ec327d
Merge branch 'wip/layout-v0' into wip/layout-v0-ux-takeword
santoshkumarradha Oct 1, 2026
2c7dff8
Tell the person on the turn's stream what the seal watch has to say
santoshkumarradha Oct 1, 2026
5b2dc0d
Seal sentences are told to the person, not folded into the work group
santoshkumarradha Oct 1, 2026
ba3e10c
Fidelity probes: own ssh socket, read-only leftovers removed
santoshkumarradha Oct 1, 2026
862780b
Merge branch 'wip/layout-v0' into wip/layout-v0-vremember
santoshkumarradha Oct 1, 2026
b68e6d5
Merge branch 'wip/layout-v0' into wip/layout-v0-vtasks
santoshkumarradha Oct 2, 2026
8753435
Merge branch 'wip/layout-v0' into wip/layout-v0-vledger
santoshkumarradha Oct 2, 2026
429c1b1
Continuity check: strict task history, kept branch ref and chat evide…
santoshkumarradha Oct 2, 2026
0303fe8
Fidelity compare: set-apart paths are named, empty-dir and take-back …
santoshkumarradha Oct 2, 2026
8eadb50
Merge branch 'wip/layout-v0' into wip/layout-v0-vfid
santoshkumarradha Oct 2, 2026
8be7f45
A warm take keeps the names an earlier take set apart
santoshkumarradha Oct 2, 2026
61d2752
Merge branch 'wip/layout-v0-vdemo' into wip/layout-v0-vrig
santoshkumarradha Oct 2, 2026
1c556e9
Add the move benchmark rig, a segment switch for the pairing journey,…
santoshkumarradha Oct 2, 2026
ac63395
Merge branch 'wip/layout-v0' into wip/layout-v0-vrig
santoshkumarradha Oct 2, 2026
239e027
Route the pairing link page on the production host and test the produ…
santoshkumarradha Oct 2, 2026
845d1f9
Hold a restored task copy at its commit, not at the project's uncommi…
santoshkumarradha Oct 2, 2026
9dd49e2
Merge branch 'wip/layout-v0' into wip/layout-v0-vledger
santoshkumarradha Oct 2, 2026
b79c78d
Continuity run: start the server as a registry job so the transcript …
santoshkumarradha Oct 2, 2026
df3363b
Read every machine, folder and relay of the move rigs from named envi…
santoshkumarradha Oct 2, 2026
2bf5172
Continuity check: leave out machine-local bookkeeping and withheld in…
santoshkumarradha Oct 2, 2026
cf0c5f8
Say why a fixture pair is skipped: not asked for, or the filesystem f…
santoshkumarradha Oct 2, 2026
396ea3d
Manual: quiet first launch, link and token pairing refusals, what a m…
santoshkumarradha Oct 2, 2026
2d2a669
Keep hard-linked files linked when a folder moves to another machine
santoshkumarradha Oct 2, 2026
0679fc9
Merge the default sync to the hosted fabric
santoshkumarradha Oct 2, 2026
614f8e3
Merge branch 'wip/layout-v0' into wip/layout-v0-vrigparam
santoshkumarradha Oct 2, 2026
7586e64
Test the no-relay path with no hosted default built in
santoshkumarradha Oct 2, 2026
014ebe9
Fork copies fill a read-only directory before locking it; the not-sea…
santoshkumarradha Oct 2, 2026
420d3fc
Merge branch 'wip/layout-v0' into wip/layout-v0-vmanual
santoshkumarradha Oct 2, 2026
c65970d
Fix the tests that failed on a clean tree and under load
santoshkumarradha Oct 2, 2026
a2fefe9
Leave the changelog entry to the pull request that carries this lane
santoshkumarradha Oct 2, 2026
41bde10
Merge branch 'wip/layout-v0' into wip/layout-v0-vledger
santoshkumarradha Oct 2, 2026
2defa08
Merge trunk's audited default-relay manual wording
santoshkumarradha Oct 2, 2026
40300ab
Say in the manual that a moved folder keeps hard links; let two runs …
santoshkumarradha Oct 2, 2026
23bcf8d
Merge branch 'wip/layout-v0' into wip/layout-v0-vforkro
santoshkumarradha Oct 2, 2026
bb2701b
Merge wip/layout-v0 into wip/layout-v0-vtasks
santoshkumarradha Oct 2, 2026
6073bbb
Merge branch 'wip/layout-v0' into wip/layout-v0-vreds
santoshkumarradha Oct 2, 2026
a4d689d
Merge branch 'wip/layout-v0' into wip/layout-v0-vhardlink
santoshkumarradha Oct 2, 2026
a1dde6b
Continuing page names no machinery when two computers continue at once
santoshkumarradha Oct 2, 2026
b8de0a3
Merge branch 'wip/layout-v0' into wip/layout-v0-vflip
santoshkumarradha Oct 2, 2026
739acab
A computer waiting for an identity is not a seal failing
santoshkumarradha Oct 2, 2026
88a65ff
Merge branch 'wip/layout-v0' into wip/layout-v0-vtasks
santoshkumarradha Oct 2, 2026
34443cb
Manual: keep the racing paragraph in the device vocabulary
santoshkumarradha Oct 2, 2026
4955379
Merge branch 'wip/layout-v0' into wip/layout-v0-vmanual
santoshkumarradha Oct 2, 2026
6754ac7
Manual: one account of what a move carries, with the kept branch, job…
santoshkumarradha Oct 2, 2026
e990fd7
Merge branch 'wip/layout-v0' into wip/layout-v0-vhardlink
santoshkumarradha Oct 2, 2026
703b217
Merge branch 'wip/layout-v0' into wip/layout-v0-vmanual
santoshkumarradha Oct 2, 2026
040d2cc
Merge branch 'wip/layout-v0' into wip/layout-v0-vflip
santoshkumarradha Oct 2, 2026
6323e7c
Merge branch 'wip/layout-v0' into wip/layout-v0-vreds
santoshkumarradha Oct 2, 2026
b449e26
Retire the engine's stale session of a chat before taking it back
santoshkumarradha Oct 2, 2026
ddda29c
A computer that was only started counts as unused again
santoshkumarradha Oct 2, 2026
8bc74b7
A pair link typed into a chat box opens the approve screen instead of…
santoshkumarradha Oct 2, 2026
afc6a6d
A computer that quit after only starting stays unused: commands in th…
santoshkumarradha Oct 2, 2026
39cb27e
A stopped computer's device list says it was stopped instead of waiti…
santoshkumarradha Oct 2, 2026
6a66e6e
A graph file that is not a database counts as use
santoshkumarradha Oct 2, 2026
abc4f98
Add the change entry for two computers pairing and continuing a chat
santoshkumarradha Oct 2, 2026
dcb0273
Merge branches 'wip/layout-v0-vtui-1' and 'wip/layout-v0-vtui-2' into…
santoshkumarradha Oct 2, 2026
ec225fe
Merge branch 'wip/layout-v0' into wip/layout-v0-vtui
santoshkumarradha Oct 2, 2026
c859fb8
A home that has only been started also counts the provider facts and …
santoshkumarradha Oct 2, 2026
ec6dbd5
Send the typed sentence on the first enter over a card that arrived w…
santoshkumarradha Oct 2, 2026
b561fc2
A chat that was moved back opens with a drive side of its own, not th…
santoshkumarradha Oct 2, 2026
5ee4866
A chat opened again reuses its drive side only while that drive side …
santoshkumarradha Oct 2, 2026
f120d73
A person can name a device: at pairing, from the device list, or from…
santoshkumarradha Oct 2, 2026
06d3e85
Merge branch 'wip/layout-v0' into wip/layout-v0-vdevname
santoshkumarradha Oct 2, 2026
56cd45b
Cells are on by default so a paired install moves chats with no setting
santoshkumarradha Oct 2, 2026
a2c9f30
Merge branch 'wip/layout-v0' into wip/layout-v0-vtui
santoshkumarradha Oct 2, 2026
77ae222
Merge branch 'wip/layout-v0' into wip/layout-v0-vcells
santoshkumarradha Oct 2, 2026
c07b8e9
Every end-to-end suite and rig takes its relay from the one setting, …
santoshkumarradha Oct 2, 2026
2522850
Hosted validation rig pairs through the link and check number
santoshkumarradha Oct 2, 2026
06151c1
Merge branch 'wip/layout-v0-vfix2-1' into wip/layout-v0-vfix2
santoshkumarradha Oct 2, 2026
f37cbbf
Every device label drops the host-name suffix, and an open device lis…
santoshkumarradha Oct 2, 2026
80e0faa
Ping every 10 s, declare the beat on every watch dial and redial at o…
santoshkumarradha Oct 2, 2026
b47d08b
A watch socket counts as online only while its pings keep coming
santoshkumarradha Oct 2, 2026
722297d
Judge presence by the sign of life: a device is online only while a s…
santoshkumarradha Oct 2, 2026
434a844
Merge branches 'wip/layout-v0-vpresence-1', 'wip/layout-v0-vpresence-…
santoshkumarradha Oct 2, 2026
b6436be
Change entry: chats move by default and a computer can be named
santoshkumarradha Oct 2, 2026
615cb72
Merge branch 'wip/layout-v0' into wip/layout-v0-vchange
santoshkumarradha Oct 2, 2026
ea7b054
Prove a frozen device shows offline within 30 s on a live relay, and …
santoshkumarradha Oct 2, 2026
cb42ee5
Durability suite reaps a frozen holder before cleanup and states kill…
santoshkumarradha Oct 2, 2026
458f02b
Merge branch 'wip/layout-v0' into wip/layout-v0-vpresence
santoshkumarradha Oct 2, 2026
f46e3aa
Merge branch 'wip/layout-v0' into wip/layout-v0-vdur
santoshkumarradha Oct 2, 2026
978eb82
The two-machine rig reads the pairing code that the pair command prin…
santoshkumarradha Oct 2, 2026
eb4473d
The move rigs name the two computers they pair, so a device list tell…
santoshkumarradha Oct 2, 2026
36890e3
The fidelity rig waits for the newest sealed turn at every poll, beca…
santoshkumarradha Oct 2, 2026
a8039c5
A fallback list naming only the failing model is a pin: no guessed mo…
santoshkumarradha Oct 2, 2026
4212fa8
Keep a cell's task folders in .cell/tasks so a moved chat's journals …
santoshkumarradha Oct 2, 2026
19b693d
Manual: task journals move whole with the chat; only job logs and sav…
santoshkumarradha Oct 2, 2026
3fb85e8
Merge the trunk's link pairing flow for the two-machine rig and keep …
santoshkumarradha Oct 2, 2026
c3e7d30
Merge branch 'wip/layout-v0' into wip/layout-v0-vbench2
santoshkumarradha Oct 2, 2026
48ba20a
A chat is not opened while it is being taken over here
santoshkumarradha Oct 2, 2026
66d224e
The manual explains the arriving-chat sentence
santoshkumarradha Oct 2, 2026
f3a66ec
Merge branch 'wip/layout-v0' into wip/layout-v0-vjournal
santoshkumarradha Oct 2, 2026
eb2f31f
Merge branch 'wip/layout-v0' into wip/layout-v0-vtakeback
santoshkumarradha Oct 2, 2026
9b39d8a
A code that burns is never followed by a mailbox under the same plate…
santoshkumarradha Oct 3, 2026
c126525
Change entry 1738: frozen computers show offline, task journals move …
santoshkumarradha Oct 3, 2026
a34fb31
A task copy's own machinery folder is not carried as the person's fil…
santoshkumarradha Oct 3, 2026
99a9c62
Make the pairing rows in the command list verb-first and list the lin…
santoshkumarradha Oct 3, 2026
2a2388a
Merge branch 'wip/layout-v0' into wip/layout-v0-vrelayflip-b
santoshkumarradha Oct 3, 2026
eab2656
Say offline the same way everywhere, name the chat being continued, a…
santoshkumarradha Oct 3, 2026
a6a4704
Make the join request and device list say what works and what happened
santoshkumarradha Oct 3, 2026
ca3e5b5
Merge branch 'wip/layout-v0-uxslash' into wip/layout-v0-uxpair
santoshkumarradha Oct 3, 2026
44d8854
Merge branch 'wip/layout-v0-uxmove' into wip/layout-v0-uxpair
santoshkumarradha Oct 3, 2026
9a0b73f
Pair, not fleet: one vocabulary for the join request and its news
santoshkumarradha Oct 3, 2026
dcf429a
Merge branch 'wip/layout-v0' into wip/layout-v0-vdocs
santoshkumarradha Oct 3, 2026
7d009cb
Polish the terminal side of pairing and the device list
santoshkumarradha Oct 3, 2026
fca0045
Change entry 1738: an arriving chat says so, a wrong pairing code say…
santoshkumarradha Oct 3, 2026
444eda3
Change entry 1738: a burned code may also end as stopped pairing
santoshkumarradha Oct 3, 2026
fed18fa
Merge branch 'wip/layout-v0' into wip/layout-v0-uxslash
santoshkumarradha Oct 3, 2026
00a7ae9
Merge branch 'wip/layout-v0-uxpair' into wip/layout-v0-uxsweep
santoshkumarradha Oct 3, 2026
e4de174
Merge branch 'wip/layout-v0' into wip/layout-v0-vstray
santoshkumarradha Oct 3, 2026
6d26111
A model the person picked is never replaced by a catalog guess when i…
santoshkumarradha Oct 3, 2026
3675040
Merge uxpair and uxcli, and align pairing wording across chat, CLI an…
santoshkumarradha Oct 3, 2026
925f85a
Merge branch 'wip/layout-v0' into wip/layout-v0-vdocs
santoshkumarradha Oct 3, 2026
b02c9b5
Merge branch 'wip/layout-v0' into wip/layout-v0-vpinrole
santoshkumarradha Oct 3, 2026
c8c9032
Merge branch 'wip/layout-v0' into wip/layout-v0-uxsweep
santoshkumarradha Oct 3, 2026
c978d36
Change entry 1738: picked models hold, task logs stay behind
santoshkumarradha Oct 3, 2026
593a25e
Merge branch 'wip/layout-v0' into wip/layout-v0-vdocs
santoshkumarradha Oct 3, 2026
fd4c538
Hold freed pairing nameplates back and fence mailboxes by generation
santoshkumarradha Oct 3, 2026
08559ea
Fold the relay note into the pairing change entry
santoshkumarradha Oct 3, 2026
46350a6
Stop the engine daemons a test run starts, and seal inherited descrip…
santoshkumarradha Oct 3, 2026
64ca3d8
Fold the test-daemon note into the pairing change entry
santoshkumarradha Oct 3, 2026
bae612d
Merge branch 'wip/layout-v0' of github.com:Agent-Field/CodeAF into wi…
santoshkumarradha Oct 3, 2026
605cef9
Hosted relay: 200 new identities a day per network, IPv6 counted by /…
santoshkumarradha Oct 3, 2026
7c29cb7
fix(vaultsync): confine restored files and tombstones to opened roots
santoshkumarradha Oct 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .github/workflows/ci-full.yml
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,11 @@ jobs:
with:
go-version-file: go.mod
cache: true
- name: Build furrow from engine/
working-directory: engine
run: |
rustup show active-toolchain || rustup toolchain install
cargo build --release --locked -p furrow-cli
- name: Weigh the binary
run: |
set -euo pipefail
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,11 @@ jobs:
with:
go-version-file: go.mod
cache: true
- name: Build furrow from engine/
working-directory: engine
run: |
rustup show active-toolchain || rustup toolchain install
cargo build --release --locked -p furrow-cli

# Several sessions work this tree at once and a half-finished file breaks
# the build for everyone. This is the cheapest way to find that out, and
Expand Down
9 changes: 9 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,11 @@ jobs:
with:
go-version-file: go.mod
cache: true
- name: Build furrow from engine/
working-directory: engine
run: |
rustup show active-toolchain || rustup toolchain install
cargo build --release --locked -p furrow-cli
- name: Build all targets with their furrow
env:
TAG: ${{ needs.prepare.outputs.tag }}
Expand All @@ -236,6 +241,10 @@ jobs:
if [ "$goos" = "windows" ]; then
rm -f internal/furrowbin/cache/furrow-*.gz
extension=".exe"
elif [ "$goos/$goarch" = "linux/amd64" ]; then
# The runner's own platform is the one furrow is built for here.
env -u GOOS -u GOARCH go run ./internal/furrowbin/cmd/fetch \
-goos "$goos" -goarch "$goarch" -built engine/target/release/furrow
else
env -u GOOS -u GOARCH go run ./internal/furrowbin/cmd/fetch \
-goos "$goos" -goarch "$goarch"
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,7 @@ internal/manual/pages.pack.gz
.furrow/
bench/idle-surface/runs/
work/

# hosted relay dev install (wrangler, miniflare)
relay/hosted/node_modules
relay/hosted/.wrangler/
21 changes: 19 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# anywhere else — so a stale copy can't shadow a fresh one.
BINARY := bin/codeaf

.PHONY: all build build-check build-cross debug demo-home clean-run embed manual-pack-law furrow test test-focus test-report test-quick test-tooling test-touched test-touched-preflight pr-ready test-laws fmt-check test-packed-manual manual-gates test-remote test-e2e test-e2e-tui vet check size clean \
.PHONY: all build build-check build-cross debug demo-home clean-run embed manual-pack-law furrow furrow-fetch furrow-source test test-focus test-report test-quick test-tooling test-touched test-touched-preflight pr-ready test-laws fmt-check test-packed-manual manual-gates test-remote test-e2e test-e2e-tui vet check size clean \
changelog changelog-new changelog-check changelog-preview

# What the shipped binary is allowed to weigh, in bytes, checked in beside the
Expand Down Expand Up @@ -72,11 +72,28 @@ embed: manual-pack-law
FURROW_GOOS := $(shell go env GOOS)
FURROW_GOARCH := $(shell go env GOARCH)

furrow:
# WHERE THE FURROW COMES FROM. engine/ is furrow's source, so a machine with
# cargo builds it and embeds exactly that. The pinned release is the road for
# everyone else: a machine without cargo, a cross-compile (cargo here builds for
# the host only), or an explicit FURROW_ARTIFACT. Force it with FURROW_FROM=fetch
# or FURROW_FROM=source.
FURROW_HOST := $(shell go env GOHOSTOS)-$(shell go env GOHOSTARCH)
FURROW_NATIVE := $(and $(shell command -v cargo),$(filter $(FURROW_HOST),$(FURROW_GOOS)-$(FURROW_GOARCH)),$(if $(FURROW_ARTIFACT),,yes))
FURROW_FROM ?= $(if $(FURROW_NATIVE),source,fetch)
FURROW_BIN := engine/target/release/furrow

furrow: furrow-$(FURROW_FROM)

furrow-fetch:
@env -u GOOS -u GOARCH go run ./internal/furrowbin/cmd/fetch \
-goos=$(FURROW_GOOS) -goarch=$(FURROW_GOARCH) \
$(if $(FURROW_ARTIFACT),-from "$(FURROW_ARTIFACT)")

furrow-source:
cd engine && cargo build --release --locked -p furrow-cli
@env -u GOOS -u GOARCH go run ./internal/furrowbin/cmd/fetch \
-goos=$(FURROW_GOOS) -goarch=$(FURROW_GOARCH) -built $(FURROW_BIN)

# The symbol table and DWARF are a third of the shipped binary and nothing at
# runtime reads them. Stripping costs symbolized panic traces, which is exactly
# what `debug` keeps — build that when a stack trace is what you need.
Expand Down
23 changes: 23 additions & 0 deletions THIRD-PARTY-NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -809,6 +809,29 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```

## github.com/coder/websocket

- Version: v1.8.15
- Licence: not determined

### LICENSE.txt

```text
Copyright (c) 2025 Coder

Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
```

## github.com/dlclark/regexp2/v2

- Version: v2.5.2
Expand Down
232 changes: 232 additions & 0 deletions cmd/codeaf/approvals.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
package main

// The chat's door onto answering new devices and keeping the device list: what
// the approve screen and `/devices` reach through tui3.Approvals. It is the
// same Approver and signed directory `codeaf pair approve` uses, pointed at
// this computer's home, so the terminal and the app cannot disagree.

import (
"context"
"errors"
"sort"
"strings"
"sync"
"time"

"github.com/Agent-Field/codeaf/internal/cellsync"
"github.com/Agent-Field/codeaf/internal/devname"
"github.com/Agent-Field/codeaf/internal/directory"
"github.com/Agent-Field/codeaf/internal/identity"
"github.com/Agent-Field/codeaf/internal/pair"
"github.com/Agent-Field/codeaf/internal/tui3"
)

// approvalsDoor is the surface's tui3.Approvals.
type approvalsDoor struct {
dir string
mailbox func(relayFlag string) (pair.Mailbox, error)
approver func(pair.Mailbox) (pair.Approver, error)

mu sync.Mutex
asking map[string]pair.Asking // by code: what Pending read, for the answer
}

var _ tui3.Approvals = (*approvalsDoor)(nil)

func newApprovalsDoor(dir string) *approvalsDoor {
return &approvalsDoor{dir: dir, mailbox: pairMailbox, approver: linkApprover(dir), asking: map[string]pair.Asking{}}
}

// toldLine is a refusal said in the sentence every sync surface uses for it, and
// it still is the refusal for errors.Is.
type toldLine struct {
line string
err error
}

func (e toldLine) Error() string { return e.line }
func (e toldLine) Unwrap() error { return e.err }

// told puts the relay's refusals (a stopped computer, a clock that is off) in
// the words a person reads, so a screen that lists devices says why it cannot,
// and the sentence is the one the chat list and the sync notice already say.
// Anything that is not a refusal is returned as it came.
func told(err error) error {
if refusal, ok := cellsync.RefusalOf(err); ok {
return toldLine{line: refusal.Say(err), err: err}
}
return err
}

func (d *approvalsDoor) who() (pair.Approver, error) {
route, err := d.mailbox("")
if err != nil {
return pair.Approver{}, err
}
return d.approver(route)
}

func (d *approvalsDoor) Pending(ctx context.Context, typed string) (tui3.PendingDevice, error) {
ref, err := pair.ReadLink(typed)
if err != nil {
return tui3.PendingDevice{}, err
}
who, err := d.who()
if err != nil {
return tui3.PendingDevice{}, err
}
as, err := who.Look(ctx, ref)
if err != nil {
return tui3.PendingDevice{}, told(err)
}
d.remember(as)
return pendingOf(as), nil
}

func pendingOf(as pair.Asking) tui3.PendingDevice {
return tui3.PendingDevice{
Code: as.Ref.Code, Device: as.DeviceID(), Name: as.Name, Platform: as.Platform,
Check: as.Check, RequestedAt: as.RequestedAt, ExpiresAt: as.ExpiresAt,
}
}

func (d *approvalsDoor) remember(as pair.Asking) {
d.mu.Lock()
defer d.mu.Unlock()
d.asking[as.Ref.Code] = as
}

func (d *approvalsDoor) recall(p tui3.PendingDevice) (pair.Asking, error) {
d.mu.Lock()
defer d.mu.Unlock()
as, ok := d.asking[p.Code]
if !ok {
return pair.Asking{}, pair.ErrLinkGone
}
return as, nil
}

func (d *approvalsDoor) Approve(ctx context.Context, p tui3.PendingDevice) error {
return d.answer(p, func(who pair.Approver, as pair.Asking) error {
return errors.Join(who.Approve(ctx, as), identity.EndSolo(d.dir))
})
}

func (d *approvalsDoor) Deny(ctx context.Context, p tui3.PendingDevice) error {
return d.answer(p, func(who pair.Approver, as pair.Asking) error { return who.Deny(ctx, as) })
}

// answer runs one decision on the request Pending read, and forgets it after.
func (d *approvalsDoor) answer(p tui3.PendingDevice, decide func(pair.Approver, pair.Asking) error) error {
as, err := d.recall(p)
if err != nil {
return err
}
who, err := d.who()
if err != nil {
return err
}
if err := decide(who, as); err != nil {
return told(err)
}
d.forget(p.Code)
return nil
}

func (d *approvalsDoor) forget(code string) {
d.mu.Lock()
defer d.mu.Unlock()
delete(d.asking, code)
}

// home is this computer's signed directory, its identity and its device id.
func (d *approvalsDoor) home() (directory.Client, identity.Identity, string, error) {
route, err := d.mailbox("")
if err != nil {
return nil, identity.Identity{}, "", err
}
client, id, err := homeDirectory(d.dir, route)
if err != nil {
return nil, id, "", err
}
dev, err := identity.Device(d.dir)
return client, id, dev.ID(), err
}

func (d *approvalsDoor) Devices(ctx context.Context) ([]tui3.DeviceRow, error) {
client, id, self, err := d.home()
if err != nil {
return nil, err
}
listing, err := client.List(ctx)
if err != nil {
return nil, told(err)
}
rows := rowsOf(listing, directory.MetadataKey(id.CellKey()), self)
if own, named := devname.Chosen(d.dir); named {
rows = withOwnName(rows, own)
}
return rows, nil
}

// withOwnName puts this computer's own name on its own row. The directory holds
// the name this computer last managed to tell it, which is the old one for a
// person who renamed offline; the name kept here is the one they typed.
func withOwnName(rows []tui3.DeviceRow, own string) []tui3.DeviceRow {
for i := range rows {
if rows[i].Self {
rows[i].Name = own
}
}
return rows
}

func rowsOf(l directory.Listing, key []byte, self string) []tui3.DeviceRow {
rows := make([]tui3.DeviceRow, 0, len(l.Devices))
for id, dev := range l.Devices {
rows = append(rows, rowOf(id, dev, key, self))
}
sort.Slice(rows, func(i, j int) bool {
return rows[i].Name < rows[j].Name || (rows[i].Name == rows[j].Name && rows[i].ID < rows[j].ID)
})
return rows
}

func rowOf(id string, dev directory.Device, key []byte, self string) tui3.DeviceRow {
row := tui3.DeviceRow{ID: id, Name: openName(key, dev.Name), Platform: dev.Platform, Self: id == self, Revoked: dev.Revoked}
if dev.LastSeen > 0 {
row.LastSeen = time.UnixMilli(dev.LastSeen)
}
return row
}

// openName is a sealed name in words, and "a device" when it cannot be opened.
func openName(key []byte, sealed string) string {
if name, err := directory.OpenName(key, sealed); err == nil && strings.TrimSpace(name) != "" {
return devname.Shown(name)
}
return "a device"
}

func (d *approvalsDoor) Revoke(ctx context.Context, id string) error {
client, _, _, err := d.home()
if err != nil {
return err
}
return told(client.Revoke(ctx, id))
}

func (d *approvalsDoor) DeviceName(sealed string) string {
id, err := identity.Load(d.dir)
if err != nil {
return "a new device"
}
return openName(directory.MetadataKey(id.CellKey()), sealed)
}

// Rename names this computer. It is the door's one write of its own record: the
// same function `codeaf devices rename` runs, so the two cannot say different
// things.
func (d *approvalsDoor) Rename(ctx context.Context, typed string) (string, error) {
return renameThisDevice(ctx, d.dir, typed)
}
Loading