Commit Graph

279 Commits

Author SHA1 Message Date
saravanakumardb1
a9361b44bb fix(web): add feature flag gate to webhooks page for consistency with inbox/planner 2026-04-19 00:54:59 -07:00
saravanakumardb1
38a15c0595 refactor(web): extract shared apiFetch helper, remove secret from webhook client type 2026-04-19 00:54:53 -07:00
saravanakumardb1
fe2ab6010e fix(backend): remove stale TODO-008 comment, add telemetry to suggestions route 2026-04-19 00:53:05 -07:00
saravanakumardb1
fd4269949f fix(planner): remove unused import, fix urgency/cascade type casts, fix overflow invalid dates 2026-04-19 00:52:26 -07:00
saravanakumardb1
333f0e5316 feat(web): Phase D.3 tempo mode engine + 11 tests 2026-04-18 18:13:45 -07:00
saravanakumardb1
3cda171b68 feat(backend): Phase D.1 smart routine suggestions engine + routes + 6 tests 2026-04-18 18:12:47 -07:00
saravanakumardb1
2e0ddcfe43 feat(web): Phase C.4 webhook management UI + client 2026-04-18 18:10:58 -07:00
saravanakumardb1
573483c20e feat(backend): Phase C.3 Zapier-compatible polling endpoint + event-types discovery 2026-04-18 18:09:56 -07:00
saravanakumardb1
79ac0bb1d6 feat(backend): Phase C.1-C.2 wire domain events from timer + routine repositories to webhook dispatch 2026-04-18 18:09:04 -07:00
saravanakumardb1
9973c548fc feat(web): Phase B.4 Day Planner web UI + planner API client 2026-04-18 18:07:12 -07:00
saravanakumardb1
23c584f4a8 feat(web): Phase B.3 Agent Inbox web UI + backend API client 2026-04-18 18:05:50 -07:00
saravanakumardb1
e021e96c80 feat(backend): Phase B.1 day planner engine + routes + 11 tests 2026-04-18 18:03:55 -07:00
saravanakumardb1
0240d3c807 feat(backend): TODO-008 wire telemetry trackEvent() into agent-actions + context-message routes 2026-04-18 18:01:19 -07:00
saravanakumardb1
698fbc19cc feat(web): TODO-003 accessibility focus trap + ARIA roles in modals 2026-04-18 18:00:00 -07:00
saravanakumardb1
0242ca85ff feat(web): TODO-002 feedback form in settings page via @bytelyst/feedback-client 2026-04-18 17:58:06 -07:00
saravanakumardb1
8bddbec43c feat(web): TODO-001 kill switch maintenance banner + disable timer creation 2026-04-18 17:56:37 -07:00
saravanakumardb1
8ca9e27532 test(ai-context): TODO-009 unit tests for LLM context message generators
Adds 18 new tests covering:

Backend (13 tests in ai-context.test.ts):
- keyword fallback — meeting, doctor, flight, case-insensitive
- generic fallback — no match, minute/hour formatting
- LLM path — flag-gated (off = no fetch), extraction-service success,
  Ollama cascade when extraction returns null, error → keyword fallback,
  short Ollama response rejected, non-200 fallthrough
- prompt construction — includes category, urgency, timeOfDay,
  recentTimerLabels

Web (5 new tests in context-messages.test.ts):
- LLM success path
- keyword fallback when backend returns 500
- keyword fallback when backend throws
- generic fallback when backend fails and no keyword matches
- payload shape — POST /api/context-message with all params

Test counts: backend 240 (was ~227), web 399 (was ~394), all green.
2026-04-17 12:40:10 -07:00
saravanakumardb1
6064d7d227 docs(agents): add .npmrc canonical template rule to AGENTS.md
Never edit .npmrc directly in product repos — managed by
canonical template in learning_ai_common_plat/scripts/npmrc.template.
Use sync-npmrc.sh to propagate. Prevents gitea.bytelyst.com hardcoding.
2026-04-14 11:57:23 -07:00
saravanakumardb1
2bf172935b fix(web): align billing-client SubscriptionDoc type with platform schema 2026-04-13 22:57:32 -07:00
saravanakumardb1
a0c5f14bbf docs: mark TODO-004 and TODO-005 as completed in agentic roadmap 2026-04-13 17:00:55 -07:00
saravanakumardb1
229ce4f00f feat(backend): wire Ollama LLM for context messages (TODO-005)
Dual-path LLM enrichment for AI context prep messages:
1. extraction-service (if EXTRACTION_SERVICE_URL set)
2. Ollama direct (if OLLAMA_URL set) — non-streaming /api/generate
3. Keyword rules fallback
4. Generic fallback

New env vars: OLLAMA_URL, OLLAMA_MODEL (default: gemma3:4b)
Both LLM paths use 5s timeout and null-return-on-error pattern.
Feature-gated behind ai_context_messages.enabled flag.
2026-04-13 17:00:24 -07:00
saravanakumardb1
0e7c1aeb15 feat(backend): state-change event detection + clone template on start
- PUT /timers/🆔 detect state→fired and state→completed transitions,
  emit timer.fired / timer.completed domain events
- PUT /routines/🆔 detect status→completed transition,
  emit routine.completed domain event
- POST /routines/:id/start (TODO-004): when isTemplate=true, clone the
  template into a new RoutineDoc instead of mutating in-place. Original
  template stays reusable. Non-templates still update in place.

All 6 ChronoMind event types are now fully wired end-to-end.
2026-04-13 17:00:05 -07:00
saravanakumardb1
0129f5623c fix(backend): emit routine.started and household.created domain events
Event bus defines 6 event types but only timer.created was wired.
Wire the two straightforward create/start events:
- routine.started: emitted from POST /routines/:id/start
- household.created: emitted from POST /households
2026-04-13 15:52:49 -07:00
saravanakumardb1
9b398bbd68 fix(backend): convert ecosystem-phase2 test to Vitest, fix .ts extension + hardcoded productId
- ecosystem-phase2.test.ts used node:test — Vitest discovered it but ran 0 tests
- Converted to Vitest describe/it/expect — now 2 tests actually execute
- Added coverage for missing plan-created-event graceful fallback
- Fixed .ts import extension to .js (ESM convention, tsc build compat)
- Replaced 6 hardcoded 'chronomind' literals with PRODUCT_ID import
2026-04-13 15:51:58 -07:00
saravanakumardb1
fcd2ee3ad2 fix(docker): standardize pnpm filter glob to match ecosystem convention 2026-04-13 15:50:43 -07:00
saravanakumardb1
24b1dd05fc docs: mark TODO-006, TODO-010, TODO-011 as completed in agentic roadmap 2026-04-13 14:59:47 -07:00
saravanakumardb1
9ece4306a2 feat(docker): add docker-prep.sh for tarball-based Docker builds 2026-04-13 14:59:21 -07:00
saravanakumardb1
9e63418837 fix(cleanup): TODO-011 — wire error boundary to telemetry trackEvent 2026-04-13 14:58:59 -07:00
saravanakumardb1
5dafcc2118 fix(cleanup): TODO-006 — centralize backend URL via getBackendBaseURL() from product-config 2026-04-13 14:58:44 -07:00
saravanakumardb1
d74c80a711 fix(cleanup): TODO-010 — replace hardcoded PRODUCT_ID with import from product-config 2026-04-13 14:56:57 -07:00
saravanakumardb1
8152d508d1 fix(docker): .docker-deps COPY + optional secret + .npmrc.docker simplification
- Dockerfiles: COPY .docker-deps/ for tarball resolution, make secret read optional
- .npmrc.docker: remove scoped registry (tarballs handle all @bytelyst/* resolution)
2026-04-13 14:05:54 -07:00
saravanakumardb1
c1972ef0d0 feat(backend): emit timer.created event from POST /timers route
Wire getEventBus().emit() into the timer creation handler so webhook
subscribers and future listeners receive typed domain events.
2026-04-13 11:50:39 -07:00
saravanakumardb1
82428d7bf9 fix(backend): fix sync throw isolation in event bus + add 6 tests
Promise.allSettled only catches rejected promises, not synchronous throws.
Wrap handler calls in Promise.resolve().then() to isolate sync errors.
Add 6 unit tests covering delivery, unsubscribe, error isolation,
singleton, reset, and removeAll.
2026-04-13 11:42:14 -07:00
saravanakumardb1
fbac905e9c feat(backend): add domain event bus + webhook dispatch
Add typed event bus (6 events: timer.created/fired/completed,
routine.started/completed, household.created) with Promise.allSettled
isolation. Wire webhook subscriber bridge using @bytelyst/webhook-dispatch
for HMAC-signed delivery with retry.

All 219 tests pass.
2026-04-13 11:28:38 -07:00
saravanakumardb1
427080a2a3 chore: standardize .npmrc + workspace for corp network resilience
- .npmrc: use ${GITEA_NPM_HOST:-localhost}:3300 instead of hardcoded
  gitea.bytelyst.com (corp TLS proxy breaks external URL).
- pnpm-workspace.yaml: add ../learning_ai_common_plat/packages/* so
  @bytelyst/* resolve locally without registry access.
- .npmrc: enable link-workspace-packages + prefer-workspace-packages.
2026-04-13 10:34:50 -07:00
saravanakumardb1
ed3bc15a4a chore(deps): use wildcard (*) for @bytelyst/* internal packages
All @bytelyst/* packages are internal to the ByteLyst ecosystem and
published to the private Gitea registry. Using "*" eliminates version
bump noise — always resolves to latest available.
2026-04-13 01:05:40 -07:00
root
c8bab1d617 chore: update registry URL to gitea.bytelyst.com + lockfile refresh
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 06:08:43 +00:00
saravanakumardb1
e61858db15 feat(ios): add TestFlight release script, README, BUILD_STATE + bundle ID migration
- Add release-testflight.sh — one-command archive + upload to TestFlight
- Add README_TESTFLIGHT.md — setup guide for home laptop
- Add BUILD_STATE.md — build tracking
- Migrate bundle IDs: com.chronomind.app → com.saravana.chronomind (original was taken)
- Remove App Groups entitlement temporarily (not registered in dev portal yet)
- Fix duplicate theme enums in generated file
2026-04-04 23:20:54 -07:00
saravanakumardb1
1ea3965492 fix(ios): remove duplicate theme enums + add ExportOptions.plist for TestFlight
- Remove duplicate CMColors, CMSpacing, CMRadius, Color.init(hex:) from generated theme file
- Keep canonical versions in ChronoMindTheme.swift
- Add ExportOptions.plist for app-store-connect export
2026-04-04 23:20:54 -07:00
fdd3743f28 feat(phase2): import chronomind routines from plans 2026-04-03 19:30:11 -07:00
saravanakumardb1
9897d2cd09 docs(todos): standardize all TODOs with running numbers and delegatable instructions
Replace ad-hoc AGENTIC-N comments with standardized TODO-NNN format across
the entire codebase. Each TODO has:
  - Running number (TODO-001 through TODO-011)
  - Priority level (high/medium/low)
  - Phase reference (0, A.1, A.4, B, cleanup)
  - Clear step-by-step instructions an AI agent can follow

TODO index:
  TODO-001: Kill switch maintenance banner (providers.tsx)
  TODO-002: Feedback button in settings page
  TODO-003: Accessibility focus trap for modals
  TODO-004: Clone routine template instead of mutating in-place
  TODO-005: Wire real LLM enrichment for context messages
  TODO-006: Centralize backend URL configuration
  TODO-007: MCP tool integration tests (common-plat)
  TODO-008: Wire trackEvent() calls into routes + components
  TODO-009: Unit tests for AI context generation
  TODO-010: Import PRODUCT_ID from product-config (5 route files)
  TODO-011: Wire error boundary to telemetry

Added consolidated TODO Index table at top of AGENTIC_AI_ROADMAP.md
for agent scanning. 219 backend tests pass, no code changes.
2026-04-01 01:05:25 -07:00
saravanakumardb1
f94c2d8424 fix(web): add NEXT_PUBLIC_CHRONOMIND_BACKEND_URL to .env.example
The fetchEnrichedMessage() function in context-messages.ts references this
env var but it was missing from .env.example, making it invisible to new
developers setting up the project.
2026-04-01 00:00:11 -07:00
saravanakumardb1
ea5adcc6ca fix(backend): harden Phase A endpoints — Zod validation, feature flag gate, state filtering
3 bugs fixed in recent Phase A code:

1. POST /api/context-message: Add Zod schema validation, feature flag gate
   (ai_context_messages.enabled), and safe body parsing. Previously had no
   validation and unsafe 'as' cast that could null-ptr on missing body.

2. GET /api/timers/availability: Filter out dismissed/completed/fired timers.
   Previously included inactive timers in occupied intervals, causing the
   endpoint to report less free time than actually available.

3. agent-actions/routes.ts: Import PRODUCT_ID from product-config.ts instead
   of hardcoding 'chronomind' string. Ensures consistency if product identity
   changes.

Also: Add EXTRACTION_SERVICE_URL + PLATFORM_SERVICE_URL to .env.example.

All 219 backend tests pass. No breaking changes.
2026-03-31 23:56:35 -07:00
saravanakumardb1
c0e576e15c docs(roadmap): update Phase A checkboxes with commit links
Mark Phase A.3 (MCP tools) and A.4 (AI context messages) as complete.
Update exit criteria with test counts and commit references.
2026-03-31 23:47:10 -07:00
saravanakumardb1
c80c1e4462 feat(ai-context): Phase A.4 — context-aware AI messages with LLM fallback
Add AI-enriched context message generation:

- backend/src/lib/ai-context.ts: LLM-powered context generator with keyword fallback
  - Calls extraction-service timer-context task when EXTRACTION_SERVICE_URL is set
  - Falls back to keyword rules, then generic message
  - Gated behind isFeatureEnabled('ai_context_messages.enabled')
- backend/src/lib/config.ts: Add EXTRACTION_SERVICE_URL env var
- backend/src/server.ts: POST /api/context-message route
- web/src/lib/context-messages.ts: fetchEnrichedMessage() with graceful degradation
- Updated AGENTIC_AI_ROADMAP.md checkboxes for Phase A.1 + A.2

All 219 backend tests + 394 web tests pass. No breaking changes.
2026-03-31 23:46:00 -07:00
saravanakumardb1
29a48025eb feat(agent-actions): Phase A.2 — agent action audit trail module + tests
Add agent-actions module for AI/MCP operation audit trail:

- types.ts: 3 enums (ACTOR_TYPES, ACTION_STATES, ACTION_TYPES), AgentActionDoc,
  CreateAgentActionSchema, AgentActionQuerySchema, BatchApproveSchema
- repository.ts: CRUD + batchApproveByActor using @bytelyst/datastore
- routes.ts: 5 endpoints (list, create, approve, reject, batch-approve)
  All gated behind isFeatureEnabled('agent_inbox.enabled')
- Registered cm_agent_actions container in cosmos-init.ts
- Registered agentActionRoutes in server.ts

Tests (37 new, 219 total):
- 22 agent-actions schema tests (constants, create, query, batch-approve)
- 15 timer schema tests (RescheduleTimerSchema, AvailabilityQuerySchema)

All 219 backend tests pass. No breaking changes.
2026-03-31 23:38:03 -07:00
saravanakumardb1
686f5fb33e feat(mcp): Phase A.1 — reschedule, availability, and start-routine endpoints
Add 3 new backend REST endpoints for MCP tool support:

- POST /timers/:id/reschedule — shift timer by delta seconds or set new target time
- GET /timers/availability — find free time slots in a window (interval merge algorithm)
- POST /routines/:id/start — transition routine from ready/template → active

All endpoints gated behind isFeatureEnabled('mcp.enabled') flag (default false).
Zod schemas: RescheduleTimerSchema (XOR validation), AvailabilityQuerySchema, FreeSlot type.

All 182 backend tests pass. No breaking changes to existing APIs.
2026-03-31 23:31:04 -07:00
saravanakumardb1
f3e14e28dd feat(ecosystem): Phase 0 — kill-switch, feedback, accessibility, feature flags, telemetry events
Phase 0 of the Agentic AI Roadmap: ecosystem gap fixes.

- Add @bytelyst/kill-switch-client integration (web/src/lib/kill-switch.ts)
- Wire kill switch check into providers.tsx on app init
- Add @bytelyst/feedback-client integration (web/src/lib/feedback.ts)
- Add @bytelyst/accessibility to web dependencies
- Add 7 agentic feature flags to backend (all default false)
- Define 16 telemetry event constants (backend + web)
- Add AGENTIC_AI_ROADMAP.md with full Phase 0-E plan + audit findings

All 182 backend tests pass. All 394 web tests pass.
No breaking changes to existing functionality.
2026-03-31 23:26:37 -07:00
saravanakumardb1
8ca4244855 ci: fix YAML formatting — normalize blank lines 2026-03-29 11:04:08 -07:00
saravanakumardb1
33b4faa283 ci: update CI/CD configuration 2026-03-29 10:50:55 -07:00