Commit graph

396 commits

Author SHA1 Message Date
red person
116ade4630
Ignore non-string signature fold metadata (#1655) 2026-06-03 14:16:48 +09:00
Afonso Coutinho
96d59d2ff9
fix: _parse_dt does not understand 'tonight' so event start/end breaks (#1488) 2026-06-03 14:14:41 +09:00
Shaw
eb5727abda
fix(agent): coerce non-object tool-call arguments instead of crashing (#1370)
A native function/tool call whose `arguments` field is valid JSON but not an
object — a bare array like ["ls -la"], or a string/number/bool/null — parsed
fine in function_call_to_tool_block and then every branch called args.get(...),
raising AttributeError ('list'/'str' object has no attribute 'get'). That
propagated out of the streamed agent loop (no surrounding try/except at the
call site in stream_agent_loop) and aborted the user's entire turn. Weaker and
local models routinely emit malformed args like this.

Coerce non-dict parsed arguments to {} (mirrors the existing empty-arguments
behavior), so the tool runs with empty args instead of killing the stream.

Adds tests/test_function_call_non_object_args.py covering array/string/number/
bool/null arguments — they fail before this change and pass after.
2026-06-03 14:14:37 +09:00
Denis Kutuzov (Rybak27)
ec3b8b42ae
fix: auto-naming for 24h time format (#1374)
* fix: auto-naming for 24h time format

needs_auto_name() required AM/PM suffix for default
frontend-generated names like 'deepseek-v4-flash 17:46:02'.
Frontend uses toLocaleTimeString() which outputs 24h
format in most locales — so the regex never matched and
auto-naming silently skipped.

Made AM/PM optional and added re.IGNORECASE for 'am'/'pm'.

* test: add regression tests for needs_auto_name (24h + 12h + custom)

---------

Co-authored-by: Calculator Dev <dev@calculator.local>
2026-06-03 14:14:34 +09:00
ghreprimand
41d2767b30
Replace task scheduler utcnow calls (#1456)
Co-authored-by: ghreprimand <203024559+ghreprimand@users.noreply.github.com>
2026-06-03 14:14:30 +09:00
Marius Oppedal Ringsby
4f03f5ccdd
Replace cleanup service datetime.utcnow calls (#1494)
datetime.utcnow() is deprecated in Python 3.12 and removed in 3.14.
Swap the five calls in src/cleanup_service.py for a local _utcnow()
helper returning naive UTC, matching the naive DateTime columns the
archive/delete cutoffs compare against (same approach as the
task-scheduler and core-database slices). Add a regression test
asserting the helper stays naive so the cutoff math can't hit a
naive/aware TypeError.

Part of #1116
2026-06-03 14:14:27 +09:00
ghreprimand
6fd52cf317
Replace webhook manager datetime.utcnow calls (#1499)
Co-authored-by: ghreprimand <203024559+ghreprimand@users.noreply.github.com>
2026-06-03 14:14:23 +09:00
Alexandre Teixeira
c639daa7a2
Add companion pairing route response tests (#920) 2026-06-03 14:14:20 +09:00
Alexandre Teixeira
83a7965a28
Add atomic IO durability tests (#1622) 2026-06-03 14:14:16 +09:00
red person
ba6da17a92
Ignore non-object prefs JSON (#1257) 2026-06-03 14:12:45 +09:00
red person
84d54d9853
Ignore non-object embedding endpoint config (#1260) 2026-06-03 14:12:41 +09:00
red person
42ef4b6502
Skip invalid research CLI records (#1394) 2026-06-03 14:12:38 +09:00
red person
0e27a574b7
Reject invalid theme CLI prefs (#1396) 2026-06-03 14:12:35 +09:00
red person
56cd8add18
Fall back from invalid preset stores (#1402) 2026-06-03 14:12:31 +09:00
Wes Huber
b30f02a3f0
fix(tests): align broken test assertions with current behavior (#1791)
* fix(tests): align broken test assertions with current behavior

- test_readme_native_quickstart_uses_loopback: README warning text
  moved from --host prefix to bind-to phrasing; update assertion
- test_sanitize_merges_consecutive_user_messages: consecutive user
  messages ARE merged and orphan tool messages ARE dropped by the
  adjacency repair pass; update expected counts and values

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(tests): update cookbook status poll assertion for stopped state

The cookbookRunning.js ternary now handles a 'stopped' status
alongside 'error', so the exact string match in the test no longer
holds. Relax the assertion to check for the error branch presence
instead of the full ternary expression.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-03 14:12:17 +09:00
Afonso Coutinho
33ae982968
fix: context_compactor token helpers crash on non-string message text (#1634)
* fix: context_compactor token helpers crash on non-string message text

* fix: _truncate_text_to_token_budget returns an empty string for non-string text, not the raw value
2026-06-03 14:12:14 +09:00
Shaw
63aa15d155
fix(scheduler): fail closed on malformed scheduled_time instead of 500 (#1410)
compute_next_run parsed scheduled_time as "HH:MM" with int(parts[0]),
int(parts[1]) and no validation, so "9", "9am", "25:00", "9:" or ":30" raised
IndexError/ValueError. The POST /tasks create route passes the user/LLM-supplied
scheduled_time before its try block (and only validates the cron field), so a
bad value surfaced as an unhandled 500 rather than the clean 400 used for other
invalid fields — and the same crash could fire inside the scheduler loop when
recomputing next_run for an already-stored bad row.

Guard the parse and fail closed (warn + return None), matching the existing
invalid-cron handling in the same function.

Adds tests/test_scheduler_scheduled_time_validation.py — malformed values return
None (fail before with IndexError/ValueError), valid HH:MM still computes.
2026-06-03 14:12:07 +09:00
Shaw
d38fb4bc46
fix(tts): tolerate a malformed tts_speed instead of 500-ing (#1450)
synthesize() and get_stats() parsed the stored tts_speed with a bare
float(settings.get("tts_speed", "1")). The manage_settings agent tool maps
"speech speed"/"voice speed" to tts_speed and, because the setting's default is
a string, writes the value through unvalidated — so an agent (or a hand-edited
settings.json) can store "fast" or "". After that, GET /api/tts/stats and POST
/api/tts/synthesize both 500 with ValueError until the JSON is corrected by hand.

Parse defensively via a _safe_speed() helper (non-numeric/empty/<=0 -> 1.0),
mirroring the settings layer's tolerance of corrupt config.

Adds tests/test_tts_speed_malformed.py (stats + synthesize) — both raise
ValueError before this change and pass after.
2026-06-03 14:12:03 +09:00
red person
dfbc94f929
Reject invalid cookbook CLI state (#1531) 2026-06-03 14:11:56 +09:00
red person
2f6d339073
Ignore invalid note CLI items (#1539) 2026-06-03 14:11:53 +09:00
red person
63aac10341
Skip invalid FAISS migration JSON (#1547) 2026-06-03 14:11:49 +09:00
red person
db8c0b3dac
Ignore non-string background stream deltas (#1549) 2026-06-03 14:11:45 +09:00
red person
708ac19f28
Skip invalid memory CLI rows (#1552) 2026-06-03 14:11:42 +09:00
red person
83f602e6d1
Skip invalid skills CLI rows (#1553) 2026-06-03 14:11:38 +09:00
red person
f549058369
Normalize stored MCP CLI JSON (#1554) 2026-06-03 14:11:35 +09:00
red person
38bfa85ad0
Reject invalid Tailscale discovery JSON (#1556)
* Reject invalid Tailscale discovery JSON

* Guard nested Tailscale IP shapes
2026-06-03 14:11:31 +09:00
red person
ab7145de83
Mask short webhook CLI tokens (#1558) 2026-06-03 14:11:28 +09:00
red person
9e91a172e7
Handle missing gallery album images (#1563) 2026-06-03 14:11:24 +09:00
red person
04e7441d78
Skip invalid contacts CLI rows (#1569) 2026-06-03 14:11:21 +09:00
red person
89b04675e2
Handle missing calendar CLI relation (#1574) 2026-06-03 14:11:17 +09:00
Afonso Coutinho
1453458519
fix: is_public_blocked_tool crashes on a truthy non-string tool name (#1620)
* fix: is_public_blocked_tool crashes on a truthy non-string tool name

* fix: is_public_blocked_tool fails closed (blocks) on a malformed non-string tool name
2026-06-03 14:11:14 +09:00
Afonso Coutinho
04f8aa1833
fix: _lookup_bandwidth crashes on a truthy non-string gpu_name (#1641) 2026-06-03 14:11:10 +09:00
red person
d1309f3bd6
Ignore non-object settings scrub inputs (#1645) 2026-06-03 14:11:05 +09:00
red person
b409b20940
Handle non-string src search queries (#1646) 2026-06-03 14:11:02 +09:00
red person
ade755b184
Let preset set replace corrupt entries (#1650) 2026-06-03 14:10:58 +09:00
red person
40e1d6e876
Reject non-PNG signature export data (#1651) 2026-06-03 14:10:54 +09:00
red person
558d6ddf24
Ignore invalid background job store rows (#1261) 2026-06-03 14:07:14 +09:00
red person
34efabdec8
Ignore invalid integration rows (#1404) 2026-06-03 14:07:11 +09:00
red person
43dc346255
Ignore invalid companion auth shapes (#1405) 2026-06-03 14:07:07 +09:00
red person
5fba1735c2
Ignore invalid editor draft payloads (#1533) 2026-06-03 14:07:03 +09:00
red person
d7a6cadbe2
Skip invalid memory extractor rows (#1535) 2026-06-03 14:07:00 +09:00
red person
d8f5c04340
Skip invalid ownerless JSON rows (#1540) 2026-06-03 14:06:57 +09:00
red person
ee8c049f9e
Skip invalid skill extractor rows (#1546) 2026-06-03 14:06:53 +09:00
red person
815bdf57d5
Ignore non-string task CLI previews (#1559) 2026-06-03 14:06:49 +09:00
red person
347b193af8
Ignore non-string docs CLI content lengths (#1561) 2026-06-03 14:06:46 +09:00
red person
3b9c601498
Skip invalid personal CLI index rows (#1571) 2026-06-03 14:06:42 +09:00
Afonso Coutinho
1571d8bba0
fix: agent_tools._truncate crashes on non-string input (#1624)
* fix: agent_tools._truncate crashes on non-string input

* fix: agent_tools._truncate returns a string for non-string input, not the raw value
2026-06-03 14:06:39 +09:00
Afonso Coutinho
3a741edbf1
fix: visual_report markdown helpers crash on a non-string input (#1633) 2026-06-03 14:06:35 +09:00
red person
8af1f85665
Ignore non-string email thread bodies (#1654) 2026-06-03 14:06:31 +09:00
Afonso Coutinho
a54d34149a
Parse standard Gmail quote attribution dates
Allow Gmail quote attribution parsing to handle standard US weekday/month/day/year comma patterns while preserving existing formats, with JS regression coverage.
2026-06-03 13:45:56 +09:00