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>
- Change sed -i '' to sed -i for Linux compatibility
- Fix BSD sed syntax that was causing docker-prep.sh to fail
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
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.
- 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.
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
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.
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.
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.
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.
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.