Commit Graph
16216 Commits
Author SHA1 Message Date
kolaente 12ed4036c8 fix(unsplash): close pingback response body
The pingback discarded the response, leaking the body and its
connection on every pingback.
2026-10-19 14:50:05 +02:00
kolaente 812520d4de fix(tasks): dedup task ids in bulk update
Repeated ids in a bulk update request ran the update and dispatched
task.updated once per duplicate.
2026-10-19 14:50:05 +02:00
kolaente 29a6f26b4b fix(export): only detach expired exports in cleanup cron
The cleanup cron cleared export_file_id for every user with an export
as soon as one export expired, orphaning fresh export files. Scope the
update to the expired file ids.
2026-10-19 14:50:05 +02:00
kolaente e982d8d738 feat(ci): add agentscan to check new PRs for automation signals
[skip ci]
2026-10-19 13:58:13 +02:00
kolaenteandTink 447944c1b0 docs(config): document the ldap id attribute 2026-10-19 13:42:19 +02:00
kolaenteandTink 33bd1c9afe feat(ldap): match users and groups by an immutable directory id
Add auth.ldap.attribute.id. When set (e.g. objectGUID on AD, entryUUID
on OpenLDAP), users and teams are matched by that attribute instead of
the login name and the group DN, so renaming or moving them in the
directory no longer creates duplicate accounts or new teams without the
old shares.

AD's binary objectGUID is formatted as a canonical GUID string; other
attributes must be printable text. Existing accounts and teams are
switched to the new id on the next login. An empty option keeps the old
behaviour.
2026-10-19 13:42:19 +02:00
kolaenteandTink f64ccf24f1 feat(models): migrate external team ids to a new identifier
Teams synced from an external provider can be moved from one external
id to another without losing members or project shares. Teams whose new
id is already taken by another team are left untouched.
2026-10-19 13:42:19 +02:00
kolaenteandTink 4d047efe8f docs(config): document group sync filter placeholders 2026-10-19 13:42:19 +02:00
kolaenteandTink a2875739e9 fix(ldap): match legacy group members against the ldap username
Address pr-swarm finding.
2026-10-19 13:42:19 +02:00
kolaenteandTink eff486337f feat(ldap): query only the user's groups during group sync
Support {userdn} and {username} placeholders in auth.ldap.groupsyncfilter.
When present, every matching group is a membership and the member
attribute is not fetched, so the cost scales with the user's own
memberships and nested AD groups can be resolved with
LDAP_MATCHING_RULE_IN_CHAIN. Filters without a placeholder keep the
previous client-side member matching.

The group search now uses paged results in both modes so directories
with more groups than the server's size limit no longer fail the login.
2026-10-19 13:42:19 +02:00
kolaenteandTink 413b5bead2 refactor(ldap): use go-ldap filter escaping for the user filter
Address pr-swarm finding.
2026-10-19 13:42:19 +02:00
kolaente b3055f393c feat(mcp): point filter params, errors and instructions at filter_syntax 2026-10-19 13:25:00 +02:00
kolaente da2d3b01f0 feat(mcp): add filter_syntax tool and resource 2026-10-19 13:25:00 +02:00
kolaente 976a14fb66 chore(frontend): regenerate API client for filter docs 2026-10-19 13:25:00 +02:00
kolaente 5819ff7c5f docs(filters): describe the filter grammar in filter parameter docs 2026-10-19 13:25:00 +02:00
kolaente 501afdfac8 fix(filters): hint at && and || when a filter value contains and/or 2026-10-19 13:25:00 +02:00
renovate[bot]andkolaente 864f198ae7 chore(deps): lock file maintenance 2026-10-19 10:40:27 +02:00
renovate[bot]andkolaente 22e1212ed1 chore(deps): update axllent/mailpit docker tag to v1.31.6 2026-10-19 10:06:27 +02:00
renovate[bot]andkolaente 03a18dded2 chore(deps): update dependency go to v1.27.2 2026-10-19 10:06:13 +02:00
renovate[bot]andkolaente 081b8c1dbf chore(deps): update dependency ip-address to v10.7.4 2026-10-19 10:06:00 +02:00
renovate[bot]andkolaente 8e746f2f57 chore(deps): update dependency launch-editor to v2.14.2 2026-10-19 10:05:40 +02:00
kolaente 96d80b6c40 fix(sentry): only report resource load failures from our own origin
Browser extensions inject third-party images (e.g. yahoo.co.jp favicons)
into the page, and their load failures were reported as ours.
Refs FRONTEND-OSS-263
2026-10-19 10:05:11 +02:00
kolaente 90cbc39c27 fix(sentry): handle cyclic objects when redacting events
Console breadcrumbs keep the raw logged arguments until Sentry normalizes
the event, which happens after event processors run. A cyclic object in
there, such as the Vue router internals a browser extension logged, sent
redactSensitiveParams into infinite recursion and the event was lost.

Fixes FRONTEND-OSS-2M2
2026-10-19 10:04:53 +02:00
Frederick [Bot] 523ed59b31 chore(i18n): update translations via Crowdin 2026-10-19 00:10:42 +00:00
kolaente 3557e172b4 feat(mcp): let read tools return only requested fields 2026-10-18 12:33:03 +02:00
KShotandGitHub de610f2ba5 fix(tasks): clamp day when advancing a monthly repeating task by one month (#4107) 2026-10-16 14:04:36 +00:00
kolaente f17b184d6b chore(frontend): regenerate API client for bulk task fields doc 2026-10-16 15:49:28 +02:00
kolaente 34202ac822 fix(tasks): reject bulk updates without fields
A bulk update with no fields fell through to the single-task path and
replaced every task wholesale with values, clearing description, dates,
priority and more on all of them. Reject it with a new
ErrBulkTaskFieldsRequired (4036) and document the accepted bulk fields.

Fixes #4109
2026-10-16 15:49:28 +02:00
kolaente 37b1c8cde8 fix(tasks): don't change favorites on bulk updates that don't name them
is_favorite was taken from the cloned bulk values, so a bulk update that
didn't name it unfavorited every task the caller had favorited (or
favorited all of them when values carried is_favorite: true). Keep the
caller's favorite state unless is_favorite is named in fields, and
accept is_favorite as a bulk field.
2026-10-16 15:49:28 +02:00
kolaente 26d09e4dc2 fix(tasks): don't clear reminders on bulk updates that don't name them
updateReminders deletes and re-inserts a task's reminders from the
cloned bulk values, so any bulk update whose fields list didn't name
reminders wiped them. Keep the stored reminders unless reminders is
named in fields, and accept reminders as a bulk field.
2026-10-16 15:49:28 +02:00
Kyle Coxandkolaente 1b53a9283d fix(tasks): don't clear assignees on bulk updates that don't name them
updateSingleTask replaced a task's assignees unconditionally, so a v2
bulk update (PUT /tasks/bulk, also exposed as the MCP tasks_bulk_update
action) whose fields list did not include assignees deleted every
assignee from every task in the request - even though the fields
contract says only the named fields are written and the rest of each
task is left untouched.

Only replace assignees when no field list is given (single-task
updates, unchanged) or when 'assignees' is named in fields. 'assignees'
is now accepted as a pseudo-field in the bulk field list so callers can
still replace or clear assignees explicitly. Field validation now runs
before the assignee update, so an invalid field no longer mutates
assignees before erroring.

Fixes #4109
2026-10-16 15:49:28 +02:00
kolaente 7e991c4cc9 test(mcp): drop session ID handling from stateless MCP test client
go-sdk v1.7.0 stops emitting and reading Mcp-Session-Id on stateless
streamable HTTP servers.
2026-10-16 14:41:21 +02:00
renovate[bot]andkolaente f54df287a8 fix(deps): update module github.com/modelcontextprotocol/go-sdk to v1.8.0 2026-10-16 14:41:21 +02:00
busslinaandGitHub bbe3dbe0f7 fix(frontend): handle Escape on keydown in Quick Actions (#4129) 2026-10-16 11:44:45 +00:00
Frederick [Bot] 352551f982 [skip ci] Updated yaegi symbols 2026-10-15 22:07:37 +00:00
kolaente 024654319d fix(reminders): exclude bot users from task reminder recipients 2026-10-15 23:26:55 +02:00
Tyagiquamarandkolaente 58e247161d test(models): fit invalid reminder time in column 2026-10-15 23:26:55 +02:00
Tyagiquamarandkolaente 576fef5738 fix(user): set default reminder settings on bot users and guard reminder parser (#4007) 2026-10-15 23:26:55 +02:00
kolaente c8845dafc4 fix(kanban): allow auto-scrolling between buckets while dragging on mobile
Mandatory scroll snapping on narrow screens snapped the board back after
each small auto-scroll step from sortablejs, so tasks could only be
dropped into buckets already visible. Disable snapping while dragging.

Fixes #4163
2026-10-15 23:16:16 +02:00
Mohd Quamar TyagiandGitHub 84a071a46d fix(models): return 404 for missing api tokens on delete (#3944) (#4119) 2026-10-15 21:01:39 +00:00
kolaente c17ef6c803 test(log): cover log level aliases 2026-10-15 17:21:38 +02:00
kolaente cc6db134df docs(config): clarify CRITICAL and NOTICE log level aliases
Refs #4049
2026-10-15 17:21:38 +02:00
kolaente 3744b6ac65 fix(saved-filters): search titles case-insensitively on postgres
Saved filter search used plain LIKE, which is case-sensitive on Postgres,
while project search uses db.ILIKE.

Refs #4131
2026-10-15 17:19:22 +02:00
kolaente 3ec925ef84 fix(frontend): stop color picker from echoing model changes as updates
The task detail view saves on every color picker update. The API returns
hex_color without '#', so the picker re-emitted the normalized value
after each save. While dragging, out-of-order save responses kept
flipping the color, each echo triggering another save in an endless loop.

Fixes #4156
2026-10-15 17:18:35 +02:00
kolaente 1368ee5c2e feat(datepicker): advance to minutes after typing the hour
Once the hour input holds a complete hour (two digits, or a single digit
that cannot start a valid two-digit hour in the current 12h/24h format),
the hour is committed and focus moves to the minutes input. Both inputs
select their content on focus so typing replaces the value.
2026-10-15 13:44:59 +02:00
kolaente f0d90b8d02 fix(datepicker): skip time step buttons when tabbing
Tab from the hours input now lands on minutes directly. The step buttons
stay mouse-clickable; ArrowUp/ArrowDown on the inputs remain the keyboard
path.
2026-10-15 13:44:59 +02:00
kolaente ae331e62f4 fix(time-tracking): start timer at chosen start time
Starting a timer always used the click time, discarding a start time the
user had picked in the form. Only an untouched start now falls back to
the click time.
2026-10-15 13:42:26 +02:00
kolaente fe4d602b37 docs(agents): point migration skill at minimum database versions [skip
ci]
2026-10-15 11:09:08 +02:00
kolaente 785e7154cd docs(agents): document supported database versions 2026-10-15 11:09:08 +02:00
Frederick [Bot] 3ae00e9ded chore(i18n): update translations via Crowdin 2026-10-15 00:09:51 +00:00