Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
260 commits
Select commit Hold shift + click to select a range
7bea0eb
fix(overnight): say stopped and exit 2 when a limit ended the run
sosidudku1 Nov 10, 2026
8f28f45
fix(models): leave Atomic Core alone when an update is refused for a …
sosidudku1 Nov 10, 2026
8b8be8c
Config: keep a newer build's agent.prompt.compact value on disk
sosidudku1 Nov 10, 2026
147c1dd
fix(fs): search the working folder before crowded parent folders on a…
sosidudku1 Nov 10, 2026
e5d8c31
Resolve qwen-think from a strict ChatML think template under a neutra…
sosidudku1 Nov 10, 2026
92496be
fix(llm): decode native tool names through the request's wire-name ma…
sosidudku1 Nov 10, 2026
99d80ad
fix(trace): replay matches sessions recorded with search mode off
sosidudku1 Nov 10, 2026
f73f2dd
fix(prompt): keep one descriptor each for os.git.push, commit and che…
sosidudku1 Nov 10, 2026
f6c506c
fix(fs): keep the folder that holds the missing path in the near search
sosidudku1 Nov 10, 2026
4f4a7e2
fix(llm): anchor the Claude temperature rule and skip a resend that c…
sosidudku1 Nov 10, 2026
e1950ff
fix(shell-guard): let scripts print a sign-in hint that names a URL
sosidudku1 Nov 10, 2026
100396e
fix(approval): apply saved deny rules to safe shell commands and nest…
sosidudku1 Nov 10, 2026
3e6a8b2
fix(overnight): resume a task only at the approval level it started u…
sosidudku1 Nov 10, 2026
84338fd
fix(fusion): count worker spend once and where the person sees it
sosidudku1 Nov 10, 2026
7d61f33
refactor(shell-guard): move printed-literal blanking into its own file
sosidudku1 Nov 10, 2026
fe20f54
fix(llm): treat GPT-6 as an OpenAI reasoning model
sosidudku1 Nov 10, 2026
1fd8eeb
fix(llm): keep reasoning_content on every DeepSeek tool call and with…
sosidudku1 Nov 10, 2026
4ddf5b4
fix(budget): skip the session-naming call after a budget stop
sosidudku1 Nov 10, 2026
cdebe42
feat(http): label tool calls in a chat's history like the live stream
sosidudku1 Nov 10, 2026
c25518f
fix(fusion): handle a stopped or swapped worker like any other cut
sosidudku1 Nov 10, 2026
6431503
fix(openrouter): rank new model generations with their family
sosidudku1 Nov 10, 2026
0dabaa5
fix(llm): send boolean tool subschemas as objects and drop a tool the…
sosidudku1 Nov 10, 2026
a6906ed
Reserve reply room for the reasoning budget on small windows
sosidudku1 Nov 10, 2026
a114830
fix(overnight): say when the Telegram report could not be sent
sosidudku1 Nov 10, 2026
36d061f
fix(openrouter): run Fable 5.2 at medium effort by default
sosidudku1 Nov 10, 2026
c32dd2b
fix(fusion): keep local server health per server
sosidudku1 Nov 10, 2026
5f1ad2e
Keep compacted turns out of the session row
sosidudku1 Nov 10, 2026
942aac8
Bound compaction reasoning on Gemini and AI/ML API thinking models
sosidudku1 Nov 10, 2026
e655500
fix(goal): share one money budget across all goal rounds
sosidudku1 Nov 10, 2026
e710a83
fix(tasks): report a task's spend against its cap and a used-up budge…
sosidudku1 Nov 10, 2026
062cce1
fix(tasks): end an approval wait when the task's time limit passes
sosidudku1 Nov 10, 2026
d40f7ce
fix(llm): size DeepSeek's reasoning against the body the capacity che…
sosidudku1 Nov 10, 2026
b24b2d3
feat(http): take the last plain question and answer back
sosidudku1 Nov 10, 2026
a0e2670
fix(overnight): block a task at another approval level instead of lea…
sosidudku1 Nov 10, 2026
3799e04
fix(overnight): count a used-up budget on resume and lost credit as s…
sosidudku1 Nov 10, 2026
97477f7
fix(overnight): also say why when no Telegram bot is set up or Telegr…
sosidudku1 Nov 10, 2026
bf6edb3
docs(turn): keep resolveTurnLocalEngine's comment on its own function
sosidudku1 Nov 10, 2026
87c5f01
fix(fusion): name the spend cap, not a stop, when the cap ends the pool
sosidudku1 Nov 10, 2026
14ba9a7
Gemini Flash: keep thinking off for the compaction summary; skip gpt-…
sosidudku1 Nov 10, 2026
ca469ff
fix(tasks): split a very long approval deadline into timer hops
sosidudku1 Nov 10, 2026
02d61a8
fix(openrouter): no default effort when the request turns thinking off
sosidudku1 Nov 10, 2026
7514a99
test(fusion): cover the spend readout wiring
sosidudku1 Nov 10, 2026
4ce2f34
docs(overnight): describe exit 2 for a run a limit stopped
sosidudku1 Nov 10, 2026
b9492b4
fix(llm): keep Azure gpt-35-turbo out of the reasoning rule
sosidudku1 Nov 10, 2026
cde3ac9
fix(llm): keep prefixItems tuples satisfiable and surface the origina…
sosidudku1 Nov 10, 2026
2abf70b
fix(http): never take back a stopped turn, match the question by posi…
sosidudku1 Nov 10, 2026
6e88e56
fix(tui): make try again on the last question a real retry
sosidudku1 Nov 10, 2026
c8868de
test(agent): compaction spend alone stops a run at the task budget
sosidudku1 Nov 10, 2026
3e83fe4
Never lose archived turns when the archive table is unavailable
sosidudku1 Nov 10, 2026
0433513
fix(tui): match the retried question by position, fall back on a stop
sosidudku1 Nov 10, 2026
2b6be9d
fix(llm): name history tool calls by the request's wire names (ATO-1365)
sosidudku1 Nov 10, 2026
b71413b
test(runtime): no naming call after a turn stopped for money
sosidudku1 Nov 10, 2026
b779ec4
fix(shell-guard): read prints whole when their output can run or the …
sosidudku1 Nov 10, 2026
1536c20
fix(approval): close more deny-rule bypasses through wrappers and nes…
sosidudku1 Nov 10, 2026
d029e82
fix(cli): do not re-run a handoff when the TUI restarts after an update
sosidudku1 Nov 11, 2026
7a8ae18
Write debug and bug-report archives owner-only (0600)
sosidudku1 Nov 12, 2026
0a6157e
test(fusion): pin the spend cap reason when the cap also aborts the s…
sosidudku1 Nov 12, 2026
f91f157
fix(config): an engine or backend variant chosen here replaces the ne…
sosidudku1 Nov 12, 2026
91420c7
fix(packaging): list the desktop app's debs in the apt index
sosidudku1 Nov 12, 2026
56021e5
Grant browser submits and off-site pages per site, not for every site…
sosidudku1 Nov 12, 2026
a19729d
fix(fusion): keep fan-outs out of the agent state dir and stop re-sen…
sosidudku1 Nov 12, 2026
6ecd6e9
Keep search and HTTP request headers out of curl's argv
sosidudku1 Nov 12, 2026
2fbb9ec
fix(http): a failed question on screen never takes back a stored answer
sosidudku1 Nov 12, 2026
bfd782b
Add audit starter skill: find, refute, report only confirmed findings…
sosidudku1 Nov 12, 2026
3addb44
Frame browser page text as outside data, fence untrusted tool output …
sosidudku1 Nov 12, 2026
9484bf2
fix(http): a failed question on screen never takes back a stored answer
sosidudku1 Nov 12, 2026
ef6100f
Add plain-writing starter skill that strips AI tells from text and pa…
sosidudku1 Nov 12, 2026
41e2e98
Analytics: tag our own machines and test runs (ATOMIC_AGENT_TEAM or ~…
sosidudku1 Nov 12, 2026
8ce3488
Add pre-push-check starter skill: three questions before pushing agen…
sosidudku1 Nov 12, 2026
26bb5b7
Add code-graph starter skill: who calls what and where features live …
sosidudku1 Nov 12, 2026
08289de
Trust MCP readOnlyHint only for local stdio servers
sosidudku1 Nov 12, 2026
f7c10fd
Limit identical Sentry events to 10 per install per hour
sosidudku1 Nov 12, 2026
5e0b5e7
Add a security policy with a private way to report vulnerabilities (A…
sosidudku1 Nov 12, 2026
e1693b8
fix(llm): name a local server that takes no tool calls
sosidudku1 Nov 12, 2026
a702b30
fix(tui): count the questions /clear hides when try again takes a tur…
sosidudku1 Nov 12, 2026
17cdd6e
Mask secrets in trace details, before summary cuts, and in bug reports
sosidudku1 Nov 12, 2026
86a4cf9
fix(llm): explain Groq's free-tier 413 and keep it out of error reports
sosidudku1 Nov 12, 2026
d228369
Scope os.http.request session grants per origin, stop body redirects …
sosidudku1 Nov 12, 2026
53dc0d3
fix(llm): read Ollama's real context window and trim requests to fit
sosidudku1 Nov 12, 2026
a5888cc
fix(guard): ask before the remaining destructive git and shell commands
sosidudku1 Nov 12, 2026
4b29ed8
Show readable quotes in the shell approval preview
sosidudku1 Nov 12, 2026
1ac9014
Save the full os.web.fetch page when it is cut at maxChars
sosidudku1 Nov 12, 2026
7b68cb2
Log where the local completion cap and request timeout come from
sosidudku1 Nov 12, 2026
066882a
Stop a plugin's running MCP servers when its code is stopped
sosidudku1 Nov 12, 2026
abe55d9
Count cache-write tokens in the cost estimate when the service report…
sosidudku1 Nov 12, 2026
42f365e
fix(deps): clear the last npm audit findings and gate on them in CI
sosidudku1 Nov 12, 2026
b4d7a83
feat: say in the chat when a tool is left out because the server refu…
sosidudku1 Nov 12, 2026
cea0dfd
Add providers status: is the Claude Code / Codex CLI installed and si…
sosidudku1 Nov 12, 2026
4c5699b
fix(agent): end turns fast when the local engine or Atomic Chat is gone
sosidudku1 Nov 12, 2026
9b685dc
fix(gemini): clean tool schemas for Google's OpenAI-compatible endpoi…
sosidudku1 Nov 12, 2026
aad528f
fix(error-reporting): keep Atomic Chat not running out of crash reports
sosidudku1 Nov 12, 2026
db91668
fix(approval): pre-check reads saved rules; sidecar sends grant fields
sosidudku1 Nov 12, 2026
6910920
fix(fusion): stop a fan-out that keeps failing the same way, cap roun…
sosidudku1 Nov 12, 2026
0fb3899
fix(llm): plain words for Atomic Chat's key and a taken local port
sosidudku1 Nov 12, 2026
d204433
image.generate: cancel a job Esc caught mid-submit, two jobs at a tim…
sosidudku1 Nov 12, 2026
e239a0c
fix(fusion): send the next local worker on fresh connections after a …
sosidudku1 Nov 12, 2026
34ed1bc
Take the OpenRouter key out of Core when it is removed from the agent
sosidudku1 Nov 12, 2026
a3d2886
Import: end with a short summary, row by row on a terminal (ATO-818)
sosidudku1 Nov 12, 2026
e67dd52
fix(llm): retry a step once when the local engine cuts the reply mid-…
sosidudku1 Nov 12, 2026
a2564a1
fix(fusion): breaker only gates new tasks; tighter error matching
sosidudku1 Nov 12, 2026
169986e
fix(fusion): the state-dir refusal is not an argument error
sosidudku1 Nov 12, 2026
9533f59
fix(gemini): only call a 404 a missing model when Gemini names the model
sosidudku1 Nov 12, 2026
bc7f1bf
Esc during a slow submit returns at once; a late job id is still canc…
sosidudku1 Nov 12, 2026
f693f02
Mask a shared object everywhere in maskSecretsDeep
sosidudku1 Nov 12, 2026
a440c26
fix(fusion): count a round when its workers start; keep the stopped-t…
sosidudku1 Nov 12, 2026
b775c45
fix(llm): do not learn a guessed 4096 window from Ollama
sosidudku1 Nov 12, 2026
bf9a424
providers status: only a signed-out answer is signed_out; the wizard …
sosidudku1 Nov 12, 2026
5815920
fix(groq): say 'your Groq plan', not 'free tier', and only skip repor…
sosidudku1 Nov 12, 2026
8978503
Frame a spilled web page as outside text, in the file and when read back
sosidudku1 Nov 12, 2026
cb54494
fix(llm): show the --jinja advice only when the server named the flag
sosidudku1 Nov 12, 2026
d400be4
Keep Composio discovery silent and test the manager wiring
sosidudku1 Nov 12, 2026
81800c7
Key the Sentry rate limit on the fingerprint only
sosidudku1 Nov 12, 2026
88c87df
Keep only a known auth scheme word in the masked header preview
sosidudku1 Nov 12, 2026
f88875d
fix(guard): read variables inside git words, aliases on the line, xar…
sosidudku1 Nov 12, 2026
c23db1b
test(sidecar): drive approval_response grants through the handler's o…
sosidudku1 Nov 12, 2026
b78f056
fix(config): picking the default engine or variant over a newer build…
sosidudku1 Nov 12, 2026
bcbcc53
Run the npm audit check only when dependencies change
sosidudku1 Nov 12, 2026
3163972
fix(cli): models engine and the CPU fallback name the key they set, s…
sosidudku1 Nov 12, 2026
a080398
fix(guard): computed git behind front commands, aliases through varia…
sosidudku1 Nov 12, 2026
b7e5e0b
Merge PR #1117 (fix/ato-1321-hook-bash-docs)
sosidudku1 Nov 12, 2026
6c6b5d1
Merge PR #1118 (fix/ato-1398-mid-reply-timeout-retry)
sosidudku1 Nov 12, 2026
a8e5ee5
Merge PR #1122 (fix/issue-1121-local-workdir)
sosidudku1 Nov 12, 2026
0d695f9
Merge PR #1123 (fix/ato-1397-anthropic-deepseek-400)
sosidudku1 Nov 12, 2026
1c58daa
Merge PR #1124 (fix/reply-polish-edge-cases)
sosidudku1 Nov 12, 2026
f2aec4d
Merge PR #1125 (fix/ato-1330-keep-unknown-compact-mode)
sosidudku1 Nov 12, 2026
06e952f
Merge PR #1130 (fix/fusion-spend-accounting)
sosidudku1 Nov 12, 2026
f77418e
Merge PR #1131 (fix/gpt6-reasoning-params)
sosidudku1 Nov 12, 2026
b1d8ed4
Merge PR #1132 (fix/tui-fold-line-says-what-was-done)
sosidudku1 Nov 12, 2026
00a4771
Merge PR #1133 (chore/tui-drop-chat-line-builder)
sosidudku1 Nov 12, 2026
cdea529
Merge PR #1134 (fix/trace-replay-search-mode)
sosidudku1 Nov 12, 2026
3869177
Merge PR #1135 (fix/ato-1333-missing-path-budget)
sosidudku1 Nov 12, 2026
3758d76
Merge PR #1136 (fix/ato-1365-mcp-wire-name)
sosidudku1 Nov 12, 2026
edb48d4
Merge PR #1137 (fix/ato-1296-git-tool-dupes)
sosidudku1 Nov 12, 2026
36ff74c
Merge PR #1138 (fix/ato-1332-deny-rules-safe-shell)
sosidudku1 Nov 12, 2026
764b5dd
Merge PR #1139 (fix/fusion-worker-stop-and-swap)
sosidudku1 Nov 12, 2026
66a303e
Merge PR #1140 (fix/ato-1353-browser-guard-print)
sosidudku1 Nov 12, 2026
5ac343d
Merge PR #1141 (fix/openrouter-catalog-new-models)
sosidudku1 Nov 12, 2026
ec64c76
Merge PR #1147 (fix/fable-default-effort)
sosidudku1 Nov 12, 2026
9b76412
Merge PR #1148 (fix/ato-1399-tool-schema-bool)
sosidudku1 Nov 12, 2026
1741ae7
Merge PR #1149 (fix/fusion-local-health-per-server)
sosidudku1 Nov 12, 2026
e5085b8
Merge PR #1151 (fix/ato-1348-update-busy-keeps-core)
sosidudku1 Nov 12, 2026
9719a29
Merge PR #1153 (fix/ato-1271-trim-session-turns)
sosidudku1 Nov 12, 2026
2ad4f5c
Merge PR #1154 (fix/ato-1294-think-template-profile)
sosidudku1 Nov 12, 2026
4b980d2
Merge PR #1155 (fix/ato-1295-reply-reserve-thinking)
sosidudku1 Nov 12, 2026
64ff8e5
Merge PR #1156 (fix/ato-1359-cloud-thinking-compaction)
sosidudku1 Nov 12, 2026
243452c
Merge PR #1162 (fix/ato-1298-rollback-last-turn)
sosidudku1 Nov 12, 2026
6dd66f0
Merge PR #1163 (fix/ato-1382-history-done-line)
sosidudku1 Nov 12, 2026
3961da3
Merge PR #1164 (fix/ato-1302-terminal-real-retry)
sosidudku1 Nov 12, 2026
ac30ab5
Merge PR #1170 (fix/ato-1322-compaction-spend)
sosidudku1 Nov 12, 2026
8700976
Merge PR #1171 (fix/ato-1323-overnight-limit-exit)
sosidudku1 Nov 12, 2026
40d04f0
Merge PR #1172 (fix/ato-1324-overnight-approval-level)
sosidudku1 Nov 12, 2026
1752f3c
Merge PR #1173 (fix/ato-1350-no-title-after-budget-stop)
sosidudku1 Nov 12, 2026
b8fd438
Merge PR #1174 (fix/ato-1358-overnight-telegram-lock)
sosidudku1 Nov 12, 2026
24a3f0d
Merge PR #1175 (fix/ato-1288-goal-shares-budget)
sosidudku1 Nov 12, 2026
8a2569b
Merge PR #1176 (fix/ato-1367-approval-wait-time-limit)
sosidudku1 Nov 12, 2026
aec744b
Merge PR #1178 (fix/ato-1413-handoff-once)
sosidudku1 Nov 12, 2026
768a85d
Merge PR #1184 (fix/ato-1403-linux-repo-desktop)
sosidudku1 Nov 12, 2026
cf0dc34
Merge PR #1186 (fix/ato-1265-engine-choice-wins)
sosidudku1 Nov 12, 2026
41c0774
Merge PR #1190 (fix/ato-1420-worker-budget-stop-test)
sosidudku1 Nov 12, 2026
2f3ad14
Merge PR #1192 (feat/ato-1159-audit-skill)
sosidudku1 Nov 12, 2026
8ac9213
Merge PR #1193 (feat/ato-1160-plain-writing-skill)
sosidudku1 Nov 12, 2026
a47bc60
Merge PR #1194 (feat/ato-1161-pre-push-check-skill)
sosidudku1 Nov 12, 2026
d8fe883
Merge PR #1195 (fix/ato-1378-untrusted-browser)
sosidudku1 Nov 12, 2026
5b63b92
Merge PR #1196 (feat/ato-1015-code-graph-skill)
sosidudku1 Nov 12, 2026
85b633e
Merge PR #1202 (fix/ato-1283-groq-413)
sosidudku1 Nov 12, 2026
c1cccd3
Merge PR #1205 (fix/ato-1247-test-run-tag)
sosidudku1 Nov 12, 2026
9917335
Merge PR #1207 (fix/ato-1179-debug-zip-owner-only)
sosidudku1 Nov 12, 2026
da05d5f
Merge PR #1208 (fix/ato-1177-search-key-stdin)
sosidudku1 Nov 12, 2026
69145c5
Merge PR #1209 (fix/ato-1178-mcp-readonly-local-only)
sosidudku1 Nov 12, 2026
34243ca
Merge PR #1210 (fix/ato-1176-redaction-tails)
sosidudku1 Nov 12, 2026
32982b5
Merge PR #1211 (fix/ato-1181-browser-grant-per-site)
sosidudku1 Nov 12, 2026
ca59d47
Merge PR #1212 (docs/ato-783-security-policy)
sosidudku1 Nov 12, 2026
0266480
Merge PR #1213 (fix/ato-1182-http-approval-per-host)
sosidudku1 Nov 12, 2026
a6d1bbe
Merge PR #1214 (fix/ato-1276-ollama-context-window)
sosidudku1 Nov 12, 2026
60d479a
Merge PR #1215 (fix/ato-1415-npm-audit)
sosidudku1 Nov 12, 2026
181bef0
Merge PR #1216 (fix/ato-1263-guard-bypasses)
sosidudku1 Nov 12, 2026
75e8134
Merge PR #1217 (fix/ato-1407-stop-plugin-mcp)
sosidudku1 Nov 12, 2026
6b4676a
Merge PR #1218 (fix/ato-1286-sentry-per-install-limit)
sosidudku1 Nov 12, 2026
c709eb9
Merge PR #1221 (fix/ato-1417-dropped-tool-notice)
sosidudku1 Nov 12, 2026
d472a51
Merge PR #1222 (fix/ato-905-shell-preview-quotes)
sosidudku1 Nov 12, 2026
55ceb42
Merge PR #1223 (fix/ato-913-web-fetch-spill)
sosidudku1 Nov 12, 2026
88c17c4
Merge PR #1224 (fix/ato-922-llama-cap-source-log)
sosidudku1 Nov 12, 2026
2c435f8
Merge PR #1225 (fix/ato-912-cache-write-cost)
sosidudku1 Nov 12, 2026
2abdccc
Merge PR #1227 (fix/ato-1420-retry-after-clear)
sosidudku1 Nov 12, 2026
ab7b0f8
Merge PR #1228 (fix/ato-1420-retry-after-clear-tui)
sosidudku1 Nov 12, 2026
55f45d1
Merge PR #1233 (fix/ato-1282-gemini-compat)
sosidudku1 Nov 12, 2026
f84d4d0
Merge PR #1234 (fix/ato-1200-providers-status)
sosidudku1 Nov 12, 2026
d51f469
Merge PR #1235 (fix/ato-1275-1278-local-engine-fail-fast)
sosidudku1 Nov 12, 2026
b56081d
Merge PR #1237 (fix/ato-1270-approval-rules-precheck)
sosidudku1 Nov 12, 2026
cb77391
Merge PR #1238 (fix/ato-1274-1277-local-401-plain-words)
sosidudku1 Nov 12, 2026
ee2678d
Merge PR #1241 (fix/ato-818-import-summary)
sosidudku1 Nov 12, 2026
c3c1ff5
Merge PR #1244 (fix/ato-425-image-gen-tails)
sosidudku1 Nov 12, 2026
2f1932c
Merge PR #1248 (fix/ato-1209-local-tools-unsupported)
sosidudku1 Nov 12, 2026
b2361fc
Merge PR #1249 (fix/ato-1279-local-engine-midstream-retry)
sosidudku1 Nov 12, 2026
00ce2ac
Merge PR #1251 (fix/ato-1406-fusion-failure-breaker)
sosidudku1 Nov 12, 2026
ca2ef54
Merge PR #1252 (fix/ato-1357-local-leg-after-cancel)
sosidudku1 Nov 12, 2026
1602e6c
Merge PR #1253 (fix/ato-1267-fusion-leftovers)
sosidudku1 Nov 12, 2026
97da449
fix(session): close the doc comment above LastTurnRollbackOptions
sosidudku1 Nov 12, 2026
fdd899e
Merge PR #1162 fix (fix/ato-1298-rollback-last-turn)
sosidudku1 Nov 12, 2026
49d1a33
test(turn): count the new localStreamCutRetry field in fresh turn state
sosidudku1 Nov 12, 2026
c88a978
test(config): expect requestTimeoutMs in the local models default key…
sosidudku1 Nov 12, 2026
b9b7728
test(fusion): keep the local dispatch line out of the budget log check
sosidudku1 Nov 12, 2026
ba8d470
test: give the approval-deadline stub tool a full tool result
sosidudku1 Nov 12, 2026
463f3ea
test: add timing to the tool-disabled completion helper
sosidudku1 Nov 12, 2026
a87cbd0
test: assert the captured call exists in the team-tag test
sosidudku1 Nov 12, 2026
9714776
test: keep affectedResources a plain array in the site-grant test
sosidudku1 Nov 12, 2026
3225a95
test: type the third createEphemeralSession arg in the fusion delegat…
sosidudku1 Nov 12, 2026
02bbd7f
test(tui): add timestamp to the chat message fixtures
sosidudku1 Nov 12, 2026
9692228
test: use a marker the system prompt cannot contain in the ATO-1397 test
sosidudku1 Nov 12, 2026
ffb7de9
test: count only session deletes in the batch-size prune test
sosidudku1 Nov 12, 2026
01e137c
test(skill): expect the passed-through token masked in the run_script…
sosidudku1 Nov 12, 2026
2bbacff
Merge fix/ato-1302-terminal-real-retry into fix/ato-1420-retry-after-…
sosidudku1 Nov 12, 2026
75351fd
test(tui): add timestamp to the cleared-chat message fixtures
sosidudku1 Nov 12, 2026
b77b617
test(chat): use a non-tools 400 for the invalid request wording
sosidudku1 Nov 12, 2026
fa67088
test(shell): expect the readable double-quoted bash -c preview
sosidudku1 Nov 12, 2026
b5bc987
test(http): read each hop's headers from the curl header file when on…
sosidudku1 Nov 12, 2026
689d822
Merge fix/fusion-local-health-per-server (per-server local-leg health)
sosidudku1 Nov 12, 2026
8b2095c
fix(fusion): check the cut-off worker's own server before renewing
sosidudku1 Nov 12, 2026
9dde759
Merge PR #1122 (run-1 fixes)
sosidudku1 Nov 12, 2026
95420ed
Merge PR #1123 (run-1 fixes)
sosidudku1 Nov 12, 2026
c2e1016
Merge PR #1153 (run-1 fixes)
sosidudku1 Nov 12, 2026
2e10d5e
Merge PR #1164 (run-1 fixes)
sosidudku1 Nov 12, 2026
1ef702e
Merge PR #1176 (run-1 fixes)
sosidudku1 Nov 12, 2026
c80f0b8
Merge PR #1205 (run-1 fixes)
sosidudku1 Nov 12, 2026
78bd555
Merge PR #1210 (run-1 fixes)
sosidudku1 Nov 12, 2026
d13914f
Merge PR #1211 (run-1 fixes)
sosidudku1 Nov 12, 2026
5c8f469
Merge PR #1213 (run-1 fixes)
sosidudku1 Nov 12, 2026
daee0d9
Merge PR #1221 (run-1 fixes)
sosidudku1 Nov 12, 2026
4344743
Merge PR #1222 (run-1 fixes)
sosidudku1 Nov 12, 2026
df27623
Merge PR #1224 (run-1 fixes)
sosidudku1 Nov 12, 2026
83149e8
Merge PR #1228 (run-1 fixes)
sosidudku1 Nov 12, 2026
1859838
Merge PR #1248 (run-1 fixes)
sosidudku1 Nov 12, 2026
221ecf4
Merge PR #1249 (run-1 fixes)
sosidudku1 Nov 12, 2026
c7f76f6
Merge PR #1252 (run-1 fixes)
sosidudku1 Nov 12, 2026
c022f22
test: make the check independent of the other PRs it is merged with
sosidudku1 Nov 12, 2026
5ab634b
Merge PR #1249 (test fix)
sosidudku1 Nov 12, 2026
b4b050e
Shorten the audit skill description so all starter skills fit the cat…
sosidudku1 Nov 12, 2026
4951f27
Shorten the code-graph skill description so all starter skills fit th…
sosidudku1 Nov 12, 2026
5e44f1d
Shorten the plain-writing skill description so all starter skills fit…
sosidudku1 Nov 12, 2026
7693606
Shorten the pre-push-check skill description so all starter skills fi…
sosidudku1 Nov 12, 2026
b4da337
Merge PR #1192 (shorter description)
sosidudku1 Nov 12, 2026
87869a9
Merge PR #1193 (shorter description)
sosidudku1 Nov 12, 2026
69d4ff2
Merge PR #1194 (shorter description)
sosidudku1 Nov 12, 2026
ba1e381
Merge PR #1196 (shorter description)
sosidudku1 Nov 12, 2026
3973cad
fix(skills): quote the description so its colon parses as YAML
sosidudku1 Nov 12, 2026
f7635bc
fix(skills): quote the description so its colon parses as YAML
sosidudku1 Nov 12, 2026
16e1173
fix(skills): quote the description so its colon parses as YAML
sosidudku1 Nov 12, 2026
7a79446
Merge PR #1192 (quoted description)
sosidudku1 Nov 12, 2026
b73d417
Merge PR #1193 (quoted description)
sosidudku1 Nov 12, 2026
469d2b8
Merge PR #1196 (quoted description)
sosidudku1 Nov 12, 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
  •  
  •  
  •  
47 changes: 47 additions & 0 deletions .github/workflows/audit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Known security advisories in the packages we ship (ATO-1415).
#
# Reads only the lockfile against the npm advisory database, so it needs no install. Dev-only
# packages (vitest, esbuild, ...) are left out: they never reach users. A high or critical
# advisory fails the check; fix it with a patch-level bump or an `overrides` entry in
# package.json, the way PR #1079 did.
#
# Kept out of the Test workflow on purpose. The advisory database changes on its own, so a
# check on every PR would turn unrelated PRs red the day a new advisory lands. On PRs it runs
# only when the dependency files change; new advisories against main are caught by the push
# and weekly runs instead.

name: Audit

on:
pull_request:
branches: [main]
paths:
- package.json
- package-lock.json
- .github/workflows/audit.yml
push:
branches: [main]
schedule:
- cron: "17 6 * * 1"
workflow_dispatch:

permissions:
contents: read

jobs:
audit:
name: npm audit (production dependencies)
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "25.7"
check-latest: true

- name: Audit the lockfile
run: npm audit --package-lock-only --omit=dev --audit-level=high
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ The desktop app is in the same repository as `atomic-agent-desktop` (on Arch `at

Debian, Ubuntu (x86-64, arm64):

> **Not in the apt repository yet.** Until the next release rebuilds the repository, `apt install atomic-agent-desktop` answers "Unable to locate package". For now, download `Atomic-Agent-<version>-amd64.deb` (or `-arm64.deb`) from the [releases page](https://github.com/AtomicBot-ai/atomic-agent/releases) and install it with `sudo apt install ./Atomic-Agent-<version>-amd64.deb`. The dnf and AUR commands below already work.

```bash
curl -fsSL https://atomic-agent-packages.fsn1.your-objectstorage.com/atomic-chat.gpg | sudo tee /usr/share/keyrings/atomic-chat.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/atomic-chat.gpg] https://atomic-agent-packages.fsn1.your-objectstorage.com/deb stable main" \
Expand Down Expand Up @@ -154,6 +156,8 @@ If something isn't working:

Building something with Atomic Agent, stuck on setup, or just want to share what you are working on? Grab a slot and talk to the team directly: **[cal.com/atomicagent/demo](https://cal.com/atomicagent/demo)**. No agenda required. Questions, feedback, feature requests, or a plain hello all count. We read every issue and every Discord message too, but sometimes a 15-minute call beats a week of comments.

Found a security problem? Please report it privately, not in a public issue: see [SECURITY.md](SECURITY.md).

## Benchmarks

On the public **GAIA validation Level 1** split (53 tasks), Atomic Agent and Hermes drove the **same** local `qwen-3.6-35b-a3b` (`llama-server`, UD-Q4_K_XL), with the same step budget and timeout. The only variable is the agent loop.
Expand Down Expand Up @@ -353,7 +357,7 @@ Full TUI guide: [TUI.md](docs/user/tui.md).
"localModels": { "managed": { "parallel": 3 } }
```

`workers` (1..8, default 2) is the default fan-out width when the orchestrator does not name one; it is not a ceiling, and the orchestrator can ask for more on a given call. What bounds the width on a local leg is `localModels.managed.parallel`, the llama-server `--parallel` slot count (default `"auto"`, sized from the daemon's context; a number pins it; applied on the next daemon start). On a cloud worker leg the width is capped by `cloudWorkers` (1..32, default 4). The orchestrator model is the provider's `defaultChatModel`; on a local leg the worker model is the one the managed daemon serves. `reviewStallSteps` (default 6, `0` disables) nudges an orchestrator that keeps reading instead of delegating or replying. `turnBudgetUsd` and `turnTimeBudgetMs` (unset or `0`: no cap) cap one fusion turn's spend (the orchestrator's plus the workers', prompt-cache discount included; local tokens count as $0) and its wall-clock time: once either is reached no new delegation or worker starts, running workers are stopped, and the orchestrator is told to tell you plainly what was done and what was not. `escalation: "advisor"` (default `"off"`) lets a stuck worker (the same result three times, six read-only steps, or a first answer cut by its time limit) ask a stronger model for a short hint once; the hint reaches the worker as a mid-turn message and the worker carries on. The escalation model is `escalationProvider`, by default the orchestrator leg, and never the worker leg; each escalation is capped by `escalationMaxUsd` (default $0.25), counts toward the turn's spend cap, and its cost is shown on the worker's row. `escalationReplace: true` additionally re-runs a task that stays stuck after the hint on the escalation model (priced models only). The person can also stop or escalate one running worker by hand (`runtime.fusionWorkers`). `judge: "on"` (default `"off"`, model `judgeProvider`, by default the orchestrator leg) gives every task an acceptance checklist in its brief, built from the contract's checks, provides and declared files plus the task's deliverable; after the work, failed checks, missing provides and missing files are red whatever any model says, and a judge with a fresh context reads the files and rules on the rest. A task closes only on a green list; a red one is re-run once with the findings and reported as failed if still red. The judge's spend counts toward the turn's cap. `autoReplan: N` (default `0`, off; at most 5) makes the planner re-plan by itself: after a fan-out in which tasks did not close (failed, judged red, handed back, out of steps or time), the result lists them with the facts and its next step may only re-delegate them, so you do not have to type "continue"; tasks that depend on a failed one are held for that replan instead of being run against missing inputs. Each task gets N replans per turn; after that the planner is told to report it plainly. `isolation: "worktree"` (default `"off"`) gives every task its own workspace: a detached git worktree of the folder's current state (uncommitted and untracked files included) inside a git repo, a copy of the folder elsewhere. When the task's wave ends its changes are merged back with a three-way merge; files changed by only one task apply cleanly, a file that changed on both sides and cannot be merged is left as it was and the planner gets a merge task for it, a task that wiped a declared input is refused, and a failed task's changes are thrown away.
`workers` (1..8, default 2) is the default fan-out width when the orchestrator does not name one; it is not a ceiling, and the orchestrator can ask for more on a given call. What bounds the width on a local leg is `localModels.managed.parallel`, the llama-server `--parallel` slot count (default `"auto"`, sized from the daemon's context; a number pins it; applied on the next daemon start). On a cloud worker leg the width is capped by `cloudWorkers` (1..32, default 4). The orchestrator model is the provider's `defaultChatModel`; on a local leg the worker model is the one the managed daemon serves. `reviewStallSteps` (default 6, `0` disables) nudges an orchestrator that keeps reading instead of delegating or replying. `turnBudgetUsd` and `turnTimeBudgetMs` (unset or `0`: no cap) cap one fusion turn's spend (the orchestrator's plus the workers', prompt-cache discount included; local tokens count as $0) and its wall-clock time: once either is reached no new delegation or worker starts, running workers are stopped, and the orchestrator is told to tell you plainly what was done and what was not. `maxRoundsPerTurn` (default 6) and `maxTasksPerTurn` (default 48; `0` turns either off) cap how many delegations and worker tasks one fusion turn may start, counted rather than priced so they mean something on a subscription leg; the fan-out's approval line names the round and the task count. Fusion also stops a fan-out that keeps failing the same way: one worker that fails because the setup cannot work (the worker model does not fit the tool-call protocol, its CLI is not installed or signed in, it is out of credit), or three in a row with the same error, and no new worker starts; the next delegation on that leg in the same turn is refused, and the orchestrator is told to explain the error to you instead of retrying. `escalation: "advisor"` (default `"off"`) lets a stuck worker (the same result three times, six read-only steps, or a first answer cut by its time limit) ask a stronger model for a short hint once; the hint reaches the worker as a mid-turn message and the worker carries on. The escalation model is `escalationProvider`, by default the orchestrator leg, and never the worker leg; each escalation is capped by `escalationMaxUsd` (default $0.25), counts toward the turn's spend cap, and its cost is shown on the worker's row. `escalationReplace: true` additionally re-runs a task that stays stuck after the hint on the escalation model (priced models only). The person can also stop or escalate one running worker by hand (`runtime.fusionWorkers`). `judge: "on"` (default `"off"`, model `judgeProvider`, by default the orchestrator leg) gives every task an acceptance checklist in its brief, built from the contract's checks, provides and declared files plus the task's deliverable; after the work, failed checks, missing provides and missing files are red whatever any model says, and a judge with a fresh context reads the files and rules on the rest. A task closes only on a green list; a red one is re-run once with the findings and reported as failed if still red. The judge's spend counts toward the turn's cap. `autoReplan: N` (default `0`, off; at most 5) makes the planner re-plan by itself: after a fan-out in which tasks did not close (failed, judged red, handed back, out of steps or time), the result lists them with the facts and its next step may only re-delegate them, so you do not have to type "continue"; tasks that depend on a failed one are held for that replan instead of being run against missing inputs. Each task gets N replans per turn; after that the planner is told to report it plainly. `isolation: "worktree"` (default `"off"`) gives every task its own workspace: a detached git worktree of the folder's current state (uncommitted and untracked files included) inside a git repo, a copy of the folder elsewhere. When the task's wave ends its changes are merged back with a three-way merge; files changed by only one task apply cleanly, a file that changed on both sides and cannot be merged is left as it was and the planner gets a merge task for it, a task that wiped a declared input is refused, and a failed task's changes are thrown away.

In the TUI, fusion is the last row of the composer's **Where it runs** switch (`ctrl+r`, or click the backend word): it needs two providers that can answer, one per leg, and says which one is missing otherwise. While it is on, the backend word is an orange chip and the composer and the chat bubbles take the same tint. `/runmode local|cloud|fusion` and `ctrl+g 1/2/3` pick a mode from the keyboard; `/runmode swap` trades the orchestrator and worker legs; `/runmode status` says what the mode resolves to.

Expand Down Expand Up @@ -681,6 +685,7 @@ Everything Atomic Agent does is inspectable and interruptible:
- **Failure taxonomy:** transport, grammar, model, tool, and cancellation failures classified across events, traces, metrics, TUI, sidecar, and HTTP.
- **Allow always:** where a rule can be saved, every place that asks (TUI, CLI, Telegram, Discord, the desktop app) offers a third answer that saves it, for example `Always allow "git status" in this project` (`ctrl+n` in the TUI, `w` in the CLI). Rules live in `<stateDir>/approval-rules.json` (allow, ask, deny) and in a project's `.atomic-agent/approval-rules.json`, where only ask and deny count, so a project cannot grant itself anything. Deny wins over ask, and ask wins over allow. A shell allow rule covers simple commands only (no pipes, `&&` or redirects), while deny and ask rules apply to every command in a chain. Shell rules are saved by program and subcommand. Dangerous commands and secret files never get an allow rule. The desktop app lists saved rules in Settings › Privacy.
- **Dangerous commands ask every time:** `rm -rf`, `git reset --hard`, force pushes (including `--force-with-lease` and `git push origin +main`), `git clean -fdx`, `git checkout -- .`, `git branch -D`, `find -delete`, `sudo`, `bash -c`, `eval`, `chmod 777` and similar fall in the `shell_dangerous` category. A session grant for the shell never covers them, and approving a Fusion fan-out does not let workers run them; only the top approval level skips the question.
- **HTTP requests ask per host:** "allow for this session" on an `os.http.request` prompt covers that origin (scheme, host and port) only, so a POST to another host asks again. A redirect that would carry a POST body to another host is not followed; the agent has to make a new request there. Credential headers (`Authorization`, `Cookie`, API keys) are masked in the prompt and are not sent on a redirect to another host. A GET runs without asking by default (`http.approvalMode: "writes"`), and a GET can still carry data out in its URL and headers; set `http.approvalMode` to `"always"` or use `http.hostAllowlist` if that matters to you.
- **Risk check (opt-in):** with `agent.smartApproval` set to `true` in `config.json` (off by default), a small model rates actions you could grant for the whole session before you are asked. Low-risk actions run; the rest come to you as usual. Categories that cannot be granted, such as `trust_config`, and reads outside the working scope are not rated and always ask. If the check does not answer in 8 seconds, you are asked.
- **No-progress guard:** repeated identical tool calls draw a warning at 3 repeats and a hard veto at 5; after 3 consecutive vetoes the agent is forced into a graceful reply. Calls are judged on the recent window and on what changed since: re-running the tests after an edit or re-reading a log after a wait is a new question, not a repeat. A deliberate poll (`sleep 60 && tail build.log`, waiting on a background job) is refused only after 20 identical answers.
- **Per-session FIFO:** every surface enters the same `TurnController`; one session stays ordered while different sessions run concurrently.
Expand Down
65 changes: 65 additions & 0 deletions SECURITY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Security Policy

Atomic Agent runs shell commands, edits files and drives a browser on your machine, so we treat security reports as our top priority. Thank you for helping keep users safe.

## Reporting a vulnerability

Please do not open a public issue, pull request or Discord post for a security problem.

Report it privately in one of two ways:

1. **GitHub private vulnerability reporting (preferred).** Open [Security → Report a vulnerability](https://github.com/AtomicBot-ai/atomic-agent/security/advisories/new) in this repository. Only the maintainers can see the report, and we can work on the fix and the advisory with you there.
2. **E-mail:** [support@atomicbot.ai](mailto:support@atomicbot.ai). Put `SECURITY` at the start of the subject line.

Please include:

- the version (`atomic-agent --version`, or the desktop release you installed) and your OS;
- what an attacker can do, and what they need first (a malicious web page, a crafted repository, a hostile MCP server, local access, and so on);
- steps to reproduce, ideally a minimal proof of concept;
- any logs or traces, with your own keys removed.

## What happens next

- We confirm we received the report within 3 business days.
- We send a first assessment (whether we can reproduce it and how severe we think it is) within 10 business days.
- We keep you updated until it is fixed, and we tell you before anything is published.
- Once a fix is released, we publish a GitHub security advisory and credit you by name or handle, unless you ask us not to.

Please give us a reasonable time to ship a fix before you disclose the issue publicly. We aim to fix critical issues within 30 days.

## Supported versions

We fix security issues in the latest release of:

- the terminal agent (`v0.x` releases, installed with the install script or a Linux package);
- the desktop app (`desktop-v0.x` releases).

Both update in place. Please check that a problem still happens on the latest release before you report it.

## Scope

In scope, for example:

- a way to run a command, write or delete a file, send a message or submit a form **without the approval prompt** the action should show;
- a prompt injection (from a web page, a file, a repository, an e-mail or an MCP tool result) that gets around an approval, a blocked command or a read-scope check;
- a way to read the agent's own secrets (`<stateDir>/.env`, `config.json`, provider keys) without the prompt that should guard them, or to get them past the masking of secrets in tool output;
- a way for a project folder to grant itself permissions it should not have;
- data leaving the machine in a way the [README](README.md#privacy-and-egress) does not describe, including through analytics or crash reports;
- problems in the installer, the update flow, or the signing and checksums of release files.

Out of scope:

- actions you approved, or that run unasked because you chose a higher approval level, a session grant or an "always allow" rule;
- at approval level 5 (full trust), or in an overnight run started with `--no-approval`, the agent doing what it is asked;
- what a skill, a shell command or an MCP server you installed and allowed does on its own;
- a model giving wrong or harmful answers without crossing a security boundary;
- issues in third-party services (model providers, MCP servers, websites) that are not caused by Atomic Agent;
- the atomicagent.io website, unless it affects the agent or its downloads (report those to the same contacts, and we will route them).

## Safe harbor

We will not take legal action against research done in good faith under this policy: test only on your own machine and accounts, do not access other people's data, do not degrade our services, and give us time to fix the issue before you disclose it.

## More

How the agent protects you (approvals, Trash instead of delete, blocked commands, telemetry and signed builds) is described at [atomicagent.io/security](https://atomicagent.io/security) and in the [Safety and Observability](README.md#safety-and-observability) section of the README.
Loading
Loading