A transient error on one calendar (e.g. shared calendar
with permission issues) no longer discards results from
all other calendars.
Co-authored-by: Ona <no-reply@ona.com>
Add @aris/source-apple-calendar for fetching iCloud
calendar events via CalDAV using tsdav and ical.js.
- CalendarSource implements FeedSource with fetchItems
and fetchContext for downstream context
- CalendarCredentialProvider interface for token injection
- CalendarDAVClient interface for testability
- iCal parser extracts full event data including
attendees, alarms, organizer, and recurrence
- Priority based on event proximity to current time
Co-authored-by: Ona <no-reply@ona.com>
Manage per-user WeatherSource instances via FeedSourceProvider,
following the same pattern as LocationService. Wire into
FeedEngineService so weather data is included in the feed.
Co-authored-by: Ona <no-reply@ona.com>
Manages per-user TflSource instances with individual line
configuration. Implements FeedSourceProvider so it can be
wired into FeedEngineService.
Adds TflSource.setLines() so line config can be mutated
in place, keeping engine references valid.
Also exports ITflApi from @aris/source-tfl for testability.
Co-authored-by: Ona <no-reply@ona.com>
Manages FeedEngine instances per user with auto-registration of
sources from FeedSourceProvider implementations.
- Add FeedSourceProvider interface
- Add FeedEngineService with providers array injection
- Update LocationService to implement FeedSourceProvider
Co-authored-by: Ona <no-reply@ona.com>
- Add @trpc/server, @hono/trpc-server, zod dependencies
- Create tRPC context with BetterAuth session
- Create router with publicProcedure and protectedProcedure
- Mount tRPC at /trpc/* via Hono adapter
Co-authored-by: Ona <no-reply@ona.com>
- Add LocationService to manage LocationSource per user
- Add UserNotFoundError for generic user-related errors
- updateUserLocation throws if source not initialized
Co-authored-by: Ona <no-reply@ona.com>
- Add apps/aris-backend package with Hono server
- Add /health endpoint
- Add backend-spec.md with design decisions
Co-authored-by: Ona <no-reply@ona.com>
Migrates TFL package from old DataSource interface to new FeedSource
interface for use with FeedEngine.
Changes:
- Rename package from @aris/data-source-tfl to @aris/source-tfl
- Replace TflDataSource class with TflSource implementing FeedSource
- Add dependency on @aris/source-location for LocationKey
- Use normalized priority values (0-1) instead of arbitrary numbers
- Update tests for FeedSource interface
- Update README.md with new package name
Co-authored-by: Ona <no-reply@ona.com>
Introduces FeedEngine that consumes FeedSource instances and manages
the dependency graph for context flow and item collection.
- Validates dependency graph (missing deps, circular references)
- Topologically sorts sources for execution order
- Runs fetchContext() in dependency order, accumulating context
- Runs fetchItems() on all sources with final context
- Supports reactive updates via onContextUpdate/onItemsUpdate
- Graceful error handling (continues after source failures)
Marks DataSource, ContextProvider, ContextBridge, Reconciler, and
FeedController as deprecated in favor of FeedSource + FeedEngine.
Co-authored-by: Ona <no-reply@ona.com>
Implements FeedSource for WeatherKit API. Depends on location source,
provides weather context for downstream sources, and produces weather
feed items.
Co-authored-by: Ona <no-reply@ona.com>
Implements FeedSource interface. Accepts external location pushes,
provides context to downstream sources, does not produce feed items.
Supports configurable history size.
Co-authored-by: Ona <no-reply@ona.com>
Unifies DataSource and ContextProvider into a single interface that
forms a dependency graph. Sources declare dependencies on other sources
and can provide context, feed items, or both.
Deprecates DataSource, ContextProvider, and ContextBridge.
Co-authored-by: Ona <no-reply@ona.com>
- Add WeatherKitClient interface and DefaultWeatherKitClient class
- WeatherKitDataSource accepts either client or credentials
- Simplify tests by injecting mock client directly
- Update fixture generation script to use new client class
Co-authored-by: Ona <no-reply@ona.com>