feat: sync with upstream — v1.2.0, in-app updates, Projects, modules

Brings the public tree back in line with the development repo after several
weeks of drift caused by a stale publish include list.

New:
- In-app update path: GET /update/check compares the checkout against
  origin/main and POST /update/apply runs `ncp upgrade` detached (pull,
  rebuild, restart). The sidebar shows the version, checks on click, and
  offers an "update available" pill.
- Projects: a project workspace groups chats and RAG documents, with
  per-project instructions and document retrieval scoped to the active
  project. Replaces the standalone Documents page.
- modules/: auto-discovered feature plugins (mail, network) with their
  frontend counterparts and tests.
- Memory curation runs in-process (synapse/memory/curator.py) on the chat
  model when a conversation goes idle. The separate memory service on :8001
  is gone, along with the launcher lines that started it.

Also: the KDE theme, panel and Promethean terminal assets, the full test
suite, and VERSION 1.2.0.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
This commit is contained in:
janvanwan
2026-08-25 09:13:55 -05:00
parent fe5d18afa7
commit 42eaed647a
88 changed files with 4280 additions and 1888 deletions
+73 -655
View File
@@ -1,702 +1,120 @@
[Icon Theme]
Name=NexusOS
Comment=NexusOS accent icon theme
Inherits=Papirus-Dark,hicolor
Directories=16x16/apps,22x22/apps,24x24/apps,32x32/apps,48x48/apps,64x64/apps,128x128/apps,16x16/places,22x22/places,24x24/places,32x32/places,48x48/places,64x64/places,128x128/places,16x16/actions,22x22/actions,24x24/actions,32x32/actions,48x48/actions,64x64/actions,128x128/actions,scalable/status,8x8/emblems,16x16/devices,16x16/emblems,16x16/emotes,16x16/mimetypes,16x16/panel,16x16/status,16x16@2x/actions,16x16@2x/apps,16x16@2x/devices,16x16@2x/emblems,16x16@2x/emotes,16x16@2x/mimetypes,16x16@2x/panel,16x16@2x/places,16x16@2x/status,18x18/actions,18x18@2x/actions,22x22/animations,22x22/devices,22x22/emblems,22x22/emotes,22x22/mimetypes,22x22/panel,22x22/status,22x22@2x/actions,22x22@2x/animations,22x22@2x/apps,22x22@2x/devices,22x22@2x/emblems,22x22@2x/emotes,22x22@2x/mimetypes,22x22@2x/panel,22x22@2x/places,22x22@2x/status,24x24/animations,24x24/devices,24x24/emblems,24x24/emotes,24x24/mimetypes,24x24/panel,24x24/status,24x24@2x/actions,24x24@2x/animations,24x24@2x/apps,24x24@2x/devices,24x24@2x/emblems,24x24@2x/emotes,24x24@2x/mimetypes,24x24@2x/panel,24x24@2x/places,24x24@2x/status,32x32/devices,32x32/emblems,32x32/emotes,32x32/mimetypes,32x32/status,32x32@2x/actions,32x32@2x/apps,32x32@2x/devices,32x32@2x/emblems,32x32@2x/emotes,32x32@2x/mimetypes,32x32@2x/places,32x32@2x/status,42x42/apps,48x48/devices,48x48/emblems,48x48/emotes,48x48/mimetypes,48x48/status,48x48@2x/actions,48x48@2x/apps,48x48@2x/devices,48x48@2x/emblems,48x48@2x/emotes,48x48@2x/mimetypes,48x48@2x/places,48x48@2x/status,64x64/devices,64x64/mimetypes,64x64@2x/apps,64x64@2x/devices,64x64@2x/mimetypes,64x64@2x/places,84x84/apps,96x96/apps,96x96/devices,96x96/mimetypes,96x96/places,128x128/devices,128x128/mimetypes,symbolic/actions,symbolic/apps,symbolic/devices,symbolic/emblems,symbolic/emotes,symbolic/mimetypes,symbolic/places,symbolic/status,symbolic/up-to-32
# Inherit breeze-dark, not Papirus-Dark. Breeze's icons carry
# ColorScheme-Text / ColorScheme-Highlight classes that Plasma recolours from
# the active colour scheme, so everything this theme does not override picks up
# the NexusOS palette on its own. Papirus hardcodes its blues (#5294e2), which
# no colour scheme can touch — inheriting it left the whole un-themed surface
# permanently blue. hicolor last, as the freedesktop fallback of last resort.
Inherits=breeze-dark,hicolor
# Only directories that actually exist. This list previously declared 124
# sections against 21 real directories, most of them copied from Papirus.
Directories=16x16/apps,16x16/places,16x16/actions,22x22/apps,22x22/places,22x22/actions,24x24/apps,24x24/places,24x24/actions,32x32/apps,32x32/places,32x32/actions,48x48/apps,48x48/places,48x48/actions,64x64/apps,64x64/places,64x64/actions,128x128/apps,128x128/places,128x128/actions
[16x16/apps]
Context=Applications
Size=16
Type=Fixed
[16x16/places]
Context=Places
Size=16
Type=Fixed
[16x16/actions]
Context=Actions
Size=16
Type=Fixed
[22x22/apps]
Context=Applications
Size=22
Type=Fixed
[22x22/places]
Context=Places
Size=22
Type=Fixed
[22x22/actions]
Context=Actions
Size=22
Type=Fixed
[24x24/apps]
Context=Applications
Size=24
Type=Fixed
[24x24/places]
Context=Places
Size=24
Type=Fixed
[24x24/actions]
Context=Actions
Size=24
Type=Fixed
[32x32/apps]
Context=Applications
Size=32
Type=Fixed
[32x32/places]
Context=Places
Size=32
Type=Fixed
[32x32/actions]
Context=Actions
Size=32
Type=Fixed
[48x48/apps]
Context=Applications
Size=48
Type=Fixed
[48x48/places]
Context=Places
Size=48
Type=Fixed
[48x48/actions]
Context=Actions
Size=48
Type=Fixed
[64x64/apps]
Context=Applications
Size=64
Type=Fixed
[128x128/apps]
Context=Applications
Size=128
MinSize=128
MaxSize=512
Type=Scalable
[16x16/places]
Context=Places
Size=16
Type=Fixed
[22x22/places]
Context=Places
Size=22
Type=Fixed
[24x24/places]
Context=Places
Size=24
Type=Fixed
[32x32/places]
Context=Places
Size=32
Type=Fixed
[48x48/places]
Context=Places
Size=48
Type=Fixed
[64x64/places]
Context=Places
Size=64
Type=Fixed
[64x64/actions]
Context=Actions
Size=64
Type=Fixed
[128x128/apps]
Context=Applications
Size=128
Type=Fixed
[128x128/places]
Context=Places
Size=128
MinSize=128
MaxSize=512
Type=Scalable
[16x16/actions]
Context=Actions
Size=16
Type=Fixed
[22x22/actions]
Context=Actions
Size=22
Type=Fixed
[24x24/actions]
Context=Actions
Size=24
Type=Fixed
[32x32/actions]
Context=Actions
Size=32
Type=Fixed
[48x48/actions]
Context=Actions
Size=48
Type=Fixed
[64x64/actions]
Size=64
Context=Actions
Type=Fixed
[128x128/actions]
Context=Actions
Size=128
Context=Actions
Type=Fixed
[scalable/status]
Size=16
Context=Status
MinSize=8
MaxSize=512
Type=Scalable
[8x8/emblems]
Context=Emblems
Size=8
Type=Fixed
[16x16/devices]
Context=Devices
Size=16
Type=Fixed
[16x16/emblems]
Context=Emblems
Size=16
Type=Fixed
[16x16/emotes]
Context=Emotes
Size=16
Type=Fixed
[16x16/mimetypes]
Context=MimeTypes
Size=16
Type=Fixed
[16x16/panel]
Context=Status
Size=16
Type=Fixed
[16x16/status]
Context=Status
Size=16
Type=Fixed
[16x16@2x/actions]
Context=Actions
Size=16
Scale=2
Type=Fixed
[16x16@2x/apps]
Context=Applications
Size=16
Scale=2
Type=Fixed
[16x16@2x/devices]
Context=Devices
Size=16
Scale=2
Type=Fixed
[16x16@2x/emblems]
Context=Emblems
Size=16
Scale=2
Type=Fixed
[16x16@2x/emotes]
Context=Emotes
Size=16
Scale=2
Type=Fixed
[16x16@2x/mimetypes]
Context=MimeTypes
Size=16
Scale=2
Type=Fixed
[16x16@2x/panel]
Context=Status
Size=16
Scale=2
Type=Fixed
[16x16@2x/places]
Context=Places
Size=16
Scale=2
Type=Fixed
[16x16@2x/status]
Context=Status
Size=16
Scale=2
Type=Fixed
[18x18/actions]
Context=Actions
Size=18
Type=Fixed
[18x18@2x/actions]
Context=Actions
Size=18
Scale=2
Type=Fixed
[22x22/animations]
Context=Animations
Size=22
Type=Fixed
[22x22/devices]
Context=Devices
Size=22
Type=Fixed
[22x22/emblems]
Context=Emblems
Size=22
Type=Fixed
[22x22/emotes]
Context=Emotes
Size=22
Type=Fixed
[22x22/mimetypes]
Context=MimeTypes
Size=22
Type=Fixed
[22x22/panel]
Context=Status
Size=22
Type=Fixed
[22x22/status]
Context=Status
Size=22
Type=Fixed
[22x22@2x/actions]
Context=Actions
Size=22
Scale=2
Type=Fixed
[22x22@2x/animations]
Context=Animations
Size=22
Scale=2
Type=Fixed
[22x22@2x/apps]
Context=Applications
Size=22
Scale=2
Type=Fixed
[22x22@2x/devices]
Context=Devices
Size=22
Scale=2
Type=Fixed
[22x22@2x/emblems]
Context=Emblems
Size=22
Scale=2
Type=Fixed
[22x22@2x/emotes]
Context=Emotes
Size=22
Scale=2
Type=Fixed
[22x22@2x/mimetypes]
Context=MimeTypes
Size=22
Scale=2
Type=Fixed
[22x22@2x/panel]
Context=Status
Size=22
Scale=2
Type=Fixed
[22x22@2x/places]
Context=Places
Size=22
Scale=2
Type=Fixed
[22x22@2x/status]
Context=Status
Size=22
Scale=2
Type=Fixed
[24x24/animations]
Context=Animations
Size=24
Type=Fixed
[24x24/devices]
Context=Devices
Size=24
Type=Fixed
[24x24/emblems]
Context=Emblems
Size=24
Type=Fixed
[24x24/emotes]
Context=Emotes
Size=24
Type=Fixed
[24x24/mimetypes]
Context=MimeTypes
Size=24
Type=Fixed
[24x24/panel]
Context=Status
Size=24
Type=Fixed
[24x24/status]
Context=Status
Size=24
Type=Fixed
[24x24@2x/actions]
Context=Actions
Size=24
Scale=2
Type=Fixed
[24x24@2x/animations]
Context=Animations
Size=24
Scale=2
Type=Fixed
[24x24@2x/apps]
Context=Applications
Size=24
Scale=2
Type=Fixed
[24x24@2x/devices]
Context=Devices
Size=24
Scale=2
Type=Fixed
[24x24@2x/emblems]
Context=Emblems
Size=24
Scale=2
Type=Fixed
[24x24@2x/emotes]
Context=Emotes
Size=24
Scale=2
Type=Fixed
[24x24@2x/mimetypes]
Context=MimeTypes
Size=24
Scale=2
Type=Fixed
[24x24@2x/panel]
Context=Status
Size=24
Scale=2
Type=Fixed
[24x24@2x/places]
Context=Places
Size=24
Scale=2
Type=Fixed
[24x24@2x/status]
Context=Status
Size=24
Scale=2
Type=Fixed
[32x32/devices]
Context=Devices
Size=32
Type=Fixed
[32x32/emblems]
Context=Emblems
Size=32
Type=Fixed
[32x32/emotes]
Context=Emotes
Size=32
Type=Fixed
[32x32/mimetypes]
Context=MimeTypes
Size=32
Type=Fixed
[32x32/status]
Context=Status
Size=32
Type=Fixed
[32x32@2x/actions]
Context=Actions
Size=32
Scale=2
Type=Fixed
[32x32@2x/apps]
Context=Applications
Size=32
Scale=2
Type=Fixed
[32x32@2x/devices]
Context=Devices
Size=32
Scale=2
Type=Fixed
[32x32@2x/emblems]
Context=Emblems
Size=32
Scale=2
Type=Fixed
[32x32@2x/emotes]
Context=Emotes
Size=32
Scale=2
Type=Fixed
[32x32@2x/mimetypes]
Context=MimeTypes
Size=32
Scale=2
Type=Fixed
[32x32@2x/places]
Context=Places
Size=32
Scale=2
Type=Fixed
[32x32@2x/status]
Context=Status
Size=32
Scale=2
Type=Fixed
[42x42/apps]
Context=Applications
Size=42
Type=Fixed
[48x48/devices]
Context=Devices
Size=48
Type=Fixed
[48x48/emblems]
Context=Emblems
Size=48
Type=Fixed
[48x48/emotes]
Context=Emotes
Size=48
Type=Fixed
[48x48/mimetypes]
Context=MimeTypes
Size=48
Type=Fixed
[48x48/status]
Context=Status
Size=48
MinSize=48
MaxSize=512
Type=Scalable
[48x48@2x/actions]
Context=Actions
Size=48
Scale=2
Type=Fixed
[48x48@2x/apps]
Context=Applications
Size=48
Scale=2
Type=Fixed
[48x48@2x/devices]
Context=Devices
Size=48
Scale=2
Type=Fixed
[48x48@2x/emblems]
Context=Emblems
Size=48
Scale=2
Type=Fixed
[48x48@2x/emotes]
Context=Emotes
Size=48
Scale=2
Type=Fixed
[48x48@2x/mimetypes]
Context=MimeTypes
Size=48
Scale=2
Type=Fixed
[48x48@2x/places]
Context=Places
Size=48
Scale=2
Type=Fixed
[48x48@2x/status]
Context=Status
Size=48
MinSize=48
MaxSize=512
Scale=2
Type=Scalable
[64x64/devices]
Context=Devices
Size=64
Type=Fixed
[64x64/mimetypes]
Context=MimeTypes
Size=64
Type=Fixed
[64x64@2x/apps]
Context=Applications
Size=64
Scale=2
Type=Fixed
[64x64@2x/devices]
Context=Devices
Size=64
Scale=2
Type=Fixed
[64x64@2x/mimetypes]
Context=MimeTypes
Size=64
Scale=2
Type=Fixed
[64x64@2x/places]
Context=Places
Size=64
Scale=2
Type=Fixed
[84x84/apps]
Context=Applications
Size=84
Type=Fixed
[96x96/apps]
Context=Applications
Size=96
Type=Fixed
[96x96/devices]
Context=Devices
Size=96
Type=Fixed
[96x96/mimetypes]
Context=MimeTypes
Size=96
Type=Fixed
[96x96/places]
Context=Places
Size=96
Type=Fixed
[128x128/devices]
Context=Devices
Size=128
MinSize=128
MaxSize=512
Type=Scalable
[128x128/mimetypes]
Context=MimeTypes
Size=128
MinSize=128
MaxSize=512
Type=Scalable
[symbolic/actions]
Context=Actions
Size=16
MinSize=16
MaxSize=512
Type=Scalable
[symbolic/apps]
Context=Applications
Size=16
MinSize=16
MaxSize=512
Type=Scalable
[symbolic/devices]
Context=Devices
Size=16
MinSize=16
MaxSize=512
Type=Scalable
[symbolic/emblems]
Context=Emblems
Size=16
MinSize=16
MaxSize=512
Type=Scalable
[symbolic/emotes]
Context=Emotes
Size=16
MinSize=16
MaxSize=512
Type=Scalable
[symbolic/mimetypes]
Context=MimeTypes
Size=16
MinSize=16
MaxSize=512
Type=Scalable
[symbolic/places]
Context=Places
Size=16
MinSize=16
MaxSize=512
Type=Scalable
[symbolic/status]
Context=Status
Size=16
MinSize=16
MaxSize=512
Type=Scalable
[symbolic/up-to-32]
Context=Status
Size=16
MinSize=16
MaxSize=32
Type=Scalable