Commit Graph

61 Commits

Author SHA1 Message Date
root
85c6cef033 fix(docker): use shared docker-prep.sh and update Dockerfile for tarball approach
Some checks are pending
CI — ChronoMind / Backend — typecheck + test (push) Waiting to run
CI — ChronoMind / Web — typecheck + lint + test + build (push) Waiting to run
CI — ChronoMind / E2E — Playwright (push) Waiting to run
Generated with [Devin](https://cli.devin.ai/docs)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-10 01:50:55 +00:00
root
d840168d5c revert(docker): revert to docker-prep.sh approach due to workspace complexity
The base image approach is too complex for the current pnpm workspace structure.
Products cannot easily use the base image's workspace because pnpm expects all
workspace packages to be present during install. Reverting to the proven
docker-prep.sh tarball approach for now.

Generated with [Devin](https://cli.devin.ai/docs)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-09 23:35:41 +00:00
root
5253aaf174 fix(docker): install all dependencies in builder stage for build tools
The base image only includes production dependencies, so we need to install
all dependencies (including devDependencies) in the builder stage to have
TypeScript and Next.js available for building.

Generated with [Devin](https://cli.devin.ai/docs)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-09 23:23:37 +00:00
root
cb51cbe671 refactor(docker): use shared base images for @bytelyst/* packages
Update Dockerfiles to use bytelyst-common-base-backend and bytelyst-common-base-web
images instead of installing @bytelyst/* packages via tarballs.

Benefits:
- Smaller final images (~50MB vs ~250MB)
- Faster builds (base image cached)
- Consistent package versions across products
- No need for docker-prep.sh tarball packing

Generated with [Devin](https://cli.devin.ai/docs)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-09 23:22:59 +00: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
3cda171b68 feat(backend): Phase D.1 smart routine suggestions engine + routes + 6 tests 2026-04-18 18:12:47 -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
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
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
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
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
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
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
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
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
d6cddb9641 chore(backend): add FIELD_ENCRYPT env vars to .env.example 2026-03-27 23:01:26 -07:00
saravanakumardb1
38dbed80ef chore(backend): add eslint config and lint script 2026-03-26 22:59:50 -07:00
saravanakumardb1
5c67bed5a6 fix(docker): remove hardcoded corporate proxy and jfrog registry from Dockerfiles 2026-03-24 11:12:38 -07:00
saravanakumardb1
bfbca2b820 feat(docker): migrate to Gitea registry-backed Docker pattern
- Convert all @bytelyst/* file: refs to semver ^0.1.0
- Remove sibling common-plat workspace references
- Add .npmrc and .npmrc.docker for local Gitea registry
- Rewrite Dockerfiles: pnpm + BuildKit secret mount
- Verified: pnpm install + backend typecheck pass
2026-03-23 20:57:37 -07:00
saravanakumardb1
582936ad65 feat(repo): migrate chronomind workspace to pnpm
- Add pnpm-workspace.yaml (backend + web + common-plat packages)
- Add root package.json with workspace scripts and pnpm config
- Add packageManager: pnpm@10.6.5 to backend/web manifests
- Remove package-lock.json files, generate pnpm-lock.yaml
- Add root .gitignore (was missing)
- Update CI to use pnpm workspace commands
- Add transpilePackages + webpack symlinks to next.config.ts
- Update docker-prep.sh for backend + web consumers
- Rewrite backend/web Dockerfiles to .docker-deps consumer pattern
- Add .dockerignore

Verified: typecheck + 576 tests (182 backend + 394 web) + builds pass
Docker: backend + web smoke builds pass
2026-03-22 19:11:01 -07:00
saravanakumardb1
cb684fa086 chore(docker): add backend + web Dockerfiles, add standalone output to next.config.ts 2026-03-22 00:20:20 -07:00
saravanakumardb1
f6c85ede9e fix: align Fastify to 5.7.4 + add web product-config.ts 2026-03-21 20:31:26 -07:00
saravanakumardb1
8c90d863a8 feat(backend): admin-panel encryption toggle via initEncryption()
- FIELD_ENCRYPT_ENABLED env var (default: true, fallback only)
- initEncryption(productId) polls encryption_enabled from platform-service
- Admin panel toggle takes precedence, 3s timeout graceful fallback
2026-03-21 15:24:58 -07:00
saravanakumardb1
253a9db0ea feat(backend): encrypt sensitive fields across all modules
- timers: description
- routines: description, steps[].notes
- shared-timers: description
- webhooks: secret, description
- Add @bytelyst/field-encrypt dep + chronomind-mek config
- field-encrypt singleton (getEncryptor lazy pattern)
- Encrypt on create/update/batchUpsert, decrypt on read/list/since
- Backward-compatible via isEncryptedField guard
- 182/182 tests passing, typecheck clean
2026-03-21 12:11:39 -07:00
saravanakumardb1
f7356706cd feat(backend): add GET /api/bootstrap route + test
- Returns productId, displayName, backendPort for client bootstrapping
- Integration test validates response shape and types
2026-03-20 21:15:40 -07:00
saravanakumardb1
fd4d35b308 feat(backend): add GET /health test to diagnostics suite
- Validates standard health response shape: status, service, version, timestamp
- Ensures consistent health endpoint contract across ecosystem
2026-03-20 21:06:56 -07:00
saravanakumardb1
62f94be845 feat(backend): add GET /api/diagnostics/config route + test
- Returns sanitized config: productId, serviceName, port, nodeEnv, dbProvider, telemetryEnabled, featureFlagsEnabled
- Integration test validates response shape
2026-03-20 19:36:04 -07:00
saravanakumardb1
95c2f9426a test(backend): add diagnostics route integration tests
- 3 tests: GET /diagnostics/flags, GET /diagnostics/telemetry, POST /diagnostics/telemetry/flush
- All tests pass
2026-03-20 19:28:09 -07:00
saravanakumardb1
d1f2587cc3 feat(backend): add /diagnostics/flags + /diagnostics/telemetry routes
- GET /api/diagnostics/flags — returns all feature flags
- GET /api/diagnostics/telemetry — returns buffered telemetry events
- POST /api/diagnostics/telemetry/flush — flush telemetry buffer
- No auth required (diagnostics endpoints)
2026-03-20 19:12:27 -07:00
saravanakumardb1
bc735dfdb9 feat(backend): add @bytelyst/backend-flags + backend-telemetry, fix config defaults
- Add @bytelyst/backend-flags and @bytelyst/backend-telemetry packages
- Create feature-flags.ts and telemetry.ts wrappers using shared packages
- Add TELEMETRY_ENABLED and FEATURE_FLAGS_ENABLED config fields
- Default DB_PROVIDER to memory (fixes test failures without env vars)
- Add JWT_SECRET dev default and PLATFORM_SERVICE_URL
- 176/176 tests pass
2026-03-20 17:31:01 -07:00
saravanakumardb1
6acc97bf8a fix(backend): use config.DB_PROVIDER instead of process.env.DB_PROVIDER in datastore.ts
- Reads validated DB_PROVIDER from Zod config instead of raw env
- Removes stale isTest fallback logic (now handled by config defaults)
2026-03-20 08:29:36 -07:00
saravanakumardb1
ea508b1fdc fix(backend): make COSMOS_ENDPOINT/KEY validation conditional on DB_PROVIDER
- Only require Cosmos credentials when DB_PROVIDER=cosmos
- Standardize to .refine() pattern matching all other repos
2026-03-20 08:26:07 -07:00
saravanakumardb1
0bda7dd9dc refactor(backend): migrate config.ts to @bytelyst/backend-config base schema
- Extends baseBackendConfigSchema with product-specific overrides
- DB_PROVIDER now declared in all repos (was missing in 3)
2026-03-20 07:56:29 -07:00
saravanakumardb1
a7b0ae9cdc refactor(backend): migrate auth.ts + request-context.ts to @bytelyst/fastify-auth
- auth.ts: 80→18 lines, delegates to createAuthMiddleware()
- request-context.ts: delegates to createRequestContext()
- Re-exports JwtPayload, AuthPayload from shared package
2026-03-20 07:45:58 -07:00
saravanakumardb1
30872465d3 refactor(backend): load product identity from shared/product.json 2026-03-20 07:23:31 -07:00
saravanakumardb1
b4a6c62e15 refactor(backend): remove errors.ts re-export, import @bytelyst/errors directly 2026-03-20 07:19:29 -07:00