Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
0ac4fa6
ci: gate pull requests into and pushes to workstreams/main
AbirAbbas Nov 3, 2026
c767483
app: workstream wire contract v0 (types, handlers, not-yet stubs) (#2…
AbirAbbas Nov 3, 2026
f4078a9
app: workstream pages render from editor JSON to markdown (pagedoc) (…
AbirAbbas Nov 3, 2026
d7456f8
app: workstream store (schema 3, factory_job refs, all 25 methods ser…
AbirAbbas Nov 3, 2026
7232f12
tests: workstream methods keep the wire contract's shapes (conformanc…
AbirAbbas Nov 3, 2026
1870bce
Merge app/v3 into workstreams/main
AbirAbbas Nov 3, 2026
dd749e1
app: workstream pages read by version, restorable delete, Spec/Decisi…
AbirAbbas Nov 3, 2026
4dcd515
app: workstream agent prompt and tools (proposals, drafts, its own pa…
AbirAbbas Nov 3, 2026
c54b647
ci: cmd/codeaf finishes inside its touched leg (busy case 200 ms, cod…
AbirAbbas Nov 3, 2026
c1b540d
app: workstreams wire v0.2: draft size/budget/source, page sources, r…
AbirAbbas Nov 3, 2026
b79efbf
workstreams: the database refuses deleting a workstream's collection;…
AbirAbbas Nov 3, 2026
5cc5a28
workstreams: size limits on plans, pages and records; agent Spec/Deci…
AbirAbbas Nov 3, 2026
4a9bdd3
Merge app/v3 into workstreams/main
AbirAbbas Nov 3, 2026
f5bf32e
workstreams: a job's spend counts its earlier runs
AbirAbbas Nov 3, 2026
14c3f0a
workstreams: the earlier-runs spend test names its agent spend as a f…
AbirAbbas Nov 3, 2026
27a989e
workstreams: the watching agent (morning and job-event wakes, undoabl…
AbirAbbas Nov 3, 2026
d33dfff
workstreams: sources (file, repo, issue, link, kept), wire v0.4, sche…
AbirAbbas Nov 3, 2026
e75aa1f
app: workstream suggested edits (wire v0.5: suggestion.list/keep/drop…
AbirAbbas Nov 3, 2026
cf3074c
Merge app/v3 into workstreams/main
AbirAbbas Nov 3, 2026
e9a571c
Client tools: a client attaches tools to a conversation; collection-h…
AbirAbbas Nov 3, 2026
fe68c7d
app: the engine keeps only the generic pieces of the Workstreams plan…
AbirAbbas Nov 3, 2026
4b1bb03
A blank conversation a collection holds is kept, never resumed, and s…
AbirAbbas Nov 4, 2026
211c968
Merge app/v3 into workstreams/main
AbirAbbas Nov 4, 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
9 changes: 8 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,14 @@ on:
branches:
- dev
- santos/dev2
- workstreams/main
# Also on the push, because a merge of two individually-green branches can
# still be red, and the merge is exactly the moment nobody is watching.
push:
branches:
- dev
- santos/dev2
- workstreams/main
workflow_dispatch:

permissions:
Expand Down Expand Up @@ -323,7 +325,12 @@ jobs:
# -p 2 permits concurrent compilation/testing in rest on the public
# 4-vCPU / 16-GB runner, leaving headroom for the linker. tui3 and
# session use four shards; codeaf runs its suite without sharding.
./scripts/touched-verdict.sh run --base "$BASE" --shards 4 --report "$TMPDIR/$LEG.json" $PACKAGES
# CODEAF'S ONE TEST BINARY GETS 25 MINUTES, AND ONLY IT. Sharding cmd/codeaf
# was tried and its sharded runs failed (#1734), and its serial suite measured
# 1065 s (17.8 min) on this runner on 2026-11-03, over the Makefile's 15m, so
# every test after the cut went unchecked. The other legs pass no --timeout and
# keep the Makefile's 15m. Drop this once the suite is back under 15 minutes.
./scripts/touched-verdict.sh run --base "$BASE" --shards 4 ${{ matrix.leg == 'codeaf' && '--timeout 25m' || '' }} --report "$TMPDIR/$LEG.json" $PACKAGES
- uses: actions/upload-artifact@v4
if: always()
with:
Expand Down
11 changes: 9 additions & 2 deletions cmd/codeaf/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ func runApp(args []string) error {
// ONE SUPERVISOR FOR EVERY CONVERSATION THE APP BUILDS (appservices.go).
services := openAppServices()
appServiceDoor.Store(services)
appClientToolsBackend.Store(backend)
backend.attachServices(services)
guard.Go("app/crews-start", func() { backend.crews() })
// THE APP IS AN OPEN WINDOW for as long as it runs, so the clock that runs
Expand Down Expand Up @@ -552,6 +553,7 @@ func appConnOf(client *remote.Client, release func(), assembled bool) *appConn {

// appBackend is the [appwire.Engine] over this process's conversations.
type appBackend struct {
clientTools appClientTools
pluginPauses map[string]appPluginPause
pluginOllama appPluginOllama
pluginAuth map[string]*appPluginAttempt
Expand Down Expand Up @@ -746,6 +748,7 @@ type appBackend struct {
collections *workspace.Store
collectionsClosed bool
collectionsPath string
collectionFactory collectionFactory
// services is the app's one supervisor of kept-running processes
// (appservices.go); nil is the capability absent.
services *appServices
Expand Down Expand Up @@ -1251,10 +1254,12 @@ func appRowOnDisk(id string) (session.SessionRow, bool) {
// A folder minted and never spoken in is still a conversation the app
// may have created; its meta names the workspace.
meta, err := session.LoadMeta(dir)
if err != nil || strings.TrimSpace(meta.ID) == "" {
if err != nil || meta.ID != id {
continue
}
return session.SessionRow{ID: id, AgentDID: meta.AgentDID(), Dir: dir, Transcript: transcript, Title: meta.Title, Workspace: meta.Workspace, Created: meta.Created}, true
return session.SessionRow{ID: id, AgentDID: meta.AgentDID(), Dir: dir, Transcript: transcript,
Title: meta.Title, Workspace: meta.Workspace, Owned: meta.Owned, Model: meta.Model,
Archived: meta.Archived, Spend: meta.SpentUSD, At: meta.Created, Created: meta.Created}, true
}
return session.SessionRow{}, false
}
Expand Down Expand Up @@ -4494,6 +4499,8 @@ func (b *appBackend) Close() error {
if b.leaving != nil {
b.leaving()
}
b.clientTools.disconnect()
appClientToolsBackend.CompareAndSwap(b, nil)
already := false
var crews *appCrewRun
var agents []*appAgent
Expand Down
2 changes: 1 addition & 1 deletion cmd/codeaf/appblank.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ func (b *appBackend) reapBlank(a *appAgent) bool {
}
gone := false
_ = teamstore.InspectConversation(b.crewProfile(), transcript, func(referenced bool) error {
if referenced || session.InUse(transcript) || !v3EmptyUnassignedSession(dir) {
if referenced || session.InUse(transcript) || !v3EmptyUnassignedSession(dir) || collectionKeepsConversation(dir) {
return nil
}
gone = os.RemoveAll(dir) == nil
Expand Down
Loading
Loading