Files
Keysat 069e60053b email-activity agent: propose -> review -> approve grid notes (v0.1.0:64)
When a sent/received email is matched to an investor, a local-model agent drafts a
one-line dated note and queues it as a PENDING proposal (it never writes the grid
itself). On the Email Capture page a partner sees "Proposed grid notes", can edit the
text, and Approve (appends to that investor's grid notes cell, newest at bottom,
stamped with the approver) or Dismiss. Going-forward only: a cutoff (app_settings
email_activity_since, set on first run) means email dated before the feature was
enabled is never summarized, so the historical backfill makes no noise. Sovereign:
summaries run entirely on the local model (no redaction needed). Gmail sync interval
tightened 180 -> 15 min so outgoing email surfaces quickly.

Backend: migration 0002 (email_activity_proposals); propose_email_activity_notes()
runs via a new scheduler post_sync hook; list/decide functions + routes
GET /api/activity/proposals, POST .../{id}/approve|dismiss. Grid append stamps the
approving user (fundraising_state.updated_by has a FK to users). Test
test_email_activity.py (propose cutoff/idempotency, approve appends + edited note,
dismiss, already-decided guard) under FK enforcement.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 15:55:26 -05:00

23 lines
1.2 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { VersionInfo } from '@start9labs/start-sdk'
// Email-activity agent (propose -> review -> approve). When a sent/received email is
// matched to an investor, a local-model agent drafts a one-line dated note and queues
// it for review on the Email Capture page; a partner edits if needed and Approves
// (appends to that investor's grid notes) or Dismisses. Going-forward only (never
// summarizes email older than when this was switched on), so the historical backfill
// makes no noise. Sovereign: the summary runs entirely on the local model. Gmail sync
// interval tightened to ~15 min so outgoing email surfaces quickly. Migration 0002
// (email_activity_proposals).
export const v_0_1_0_64 = VersionInfo.of({
version: '0.1.0:64',
releaseNotes: {
en_US: [
'New email-activity agent: when an email is matched to an investor, it drafts a short',
'dated note (on your local model) and queues it on the Email Capture page for you to',
'edit, approve into that investors grid notes, or dismiss. Going-forward only, so',
'the historical backfill stays quiet. Gmail now syncs about every 15 minutes.',
].join(' '),
},
migrations: { up: async () => {}, down: async () => {} },
})