diff --git a/apps/settings/routes.py b/apps/settings/routes.py index 1ce7da6a9..da35c136f 100644 --- a/apps/settings/routes.py +++ b/apps/settings/routes.py @@ -379,7 +379,7 @@ def get_providers() -> Any: - cogitate: Current cogitate provider, tier, and backup - contexts: Configured context overrides from journal.json - context_defaults: Context registry with labels/groups for UI - (includes talent configs with type, schedule, disabled, extract) + (includes talent configs with type, schedule, and disabled state) - api_keys: Boolean status for each provider's API key - auth: Per-provider auth mode for cogitate ("platform" or "api_key") """ @@ -432,13 +432,6 @@ def get_providers() -> Any: if "schedule" in info: context_defaults[context_key]["schedule"] = info["schedule"] context_defaults[context_key]["disabled"] = info.get("disabled", False) - # Include extract for generators with occurrence hooks - hook = info.get("hook") - has_extraction = ( - isinstance(hook, dict) and hook.get("post") in ("occurrence",) - ) or hook in ("occurrence",) - if has_extraction: - context_defaults[context_key]["extract"] = info.get("extract", True) # Get providers list from registry providers_list = get_provider_list() @@ -928,12 +921,6 @@ def _build_generator_info(key: str, info: dict) -> dict: Transforms talent config metadata into the format expected by the Settings UI Insights section. """ - # Determine if extraction is supported (occurrence hooks) - hook = info.get("hook") - has_extraction = ( - isinstance(hook, dict) and hook.get("post") in ("occurrence",) - ) or hook in ("occurrence",) - return { "key": key, "title": info.get("title", info.get("label", key)), @@ -941,8 +928,6 @@ def _build_generator_info(key: str, info: dict) -> dict: "source": info.get("source", "system"), "app": info.get("app"), "disabled": info.get("disabled", False), - "extract": info.get("extract", True) if has_extraction else None, - "has_extraction": has_extraction, } diff --git a/apps/settings/workspace.html b/apps/settings/workspace.html index b4687d005..82643bf1b 100644 --- a/apps/settings/workspace.html +++ b/apps/settings/workspace.html @@ -2500,7 +2500,7 @@ button:focus:not(:focus-visible) {

insights

-

Configure which AI insights run and whether they extract events to your timeline.

+

Configure which AI insights run.

@@ -5332,8 +5332,6 @@ function renderInsightsList(insights) { for (const insight of sourceInsights) { const isDisabled = insight.disabled; - const hasExtraction = insight.has_extraction; - const extractEnabled = insight.extract !== false; html += `
`; html += `
`; @@ -5345,17 +5343,6 @@ function renderInsightsList(insights) { html += `
`; - // Extract toggle (only if insight supports extraction) - if (hasExtraction) { - html += `
`; - html += `Extract`; - html += ``; - html += `
`; - } - // Enabled toggle html += `
`; html += `Enabled`; @@ -5389,12 +5376,6 @@ function setupInsightsEventListeners() { // Update row styling and disable/enable other toggles row.classList.toggle('insight-disabled', disabled); - const extractToggle = row.querySelector('input[data-field="extract"]'); - if (extractToggle) { - extractToggle.disabled = disabled; - } - } else if (field === 'extract') { - await saveInsightSetting(insightKey, 'extract', e.target.checked); } }); }); diff --git a/talent/journal/references/config.md b/talent/journal/references/config.md index c28d94174..c2e2f808f 100644 --- a/talent/journal/references/config.md +++ b/talent/journal/references/config.md @@ -58,7 +58,7 @@ Fields: ```json { "facets": {"order": ["work", "personal"], "selected": "work"}, - "apps": {"order": ["home", "calendar", "todos"], "starred": ["home", "todos"]} + "apps": {"order": ["home", "activities", "todos"], "starred": ["home", "todos"]} } ``` diff --git a/talent/schedule.md b/talent/schedule.md index e2dbc367c..cd0e45884 100644 --- a/talent/schedule.md +++ b/talent/schedule.md @@ -2,7 +2,7 @@ "type": "generate", "title": "Upcoming Schedule", - "description": "Extracts future scheduled events and calendar activities into structured anticipation records. Captures dates, times, participants, and cancellation state.", + "description": "Extracts future scheduled items from screen and transcript content into anticipated activity records. Captures dates, times, participants, and cancellation state.", "hook": {"post": "schedule"}, "color": "#5e35b1", "schedule": "daily", @@ -17,7 +17,7 @@ $daily_preamble **Input:** A markdown file containing chronologically ordered transcripts of a workday plus the screen agent's output for the same day. Calendar views, meeting invitations, scheduling UIs, and project-management interfaces are captured in the screen content; verbal mentions of future plans appear in transcripts. -**Your task:** Identify every future scheduled item (dated after today) visible in the day's screen or transcript content and emit a JSON array of anticipation objects. +**Your task:** Identify every future scheduled item (dated after today) visible in the day's screen or transcript content and emit a JSON array of anticipated activity objects. ## What to capture diff --git a/tests/baselines/api/settings/generators.json b/tests/baselines/api/settings/generators.json index 150da5d57..78eadf290 100644 --- a/tests/baselines/api/settings/generators.json +++ b/tests/baselines/api/settings/generators.json @@ -4,8 +4,6 @@ "app": "entities", "description": "Extracts durable factoids about attached entities from journal content", "disabled": false, - "extract": null, - "has_extraction": false, "key": "entities:entity_observer", "source": "app", "title": "Entity Observer" @@ -14,18 +12,14 @@ "app": null, "description": "Analyzes activity patterns to identify optimal times for scheduled maintenance tasks.", "disabled": false, - "extract": null, - "has_extraction": false, "key": "daily_schedule", "source": "system", "title": "Maintenance Window" }, { "app": null, - "description": "Extracts future scheduled events and calendar activities into structured anticipation records. Captures dates, times, participants, and cancellation state.", + "description": "Extracts future scheduled items from screen and transcript content into anticipated activity records. Captures dates, times, participants, and cancellation state.", "disabled": false, - "extract": null, - "has_extraction": false, "key": "schedule", "source": "system", "title": "Upcoming Schedule" @@ -36,8 +30,6 @@ "app": null, "description": "Creates a detailed documentary record of screen activity. Focuses on the 'what' - chronological account with preserved details, excerpts, and entities.", "disabled": false, - "extract": null, - "has_extraction": false, "key": "screen", "source": "system", "title": "Screen Record" @@ -46,8 +38,6 @@ "app": null, "description": "Extracts people, companies, projects, and tools from segment content", "disabled": false, - "extract": null, - "has_extraction": false, "key": "entities", "source": "system", "title": "Entity Extraction" @@ -56,8 +46,6 @@ "app": null, "description": "Extracts structured intelligence from imported documents", "disabled": false, - "extract": null, - "has_extraction": false, "key": "documents", "source": "system", "title": "Document Analysis" @@ -66,8 +54,6 @@ "app": null, "description": "Identifies who said what in each transcript segment. Layers 1-3 (owner, structural, acoustic) run computationally via hook; Layer 4 uses contextual LLM analysis for remaining unmatched sentences.", "disabled": false, - "extract": null, - "has_extraction": false, "key": "speaker_attribution", "source": "system", "title": "Speaker Attribution" @@ -76,8 +62,6 @@ "app": null, "description": "Unified segment understanding — density, content type, entities, facets, speakers, and routing recommendations in a single pass", "disabled": false, - "extract": null, - "has_extraction": false, "key": "sense", "source": "system", "title": "Segment Sense" diff --git a/tests/baselines/api/sol/talents-day.json b/tests/baselines/api/sol/talents-day.json index e90d33ab2..25dfbdc07 100644 --- a/tests/baselines/api/sol/talents-day.json +++ b/tests/baselines/api/sol/talents-day.json @@ -371,7 +371,7 @@ "schedule": { "app": null, "color": "#5e35b1", - "description": "Extracts future scheduled events and calendar activities into structured anticipation records. Captures dates, times, participants, and cancellation state.", + "description": "Extracts future scheduled items from screen and transcript content into anticipated activity records. Captures dates, times, participants, and cancellation state.", "multi_facet": false, "output_format": "json", "schedule": "daily", diff --git a/tests/baselines/api/stats/stats.json b/tests/baselines/api/stats/stats.json index 270b56579..bc215dc5f 100644 --- a/tests/baselines/api/stats/stats.json +++ b/tests/baselines/api/stats/stats.json @@ -216,7 +216,7 @@ }, "schedule": { "color": "#5e35b1", - "description": "Extracts future scheduled events and calendar activities into structured anticipation records. Captures dates, times, participants, and cancellation state.", + "description": "Extracts future scheduled items from screen and transcript content into anticipated activity records. Captures dates, times, participants, and cancellation state.", "hook": { "post": "schedule" }, diff --git a/tests/test_talent_cli.py b/tests/test_talent_cli.py index 4580f4fa1..4baafa92b 100644 --- a/tests/test_talent_cli.py +++ b/tests/test_talent_cli.py @@ -80,7 +80,7 @@ def test_format_tags_hook(): assert _format_tags({}) == "" # Hook tags (compact, no =name suffix) - assert _format_tags({"hook": {"post": "occurrence"}}) == "post" + assert _format_tags({"hook": {"post": "schedule"}}) == "post" assert _format_tags({"hook": {"pre": "prep"}}) == "pre" assert _format_tags({"hook": {"pre": "prep", "post": "process"}}) == "pre post" @@ -93,7 +93,7 @@ def test_format_tags_hook(): # Combined: output + hooks + disabled + FAIL tags = _format_tags( - {"output": "md", "hook": {"post": "occurrence"}, "disabled": True}, + {"output": "md", "hook": {"post": "schedule"}, "disabled": True}, failed=True, ) assert tags == "md post disabled FAIL" diff --git a/think/sense_splitter.py b/think/sense_splitter.py index cd05638cc..97309485a 100644 --- a/think/sense_splitter.py +++ b/think/sense_splitter.py @@ -48,6 +48,11 @@ def write_sense_outputs( "timestamp": datetime.now(tz=timezone.utc).isoformat(), }, ) + # Write both structured and human-readable Sense outputs here. + # think/cluster.py discovers talent outputs by globbing + # {segment}/talents/**/*.md for load.talents.{name} consumers. + # Dropping sense.md would silently break downstream talents such as + # participation that rely on the sense markdown file being present. _write_json_atomic(agents_dir / "sense.json", sense_json) if entities: