santhreal and chengyongru
259d8a018c
fix(skills): tolerate null requires/bins/env in skill metadata
2026-07-26 17:44:41 +08:00
santhreal and chengyongru
7e9426d9bd
fix(telegram): hard-cut when fence body cut lands on the prefix
...
A leading space in the fenced body made the soft cut land at min_code_pos
and re-emit the same fence forever. Require progress past the fence line.
2026-07-23 23:56:18 +08:00
santhreal and chengyongru
98d661775e
fix(telegram): hard-cut fence splits when the closer cannot fit
...
Adaptive HTML limits can shrink max_len to the fence prefix size. Treat
budget <= min_code_pos as a hard cut so the splitter still advances.
2026-07-23 23:56:18 +08:00
santhreal and chengyongru
017a4946e2
fix(telegram): advance markdown split on long single-line fences
...
When a fenced code body has no interior newlines, the splitter cut at the
opening fence line and re-emitted the same content forever. Prefer breaks
inside the body after the fence so long JSON/minified blocks still split.
2026-07-23 23:56:18 +08:00
santhreal and chengyongru
299bcf491b
fix(cron): skip null runHistory elements when loading jobs.json
...
Null entries in state.runHistory raised TypeError and quarantined the
store. Skip non-dict elements like LocalTrigger.from_dict already does.
2026-07-23 14:07:06 +08:00
santhreal and chengyongru
0191c0db73
fix(pairing): treat null approved channel lists as empty
...
pairing.json with "telegram": null crashed is_approved during load.
Treat non-list channel entries as an empty allow-list.
2026-07-23 14:04:53 +08:00
santhreal and chengyongru
5851bd432a
fix(slack): keep fenced markdown tables intact in _to_mrkdwn
2026-07-23 14:03:09 +08:00
santhreal and chengyongru
8195181783
fix(feishu): keep fenced markdown tables out of card tables
2026-07-23 14:02:33 +08:00
santhreal and Xubin Ren
b81c05581f
fix(cron): coerce string schedule/state ms fields from jobs.json
...
jobs.json can store everyMs/atMs and next/last run timestamps as strings.
Loading left them as str, so _compute_next_run compared str to int and raised TypeError.
Coerce with an optional-int helper at from_store_dict, matching runHistory int() paths.
2026-07-21 19:07:45 +08:00
santhreal and Xubin Ren
28102382af
fix(config): write config.json atomically via temp+replace
...
save_config truncated config.json in place on crash mid-write.
Route through _write_text_atomic like the pairing store so a failed write leaves the prior file intact.
2026-07-21 17:33:39 +08:00
santhreal and Xubin Ren
b6156fdd79
fix(cron): also coerce null createdAtMs/updatedAtMs on load
...
Same present-null footgun as runHistory; route all required store
ints through _store_int.
2026-07-21 13:45:02 +08:00
santhreal and Xubin Ren
0b1b02f187
fix(cron): coerce null runHistory ms fields from jobs.json
...
Explicit JSON null for runAtMs/durationMs bypassed the missing-key
default and raised TypeError on load. Treat null/blank like missing.
2026-07-21 13:45:02 +08:00
santhreal and chengyongru
c2071594cf
fix(triggers): rename coerce helper to _store_int
...
Match the cron store-load naming and cover null attempts on deliveries.
2026-07-19 15:46:00 +08:00
santhreal and chengyongru
cf96c4d5e9
fix(triggers): coerce null ms fields when loading local triggers
...
Explicit JSON null for runAtMs/createdAtMs raised TypeError and could
quarantine triggers.json. Treat null/blank like a missing key (0).
2026-07-19 15:46:00 +08:00
santhreal and Xubin Ren
afed32b013
fix(cron): dual-case keys when loading jobs.json
...
jobs.json hand-edits and asdict-style snake_case for schedule intervals and
runHistory crashed or silently disabled cron. Deserialize via Cron* from_store_dict
and shared get_camel_snake (also used by local triggers).
2026-07-18 17:39:06 +08:00
santhreal and Xubin Ren
7ac9a46978
fix(utils): avoid hang in split_message when max_len <= 0
...
When max_len is 0 or negative the cut pointer never advances, so the loop hangs. Return the content unsplit, matching truncate_text_to_tokens for non-positive budgets.
2026-07-18 17:24:12 +08:00
santhreal and Xubin Ren
fe0e65928d
fix(utils): coerce Tavily usage counters to int
...
JSON APIs sometimes return numeric fields as strings; subtracting them raised TypeError and /status dropped the usage block.
2026-07-18 17:23:26 +08:00
santhreal and Xubin Ren
85097aa143
fix(utils): handle empty commit messages in CommitInfo.format
...
Empty git commit messages made splitlines()[0] raise IndexError in format() and /dream-restore list rendering.
2026-07-18 17:22:16 +08:00