Commit 406b47a
fix: backport UX, timezone, and plugin skill detection fixes (#48)
* feat: extract and display image attachments from user messages
Parses base64 image blocks from UserMessage content, surfaces them
via image_attachments field, and renders them in the frontend timeline,
conversation overview, and expandable prompt components.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(api): use local timezone for dashboard stats and daily trend grouping
The dashboard "today"/"yesterday"/"this week" stats and all 28 SQL daily
trend queries were using UTC date boundaries instead of the machine's
local timezone. On a UTC-8 machine, this caused the homepage to show
1 session instead of 24 for "today".
- Add shared `local_timezone()` and `utc_to_local_date()` helpers in
utils.py using `datetime.astimezone()` (DST-safe, no stale offsets)
- Fix dashboard endpoint to use local calendar date boundaries
- Replace all DATE(s.start_time) with timezone-adjusted expressions
in db/queries.py (28 occurrences)
- Fix Python-side date grouping in plugins router (5 occurrences)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(plugins): detect skills from manifest custom paths
Plugins like impeccable store skills in non-default directories
(e.g., .claude/skills/ instead of skills/) and declare these paths
in their .claude-plugin/plugin.json manifest. Our capability scanner
only checked hardcoded default directories, returning 0 skills.
- Add read_plugin_manifest() and _resolve_manifest_dirs() helpers
to scan both default and manifest-declared custom paths
- Update scan_plugin_capabilities(), read_command_contents(),
list_plugin_skills(), get_plugin_skill_content() to use them
- Update _resolve_skill_info() to check manifest paths when
resolving individual skill files
- Fix route ordering: move /{plugin_name:path} catch-all to end
so /skills and /skills/content sub-routes are reachable
- Add "Browse all N skill files" link on plugin detail page
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: replace ambiguous for/break with next() for first user message lookup
The for/break pattern had the break at the same indent as the if,
making it always fire on first iteration regardless of the condition.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: address code review findings across 3 cherry-picked commits
- media_type allowlist for image attachments (prevents non-image data URIs)
- rename shadowed `date` param to `day` in _local_day_boundaries
- guard naive datetimes in utc_to_local_date (assume UTC)
- remove unused plugins_base variable in _resolve_manifest_dirs
- promote _find_skill_in_version_dir to module level (was needlessly nested)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: sort imports in plugins and skills routers to pass ruff I001
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* style: apply ruff formatter to message, plugins, and sessions modules
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add zero-use skills display
* feat: persist accordion state and scroll position on skills/commands pages
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Ayush Jhunjhunwala <48875674+the-non-expert@users.noreply.github.com>1 parent 27aa530 commit 406b47a
24 files changed
Lines changed: 1010 additions & 308 deletions
File tree
- api
- db
- models
- routers
- services
- frontend/src
- lib
- components
- conversation
- skills
- timeline
- ui
- routes
- commands
- plugins/[plugin_name]
- skills
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
21 | 45 | | |
22 | 46 | | |
23 | 47 | | |
| |||
40 | 64 | | |
41 | 65 | | |
42 | 66 | | |
43 | | - | |
| 67 | + | |
44 | 68 | | |
45 | 69 | | |
46 | 70 | | |
47 | | - | |
| 71 | + | |
48 | 72 | | |
49 | 73 | | |
50 | 74 | | |
| |||
679 | 703 | | |
680 | 704 | | |
681 | 705 | | |
682 | | - | |
| 706 | + | |
683 | 707 | | |
684 | 708 | | |
685 | 709 | | |
686 | 710 | | |
687 | 711 | | |
688 | 712 | | |
689 | | - | |
| 713 | + | |
690 | 714 | | |
691 | 715 | | |
692 | 716 | | |
| |||
982 | 1006 | | |
983 | 1007 | | |
984 | 1008 | | |
985 | | - | |
| 1009 | + | |
986 | 1010 | | |
987 | 1011 | | |
988 | 1012 | | |
989 | | - | |
| 1013 | + | |
990 | 1014 | | |
991 | 1015 | | |
992 | 1016 | | |
| |||
1775 | 1799 | | |
1776 | 1800 | | |
1777 | 1801 | | |
1778 | | - | |
| 1802 | + | |
1779 | 1803 | | |
1780 | 1804 | | |
1781 | 1805 | | |
1782 | 1806 | | |
1783 | | - | |
| 1807 | + | |
1784 | 1808 | | |
1785 | 1809 | | |
1786 | 1810 | | |
| |||
2660 | 2684 | | |
2661 | 2685 | | |
2662 | 2686 | | |
2663 | | - | |
| 2687 | + | |
2664 | 2688 | | |
2665 | 2689 | | |
2666 | 2690 | | |
2667 | 2691 | | |
2668 | 2692 | | |
2669 | | - | |
| 2693 | + | |
2670 | 2694 | | |
2671 | 2695 | | |
2672 | 2696 | | |
| |||
2684 | 2708 | | |
2685 | 2709 | | |
2686 | 2710 | | |
2687 | | - | |
| 2711 | + | |
2688 | 2712 | | |
2689 | 2713 | | |
2690 | 2714 | | |
2691 | 2715 | | |
2692 | 2716 | | |
2693 | 2717 | | |
2694 | | - | |
| 2718 | + | |
2695 | 2719 | | |
2696 | 2720 | | |
2697 | 2721 | | |
| |||
2919 | 2943 | | |
2920 | 2944 | | |
2921 | 2945 | | |
2922 | | - | |
| 2946 | + | |
2923 | 2947 | | |
2924 | 2948 | | |
2925 | 2949 | | |
2926 | 2950 | | |
2927 | | - | |
| 2951 | + | |
2928 | 2952 | | |
2929 | 2953 | | |
2930 | 2954 | | |
| |||
3034 | 3058 | | |
3035 | 3059 | | |
3036 | 3060 | | |
3037 | | - | |
| 3061 | + | |
3038 | 3062 | | |
3039 | 3063 | | |
3040 | 3064 | | |
3041 | 3065 | | |
3042 | | - | |
| 3066 | + | |
3043 | 3067 | | |
3044 | 3068 | | |
3045 | 3069 | | |
| |||
3147 | 3171 | | |
3148 | 3172 | | |
3149 | 3173 | | |
3150 | | - | |
| 3174 | + | |
3151 | 3175 | | |
3152 | 3176 | | |
3153 | 3177 | | |
3154 | 3178 | | |
3155 | 3179 | | |
3156 | | - | |
| 3180 | + | |
3157 | 3181 | | |
3158 | 3182 | | |
3159 | 3183 | | |
| |||
3162 | 3186 | | |
3163 | 3187 | | |
3164 | 3188 | | |
3165 | | - | |
| 3189 | + | |
3166 | 3190 | | |
3167 | 3191 | | |
3168 | 3192 | | |
3169 | 3193 | | |
3170 | 3194 | | |
3171 | | - | |
| 3195 | + | |
3172 | 3196 | | |
3173 | 3197 | | |
3174 | 3198 | | |
| |||
3503 | 3527 | | |
3504 | 3528 | | |
3505 | 3529 | | |
3506 | | - | |
| 3530 | + | |
3507 | 3531 | | |
3508 | 3532 | | |
3509 | 3533 | | |
3510 | 3534 | | |
3511 | 3535 | | |
3512 | | - | |
| 3536 | + | |
3513 | 3537 | | |
3514 | 3538 | | |
3515 | 3539 | | |
| |||
3526 | 3550 | | |
3527 | 3551 | | |
3528 | 3552 | | |
3529 | | - | |
| 3553 | + | |
3530 | 3554 | | |
3531 | 3555 | | |
3532 | 3556 | | |
3533 | 3557 | | |
3534 | 3558 | | |
3535 | 3559 | | |
3536 | | - | |
| 3560 | + | |
3537 | 3561 | | |
3538 | 3562 | | |
3539 | 3563 | | |
| |||
3632 | 3656 | | |
3633 | 3657 | | |
3634 | 3658 | | |
3635 | | - | |
| 3659 | + | |
3636 | 3660 | | |
3637 | 3661 | | |
3638 | 3662 | | |
3639 | 3663 | | |
3640 | 3664 | | |
3641 | | - | |
| 3665 | + | |
3642 | 3666 | | |
3643 | 3667 | | |
3644 | 3668 | | |
| |||
3647 | 3671 | | |
3648 | 3672 | | |
3649 | 3673 | | |
3650 | | - | |
| 3674 | + | |
3651 | 3675 | | |
3652 | 3676 | | |
3653 | 3677 | | |
3654 | 3678 | | |
3655 | 3679 | | |
3656 | | - | |
| 3680 | + | |
3657 | 3681 | | |
3658 | 3682 | | |
3659 | 3683 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
71 | 71 | | |
72 | 72 | | |
73 | 73 | | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
74 | 77 | | |
75 | 78 | | |
76 | 79 | | |
| |||
99 | 102 | | |
100 | 103 | | |
101 | 104 | | |
| 105 | + | |
102 | 106 | | |
103 | 107 | | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
104 | 128 | | |
105 | 129 | | |
106 | 130 | | |
107 | 131 | | |
108 | 132 | | |
109 | 133 | | |
110 | 134 | | |
111 | | - | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
112 | 138 | | |
113 | 139 | | |
114 | 140 | | |
| |||
0 commit comments