Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
31e0602
feat: add database-backed owner bootstrap
ansidian Jul 17, 2026
94ff909
feat: add passkey modes and recovery codes
ansidian Jul 17, 2026
0826048
feat: add canonical URL management
ansidian Jul 17, 2026
b3ebd91
feat: add typed instance credential registry
ansidian Jul 18, 2026
dd9101a
feat: resolve AI credentials at runtime
ansidian Jul 18, 2026
5e5d4fb
feat: resolve location credentials at runtime
ansidian Jul 18, 2026
62a5135
feat: configure Google OAuth in app
ansidian Jul 18, 2026
adec07b
feat: add optional Gmail Pub/Sub setup
ansidian Jul 18, 2026
933b52c
feat: add Todoist OAuth setup
ansidian Jul 18, 2026
aa515d7
feat: add capability status backend
ansidian Jul 18, 2026
55f9596
feat: add core credential settings
ansidian Jul 18, 2026
957a977
feat: add settings capability status
ansidian Jul 18, 2026
52a080a
feat: add guided onboarding checklist
ansidian Jul 18, 2026
9beb7e6
feat: add Render deployment path
ansidian Jul 18, 2026
091ded1
fix: resolve frontend lint errors
ansidian Jul 18, 2026
6ae49b1
fix: improve onboarding quality-of-life flow
ansidian Jul 18, 2026
de09539
chore: establish Vitest governance and prune duplicate coverage
ansidian Jul 19, 2026
4dc3e67
chore: consolidate test ownership by model and domain
ansidian Jul 19, 2026
f11896f
chore: distill component integration coverage
ansidian Jul 19, 2026
a636d6a
chore: distill service boundaries and remove test seams
ansidian Jul 19, 2026
f61e693
chore: harden route coverage and Vitest runtime guardrails
ansidian Jul 19, 2026
a1dbe1b
fix: make calendar search highlight authoritative
ansidian Jul 19, 2026
e5444e7
fix: align email lookback ceiling
ansidian Jul 19, 2026
945226a
chore: enforce module and export reachability
ansidian Jul 19, 2026
0ec5ddb
chore: speed up calendar vitest suites
ansidian Jul 19, 2026
75a805e
feat: add settings connection state model
ansidian Jul 19, 2026
ae32c4f
feat: reorganize settings connections
ansidian Jul 19, 2026
f7430ed
feat: gate settings by connection health
ansidian Jul 19, 2026
cfbfecd
feat: harden connection credential workflows
ansidian Jul 19, 2026
23058be
feat: converge settings onboarding links
ansidian Jul 19, 2026
42554a8
feat: harden owner security and Actual archive handling
ansidian Jul 20, 2026
cf1e30b
fix: improve onboarding quality of life
ansidian Jul 20, 2026
fc31a34
fix: harden encrypted credential migration
ansidian Jul 20, 2026
14f50f6
fix: bind credential ciphertext to record context
ansidian Jul 20, 2026
44c959d
fix: harden gmail callback token verification
ansidian Jul 20, 2026
b5ce91e
fix: replace actual archive zip dependency
ansidian Jul 20, 2026
97be8e2
feat: add transactional root key rotation
ansidian Jul 20, 2026
85e908d
fix: expire and discard pending credentials
ansidian Jul 20, 2026
d5533b4
chore: document credential security controls
ansidian Jul 20, 2026
35c45e8
chore: satisfy credential security guardrails
ansidian Jul 20, 2026
4ed8808
chore: remove root key rotation runbook
ansidian Jul 20, 2026
757dc99
chore: remove deployment operations runbook
ansidian Jul 20, 2026
7f48980
fix: correct onboarding entry and settings navigation
ansidian Jul 21, 2026
c676329
chore: fix agent harness checks
ansidian Jul 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
66 changes: 32 additions & 34 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,53 +1,35 @@
# Auth (run `node server/hash-password.js <your-password>` to generate)
EA_PASSWORD_HASH=$2b$12$...
EA_USER_ID=your-user-id

# WebAuthn passkeys. Production requires all three and must use your HTTPS app origin.
# Local dev defaults to Setpoint / localhost / http://localhost:5173 when unset.
EA_WEBAUTHN_RP_NAME=Setpoint
EA_WEBAUTHN_RP_ID=your-app-domain.com
EA_WEBAUTHN_ORIGIN=https://your-app-domain.com

# Playwright E2E auth (local only)
PLAYWRIGHT_EA_PASSWORD=

# EA Turso Database
# Required production bootstrap. Render generates EA_ENCRYPTION_KEY; other hosts
# must supply a 256-bit value encoded as 64 hex characters or standard base64.
TURSO_DATABASE_URL=libsql://your-ea-db.turso.io
TURSO_AUTH_TOKEN=

# Encryption
EA_ENCRYPTION_KEY=
# Required only while claiming a fresh instance. Generate at least 32 random
# characters and enter the same value on the first-run setup screen.
EA_SETUP_TOKEN=

# Anthropic (email triage and bill extraction)
# Optional advanced host-managed provider sources. Normal setup stores these
# write-only in Setpoint Settings; stored values take precedence over env values.
# AI providers
ANTHROPIC_API_KEY=

# OpenAI (optional email AI, bill extraction, and inbox-search embeddings)
OPENAI_API_KEY=

# Opt-in only: run local dev against Turso/native vectors for inbox AI search
# AI_SEARCH_VECTOR_ADAPTER=turso
# EA_DEV_DB_ADAPTER=turso
# EA_EMAIL_SEARCH_EMBEDDINGS_DISABLED=1

# Dev: mock search analysis instead of calling Haiku
# DEV_MOCK_SEARCH=1

# Google OAuth (Gmail + Calendar)
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_REDIRECT_URI=https://your-app.onrender.com/api/ea/accounts/gmail/callback

# Gmail Pub/Sub push ingestion
# Calendar place enrichment and weather
GOOGLE_PLACES_API_KEY=
PIRATE_WEATHER_API_KEY=

# Optional advanced Gmail real-time delivery
GMAIL_PUBSUB_TOPIC=projects/your-project/topics/gmail-push
GMAIL_PUBSUB_PUSH_TOKEN=

# Todoist OAuth refresh + webhook verification (Todoist Developer app credentials).
# Configure the public webhook callback URL in Todoist's app console:
# https://your-app.onrender.com/api/todoist/webhook
# Optional advanced Todoist OAuth + webhooks
TODOIST_CLIENT_ID=
TODOIST_CLIENT_SECRET=

# Startup workers (optional). Production defaults delay workers 60-120s after
# Optional operational tuning. Production defaults delay workers 60-120s after
# listen, then add 2m before the passive indexer and 10m before backfill.
EA_STARTUP_WORKER_DELAY_MS=
EA_STARTUP_WORKER_JITTER_MS=
Expand All @@ -56,7 +38,23 @@ EA_STARTUP_BACKFILL_OFFSET_MS=
EA_STARTUP_TODOIST_SYNC_OFFSET_MS=
EA_EMAIL_BACKFILL_QUEUE_ON_STARTUP=

# Actual Budget CLI (used by `npm run actual`; values mirror those stored encrypted in ea_settings)
# Optional local-development switches
# AI_SEARCH_VECTOR_ADAPTER=turso
# EA_DEV_DB_ADAPTER=turso
# EA_EMAIL_SEARCH_EMBEDDINGS_DISABLED=1
# DEV_MOCK_SEARCH=1
# PLAYWRIGHT_EA_PASSWORD=

# Optional legacy compatibility for existing installations only. Fresh instances
# create owner auth and confirm the canonical URL in the browser.
# EA_PASSWORD_HASH=$2b$12$...
# EA_USER_ID=your-user-id
# EA_WEBAUTHN_RP_NAME=Setpoint
# EA_WEBAUTHN_RP_ID=your-app-domain.com
# EA_WEBAUTHN_ORIGIN=https://your-app-domain.com
# GOOGLE_REDIRECT_URI=https://your-app.onrender.com/api/ea/accounts/gmail/callback

# Actual Budget CLI only (`npm run actual`); runtime values live encrypted in Settings.
ACTUAL_SERVER_URL=https://your-actual-server
ACTUAL_PASSWORD=
ACTUAL_SYNC_ID=
7 changes: 5 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,11 @@ jobs:
- name: Lint
run: npm run lint

- name: Test
run: npm test
- name: Test fast suite
run: npm run test:fast

- name: Test slow integrations
run: npm run test:slow

- name: Check agent harness
run: npm run check:harness
Expand Down
8 changes: 8 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,14 @@ Prefer a layered Vitest structure. New behavior should usually start at the lowe

When a broad test gets harder to maintain, extract the underlying rule into a named model/helper module before adding more cases. Good recent examples include `calendarModalInteractionModel`, `inboxCommandModel`, `dashboardShellModel`, `calendarRangeModel`, `currentDashboardModel`, `dashboardTaskProjection`, `inboxWorkItems`, and `snapshot-lifecycle`.

### Test Suite Governance

- Put new behavior at the lowest test layer that can express it; do not repeat shared policy as desktop, mobile, and page-level branch matrices.
- Exact style or source-literal assertions require an adjacent explanation of the public compatibility contract they protect.
- Every Vitest file must belong to exactly one project in `test-environment-partitions.mts`; pure tests use Node and DOM environments are explicit exceptions.
- Test files above 600 lines require decomposition or a documented exception in `test-size-baseline.json`; grandfathered files may not grow past their allowance.
- `npm run test:slow` remains required in CI and `npm test` remains the complete non-Playwright suite.

## Mechanical Checks

- `npm run lint` - ESLint.
Expand Down
Loading
Loading