mirror of
https://github.com/kennethnym/aris.git
synced 2026-03-20 09:01:19 +00:00
feat(core): add sourceId to FeedItem
Each FeedSource implementation now sets sourceId on items it produces, allowing consumers to trace items back to their originating source. Co-authored-by: Ona <no-reply@ona.com>
This commit is contained in:
@@ -17,6 +17,7 @@ import type { FeedItem } from "./feed"
|
||||
* const data = await fetchWeather(location)
|
||||
* return [{
|
||||
* id: `weather-${Date.now()}`,
|
||||
* sourceId: "aelis.weather",
|
||||
* type: this.type,
|
||||
* timestamp: context.time,
|
||||
* data: { temp: data.temperature },
|
||||
|
||||
@@ -99,6 +99,7 @@ function createWeatherSource(
|
||||
return [
|
||||
{
|
||||
id: `weather-${Date.now()}`,
|
||||
sourceId: "weather",
|
||||
type: "weather",
|
||||
timestamp: new Date(),
|
||||
data: {
|
||||
@@ -130,6 +131,7 @@ function createAlertSource(): FeedSource<AlertFeedItem> {
|
||||
return [
|
||||
{
|
||||
id: "alert-storm",
|
||||
sourceId: "alert",
|
||||
type: "alert",
|
||||
timestamp: new Date(),
|
||||
data: { message: "Storm warning!" },
|
||||
@@ -423,6 +425,7 @@ describe("FeedEngine", () => {
|
||||
return [
|
||||
{
|
||||
id: "item-1",
|
||||
sourceId: "working",
|
||||
type: "test",
|
||||
priority: 0.5,
|
||||
timestamp: new Date(),
|
||||
@@ -746,6 +749,7 @@ describe("FeedEngine", () => {
|
||||
return [
|
||||
{
|
||||
id: "item-1",
|
||||
sourceId: "reactive-items",
|
||||
type: "test",
|
||||
priority: 0.5,
|
||||
timestamp: new Date(),
|
||||
@@ -830,6 +834,7 @@ describe("FeedEngine", () => {
|
||||
return [
|
||||
{
|
||||
id: `item-${fetchCount}`,
|
||||
sourceId: "counter",
|
||||
type: "test",
|
||||
priority: 0.5,
|
||||
timestamp: new Date(),
|
||||
@@ -895,6 +900,7 @@ describe("FeedEngine", () => {
|
||||
return [
|
||||
{
|
||||
id: `weather-${Date.now()}`,
|
||||
sourceId: "weather",
|
||||
type: "weather",
|
||||
priority: 0.5,
|
||||
timestamp: new Date(),
|
||||
|
||||
@@ -29,11 +29,17 @@ type WeatherItem = FeedItem<"weather", { temp: number }>
|
||||
type CalendarItem = FeedItem<"calendar", { title: string }>
|
||||
|
||||
function weatherItem(id: string, temp: number): WeatherItem {
|
||||
return { id, type: "weather", timestamp: new Date(), data: { temp } }
|
||||
return { id, sourceId: "aelis.weather", type: "weather", timestamp: new Date(), data: { temp } }
|
||||
}
|
||||
|
||||
function calendarItem(id: string, title: string): CalendarItem {
|
||||
return { id, type: "calendar", timestamp: new Date(), data: { title } }
|
||||
return {
|
||||
id,
|
||||
sourceId: "aelis.calendar",
|
||||
type: "calendar",
|
||||
timestamp: new Date(),
|
||||
data: { title },
|
||||
}
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
|
||||
@@ -98,6 +98,7 @@ function createWeatherSource(
|
||||
return [
|
||||
{
|
||||
id: `weather-${Date.now()}`,
|
||||
sourceId: "weather",
|
||||
type: "weather",
|
||||
timestamp: new Date(),
|
||||
data: {
|
||||
@@ -129,6 +130,7 @@ function createAlertSource(): FeedSource<AlertFeedItem> {
|
||||
return [
|
||||
{
|
||||
id: "alert-storm",
|
||||
sourceId: "alert",
|
||||
type: "alert",
|
||||
timestamp: new Date(),
|
||||
data: { message: "Storm warning!" },
|
||||
|
||||
@@ -6,6 +6,7 @@ describe("FeedItem slots", () => {
|
||||
test("FeedItem without slots is valid", () => {
|
||||
const item: FeedItem<"test", { value: number }> = {
|
||||
id: "test-1",
|
||||
sourceId: "test-source",
|
||||
type: "test",
|
||||
timestamp: new Date(),
|
||||
data: { value: 42 },
|
||||
@@ -17,6 +18,7 @@ describe("FeedItem slots", () => {
|
||||
test("FeedItem with unfilled slots", () => {
|
||||
const item: FeedItem<"weather", { temp: number }> = {
|
||||
id: "weather-1",
|
||||
sourceId: "aelis.weather",
|
||||
type: "weather",
|
||||
timestamp: new Date(),
|
||||
data: { temp: 18 },
|
||||
@@ -41,6 +43,7 @@ describe("FeedItem slots", () => {
|
||||
test("FeedItem with filled slots", () => {
|
||||
const item: FeedItem<"weather", { temp: number }> = {
|
||||
id: "weather-1",
|
||||
sourceId: "aelis.weather",
|
||||
type: "weather",
|
||||
timestamp: new Date(),
|
||||
data: { temp: 18 },
|
||||
@@ -75,6 +78,7 @@ describe("FeedItem slots", () => {
|
||||
test("FeedItem with empty slots record", () => {
|
||||
const item: FeedItem<"test", { value: number }> = {
|
||||
id: "test-1",
|
||||
sourceId: "test-source",
|
||||
type: "test",
|
||||
timestamp: new Date(),
|
||||
data: { value: 1 },
|
||||
|
||||
@@ -48,6 +48,7 @@ export interface Slot {
|
||||
*
|
||||
* const item: WeatherItem = {
|
||||
* id: "weather-123",
|
||||
* sourceId: "aelis.weatherkit",
|
||||
* type: "weather",
|
||||
* timestamp: new Date(),
|
||||
* data: { temp: 18, condition: "cloudy" },
|
||||
@@ -67,6 +68,8 @@ export interface FeedItem<
|
||||
> {
|
||||
/** Unique identifier */
|
||||
id: string
|
||||
/** ID of the FeedSource that produced this item */
|
||||
sourceId: string
|
||||
/** Item type, matches the data source type */
|
||||
type: TType
|
||||
/** When this item was generated */
|
||||
|
||||
Reference in New Issue
Block a user