Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
318 commits
Select commit Hold shift + click to select a range
3bd15af
Merge pull request #5899 from atomantic/claim/issue-5694
atomantic Sep 2, 2026
aac74f4
Merge pull request #5895 from atomantic/cos/task-mtkhyj89/agent-2fba8169
atomantic Sep 2, 2026
d7c3674
fix: size the curated coding-agent context from the model's actual KV…
atomantic Sep 2, 2026
efe1765
Merge pull request #5915 from atomantic/cos/task-mtkndbix/agent-c5a00cdd
atomantic Sep 2, 2026
80b6443
feat([issue-5638]): stamp model and LoRA licenses onto generated asse…
atomanticagent Sep 2, 2026
2be3933
fix: make managed app updates opt-in
atomantic Sep 2, 2026
5bce086
test: guard every static import cycle in server/services with a shrin…
atomantic Sep 2, 2026
2ca7019
test: guard docs/DEPS.md against dependency drift (#5708)
atomantic Sep 2, 2026
dd9e1ec
fix: make findImportCycleComponents' sort a total order (#5693)
atomantic Sep 2, 2026
5d8e971
refactor: import summarizeSkillEvidence instead of re-copying it into…
atomantic Sep 2, 2026
75436c7
test: close two gaps in the DEPS.md parity guard (#5708)
atomantic Sep 2, 2026
c3b32df
fix: assert the platform's own conventional update script in appUpdat…
atomantic Sep 2, 2026
428d557
refactor(client): route eleven hand-rolled polling intervals through …
atomantic Sep 2, 2026
5c32a1c
Merge pull request #5913 from atomantic/cos/task-mtkn8z9b/agent-f65b54c0
atomantic Sep 2, 2026
d98d4f3
test: make the /api/sync category parity test read the real getSuppor…
atomantic Sep 2, 2026
eff45d3
fix(fableloom): drop a stale autopilot poll reply after the loom or r…
atomantic Sep 2, 2026
6751e64
docs: document the 16 env vars .env.example was missing, and guard th…
atomantic Sep 2, 2026
7f42764
ci: select pollingConventions.test.js from the structural client trig…
atomantic Sep 2, 2026
4d5748e
Merge pull request #5924 from atomantic/claim/issue-5705
atomantic Sep 2, 2026
2d6a4ac
Merge pull request #5925 from atomantic/claim/issue-5697
atomantic Sep 2, 2026
07c9bfd
Merge pull request #5926 from atomantic/claim/issue-5706
atomantic Sep 2, 2026
df083e0
Merge pull request #5921 from atomantic/claim/issue-5693
atomantic Sep 2, 2026
4b515ff
Merge pull request #5922 from atomantic/claim/issue-5708
atomantic Sep 2, 2026
6d5f3aa
Merge pull request #5923 from atomantic/claim/issue-5709
atomantic Sep 2, 2026
643c14b
chore: update lib/slashdo submodule to bce844b
atomantic Sep 2, 2026
7dadd55
test: cover video display wake
atomantic Sep 2, 2026
0b9a9a7
Merge pull request #5927 from atomantic/cos/task-mtkpm5by/agent-e726700b
atomantic Sep 2, 2026
9229c78
fix: let pr-reviewer stages run on enabled TUI providers, spawned hea…
atomantic Sep 2, 2026
fdde7e1
fix: screen PRs for hidden and model-directed content instead of keyw…
atomantic Sep 2, 2026
eb1fcc6
Merge pull request #5928 from atomantic/cos/task-mtkolu4j/agent-2210921b
atomantic Sep 2, 2026
424920f
feat: let pr-reviewer stage 3 run on any enabled CLI/TUI provider, wi…
atomantic Sep 2, 2026
95809f1
fix: do not carry the eligibility gate's provider/model into an unpin…
atomantic Sep 2, 2026
15518ec
fix: honor the maintainer-targeted waiver in the pre-action eligibili…
atomantic Sep 2, 2026
edc3546
refactor: collapse the Claude posture wrappers and share the enforced…
atomantic Sep 2, 2026
7f050c4
refactor: share the maintainer-targeted waiver between the eligibilit…
atomantic Sep 2, 2026
a17c303
feat([issue-5596]): grow the operator-action allowlist and detect lef…
atomanticagent Sep 2, 2026
7982edb
Merge pull request #5932 from atomantic/cos/task-mtkolu4j/agent-5d9a1ca9
atomantic Sep 2, 2026
25d6e46
fix: route client port literals through a client-side PORTS mirror (#…
atomantic Sep 2, 2026
07bbb7a
perf: index human_activity_events on (source, happened_at) so timelin…
atomantic Sep 2, 2026
466fb47
refactor: move the video-model cache verify/repair engine into a serv…
atomantic Sep 3, 2026
43c0064
fix: pin the three stack to vendor-three and guard chunk groups again…
atomantic Sep 3, 2026
799f3f3
test: pin ImageGen object-URL revoke lifecycle (#5722)
atomantic Sep 3, 2026
16340cd
test: compare human_activity index definitions, not just names, in th…
atomantic Sep 3, 2026
ebba8be
test: assert reposToVerify keeps same-repo targets pinned to differen…
atomantic Sep 3, 2026
dd1cdf9
test: resolve chunk-group packages from the lockfile, not node_module…
atomantic Sep 3, 2026
dc4e55b
test: pin index uniqueness and ordered-scan plan shape for the human_…
atomantic Sep 3, 2026
ef01600
feat([issue-5640]): give a fresh install a first-run card that stages…
atomanticagent Sep 3, 2026
a1f66f1
fix: stop ImageGen minting an object URL after the page unmounts (#5722)
atomantic Sep 3, 2026
c334288
refactor: split the reviewer vocabulary out of cosValidation.js (#5702)
atomantic Sep 3, 2026
318f6a9
fix: mint ImageGen reference preview URLs outside the state updater (…
atomantic Sep 3, 2026
73c13db
fix: use Object.hasOwn in the ImageGen object-URL test stub (#5722)
atomantic Sep 3, 2026
2832098
Merge pull request #5939 from atomantic/claim/issue-5715
atomantic Sep 3, 2026
c4dec82
Merge pull request #5940 from atomantic/claim/issue-5725
atomantic Sep 3, 2026
97479aa
Merge pull request #5943 from atomantic/claim/issue-5722
atomantic Sep 3, 2026
47c3356
Merge pull request #5945 from atomantic/claim/issue-5702
atomantic Sep 3, 2026
d72864f
refactor: import deriveUiPort from the declaring service and assert s…
atomantic Sep 3, 2026
3ab8636
fix: summarize route-error details into one log line instead of a JSO…
atomantic Sep 3, 2026
b6e62a4
fix: render non-Zod and array-path detail entries readably in the rou…
atomantic Sep 3, 2026
1d72e48
fix: validate agent-activity route inputs and floor the cleanup reten…
atomantic Sep 3, 2026
0877fa6
fix: compare activity day files by local date string when expiring th…
atomantic Sep 3, 2026
504961a
refactor: move the 1100-line ProviderForm out of the AIProviders page…
atomantic Sep 3, 2026
c7e41ef
refactor: share the yt-dlp spawn, marker parsing and exit classificat…
atomantic Sep 3, 2026
248a525
Merge pull request #5933 from atomantic/claim/issue-5712
atomantic Sep 3, 2026
1357d63
Merge pull request #5937 from atomantic/claim/issue-5711
atomantic Sep 3, 2026
8559150
test: pin the client's 88 API modules to the routes the server actual…
atomantic Sep 3, 2026
4f56257
fix: bound a path helper's concise body by its semicolon, not the nex…
atomantic Sep 3, 2026
7704eb5
fix: batch the Prompt Guard input so Stage 1 scans stop failing, and …
atomantic Sep 3, 2026
3fdb2b7
fix: pin the client ports mirror against server/lib/ports.js so mirro…
atomantic Sep 3, 2026
d257f8d
Merge pull request #5947 from atomantic/cos/task-mtkolu4j/agent-4a3f0ffb
atomantic Sep 3, 2026
8a14c6f
fix: stop holding the pr-reviewer eligibility gate for human approval…
atomantic Sep 3, 2026
fce2630
fix: use the promise chmod when materializing the screened review inp…
atomantic Sep 3, 2026
bed92a5
fix: remove the worktree a failed agent spawn setup cut instead of le…
atomantic Sep 3, 2026
4293fb3
Merge pull request #5948 from atomantic/cos/task-mtkolu4j/agent-4a3f0ffb
atomantic Sep 3, 2026
7c750bd
fix: validate the video-history id on every route that touches a reco…
atomantic Sep 3, 2026
808bba0
fix: pass the local Claude wrapper's placeholder token into the publi…
atomantic Sep 3, 2026
8640897
ux: give index-page empty states a real next action via EmptyState (#…
atomantic Sep 3, 2026
7015eb0
Merge pull request #5950 from atomantic/cos/task-mtkolu4j/agent-4a3f0ffb
atomantic Sep 3, 2026
9194761
fix: give pipeline stages their own prompt, and tell the tool-free ga…
atomantic Sep 3, 2026
3e246e5
fix: give the sandboxed review stage the sentinel-payload completion …
atomantic Sep 3, 2026
98a47a9
Merge pull request #5952 from atomantic/cos/task-mtkolu4j/agent-4a3f0ffb
atomantic Sep 3, 2026
858b0e4
refactor: split LocalLlmTab into its two disjoint views (#5720)
atomantic Sep 3, 2026
f03e848
test: move the local-LLM cases beside the view each one exercises (#5…
atomantic Sep 3, 2026
2c4075b
Merge pull request #5949 from atomantic/claim/issue-5713
atomantic Sep 3, 2026
3b28bae
Merge pull request #5951 from atomantic/claim/issue-5710
atomantic Sep 3, 2026
159b8ed
fix: rescue a printed hook payload from output.txt for direct CLI run…
atomantic Sep 3, 2026
2f4f00d
Merge pull request #5953 from atomantic/claim/issue-5720
atomantic Sep 3, 2026
365cd9c
Merge pull request #5954 from atomantic/cos/task-mtkolu4j/agent-4a3f0ffb
atomantic Sep 3, 2026
e9a7369
fix: try each transcript spool until one yields a payload, not the fi…
atomantic Sep 3, 2026
269919a
test: add known-answer vectors for signalCrypto key derivation (#5723)
atomantic Sep 3, 2026
9e5a514
Merge pull request #5955 from atomantic/cos/sys-mtkvb4dk/agent-5c50e582
atomantic Sep 3, 2026
7fd9f31
refactor: fold scaffoldIOS into xcodeScaffold (#5724)
atomantic Sep 3, 2026
633b373
refactor: stop shadowing the global setInterval in CreateLoopForm (#5…
atomantic Sep 3, 2026
c1aa25f
test: keep the CLAUDE.md bridge row beside AGENTS.md in the scaffold …
atomantic Sep 3, 2026
67a4e85
ci: register the global-shadow guard so PR selection can reach it
atomantic Sep 3, 2026
cd1d212
fix: advance a staged pipeline when a directly-spawned CLI agent comp…
atomantic Sep 3, 2026
f86eb57
Merge pull request #5959 from atomantic/cos/task-mtkolu4j/agent-4a3f0ffb
atomantic Sep 3, 2026
55cb971
Merge pull request #5956 from atomantic/claim/issue-5723
atomantic Sep 3, 2026
f03d39a
Merge pull request #5957 from atomantic/claim/issue-5724
atomantic Sep 3, 2026
c5fca37
Merge branch 'main' into claim/issue-5728
atomantic Sep 3, 2026
0685c1f
Merge pull request #5958 from atomantic/claim/issue-5728
atomantic Sep 3, 2026
c6c1223
feat: add rigging clip compatibility contracts (#5892)
atomantic Sep 2, 2026
b0576c5
fix: classify rigging clip library for Data Manager, reuse makePathRe…
atomantic Sep 3, 2026
48f53e9
fix: restore the trailing newline on materialized review patches so g…
atomantic Sep 3, 2026
fc9ab49
Merge pull request #5896 from atomantic/claim/issue-5892
atomantic Sep 3, 2026
08454bf
Merge pull request #5961 from atomantic/cos/task-mtkolu4j/agent-4a3f0ffb
atomantic Sep 3, 2026
736bac0
feat: release a fork PR's held CI run only after the coordinator's ow…
atomantic Sep 3, 2026
26e15c6
feat: offer OpenCode, Kimi and MTPLX as code reviewers
atomantic Sep 3, 2026
5e742ca
Merge pull request #5962 from atomantic/cos/task-mtkolu4j/agent-4a3f0ffb
atomantic Sep 3, 2026
a52201c
test: fake the timers in the two suites that slept 5.4s of real time …
atomantic Sep 3, 2026
ae17f97
fix: keep the copilot review flag when a PortOS-only reviewer rides a…
atomantic Sep 3, 2026
6fa099b
refactor: drop 21 exported-but-unwired Zod schemas and guard against …
atomantic Sep 3, 2026
142fbb1
Merge pull request #5906 from tzioup/docs/socket-ui-skill-stale-rules
atomantic Sep 3, 2026
c88fb24
Merge pull request #5967 from atomantic/cos/task-mtkujyh1/agent-37575aab
atomantic Sep 3, 2026
6894dcf
test: pin the FableLoom hosted-socket event handlers and the host-onl…
atomantic Sep 3, 2026
dfe213b
Merge pull request #5968 from atomantic/claim/issue-5726
atomantic Sep 3, 2026
271f9d1
refactor: put every client reviewer-vocabulary constant behind the se…
atomantic Sep 3, 2026
e247ebc
Merge pull request #5969 from atomantic/claim/issue-5704
atomantic Sep 3, 2026
acbce12
feat: add a fail-closed Blender rigging runtime resolver and readines…
atomantic Sep 3, 2026
fdd12ad
test: derive the rigging interpreter path so the suite passes on Windows
atomantic Sep 3, 2026
af853f6
Merge pull request #5970 from atomantic/claim/issue-5752
atomantic Sep 3, 2026
4cb2664
render pr-reviewer stage 3 output as structured markdown instead of o…
atomantic Sep 3, 2026
4307ecf
own the PR-decision envelope in one module so its two prompts cannot …
atomantic Sep 3, 2026
35f9027
keep an inline suggestion applyable when the finding body opens a cod…
atomantic Sep 3, 2026
fa40894
fix: honour a Stop raised while a Codex thread/start or turn/start RP…
atomantic Sep 3, 2026
bb49005
fix: stop caching a failed FLUX.2 venv health check forever, and exte…
atomantic Sep 3, 2026
a592444
simplify: use a Set for usesDiffusersRunner, matching the file's exis…
atomantic Sep 3, 2026
9daa3a1
perf: sync federated usage per instance slot, not the whole digest ma…
atomantic Sep 3, 2026
a710357
Merge pull request #5971 from atomantic/cos/task-mtkxkzln/agent-3c8239f1
atomantic Sep 3, 2026
7c8ef65
Merge pull request #5973 from atomantic/cos/task-mtky7yt3/agent-ba1aa9b0
atomantic Sep 3, 2026
3d0dd95
feat: auto-skin generated characters behind a measured weight-coverag…
atomantic Sep 3, 2026
97e8377
fix: verify a published rig reads back before recording it as ready (…
atomantic Sep 3, 2026
4d08d4a
Merge pull request #5972 from atomantic/claim/issue-5778
atomantic Sep 3, 2026
26334af
Merge branch 'main' into claim/issue-5759
atomantic Sep 3, 2026
a53f345
Merge pull request #5974 from atomantic/claim/issue-5759
atomantic Sep 3, 2026
cea998d
Merge branch 'main' into claim/issue-5753
atomantic Sep 3, 2026
ffd192d
fix: refresh the API route catalog stats after merging main (#5753)
atomantic Sep 3, 2026
8a21f2a
Merge pull request #5975 from atomantic/claim/issue-5753
atomantic Sep 3, 2026
efbf6d1
ci: install the autofixer workspace so a broken lockfile cannot ship …
atomantic Sep 3, 2026
1a4d7b8
fix: stop a FableLoom hosted turn from emitting after its session end…
atomantic Sep 3, 2026
bec3727
feat: add a subject-framing control to image-to-3D so extremities sur…
atomantic Sep 3, 2026
6882115
Merge pull request #5978 from atomantic/claim/issue-5779
atomantic Sep 3, 2026
b800e84
Merge pull request #5979 from atomantic/claim/issue-5786
atomantic Sep 3, 2026
544c7a3
move Usage and Providers pages into the Models nav section
atomantic Sep 3, 2026
3db13dc
Merge pull request #5982 from atomantic/claim/issue-5755
atomantic Sep 3, 2026
b46b2c9
Merge pull request #5965 from atomantic/claim/issue-5733
atomantic Sep 3, 2026
d78f798
Merge pull request #5966 from atomantic/claim/issue-5730
atomantic Sep 3, 2026
162636b
refactor: give the client a textUtils mirror so escapeRegExp stops be…
atomantic Sep 3, 2026
168e912
fix app update activity log wrapping git-pull stat output on mobile
atomantic Sep 3, 2026
b98a68c
fix: stop losing a fast-exiting direct agent's output and close event…
atomantic Sep 3, 2026
7c99694
Merge pull request #5987 from atomantic/cos/task-mtl0ykub/agent-6863f8b1
atomantic Sep 3, 2026
2296a4f
feat: export a generated 3D model as USDZ so it opens in AR on your p…
atomantic Sep 3, 2026
22c55c1
fix: code reviewer config — model dropdown, and default to your AI pr…
atomantic Sep 3, 2026
2926bc7
Merge pull request #5988 from atomantic/claim/issue-5791
atomantic Sep 3, 2026
17be257
Merge pull request #5986 from atomantic/claim/issue-5790
atomantic Sep 3, 2026
788817e
Merge pull request #5989 from atomantic/claim/issue-5756
atomantic Sep 3, 2026
99cc19a
default the repo study brief to the link save note
atomantic Sep 3, 2026
b35b914
Merge pull request #5990 from atomantic/cos/task-mtl0oy4x/agent-7a16f4be
atomantic Sep 3, 2026
441b212
fix: keep a throwing onRunStarted hook from crashing the server on CL…
atomantic Sep 3, 2026
0df3738
Merge pull request #5995 from atomantic/cos/task-mtl1l75u/agent-4c614be6
atomantic Sep 3, 2026
89734a8
refactor: give the autofixer one shared module for PM2 execution, dat…
atomantic Sep 3, 2026
3a03081
fix: gate unattended commands at the subcommand level, not just the b…
atomantic Sep 3, 2026
ff47e51
fix: keep long tokens in wrapping <pre> blocks on screen (#5820)
atomantic Sep 3, 2026
a5b5fe6
fix: assert the autofixer data dir without the '../data' spelling the…
atomantic Sep 3, 2026
cb3172f
Merge pull request #5964 from atomantic/claim/issue-5732
atomantic Sep 3, 2026
e4d199a
fix: run PortOS's App Management update through the detached launcher…
atomantic Sep 3, 2026
15f030c
fix: hold the update lock and report a failed health verify honestly …
atomantic Sep 3, 2026
495d885
fix: name the real reason when a PortOS update declines the detached …
atomantic Sep 3, 2026
0a7e028
ci: register the <pre> wrap/break guard with the test selector (#5820)
atomantic Sep 3, 2026
5588b14
Merge pull request #5985 from atomantic/claim/issue-5976
atomantic Sep 3, 2026
4c10cff
Merge pull request #5996 from atomantic/claim/issue-5792
atomantic Sep 3, 2026
ba3bd9e
Merge pull request #5997 from atomantic/claim/issue-5808
atomantic Sep 3, 2026
f877fc7
Merge pull request #5998 from atomantic/claim/issue-5820
atomantic Sep 3, 2026
3fdc839
fix: retry local code review without reasoning_effort when a model re…
atomantic Sep 3, 2026
cb95888
update Antigravity model catalog to include Gemini 3.8, drop retired 3.5
atomantic Sep 3, 2026
db15480
refactor: skip effort normalization when the thinking-downgrade cache…
atomantic Sep 3, 2026
dde2842
fix: build the FLUX.2 venv from a system Python, never PortOS's own v…
atomantic Sep 3, 2026
9884dac
Merge pull request #6012 from atomantic/claim/issue-5960
atomantic Sep 3, 2026
6eee84d
Merge pull request #6011 from atomantic/cos/task-mtl2vvqb/agent-e63686dc
atomantic Sep 3, 2026
2734f2f
fix: keep grok's weekly reset time from squeezing off mobile usage cards
atomantic Sep 3, 2026
e72270a
fix: teach pr-reviewer Stage 3 the sandbox-protected .claude/ apply f…
atomantic Sep 3, 2026
e52c084
Merge pull request #6020 from atomantic/cos/task-mtl2xaes/agent-3de5d4c0
atomantic Sep 3, 2026
1ecd540
Merge pull request #6016 from atomantic/claim/issue-5980
atomantic Sep 3, 2026
b3cd959
fix: gate the sandbox-write fallback on the real git apply, not --check
atomantic Sep 3, 2026
6ec4e70
test: reset git test sandboxes in place instead of copy+delete per te…
atomantic Sep 3, 2026
425544e
fix: apply update preflight guards to App Management's socket update …
atomantic Sep 3, 2026
1dd12a7
feat: verify the merge-gate contract before a completing agent tears …
atomantic Sep 3, 2026
07cb920
fix: serialize boot schema DDL across processes with an advisory lock…
atomantic Sep 3, 2026
98cc798
Merge pull request #6028 from atomantic/claim/issue-5984
atomantic Sep 3, 2026
1060066
Merge pull request #6027 from atomantic/claim/issue-5963
atomantic Sep 3, 2026
67c09c0
fix: find the SGLang project inside WSL2 on Windows instead of asking…
atomantic Sep 3, 2026
c42f0bf
fix: attribute nested Grok and Antigravity CLI usage in cost reports …
atomantic Sep 3, 2026
fcc20d6
fix: flag a stale deployed build in AI provider investigation tasks
howlingmime Sep 3, 2026
b92f40b
Merge pull request #6029 from atomantic/claim/issue-5977
atomantic Sep 3, 2026
ea04b6e
fix: harden gitTestRepo reset helpers per review (#6003)
atomantic Sep 3, 2026
0f04aff
feat: let a failed installer queue a CoS agent to investigate it (#5981)
atomantic Sep 3, 2026
a09dbf0
fix: address local review findings on the merge-gate contract check (…
atomantic Sep 3, 2026
f56c650
fix: validate the mkdtemp path, not git's respelling, in worktreeReap…
atomantic Sep 3, 2026
e16a992
Merge pull request #6041 from atomantic/claim/issue-5876
atomantic Sep 3, 2026
f7bcfe3
Merge pull request #6040 from atomantic/claim/issue-6003
atomantic Sep 3, 2026
52127c4
feat: collapse scheduled-task cadences to On-Demand or Scheduled (#5829)
atomantic Sep 3, 2026
26e489a
fix: normalize path separators in the three new venv-base assertions
atomantic Sep 3, 2026
6571dfa
fix: redact and bound the installer log tail before it reaches a queu…
atomantic Sep 3, 2026
cc67b0a
fix: redact the error line and stop calling a blocked duplicate task …
atomantic Sep 3, 2026
37f3654
chore: match the investigate button's tooltip to its queued vs alread…
atomantic Sep 3, 2026
5d5d2ba
fix: stop the Perpetual toggle attaching .catch() to a bare await (#5…
atomantic Sep 3, 2026
6584c8a
Merge pull request #6034 from atomantic/claim/issue-5832
atomantic Sep 3, 2026
b862954
Merge pull request #6035 from atomantic/claim/issue-5831
atomantic Sep 3, 2026
adadca4
Merge pull request #6042 from atomantic/claim/issue-5829
atomantic Sep 3, 2026
cfc1071
refactor([issue-5833]): collapse server-side .env helpers onto portosEnv
atomantic Sep 3, 2026
d18c0e9
Merge remote-tracking branch 'origin/main' into next/issue-5833
atomantic Sep 3, 2026
8fe3d5e
Merge pull request #6046 from atomantic/next/issue-5833
atomantic Sep 3, 2026
8cc176d
Merge pull request #6044 from atomantic/claim/issue-5981
atomantic Sep 3, 2026
164ff8f
restart PortOS's PM2 apps when an update aborts between the delete an…
atomantic Sep 3, 2026
a4e5524
address review (claude): resolve pm2 for the recovery and close the W…
atomantic Sep 3, 2026
eb6df7c
address review (claude): arm the latch before the delete and stop Pow…
atomantic Sep 3, 2026
b69b343
fix the PORTOS_ENV_PATH import that is currently red on main, and add…
atomantic Sep 3, 2026
15ed8fe
test: extract the shared VideoGen page mock harness (#5836)
atomantic Sep 3, 2026
026cb76
Merge pull request #6047 from atomantic/cos/task-mtl41li2/agent-f2470649
atomantic Sep 3, 2026
5e3a665
test: give Python-shelling suites explicit, nested timeouts (#5856)
atomantic Sep 3, 2026
cace949
add a Harnesses page so coding-agent CLIs can be updated from PortOS
atomantic Sep 3, 2026
61ed03f
fix: resolve ollama thinking support per model before sending reasoni…
atomantic Sep 3, 2026
e533f78
Merge pull request #6053 from atomantic/claim/issue-6050
atomantic Sep 3, 2026
bc4c9e2
address local review: keep the configured-default sentinel across a m…
atomantic Sep 3, 2026
cf59d98
chore(deps): clear the qs moderate advisories and refresh patch-level…
atomantic Sep 3, 2026
878468a
Merge pull request #6054 from atomantic/cos/sys-portos-d-dependency-u…
atomantic Sep 3, 2026
2aa6e27
fix: ignore Finder metadata in build freshness
tzioup Aug 31, 2026
107273c
docs: record macOS stale-build investigation
tzioup Sep 3, 2026
4ec009d
fix(video-gen): quote the real FastMetal download size in the picker …
atomantic Sep 3, 2026
78511ed
Merge pull request #6038 from howlingmime/cos/sys-mtjng46r/agent-4e73…
atomantic Sep 3, 2026
d959595
Merge pull request #6049 from atomantic/claim/issue-5836
atomantic Sep 3, 2026
9bb4b57
Merge pull request #6052 from atomantic/claim/issue-5856
atomantic Sep 3, 2026
4c62909
address review round 2: hold a record to its own namespace on a model…
atomantic Sep 3, 2026
606a7de
Merge pull request #6057 from atomantic/claim/issue-5871
atomantic Sep 3, 2026
f87a964
Merge pull request #6058 from atomantic/cos/task-mtl4yl8u/agent-c0aa1bee
atomantic Sep 3, 2026
b99d32f
test: settle the ChiefOfStaff page mount before querying it (#5857)
atomantic Sep 3, 2026
77acfd8
Merge pull request #6061 from atomantic/claim/issue-5857
atomantic Sep 3, 2026
cda93b5
Merge pull request #6055 from tzioup/fix/ignore-client-ds-store-build…
atomantic Sep 3, 2026
ae2c371
feat: retarget animation clips onto rigged characters with a motion p…
atomantic Sep 3, 2026
b178c52
fix: refuse a write-mode retarget on its over-cap proposal, not just …
atomantic Sep 3, 2026
f50866c
Merge pull request #6063 from atomantic/claim/issue-5893
atomantic Sep 3, 2026
547d6c4
stop pr-reviewer stage 3 marking sandbox and probe failures as review…
atomantic Sep 3, 2026
037b0b9
Merge pull request #6066 from atomantic/cos/task-mtlk1wzx/agent-95a992fc
atomantic Sep 3, 2026
9be8d8c
hand a reviewed public PR back to its opener, or land it ourselves wh…
atomantic Sep 3, 2026
6f9c39f
address local review: describe push access from the head repo, not a …
atomantic Sep 3, 2026
01fed0d
address review: merge the handback ledger onto fresh state, and stop …
atomantic Sep 3, 2026
a9045f7
drop the union-merge duplicate of the prReviewReport catalog row
atomantic Sep 3, 2026
6f8f222
fix(cos): start the PR page's Resolve & merge agent immediately
atomantic Sep 3, 2026
f5caf02
Merge pull request #6067 from atomantic/cos/task-mtljhoa7/agent-5a745ea2
atomantic Sep 3, 2026
d034c13
Merge pull request #6068 from atomantic/cos/task-mtlko6vu/agent-d09f43a9
atomantic Sep 3, 2026
1dd6c69
chore: release v2.57.0
atomantic Sep 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
  •  
  •  
  •  
37 changes: 37 additions & 0 deletions .changelog/v2.57.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Release v2.57.0

Released: 2026-09-03

## Highlights

**Rigging & 3D**
- Generated 3D characters can now be auto-skinned to a rig with a measured weight-coverage gate, then have animation clips retargeted onto them with a compatibility contract and a motion proof, so imported motion doesn't visibly break on unfamiliar skeletons.
- 3D models can be exported as USDZ, so they open directly in AR on an iPhone/iPad.
- Image-to-3D gained a subject-framing control so limbs and extremities survive conversion, and Blender rigging now resolves through a fail-closed runtime resolver with a readiness probe instead of failing silently mid-job.

**Code review & CoS agents**
- Added OpenCode, Kimi, and MTPLX as selectable code reviewers, and reviewers now live under Models instead of a separate list.
- `pr-reviewer` stage 3 can run on any enabled CLI/TUI provider (spawned headless), with a documented Claude sandbox recipe.
- A fork PR's held CI run now releases only after the coordinator's own approval, never before — closing a gap where an untrusted fork's CI could run ahead of review.
- A failed installer can now queue a CoS agent to investigate the failure automatically, and the merge-gate contract is verified before a completing agent tears down its worktree.
- Numerous CoS/pr-reviewer robustness fixes: honoring a Stop signal mid Codex RPC, rescuing hook payloads from `output.txt` for direct CLI runs, keeping the sandbox-write fallback gated on a real `git apply` (not `--check`), retrying local code review without `reasoning_effort` when a model rejects thinking, and screening PRs for hidden/model-directed content instead of keyword co-occurrence.

**Video generation**
- FastH3 can now render directly from FastVideo's own checkpoint by converting its DiT locally.
- Fixed FastMetal's picker showing the wrong download size, clamped FastH3 frame options to the pipeline's actual 5–15s window, and made `generate_fastvideo` importable on Python 3.9.

**Onboarding & settings**
- A fresh install now gets a first-run card that stages one PortOS slice end to end.
- Added a Settings > Credentials page showing presence and source for configured credentials.
- Generated assets are now stamped with their source model/LoRA licenses.
- Scheduled-task cadences collapsed to a simpler On-Demand / Scheduled choice.
- Local coding runtime is now recommended based on detected hardware.

**Reliability & UX fixes**
- Fixed a stuck-forever FLUX.2 venv health-check cache, boot schema DDL races across processes, worktree cleanup after a failed agent spawn, and object-URL leaks in ImageGen.
- Mobile/UI polish: 44px tap targets on MeatSpace log-row icons, wrapping long tokens in `<pre>` blocks, clamping dropdown popovers to the viewport, and keeping long record names readable via a title tooltip.
- App Management updates are now opt-in and route through the detached launcher with proper preflight guards, instead of running unannounced.

## Full Changelog

**Full Diff**: https://github.com/atomantic/PortOS/compare/v2.56.0...v2.57.0
4 changes: 2 additions & 2 deletions .claude/skills/portos-socket-ui/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ These are hard-won failure contracts from the Shell and CoS-agent views. Every o

- **Single-subscriber socket resources need notify + recipient-relative advertise + filter + claim.** Some server-side resources (PTY shell sessions, etc.) intentionally store one attached socket and fan output to it. The contract: (1) emit `<resource>:detached` on the previous socket when a new socket takes over so the displaced client can drop its local view; (2) include an `attached: boolean` field on each list-entry payload, computed *relative to the recipient socket* (true only when bound to a different socket) — a globally-truthy `attached` makes a client's own sessions look unavailable to itself; (3) broadcast list updates from both attach AND detach paths; (4) auto-pick paths send `claim: true` and the server refuses to displace a different socket. Manual paths (tab click, deep-link URL) default to `claim: false` so explicit intent still wins. See `server/services/shell.js` for the canonical implementation.

- **Pending socket-request tracking — `{ target, generation }` ref.** When a stateful socket operation is in flight, track it as `{ target, generation }` and increment `generation` on every change. Response handlers gate on strict equality with `target` — null/stale/cancelled all fall through, so a cancelled-mid-flight response can't re-activate after the user moved on. Deferred work (`setTimeout` fallbacks) captures `generation` and aborts if it advanced. Pair every cancellation path with explicit `cancelPendingAttach()`-style helpers rather than overloading a `clearActiveSession()` helper — clearing the displayed entity and cancelling an in-flight request are *separate* concerns, and conflating them cancels user-initiated switches when an unrelated session dies. See `client/src/pages/Shell.jsx` `pendingAttachRef` for the pattern.
- **Pending socket-request tracking — `{ target, generation }` ref.** When a stateful socket operation is in flight, track it as `{ target, generation }` and increment `generation` on every change. Response handlers gate on strict equality with `target` — null/stale/cancelled all fall through, so a cancelled-mid-flight response can't re-activate after the user moved on. Deferred work (`setTimeout` fallbacks) captures `generation` and aborts if it advanced. Pair every cancellation path with explicit `cancelPendingAttach()`-style helpers rather than overloading a `clearActiveSession()` helper — clearing the displayed entity and cancelling an in-flight request are *separate* concerns, and conflating them cancels user-initiated switches when an unrelated session dies. See `client/src/hooks/useShellSession.js` `pendingAttachRef` for the pattern.

- **Server-correlate every async response, then filter display.** When the server emits `<resource>:error` in response to a client request, include the original `sessionId` / request id in the payload so the client can match against its pending state. Drop stale errors silently and gate the red-error display on correlation — rendering before classification flashes noise in the UI for requests the user has already moved past (rapid tab clicks, expected `claim:true` race rejections). Passive errors against the currently-displayed resource (e.g. `shell:input` to a now-dead session) should still display, but must not mutate pending state.

- **Distinguish intentional idle from passive idle.** A "no entity displayed" state can come from a user action (Stop / dismiss) or from passive circumstance (initial load found everything in-use elsewhere). Recovery branches that auto-adopt the next free entity must gate on a `userIdle*Ref` flag set by explicit user-clear paths and cleared by every user-initiated start/attach. The gate needs to cover every reconnect-triggered re-init path, not just the initial-load branch — a transient disconnect resets initialization flags, and an empty-list auto-start or survivor adoption can otherwise undo an explicit Stop on reconnect.

- **Deferred work must respect both staleness and unmount.** Any `setTimeout`-scheduled side effect that emits to the network or mutates shared state needs two guards: (1) a generation counter check so user actions during the delay window abort it, and (2) a `mountedRef` so a navigation-away unmount stops it from firing into the void. Pattern: `const mountedRef = useRef(true); useEffect(() => () => { mountedRef.current = false; }, []);` — never reset to `true` (handles dev-mode double-mount cleanly). Without the unmount guard, a deferred socket emit can claim a resource (e.g. shell session) with no listener left to render it.
- **Deferred work must respect both staleness and unmount.** Any `setTimeout`-scheduled side effect that emits to the network or mutates shared state needs two guards: (1) a generation counter check so user actions during the delay window abort it, and (2) a `mountedRef` so a navigation-away unmount stops it from firing into the void. Use `useMounted()` from `client/src/hooks/useMounted.js`; it re-arms on every mount, which StrictMode's mount-cleanup-remount cycle requires. Do not hand-roll the guard even correctly — `client/src/hooks/mountedRefConventions.test.js` rejects both a `useRef(true)` that is only ever set to `false` and any re-implementation of the hook. Without the unmount guard, a deferred socket emit can claim a resource (e.g. shell session) with no listener left to render it.
76 changes: 71 additions & 5 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,19 @@ PGPASSWORD=portos
# Loopback HTTP port spawned when HTTPS is active so local curl skips the cert (default: 5553)
# PORTOS_HTTP_PORT=5553

# Port the Express server listens on (server/index.js; default: 5555 from lib/ports.js)
# PORT=5555

# VNC port the Remote Desktop broker connects to on this machine
# (remoteDesktop.js; default: 5900). A non-numeric or out-of-range value falls
# back to the default rather than failing.
# PORTOS_VNC_PORT=5900

# pm2 restarts portos-server when its RSS crosses this (memory-leak safety valve).
# Default 4G fits small installs; raise it on a big-RAM workstation so a long
# session / heavy SSE load doesn't cause spurious restarts (e.g. 32G on 128 GB).
# PORTOS_SERVER_MAX_MEMORY=32G

# Same ceiling for the Vite dev server (portos-ui). Default 1G — a dev server that
# transforms modules on demand should sit well under that; raise it only if a huge
# client tree makes Vite restart during normal editing.
# PORTOS_UI_MAX_MEMORY=2G

# Override the base URLs advertised to clients (auto-derived from PORTOS_HOST/PORT if unset)
# PORTOS_API_URL=https://my-machine.ts.net:5555
# PORTOS_UI_URL=https://my-machine.ts.net:5555
Expand Down Expand Up @@ -69,6 +72,12 @@ PGPASSWORD=portos
# Chief of Staff runner endpoint (used when CoS runs as a separate process)
# COS_RUNNER_URL=http://localhost:5558

# Eidoverse world server endpoints (eidoverseWorld.js). The WebSocket URL defaults
# to ws://127.0.0.1:<eidoverse port>/ws; the HTTP URL is derived from it unless set.
# Point these at another host only when the world runs off-box.
# EIDOVERSE_WS_URL=ws://127.0.0.1:8940/ws
# EIDOVERSE_HTTP_URL=http://127.0.0.1:8940/

# Active local LLM backend: "ollama" or "lmstudio" (chosen at setup time; managed in Settings → Local LLMs)
# LLM_BACKEND=ollama

Expand Down Expand Up @@ -96,6 +105,11 @@ PGPASSWORD=portos
# Maximum Grok image-generation runtime in milliseconds (default: 1200000 / 20 minutes)
# GROK_TIMEOUT_MS=1200000

# Maximum Grok VIDEO runtime in milliseconds (videoGen/grok.js; default: 1800000 /
# 30 minutes). Video takes longer than an image, so this cap is separate from
# GROK_TIMEOUT_MS — keep it above the 20-minute cloud-lane idle watchdog.
# GROK_VIDEO_TIMEOUT_MS=1800000

# Maximum Antigravity image-generation runtime in milliseconds (default: 1200000 / 20 minutes)
# AGY_IMAGEGEN_TIMEOUT_MS=1200000

Expand Down Expand Up @@ -141,6 +155,11 @@ PGPASSWORD=portos
# because a bare `bash` often resolves to WSL, which can't see drive paths.
# PORTOS_BASH=/bin/bash

# Python interpreter scripts/setup-image-video.sh uses as the venv base
# (setupScriptRunner.js). An explicit value always wins; on Windows PortOS
# otherwise auto-detects one, avoiding a conda base whose venv can't load torch.
# PYTHON_BIN=/usr/bin/python3

# Shell binary for interactive PTY sessions (the Shell page, agent TUI shells).
# Auto-detected if unset: on Windows PowerShell 7, else Windows PowerShell, else
# cmd.exe (last, because it can't reach another drive by anything you'd type —
Expand Down Expand Up @@ -171,9 +190,29 @@ PGPASSWORD=portos
# Ollama context window size passed to new model loads (default: 32768)
# OLLAMA_NUM_CTX=32768

# Slotstream model cache directory override (slotstreamModels.js; default:
# ~/.slotstream/models). The binary always lives in ~/.slotstream/bin.
# SLOTSTREAM_MODEL_DIR=/path/to/slotstream/models

# Abort a speculative-decoding model download after this many milliseconds with
# no bytes received (specDecodeModels.js; default: 1200000 / 20 minutes). Raise
# it for a slow Hugging Face/CDN handshake; a download still receiving bytes is
# never cut off by this.
# SPEC_DECODE_IDLE_STALL_MS=1200000

# Video process grace period after output completion in milliseconds (default: 40000)
# VIDEOGEN_COMPLETION_WATCHDOG_MS=40000

# FFLF/ltx2 stage-2 pixel-frame budget (videoGen/renderArgs.js). Unset, PortOS
# scales it to detected unified memory. Raise it on a big-memory box; lower it if
# a render OOMs. This is the single cap both the worker and the client honour.
# FFLF_LTX2_PIXEL_BUDGET=8000000

# Megapixel ceiling for a local image regeneration render (imageGen/regen.js;
# default: 2.0). The result is upscaled back to the source's exact dimensions, so
# this bounds compute, not output size. Raise it on a high-memory machine.
# PORTOS_REGEN_MAX_MP=2.0

# Terminate an idle queued video job after this many milliseconds (default: 1800000 / 30 minutes)
# MEDIA_JOB_WATCHDOG_VIDEO_MS=1800000

Expand Down Expand Up @@ -207,15 +246,42 @@ PGPASSWORD=portos
# Automatic LoRA checkpoint resumes allowed after soft stalls (default: 2; 0 disables)
# LORA_TRAIN_STALL_MAX_AUTO_RESUMES=2

# Cap LoRA training quantization at this bit width (loraTraining/runtimes.js).
# Only 8 or 4 are honoured; anything else is ignored and the memory-derived tier
# stands. Set it to force a smaller quant on a machine whose auto-tier OOMs.
# LORA_TRAIN_MAX_QUANT_BITS=4

# Ingredient catalog revisions retained per ingredient (default: 50)
# CATALOG_REVISION_RETENTION=50

# LM Studio model id auto-installed for voice tool calling (default: built-in fallback chain)
# PORTOS_VOICE_DEFAULT_TOOL_MODEL=lmstudio-community/Qwen2.5-3B-Instruct-GGUF

# Signal Desktop install directory read by Signal sync (signalSync.js; default:
# ~/Library/Application Support/Signal). SIGNAL_CONFIG_PATH and SIGNAL_DB_PATH are
# derived from it, so relocating a Signal install usually only needs this one.
# SIGNAL_DIR=/path/to/signal

# Signal sync config file path (default: SIGNAL_DIR/config.json)
# SIGNAL_CONFIG_PATH=/path/to/signal/config.json

# Signal sync SQLCipher database path (default: SIGNAL_DIR/sql/db.sqlite)
# SIGNAL_DB_PATH=/path/to/signal/sql/db.sqlite

# Test/CI hook that supplies the "Signal Safe Storage" password instead of
# shelling out to the macOS keychain (signalSync.js). Leave unset on a real
# install — PortOS reads the keychain itself, and this would put a live
# credential in a plaintext file.
# SIGNAL_KEYCHAIN_PASSWORD=fake-keychain-password

# macOS Contacts (AddressBook) directory read by contact sync (contactsSync.js;
# default: ~/Library/Application Support/AddressBook)
# CONTACTS_AB_ROOT=/path/to/AddressBook

# macOS Messages database read by iMessage sync (imessageSync.js; default:
# ~/Library/Messages/chat.db)
# IMESSAGE_CHAT_DB=/path/to/chat.db

# Privacy Center PII Vault encryption key — 32 bytes, hex (64 chars) or base64.
# Auto-generated and appended to .env on the first vault write if unset. Back
# it up: losing it makes every encrypted vault value unrecoverable.
Expand Down
15 changes: 15 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,18 @@
*.woff2 binary
*.ttf binary
*.eot binary

# Sorted catalogs and barrels: one line per module, so concurrent branches
# conflict on the same insertion hunk. `union` keeps both sides;
# scripts/catalog-merge-union.test.js catches a doubled or resurrected line
# and pins this list to the barrel list in scripts/ci-test-plan.js. Rationale
# and rules: AGENTS.md "Module Organization".
server/lib/README.md merge=union
server/lib/index.js merge=union
client/src/lib/README.md merge=union
client/src/lib/index.js merge=union
client/src/hooks/README.md merge=union
client/src/hooks/index.js merge=union
client/src/utils/README.md merge=union
client/src/utils/index.js merge=union
client/src/services/README.md merge=union
Loading