- 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.
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.