Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
492 commits
Select commit Hold shift + click to select a range
618631e
fix(server): clean abandoned conversation summaries
ScriptedAlchemy Oct 23, 2026
b9746a3
feat(mobile): view cited conversation summaries
ScriptedAlchemy Oct 23, 2026
110c8d5
fix(server): code queries work under node --watch and stay out of git…
ScriptedAlchemy Oct 23, 2026
289235a
fix(memory): deduplicate attribution and make attach previews readable
ScriptedAlchemy Oct 23, 2026
d3b707c
fix(server): Loom reads stay bounded and keep marker-only lanes
ScriptedAlchemy Oct 23, 2026
8175dcf
fix(server): Loom test markers skip listing, build and help modes
ScriptedAlchemy Oct 23, 2026
8524779
fix(web): Loom pages the default window and draws unknown starts hone…
ScriptedAlchemy Oct 23, 2026
0927229
fix(web): Loom entries open the active environment and need its support
ScriptedAlchemy Oct 23, 2026
7d2e720
fix(web): Loom Fit frames the activity and edge markers draw whole
ScriptedAlchemy Oct 23, 2026
5f774d0
fix(server): symbol search leaves out import statements
ScriptedAlchemy Oct 23, 2026
d53da00
feat(contracts): Loom windows carry per-run activity ticks
ScriptedAlchemy Oct 23, 2026
8a56240
feat(web): Loom field geometry for lifelines, activity ticks and the …
ScriptedAlchemy Oct 23, 2026
98d9f44
feat(server): read compact loom run activity
ScriptedAlchemy Oct 23, 2026
209a887
fix(server): Loom activity ticks outside the window no longer use up …
ScriptedAlchemy Oct 23, 2026
4e5e310
refactor(web): Loom weave model groups threads into workstreams
ScriptedAlchemy Oct 23, 2026
50652fd
feat(web): Loom spindle and branch geometry
ScriptedAlchemy Oct 23, 2026
6c2b9ed
Merge branch 'loom-server-activity' into loom-visual-field
ScriptedAlchemy Oct 23, 2026
1658c9f
feat(web): Loom weave geometry fits real workstreams
ScriptedAlchemy Oct 23, 2026
f6ca686
refactor(web): Loom view gestures move into a shared hook
ScriptedAlchemy Oct 23, 2026
7102699
feat(web): Loom draws the weave in Workstream and Agent modes
ScriptedAlchemy Oct 23, 2026
fe86cc3
fix(checks): run native binding tests with Node
ScriptedAlchemy Oct 23, 2026
3e2c9dd
fix(web): Loom packs Agent lanes like a Gantt chart and frames each m…
ScriptedAlchemy Oct 23, 2026
575ff86
fix(web): Loom weave labels and count badges stop covering what they …
ScriptedAlchemy Oct 23, 2026
d0b30ed
Merge branch 'tracedecay-pr-check' into loom-visual-field
ScriptedAlchemy Oct 23, 2026
5acc118
fix(server): bind knowledge delivery to native conversations
ScriptedAlchemy Oct 23, 2026
d4e6860
chore(web): Loom keeps module-local layout constants unexported
ScriptedAlchemy Oct 23, 2026
e4c5b67
fix(server): revalidate retained knowledge source excerpts
ScriptedAlchemy Oct 23, 2026
9b6edfa
test(server): reproduce blocking cold code intelligence queries
ScriptedAlchemy Oct 23, 2026
2512b7a
fix(server): model maintenance effects run on their own worker so the…
ScriptedAlchemy Oct 23, 2026
df13ff8
fix(server): keep thread titles out of heavy maintenance queue
ScriptedAlchemy Oct 23, 2026
9c19f63
fix(server): exclude rolled-back knowledge sources and deleted projects
ScriptedAlchemy Oct 23, 2026
9d1f9b1
Merge branch 't3/independent-assisted-learning-lane' into loom-visual…
ScriptedAlchemy Oct 23, 2026
6bc225f
Merge branch 't3/project-intelligence-source-removal' into loom-visua…
ScriptedAlchemy Oct 23, 2026
c988846
fix(server): keep knowledge retries behind native delivery receipts
ScriptedAlchemy Oct 23, 2026
5ac7a17
Merge branch 't3/bind-knowledge-delivery' into loom-visual-field
ScriptedAlchemy Oct 23, 2026
a122914
fix(knowledge): record context omissions and delivery budgets
ScriptedAlchemy Oct 23, 2026
d907eec
fix(server): effect daemon workers use a named Effect.fn and the lane…
ScriptedAlchemy Oct 23, 2026
6ce3851
test(desktop): identify the primary probe by its executable
ScriptedAlchemy Oct 23, 2026
9e4fd93
fix(server): remove the unused daemon layer
ScriptedAlchemy Oct 23, 2026
2062851
fix(tooling): audit mobile Metro config without executing generators
ScriptedAlchemy Oct 23, 2026
ab03bd0
fix(scripts): build project-memory before changed server tests
ScriptedAlchemy Oct 23, 2026
69b42f6
fix(mobile): defer generated assets until Metro bundles
ScriptedAlchemy Oct 23, 2026
aa71e9f
fix(scripts): use installed test API in changed-check regression
ScriptedAlchemy Oct 23, 2026
68e1696
fix(server): include delivery budget in preview migration expectations
ScriptedAlchemy Oct 23, 2026
3901cfe
fix(server): inject startup test read failures at execution boundary
ScriptedAlchemy Oct 23, 2026
5ed5061
feat(server): serve code queries from a published index generation
ScriptedAlchemy Oct 23, 2026
f9d68d2
feat(server): report successor builds and failed refreshes of the cod…
ScriptedAlchemy Oct 23, 2026
c23dfd4
feat(server): refresh the code index after each checkpoint, coalesced…
ScriptedAlchemy Oct 23, 2026
4ce29c0
feat(server): delete retired code index generations after their last …
ScriptedAlchemy Oct 23, 2026
7a49d96
Merge branch 't3/serve-published-index-generations' into loom-visual-…
ScriptedAlchemy Oct 23, 2026
c894280
fix(client-runtime): refresh code panels on index events
ScriptedAlchemy Oct 23, 2026
8f85047
fix(server): scrub knowledge receipts when cited sources are removed
ScriptedAlchemy Oct 24, 2026
d948d16
Merge branch 't3/eager-receipt-scrub' into loom-visual-field
ScriptedAlchemy Oct 24, 2026
93fb7f5
test(server): hold code index builds at a seam instead of racing the …
ScriptedAlchemy Oct 24, 2026
473321b
fix(server): coordinate code index builds and readers across server p…
ScriptedAlchemy Oct 24, 2026
95decf7
Merge branch 't3/index-cross-process' into loom-visual-field
ScriptedAlchemy Oct 24, 2026
b4dd114
feat(client-runtime): match projects before a cross-environment launch
cursoragent Oct 24, 2026
1ca7bda
feat(server): agents can launch a thread on a connected environment
cursoragent Oct 24, 2026
e1929f3
refactor(server): drop cross-environment narration
cursoragent Oct 24, 2026
a1aa098
fix(server): name the cross-environment wait span
cursoragent Oct 24, 2026
640e25d
refactor: remove comments that restate cross-environment types
cursoragent Oct 24, 2026
fbb2a56
merge: integrate upstream main into fork
ScriptedAlchemy Oct 25, 2026
ebb22a8
fix: audit memory provenance, indexing, and Loom integration
ScriptedAlchemy Oct 25, 2026
8c13016
fix: audit cross-environment launch ownership and cancellation
ScriptedAlchemy Oct 25, 2026
b9ea3ea
fix: complete durable launches and consolidate release migrations
ScriptedAlchemy Oct 25, 2026
05e96c9
feat: merge upstream peer environment stack into project intelligence
ScriptedAlchemy Oct 25, 2026
2cc2848
test: align upstream retry fixtures with current fork checks
ScriptedAlchemy Oct 25, 2026
df9d210
test(peer): observe the active client before asserting offline recovery
ScriptedAlchemy Oct 25, 2026
7d392f6
fix: build remote environment support on the upstream peer stack
ScriptedAlchemy Oct 25, 2026
cdb1d81
fix(peer): use the public JSON schema constructor
ScriptedAlchemy Oct 25, 2026
68bff08
fix(ci): let canceled fork workflows finish
ScriptedAlchemy Oct 25, 2026
7ec8fed
fix(server): preserve worker wakeups and repair replay fixtures
ScriptedAlchemy Oct 25, 2026
3212b5b
fix(peer): harden upstream remote environments and task retries (#5)
ScriptedAlchemy Oct 25, 2026
cdd4437
feat(peer): integrate upstream environment stack (#6)
ScriptedAlchemy Oct 25, 2026
09b5719
feat: ship project intelligence and upstream peer environments (#4)
ScriptedAlchemy Oct 25, 2026
41e63e0
Merge upstream pingdotgg/t3code main into fork main
ScriptedAlchemy Oct 25, 2026
c8d0247
Merge upstream pingdotgg/t3code main into fork main
ScriptedAlchemy Oct 25, 2026
e48798a
feat: bundle pstack and run it the same way in every provider (#8)
ScriptedAlchemy Oct 26, 2026
428cc0e
feat(web): @-mention a provider or model to switch to it
ScriptedAlchemy Oct 26, 2026
f05f838
fix(desktop): pstack works in packaged desktop builds (#12)
ScriptedAlchemy Oct 26, 2026
ef8d0aa
feat(mobile): @-mention a model to switch to it
ScriptedAlchemy Oct 26, 2026
96079ec
test(server): fix the server CI shards that fail on fork main (#10)
ScriptedAlchemy Oct 26, 2026
09ac994
docs: plainer comments for model mentions
ScriptedAlchemy Oct 26, 2026
f62ddaf
Merge upstream pingdotgg/t3code main into fork main
ScriptedAlchemy Oct 26, 2026
fe35be0
fix: preserve model mention cursor and reject empty searches
ScriptedAlchemy Oct 26, 2026
0907625
fix(server): list iOS simulators before their first boot (#14)
ScriptedAlchemy Oct 26, 2026
cfc63dc
fix(desktop): packaged code index finds its tree-sitter parser
ScriptedAlchemy Oct 26, 2026
ffde3a2
chore: merge upstream main into fork
ScriptedAlchemy Oct 26, 2026
c8c9033
fix(device): report incomplete iOS simulator discovery
ScriptedAlchemy Oct 26, 2026
e1daaf5
Merge remote-tracking branch 'origin/main' into fix/ios-device-discov…
ScriptedAlchemy Oct 26, 2026
f926d10
chore: merge main into composer model mentions
ScriptedAlchemy Oct 26, 2026
6b51515
fix(mobile): keep project memory outside the text editor
ScriptedAlchemy Oct 26, 2026
ac59ad5
fix(server): exclude exhausted providers from delegation
ScriptedAlchemy Oct 26, 2026
636dc9e
fix(mobile): exclude unusable providers from model mentions
ScriptedAlchemy Oct 26, 2026
33adbca
fix(device): preserve discovery warnings after SSH probe failures
ScriptedAlchemy Oct 26, 2026
272f56e
fix(server): recheck availability before starting delegated work
ScriptedAlchemy Oct 26, 2026
fd9fd2e
Merge pull request #11 from ScriptedAlchemy/feat/composer-model-mentions
ScriptedAlchemy Oct 27, 2026
740403e
Merge pull request #15 from ScriptedAlchemy/fix/ios-device-discovery-…
ScriptedAlchemy Oct 27, 2026
cba912b
Merge pull request #16 from ScriptedAlchemy/fix/delegation-provider-a…
ScriptedAlchemy Oct 27, 2026
5d04153
Merge upstream main into main
ScriptedAlchemy Oct 27, 2026
8bf0a16
ci(release): package Linux ARM64 fork builds
ScriptedAlchemy Oct 27, 2026
47021ec
Merge upstream main into main
ScriptedAlchemy Oct 27, 2026
c3424e4
merge: integrate upstream agent-link stack
ScriptedAlchemy Oct 27, 2026
0621be0
fix(clients): open remote subagent approvals on their machine
ScriptedAlchemy Oct 27, 2026
e802114
fix: remove duplicate linked-environment instructions
ScriptedAlchemy Oct 27, 2026
f8a0028
fix: address full-suite validation failures after upstream merge
ScriptedAlchemy Oct 27, 2026
8c5ef68
Merge pull request #18 from ScriptedAlchemy/codex/merge-upstream-agen…
ScriptedAlchemy Oct 27, 2026
bdb0f53
fix(connections): surface rejected pairing across shared routes
ScriptedAlchemy Oct 28, 2026
f1b33b1
Merge upstream main into main
ScriptedAlchemy Oct 28, 2026
71206f5
test: align upstream fixtures with canonical paths and watch labels
ScriptedAlchemy Oct 28, 2026
dff25e4
fix: model mentions name a model in the prompt instead of switching (…
ScriptedAlchemy Oct 28, 2026
0ed2fb0
fix(server): storage cleanup treats a dangling .git file as a missing…
ScriptedAlchemy Oct 28, 2026
2011f7c
Merge upstream main into main
ScriptedAlchemy Oct 28, 2026
61bd965
fix: integrate project intelligence across agents and environments (#19)
ScriptedAlchemy Oct 29, 2026
3fc51ef
fix(pstack): respect provider cooldowns and pool availability (#20)
ScriptedAlchemy Oct 29, 2026
86d29d6
Support secure LAN agent links over SSH (#21)
ScriptedAlchemy Oct 29, 2026
b977b1b
fix(release): enable desktop updates from fork releases (#22)
ScriptedAlchemy Oct 29, 2026
e9881ce
fix(pstack): role targets leave speed to the provider (#25)
ScriptedAlchemy Oct 29, 2026
af78cb4
feat(pstack): bundle the native pstack-t3code port (#26)
ScriptedAlchemy Oct 29, 2026
a02404b
feat(pstack): let roles hold a pool of models (#27)
ScriptedAlchemy Oct 29, 2026
03e2a54
Merge origin main while preserving the local upstream merge
ScriptedAlchemy Oct 29, 2026
902cf0f
Merge upstream main into main
ScriptedAlchemy Oct 29, 2026
830873c
Merge upstream main into main
ScriptedAlchemy Oct 29, 2026
19ce587
merge: sync upstream main into fork
ScriptedAlchemy Oct 29, 2026
054385e
test: align merged fixtures with fork migrations and macOS
ScriptedAlchemy Oct 29, 2026
5dad1f2
fix: route pools to signed-in accounts and repair fork update releases
ScriptedAlchemy Oct 29, 2026
03a87f5
fix: hold signed-out queued turns and normalize macOS signing archives
ScriptedAlchemy Oct 29, 2026
3de73f7
fix(ci): upload only release files when publishing fork builds
ScriptedAlchemy Oct 29, 2026
cb9dcd1
merge: sync upstream main into fork
ScriptedAlchemy Oct 30, 2026
dbf4137
merge: sync latest upstream main into fork
ScriptedAlchemy Oct 30, 2026
aae2c80
feat(mcp): orchestrator_capabilities lists every model on request
ScriptedAlchemy Oct 30, 2026
b5e65d4
refactor(server): move Codex shadow-home links into a shared home ove…
ScriptedAlchemy Oct 30, 2026
b0f8df3
chore(server): record the allModels input in the agent context budget
ScriptedAlchemy Oct 30, 2026
21a20be
feat(claude): share profiles across CLI accounts
ScriptedAlchemy Oct 30, 2026
8732906
feat(web): hide offline environment threads from the sidebar (#29)
ScriptedAlchemy Oct 30, 2026
a1750bf
fix(claude): keep valid plugin paths and disclose profile sharing
ScriptedAlchemy Oct 30, 2026
48f4c62
feat: model mentions show as chips (#28)
ScriptedAlchemy Oct 30, 2026
4d5ca9d
test(claude): assert the profile overlay through what callers observe
ScriptedAlchemy Oct 30, 2026
81a929c
fix: project memory entry matches the surrounding UI on web and mobil…
ScriptedAlchemy Oct 30, 2026
e89a952
fix(claude): link profile directories lazily and drop unused paths
ScriptedAlchemy Oct 30, 2026
c6ada14
feat(server): one skills library for every harness
ScriptedAlchemy Oct 30, 2026
77ebd3c
fix(server): skills library never deletes or moves what it cannot pro…
ScriptedAlchemy Oct 30, 2026
f40c8fa
Merge pull request #31 from ScriptedAlchemy/feat/claude-shared-profile
ScriptedAlchemy Oct 30, 2026
0e99148
Merge pull request #34 from ScriptedAlchemy/feat/skills-library
ScriptedAlchemy Oct 30, 2026
677e044
feat(server): agents read pull requests through T3 (#33)
ScriptedAlchemy Oct 30, 2026
5a9eed9
chore: merge upstream main and preserve fork integrations
ScriptedAlchemy Oct 31, 2026
e747cef
fix(server): unavailable pool accounts no longer hide Claude models (…
ScriptedAlchemy Oct 31, 2026
e0149fb
chore: sync upstream t3code and resolve fork conflicts
ScriptedAlchemy Oct 31, 2026
685d77a
ci: run Windows tests on hosted runners in forks
ScriptedAlchemy Nov 1, 2026
2672d23
ci: attempt every Windows workspace test suite
ScriptedAlchemy Nov 1, 2026
7b90da3
fix(ci): prepare Windows server test prerequisites
ScriptedAlchemy Nov 1, 2026
9de7040
Merge pull request #37 from ScriptedAlchemy/sync/upstream-2026-10-31
ScriptedAlchemy Nov 1, 2026
3c137fe
fix(github): reduce duplicate PR reads and manage agent CLI access (#39)
ScriptedAlchemy Nov 1, 2026
d55032f
fix(pstack): integrate native workflows with T3 harness capabilities …
ScriptedAlchemy Nov 1, 2026
912fdd7
feat(server): evaluate incoming ACP tool results locally (#41)
ScriptedAlchemy Nov 1, 2026
af569b0
fix: complete fork intelligence, client, and release integration (#36)
ScriptedAlchemy Nov 1, 2026
b45ba3c
chore: sync upstream main and preserve fork integrations
ScriptedAlchemy Nov 1, 2026
3fd148d
chore: integrate current fork main into upstream sync
ScriptedAlchemy Nov 1, 2026
4cb8aef
test(web): adapt model mention fixture to upstream workspace refresh
ScriptedAlchemy Nov 1, 2026
f51d4ed
fix(providers): preserve Codex account paths during upstream sync
ScriptedAlchemy Nov 2, 2026
38ef969
test(web): separate PDF reload and document-reset scenarios
ScriptedAlchemy Nov 2, 2026
c4f29bb
Merge pull request #42 from ScriptedAlchemy/sync/upstream-2026-11-01
ScriptedAlchemy Nov 2, 2026
6748a8d
fix(acp): keep npm shim installs in the managed prefix (#45)
ScriptedAlchemy Nov 2, 2026
4522c82
fix(connection): rediscover paired machines on the local network (#44)
ScriptedAlchemy Nov 2, 2026
2587aef
fix(pstack): packaged desktop builds load pstack, and T3 hides native…
ScriptedAlchemy Nov 3, 2026
10fb290
ci: keep runner selection on hosted pools
ScriptedAlchemy Nov 3, 2026
6d4c6ad
chore: merge upstream main and reconcile fork integrations
ScriptedAlchemy Nov 3, 2026
4a4a480
Merge pull request #48 from ScriptedAlchemy/ci/runner-input-safety
ScriptedAlchemy Nov 3, 2026
ef873ed
ci: offload owner server tests to isolated Linux capacity
ScriptedAlchemy Nov 3, 2026
4d128d9
fix(pstack): load the bundled pack after test fixtures are pruned
ScriptedAlchemy Nov 3, 2026
7bdbfed
test(pstack): pin the pruned corpus to the shared constant
ScriptedAlchemy Nov 3, 2026
4e3a3a0
fix(pstack): honor native plugin settings formats
ScriptedAlchemy Nov 3, 2026
c21f80d
chore: bring current fork CI into upstream integration
ScriptedAlchemy Nov 3, 2026
362e874
fix(pstack): reconcile packaged files and versioned plugin settings
ScriptedAlchemy Nov 3, 2026
ea88db8
fix(integration): preserve pstack repairs across upstream sync
ScriptedAlchemy Nov 3, 2026
9abb77c
fix(pstack): load the bundled pack after test fixtures are pruned (#51)
ScriptedAlchemy Nov 3, 2026
5bd849d
fix(ci): checksum desktop installers in fork releases (#54)
ScriptedAlchemy Nov 3, 2026
ff062e6
fix(ssh): restore NodeCrypto in tunnel test layers; stabilize delete-…
ScriptedAlchemy Nov 3, 2026
94e1eca
fix(pstack): packaged desktop builds load pstack, and T3 hides native…
ScriptedAlchemy Nov 3, 2026
3f7bc90
Merge main into upstream sync
ScriptedAlchemy Nov 3, 2026
e3e8dfb
fix(ssh): reuse the desktop-installed CLI during remote setup (#47)
ScriptedAlchemy Nov 3, 2026
4181723
Merge pull request #49 from ScriptedAlchemy/sync/upstream-main-2026-1…
ScriptedAlchemy Nov 4, 2026
69b9b7b
ci: retire private Actions runners and use GitHub-hosted capacity (#56)
ScriptedAlchemy Nov 4, 2026
a392bea
ci: remove Blacksmith leftovers and restrict hosted runner inputs (#57)
ScriptedAlchemy Nov 4, 2026
21fc2b0
fix(ci): Windows release builds wait for a queued Linux job [skip ci]
ScriptedAlchemy Nov 4, 2026
c3309ca
test(web): wait for painted timeline before measuring work heading (#58)
ScriptedAlchemy Nov 4, 2026
7fe1ff0
fix(connection): reconnect paired devices over authenticated LAN rout…
ScriptedAlchemy Nov 4, 2026
f85c2a8
fix(opencode): point agents at T3's browser instead of OpenCode's (#50)
ScriptedAlchemy Nov 4, 2026
ea32593
Fix thread citations rendering as "Thread no longer available" (#61)
ScriptedAlchemy Nov 4, 2026
516103e
fix(server): advertise the mDNS hostname as a LAN route (#59)
ScriptedAlchemy Nov 4, 2026
c5f3419
feat(chat): suggest fresh threads for independent drafts (#55)
ScriptedAlchemy Nov 4, 2026
3158d53
chore: merge upstream main and reconcile fork integrations
ScriptedAlchemy Nov 3, 2026
5fc5392
chore: bring current fork CI into upstream integration
ScriptedAlchemy Nov 3, 2026
3961dec
fix(integration): preserve pstack repairs across upstream sync
ScriptedAlchemy Nov 3, 2026
108bbf1
fix(ssh): restore NodeCrypto in tunnel test layers; stabilize delete-…
ScriptedAlchemy Nov 3, 2026
da94a5b
Merge main into upstream sync
ScriptedAlchemy Nov 3, 2026
021ac91
Merge pull request #49 from ScriptedAlchemy/sync/upstream-main-2026-1…
ScriptedAlchemy Nov 4, 2026
46df1f2
ci: retire private Actions runners and use GitHub-hosted capacity (#56)
ScriptedAlchemy Nov 4, 2026
d9e383c
ci: remove Blacksmith leftovers and restrict hosted runner inputs (#57)
ScriptedAlchemy Nov 4, 2026
0f8ccf8
fix(ci): Windows release builds wait for a queued Linux job [skip ci]
ScriptedAlchemy Nov 4, 2026
38920d1
test(web): wait for painted timeline before measuring work heading (#58)
ScriptedAlchemy Nov 4, 2026
97a1046
fix(connection): reconnect paired devices over authenticated LAN rout…
ScriptedAlchemy Nov 4, 2026
f9309d7
fix(opencode): point agents at T3's browser instead of OpenCode's (#50)
ScriptedAlchemy Nov 4, 2026
5062ab4
Fix thread citations rendering as "Thread no longer available" (#61)
ScriptedAlchemy Nov 4, 2026
0580987
fix(server): advertise the mDNS hostname as a LAN route (#59)
ScriptedAlchemy Nov 4, 2026
ab67bda
feat(chat): suggest fresh threads for independent drafts (#55)
ScriptedAlchemy Nov 4, 2026
4f0dd4c
fix(integration): reconcile upstream auth, migrations, and fork clients
ScriptedAlchemy Nov 4, 2026
e6c4180
chore(sync): make upstream rebase mergeable with fork main
ScriptedAlchemy Nov 4, 2026
f30012d
fix(sync): check tracked sources and align fork replay fixtures
ScriptedAlchemy Nov 4, 2026
130fbac
test(sync): preserve fork shell settings in Codex replay
ScriptedAlchemy Nov 4, 2026
8e82e32
test(sync): replay recorded Codex config reads and launcher exit codes
ScriptedAlchemy Nov 4, 2026
fa42382
feat(lcm): recover evidence and search external history (#52)
ScriptedAlchemy Nov 5, 2026
34cf3a9
feat(labs): add blind model evaluations and orchestration guidance (#53)
ScriptedAlchemy Nov 5, 2026
78fb4ef
fix(sync): preserve fork behavior across upstream provider and UI cha…
ScriptedAlchemy Nov 5, 2026
ef528c3
merge: integrate latest fork main and organize fork settings under Labs
ScriptedAlchemy Nov 5, 2026
54d7c11
Merge pull request #62 from ScriptedAlchemy/sync/upstream-rebase-2026…
ScriptedAlchemy Nov 5, 2026
804f8a5
fix(lint): main CI no longer fails on unreasoned effects (#65)
ScriptedAlchemy Nov 5, 2026
8463d1a
feat(codex): discover configured native computer use (#63)
ScriptedAlchemy Nov 5, 2026
e4bdc60
chore(sync): merge upstream main while preserving fork behavior
ScriptedAlchemy Nov 6, 2026
2cc769c
refactor(web): remove the Loom project timeline page
ScriptedAlchemy Nov 6, 2026
fb061bd
refactor(mobile): remove the Loom project timeline screen
ScriptedAlchemy Nov 6, 2026
cd68cb1
refactor(server): remove the project Loom service and RPC
ScriptedAlchemy Nov 6, 2026
20183e0
fix(mcp): expose account pool members for delegation checks
ScriptedAlchemy Nov 6, 2026
83d4f13
fix(server): drop the indexes only the removed Loom used
ScriptedAlchemy Nov 6, 2026
e3e252b
docs: remove the Loom user guide
ScriptedAlchemy Nov 6, 2026
f5fae3a
feat(memory): save project facts without an approval queue
ScriptedAlchemy Nov 6, 2026
3873409
fix(test): the Android preview test keeps its platform variable
ScriptedAlchemy Nov 6, 2026
971fffc
test(pstack): role targets include the ultracode option
ScriptedAlchemy Nov 6, 2026
ede6b4b
fix(server): cleanup follows the branch an agent checked out (#68)
ScriptedAlchemy Nov 6, 2026
f36be8f
Merge main into t3/remove-loom-features
ScriptedAlchemy Nov 6, 2026
aadcc03
fix(ci): update pool metadata branch with main and Android fixture
ScriptedAlchemy Nov 6, 2026
cd9ae3d
fix(memory): prevent duplicate saves and reconcile preview migrations
ScriptedAlchemy Nov 6, 2026
dde3af9
fix(mobile): keep memory save controls accessible above keyboard
ScriptedAlchemy Nov 6, 2026
0e401a6
Merge pull request #72 from ScriptedAlchemy/t3/holographic-memory-aut…
ScriptedAlchemy Nov 6, 2026
112dc64
feat(server): index worktrees for active agents, outside the repo (#67)
ScriptedAlchemy Nov 6, 2026
e8f9e52
fix(mobile): keep providers listed when their health probe lags (#74)
ScriptedAlchemy Nov 6, 2026
61b6969
Merge remote-tracking branch 'origin/main' into t3/remove-loom-features
ScriptedAlchemy Nov 6, 2026
28132ce
test(server): recovery tests turn off automatic learning
ScriptedAlchemy Nov 6, 2026
c97ec24
Merge PR #71: remove Loom and save project memories automatically
ScriptedAlchemy Nov 6, 2026
c81b119
Merge pull request #70 from ScriptedAlchemy/t3/fix-pool-provider-mism…
ScriptedAlchemy Nov 6, 2026
8200347
chore(git): ignore Python caches and local checkout artifacts
ScriptedAlchemy Nov 6, 2026
006106d
chore(sync): merge upstream main and preserve fork integrations
ScriptedAlchemy Nov 6, 2026
189cfd8
fix(mobile): prevent linked subagent messages from crashing conversat…
ScriptedAlchemy Nov 7, 2026
a186b5c
chore: merge upstream main and preserve fork integrations
ScriptedAlchemy Nov 7, 2026
bc3d2e3
chore(sync): merge upstream main and preserve fork integrations
ScriptedAlchemy Nov 7, 2026
80bb433
fix(test): provide the theme environment in composer mocks
ScriptedAlchemy Nov 8, 2026
ce27118
Merge pull request #78 from ScriptedAlchemy/codex/sync-upstream-main-…
ScriptedAlchemy Nov 8, 2026
9e09f60
fix(ssh): preserve installed service network settings (#79)
ScriptedAlchemy Nov 8, 2026
cecdf9f
fix(server): switching Codex accounts releases the conversation
ScriptedAlchemy Nov 8, 2026
ad598b9
feat(web,mobile): add Reset usage to the usage-limit banner
ScriptedAlchemy Nov 8, 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
  •  
  •  
  •  
36 changes: 36 additions & 0 deletions .github/actions/server-ci/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Server CI
description: Run the server suite on a hosted shard or an isolated Linux worker.
inputs:
shard:
description: Optional Vitest shard, such as 1/8
default: ""
max-workers:
description: Optional Vitest worker limit
default: ""
runs:
using: composite
steps:
- uses: ./.github/actions/setup-ci-deps
- name: Setup Rust
uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87
with:
toolchain: stable
- name: Install Chromium
shell: bash
run: node apps/server/node_modules/playwright-core/cli.js install --with-deps --only-shell chromium
- name: Test server
shell: bash
env:
TEST_SHARD: ${{ inputs.shard }}
MAX_WORKERS: ${{ inputs.max-workers }}
run: |
args=()
if [[ -n "$TEST_SHARD" ]]; then
[[ "$TEST_SHARD" =~ ^[1-9][0-9]*/[1-9][0-9]*$ ]]
args+=(--shard "$TEST_SHARD")
fi
if [[ -n "$MAX_WORKERS" ]]; then
[[ "$MAX_WORKERS" =~ ^[1-9][0-9]*$ ]]
args+=(--maxWorkers "$MAX_WORKERS")
fi
vp run --filter t3 test "${args[@]}"
5 changes: 2 additions & 3 deletions .github/actions/setup-apt-mirrors/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,16 @@ runs:
steps:
- shell: bash
run: |
# Replace the existing Blacksmith mirror list as well as direct sources.
printf '%s\tpriority:%s\n' \
https://archive.ubuntu.com/ubuntu 1 \
https://mirrors.edge.kernel.org/ubuntu 2 \
https://mirror.math.princeton.edu/pub/ubuntu 3 \
| sudo tee /etc/apt/blacksmith-ubuntu-mirrors.txt > /dev/null
| sudo tee /etc/apt/ci-ubuntu-mirrors.txt > /dev/null

# APT's mirror transport retries each file against the next server.
sudo find /etc/apt -maxdepth 2 -type f \( -name '*.list' -o -name '*.sources' \) \
-exec sed -i -E \
's#https?://(([^/]+\.)?archive|security)\.ubuntu\.com/ubuntu/?#mirror+file:/etc/apt/blacksmith-ubuntu-mirrors.txt#g' {} +
's#https?://(([^/]+\.)?archive|security)\.ubuntu\.com/ubuntu/?#mirror+file:/etc/apt/ci-ubuntu-mirrors.txt#g' {} +

# Move on to a fallback before an unreachable server exhausts the job.
printf '%s\n' 'Acquire::http::Timeout "15";' 'Acquire::https::Timeout "15";' \
Expand Down
14 changes: 8 additions & 6 deletions .github/actions/setup-ci-deps/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,13 @@ runs:
if: steps.vp_cache.outputs.cache-hit == 'true'
shell: bash
run: |
echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH"
"$HOME/.vite-plus/bin/vp" env use "${{ steps.vp.outputs.node }}"
vp_bin="$HOME/.vite-plus/bin"
if [[ "$RUNNER_OS" == "Windows" ]]; then
cygpath -w "$vp_bin" >> "$GITHUB_PATH"
else
echo "$vp_bin" >> "$GITHUB_PATH"
fi
"$vp_bin/vp" env use "${{ steps.vp.outputs.node }}"

# vp gives each Node.js download attempt 10 minutes by default, so one
# stalled stream holds the job that long. It retries 3 times and resumes
Expand Down Expand Up @@ -85,10 +90,7 @@ runs:

# Filtered installs prefer the current full store, which holds every package,
# over an older store of their own.
# The pnpm store stays a cache tarball on the runner's own disk. A store on a
# Blacksmith sticky disk mounts in under a second, but pnpm then copies every
# package across filesystems instead of hard-linking it: install took 28-49s
# against 9s plus an 11s restore.
# Keep the pnpm store on the workspace filesystem so installs can hard-link packages.
- name: Restore pnpm store
id: pnpm_cache
if: inputs.install == 'true'
Expand Down
141 changes: 141 additions & 0 deletions .github/scripts/check-runner-labels.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
"""Keep workflow runner selection on hosted pools.

This repository has no self-hosted runners. Pull requests from forks can propose
workflow changes, and a workflow that selects a private runner would put
untrusted code on hardware that holds credentials and reaches the internal
network. Every `runs-on` value must name a standard GitHub-hosted image.

Two modes:

check-runner-labels.py
Scan `.github/workflows/*.yml` and fail on `self-hosted` or a
private-runner label (`linux-runner`, `windows-runner`,
`macos-runner`, `bench-*`). Comments are ignored.

check-runner-labels.py --runner LABEL [--verify-runner LABEL]
Validate labels passed to a reusable workflow, where the static scan
cannot see through `${{ inputs.runner }}`.
"""

import argparse
import os
import re
import sys
from pathlib import Path

WORKFLOWS_DIR = Path(__file__).resolve().parent.parent / "workflows"

# Excludes paid larger runners and third-party pools.
HOSTED_LABEL = re.compile(r"^(?:ubuntu-(?:latest|22\.04|24\.04|26\.04)(?:-arm)?|macos-(?:latest|14|15|26)(?:-intel)?|windows-(?:latest|2022|2025|11-arm))$")

# Runner labels that name hardware this account owns. `-runner` is a stronger
# signal than `-hosted`, so a label such as `linux-runner` is private by
# construction; `self-hosted` is GitHub's own selector.
PRIVATE_LABEL_HINT = ("self-hosted", "-runner")

# What the static scan looks for in workflow text: GitHub's self-hosted
# selector, the private labels this repository used to have, and the `bench-*`
# capacity pool. `android-emulator-runner` and other action names do not match.
FORBIDDEN_REFERENCE = re.compile(
r"blacksmith-[a-z0-9.-]+|self-hosted|\b(?:linux|windows|macos)-runner\b|\bbench-[a-z0-9][a-z0-9.-]*"
)


def strip_comment(line):
"""Drop a trailing YAML comment without touching quoted `#` characters."""
quote = None
for index, char in enumerate(line):
if quote:
if char == quote:
quote = None
elif char in ("'", '"'):
quote = char
elif char == "#" and (index == 0 or line[index - 1] in " \t"):
return line[:index]
return line


def scan_workflows(workflows_dir=WORKFLOWS_DIR):
"""Return one message per workflow line that references a private runner."""
problems = []
paths = sorted(workflows_dir.glob("*.yml")) + sorted(workflows_dir.glob("*.yaml"))
for path in paths:
for number, line in enumerate(path.read_text(encoding="utf-8").splitlines(), 1):
code = strip_comment(line)
match = FORBIDDEN_REFERENCE.search(code)
if match:
problems.append(
f"{path.name}:{number}: references private runner {match.group(0)!r}: "
f"{code.strip()}"
)
return problems


def check_label(name, label, required):
"""Return a message when `label` is empty-but-required or not a hosted pool."""
if not label:
if required:
return f"inputs.{name} is empty; this workflow needs a hosted runner label"
return None
if any(hint in label for hint in PRIVATE_LABEL_HINT) or not HOSTED_LABEL.match(label):
return (
f"inputs.{name}={label!r} is not a hosted runner label; "
"use a standard GitHub-hosted Ubuntu, macOS or Windows image"
)
return None


def check_labels(runner, verify_runner):
"""Validate the runner inputs of a reusable workflow."""
problems = [
message
for message in (
check_label("runner", runner, required=True),
check_label("verify_runner", verify_runner, required=False),
)
if message
]
return problems


def report(message):
prefix = "::error::" if os.environ.get("GITHUB_ACTIONS") else "error: "
print(f"{prefix}{message}", file=sys.stderr)


def main(argv=None):
parser = argparse.ArgumentParser(description=__doc__.splitlines()[0])
parser.add_argument(
"--runner",
help="runner input of a reusable workflow; validates labels instead of scanning",
)
parser.add_argument(
"--verify-runner",
help="optional verify_runner input; empty means the workflow has no verify job",
)
parser.add_argument(
"--workflows-dir",
type=Path,
default=WORKFLOWS_DIR,
help=f"directory to scan (default: {WORKFLOWS_DIR})",
)
args = parser.parse_args(argv)

if args.runner is None and args.verify_runner is None:
problems = scan_workflows(args.workflows_dir)
checked = "workflow runner references"
else:
# A caller may pass neither flag through the shell, so both are checked.
problems = check_labels(args.runner or "", args.verify_runner or "")
checked = "runner inputs"

for problem in problems:
report(problem)
if problems:
return 1
print(f"All {checked} name hosted runner pools.")
return 0


if __name__ == "__main__":
sys.exit(main())
109 changes: 109 additions & 0 deletions .github/scripts/check-runner-labels.test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import importlib.util
import tempfile
import unittest
from pathlib import Path

spec = importlib.util.spec_from_file_location(
"check_runner_labels", Path(__file__).with_name("check-runner-labels.py")
)
labels = importlib.util.module_from_spec(spec)
spec.loader.exec_module(labels)


class ScanWorkflowsTests(unittest.TestCase):
def setUp(self):
self.temp = tempfile.TemporaryDirectory()
self.addCleanup(self.temp.cleanup)
self.workflows = Path(self.temp.name)

def scan(self, filename, text):
(self.workflows / filename).write_text(text, encoding="utf-8")
return labels.scan_workflows(self.workflows)

def test_accepts_hosted_pools(self):
self.assertEqual(self.scan("build.yml", """
jobs:
build:
runs-on: ubuntu-24.04
verify:
runs-on: windows-11-arm
lint:
runs-on: ubuntu-24.04-arm
mac:
runs-on: macos-26
"""), [])

def test_rejects_self_hosted(self):
problems = self.scan("build.yml", " runs-on: [self-hosted, linux]\n")
self.assertEqual(len(problems), 1)
self.assertIn("build.yml:1", problems[0])
self.assertIn("self-hosted", problems[0])

def test_rejects_private_runner_labels(self):
for label in ("linux-runner", "windows-runner", "macos-runner", "bench-32vcpu", "blacksmith-8vcpu-ubuntu-2404"):
with self.subTest(label=label):
self.workflows.joinpath("build.yml").unlink(missing_ok=True)
problems = self.scan("build.yml", f" runs-on: {label}\n")
self.assertEqual(len(problems), 1, problems)

def test_rejects_matrix_values(self):
problems = self.scan("release.yml", """
strategy:
matrix:
runner: [ubuntu-24.04, bench-arm64]
runs-on: ${{ matrix.runner }}
""")
self.assertEqual(len(problems), 1)
self.assertIn("bench-arm64", problems[0])

def test_ignores_comments_and_action_names(self):
self.assertEqual(self.scan("notes.yml", """
# A private runner would be self-hosted or linux-runner.
jobs:
emulator:
runs-on: ubuntu-24.04
steps:
- uses: reactivecircus/android-emulator-runner@v2
"""), [])

def test_ignores_trailing_comments(self):
self.assertEqual(self.scan("build.yml", "runs-on: ubuntu-24.04 # not self-hosted\n"), [])

def test_strip_comment_keeps_hash_inside_quotes(self):
self.assertEqual(
labels.strip_comment('run: echo "a # b" # mentions linux-runner'),
'run: echo "a # b" ',
)


class CheckLabelsTests(unittest.TestCase):
def test_accepts_hosted_labels(self):
self.assertEqual(
labels.check_labels("ubuntu-24.04", "windows-2025"), []
)
self.assertEqual(labels.check_labels("ubuntu-24.04-arm", ""), [])

def test_rejects_private_labels(self):
for label in ("self-hosted", "linux-runner", "bench-32vcpu", "macos-26-runner", "blacksmith-8vcpu-ubuntu-2404", "macos-15-large", "macos-15-xlarge"):
with self.subTest(label=label):
problems = labels.check_labels(label, "")
self.assertEqual(len(problems), 1, problems)
self.assertIn("inputs.runner", problems[0])

def test_rejects_verify_runner_on_a_private_pool(self):
problems = labels.check_labels("ubuntu-24.04", "linux-runner")
self.assertEqual(len(problems), 1)
self.assertIn("inputs.verify_runner", problems[0])

def test_requires_runner_but_not_verify_runner(self):
self.assertEqual(len(labels.check_labels("", "")), 1)
self.assertIn("inputs.runner is empty", labels.check_labels("", "")[0])


class MainTests(unittest.TestCase):
def test_scan_mode_passes_on_the_repository_workflows(self):
self.assertEqual(labels.scan_workflows(), [])


if __name__ == "__main__":
unittest.main()
5 changes: 3 additions & 2 deletions .github/scripts/ci-changes.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,14 @@ const EXTRA_OWNERS = [
[/^scripts\/lib\//, ["@t3tools/desktop", "@t3tools/mobile", "@t3tools/web", "t3"]],
// scripts/build-desktop-artifact.ts reads the GNOME extension manifest.
[/^apps\/desktop\/gnome-extension\//, ["@t3tools/scripts"]],
[/^native\/project-memory\//, ["t3"]],
[/^native\/browser-secret\//, ["@t3tools/desktop"]],
[/^native\/kde-snap-shot\//, ["@t3tools/desktop"]],
[/^native\/libghostty-vt\//, ["@t3tools/web"]],
// apps/server/src/cloud/ConnectReachability.test.ts checks the guide's headings.
[/^docs\/user\/t3-connect-troubleshooting\.md$/, ["t3"]],
];
const RUST = /^native\/(resource-monitor|kde-snap-shot|hyprland-snap-shot)\//;
const RUST = /^native\/(resource-monitor|kde-snap-shot|hyprland-snap-shot|project-memory)\//;

// These tests read other packages without declaring dependencies.
const TEST_ONLY_DEPS = {
Expand All @@ -49,7 +50,7 @@ const TEST_ONLY_DEPS = {
const BUILD_ONLY_DEPS = { t3: ["@t3tools/web"] };

const MOBILE_NATIVE =
/^apps\/mobile\/.*\.(swift|kt|kts)$|^apps\/mobile\/(\.swiftlint\.yml|detekt\.yml|\.editorconfig|Brewfile)$|^scripts\/mobile-native-static-check\.ts$|^package\.json$|^\.github\/workflows\/ci\.yml$|^\.github\/scripts\/ci-changes\.cjs$|^\.github\/actions\/ci-changes\//;
/^apps\/mobile\/.*\.(swift|kt|kts)$|^apps\/mobile\/(\.swiftlint\.yml|detekt\.yml|\.editorconfig|Brewfile)$|^scripts\/mobile-native-static-check\.ts$|^package\.json$|^\.github\/workflows\/(fork-)?ci\.yml$|^\.github\/scripts\/ci-changes\.cjs$|^\.github\/actions\/ci-changes\//;

const OWN_TEST_JOB = new Set(["t3", "@t3tools/web", "@t3tools/monorepo"]);

Expand Down
Loading
Loading