personal memory agent
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

update docs and fixtures for activities naming and schema

+17 -11
+2 -2
docs/APPS.md
··· 128 128 **Reference implementations:** 129 129 - API endpoints: `apps/search/routes.py` (search APIs, no index route) 130 130 - Form handlers: `apps/todos/routes.py` (POST handlers, validation, flash messages) 131 - - Navigation: `apps/calendar/routes.py` (date-based routes with custom context) 131 + - Navigation: `apps/activities/routes.py` (date-based routes with custom context) 132 132 - Redirects: `apps/todos/routes.py` index route (redirects `/` to today's date) 133 133 134 134 ··· 703 703 704 704 **Examples:** 705 705 - Standard: `apps/home/workspace.html`, `apps/todos/workspace.html`, `apps/entities/workspace.html` 706 - - Wide: `apps/search/workspace.html`, `apps/calendar/_day.html`, `apps/import/workspace.html` 706 + - Wide: `apps/search/workspace.html`, `apps/activities/_day.html`, `apps/import/workspace.html` 707 707 708 708 ### CSS Variables 709 709
+4 -4
docs/SOLCLI.md
··· 82 82 **Auto-discovered apps** — scans `apps/*/call.py` at import time: 83 83 ``` 84 84 apps/todos/call.py → sol call todos ... 85 - apps/calendar/call.py → sol call calendar ... 85 + apps/activities/call.py → sol call activities ... 86 86 apps/entities/call.py → sol call entities ... 87 87 ``` 88 88 ··· 265 265 │ │ ├── call.py # sol call todos (auto-discovered) 266 266 │ │ ├── todo.py # Data models 267 267 │ │ └── talent/todos/SKILL.md # Agent skill doc 268 - │ ├── calendar/ 269 - │ │ ├── call.py # sol call calendar (auto-discovered) 268 + │ ├── activities/ 269 + │ │ ├── call.py # sol call activities (auto-discovered) 270 270 │ │ └── talent/calendar/SKILL.md 271 271 │ ├── entities/call.py 272 272 │ ├── speakers/call.py ··· 306 306 | App | Source | Commands | 307 307 |-----|--------|----------| 308 308 | `todos` | `apps/todos/call.py` | list, add, done, cancel, move, upcoming, list-nudges-due, dispatch-nudges | 309 - | `calendar` | `apps/calendar/call.py` | list, add, update, cancel, move, import-day | 309 + | `activities` | `apps/activities/call.py` | list, get, create, update, mute, unmute | 310 310 | `entities` | `apps/entities/call.py` | list, show, search, observe, merge | 311 311 | `speakers` | `apps/speakers/call.py` | list, show, detect-owner, confirm-owner, clusters, suggest | 312 312 | `transcripts` | `apps/transcripts/call.py` | list, read, segments |
+9 -3
talent/journal/references/facets.md
··· 196 196 Each day file contains one JSON object per line, where each record represents a completed activity span: 197 197 198 198 ```jsonl 199 - {"id": "coding_095809_303", "activity": "coding", "segments": ["095809_303", "100313_303", "100816_303", "101320_302"], "level_avg": 0.88, "description": "Developed extraction prompts using Claude Code and VS Code", "active_entities": ["Claude Code", "VS Code", "sunstone"], "created_at": 1770435619415} 200 - {"id": "meeting_090953_303", "activity": "meeting", "segments": ["090953_303", "091457_303", "092001_304", "092506_304", "093010_304"], "level_avg": 1.0, "description": "Sprint planning meeting with the engineering team", "active_entities": ["Alice", "Bob"], "created_at": 1770435619420} 199 + {"id": "coding_095809_303", "activity": "coding", "segments": ["095809_303", "100313_303", "100816_303", "101320_302"], "level_avg": 0.88, "title": "Prompt Refactor Session", "description": "Developed extraction prompts using Claude Code and VS Code", "details": "Iterated on the extraction flow and validated generated output paths.", "active_entities": ["Claude Code", "VS Code", "sunstone"], "hidden": false, "source": "cogitate", "edits": [{"timestamp": "2026-02-09T18:20:19Z", "actor": "cogitate:activities", "fields": ["title", "description", "details"], "note": "synthesized activity summary"}], "created_at": 1770435619415} 200 + {"id": "meeting_090953_303", "activity": "meeting", "segments": ["090953_303", "091457_303", "092001_304", "092506_304", "093010_304"], "level_avg": 1.0, "title": "Sprint Planning", "description": "Sprint planning meeting with the engineering team", "details": "", "active_entities": ["Alice", "Bob"], "hidden": false, "source": "user", "edits": [], "created_at": 1770435619420} 201 201 ``` 202 202 203 203 ### Record ID scheme ··· 210 210 - `activity` (string) – Activity type ID from the facet's configured activities 211 211 - `segments` (array of strings) – Ordered list of segment keys where this activity was active 212 212 - `level_avg` (float) – Average engagement level across all segments (high=1.0, medium=0.5, low=0.25) 213 + - `title` (string) – Human title for the activity span; newer records set this explicitly, older records may fall back to `description` 213 214 - `description` (string) – AI-synthesized description of the full activity span 215 + - `details` (string) – Optional longer-form narrative detail for the span 214 216 - `active_entities` (array of strings) – Merged and deduplicated entity names from all segments 217 + - `hidden` (boolean) – When `true`, the record is muted from default list views 218 + - `source` (string) – Origin of the record, currently `cogitate` or `user` 219 + - `edits` (array of objects) – Append-only edit history with `timestamp`, `actor`, `fields`, and `note` 215 220 - `created_at` (integer) – Unix timestamp in milliseconds when the record was created 216 221 217 222 ### Lifecycle ··· 223 228 3. When an activity ends (explicitly, implicitly, or via timeout), the agent walks the segment chain to collect all data 224 229 4. A record is written to the facet's day file with preliminary description 225 230 5. An LLM synthesizes all per-segment descriptions into a unified narrative 226 - 6. The record description is updated with the synthesized version 231 + 6. The synthesized summary updates the record's `description`, and may also fill `title` and `details` 232 + 7. Later CLI edits append to the record's `edits` log and may hide/unhide the record without changing its ID 227 233 228 234 **Segment flush:** If no new segments arrive for an extended period (1 hour), the supervisor triggers `sol think --flush` on the last segment. Agents that declare `hook.flush: true` (like `activities`) run with `flush=True` in their context, treating all remaining active activities as ended. This ensures activities are recorded promptly even when the owner stops working, and prevents cross-day data loss. 229 235
+2 -2
tests/fixtures/journal/facets/full-featured/activities/20260214.jsonl
··· 1 - {"id": "coding_093000_300", "activity": "coding", "segments": ["093000_300", "093500_300", "094000_300", "094500_300"], "level_avg": 0.88, "description": "Refactored activity output path storage to use facet-scoped directories", "active_entities": ["sunstone", "claude"], "created_at": 1739523600000} 2 - {"id": "meeting_140000_300", "activity": "meeting", "segments": ["140000_300", "140500_300"], "level_avg": 0.5, "description": "Sprint planning for next iteration", "active_entities": ["alice", "bob"], "created_at": 1739541600000} 1 + {"id": "coding_093000_300", "activity": "coding", "segments": ["093000_300", "093500_300", "094000_300", "094500_300"], "level_avg": 0.88, "title": "Activity Output Refactor", "description": "Refactored activity output path storage to use facet-scoped directories", "details": "Moved generated artifacts under facets/{facet}/activities/{day}/{activity_id}/ and verified the session review path.", "active_entities": ["sunstone", "claude"], "hidden": false, "source": "cogitate", "edits": [{"timestamp": "2025-02-14T17:00:00Z", "actor": "cogitate:activities", "fields": ["title", "description", "details"], "note": "synthesized activity summary"}], "created_at": 1739523600000} 2 + {"id": "meeting_140000_300", "activity": "meeting", "segments": ["140000_300", "140500_300"], "level_avg": 0.5, "title": "Sprint Planning", "description": "Sprint planning for next iteration", "details": "", "active_entities": ["alice", "bob"], "hidden": false, "source": "user", "edits": [], "created_at": 1739541600000}