@sprinterai/runtime 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/heartbeat-scheduler.d.ts +36 -0
- package/dist/agent/heartbeat-scheduler.d.ts.map +1 -0
- package/dist/agent/heartbeat-scheduler.js +57 -0
- package/dist/agent/heartbeat-scheduler.js.map +1 -0
- package/dist/agent/heartbeat-scheduler.test.d.ts +2 -0
- package/dist/agent/heartbeat-scheduler.test.d.ts.map +1 -0
- package/dist/agent/heartbeat-scheduler.test.js +216 -0
- package/dist/agent/heartbeat-scheduler.test.js.map +1 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +2 -0
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/versioning.d.ts +22 -0
- package/dist/agent/versioning.d.ts.map +1 -0
- package/dist/agent/versioning.js +47 -0
- package/dist/agent/versioning.js.map +1 -0
- package/dist/agent/versioning.test.d.ts +2 -0
- package/dist/agent/versioning.test.d.ts.map +1 -0
- package/dist/agent/versioning.test.js +147 -0
- package/dist/agent/versioning.test.js.map +1 -0
- package/dist/analytics/analytics-recorder.d.ts +12 -0
- package/dist/analytics/analytics-recorder.d.ts.map +1 -0
- package/dist/analytics/analytics-recorder.js +27 -0
- package/dist/analytics/analytics-recorder.js.map +1 -0
- package/dist/analytics/analytics-recorder.test.d.ts +2 -0
- package/dist/analytics/analytics-recorder.test.d.ts.map +1 -0
- package/dist/analytics/analytics-recorder.test.js +98 -0
- package/dist/analytics/analytics-recorder.test.js.map +1 -0
- package/dist/analytics/analytics-types.d.ts +13 -0
- package/dist/analytics/analytics-types.d.ts.map +1 -0
- package/dist/analytics/analytics-types.js +2 -0
- package/dist/analytics/analytics-types.js.map +1 -0
- package/dist/analytics/index.d.ts +4 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +2 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/automation/index.d.ts +77 -0
- package/dist/automation/index.d.ts.map +1 -0
- package/dist/automation/index.js +119 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/automation/index.test.d.ts +2 -0
- package/dist/automation/index.test.d.ts.map +1 -0
- package/dist/automation/index.test.js +135 -0
- package/dist/automation/index.test.js.map +1 -0
- package/dist/capture/capture-parser.d.ts +13 -0
- package/dist/capture/capture-parser.d.ts.map +1 -0
- package/dist/capture/capture-parser.js +55 -0
- package/dist/capture/capture-parser.js.map +1 -0
- package/dist/capture/capture-parser.test.d.ts +2 -0
- package/dist/capture/capture-parser.test.d.ts.map +1 -0
- package/dist/capture/capture-parser.test.js +134 -0
- package/dist/capture/capture-parser.test.js.map +1 -0
- package/dist/capture/capture-schema.d.ts +38 -0
- package/dist/capture/capture-schema.d.ts.map +1 -0
- package/dist/capture/capture-schema.js +16 -0
- package/dist/capture/capture-schema.js.map +1 -0
- package/dist/capture/capture-schema.test.d.ts +2 -0
- package/dist/capture/capture-schema.test.d.ts.map +1 -0
- package/dist/capture/capture-schema.test.js +72 -0
- package/dist/capture/capture-schema.test.js.map +1 -0
- package/dist/capture/create-from-capture.d.ts +14 -0
- package/dist/capture/create-from-capture.d.ts.map +1 -0
- package/dist/capture/create-from-capture.js +30 -0
- package/dist/capture/create-from-capture.js.map +1 -0
- package/dist/capture/create-from-capture.test.d.ts +2 -0
- package/dist/capture/create-from-capture.test.d.ts.map +1 -0
- package/dist/capture/create-from-capture.test.js +148 -0
- package/dist/capture/create-from-capture.test.js.map +1 -0
- package/dist/capture/index.d.ts +7 -0
- package/dist/capture/index.d.ts.map +1 -0
- package/dist/capture/index.js +4 -0
- package/dist/capture/index.js.map +1 -0
- package/dist/chat/inbox.d.ts +96 -0
- package/dist/chat/inbox.d.ts.map +1 -0
- package/dist/chat/inbox.js +170 -0
- package/dist/chat/inbox.js.map +1 -0
- package/dist/chat/inbox.test.d.ts +2 -0
- package/dist/chat/inbox.test.d.ts.map +1 -0
- package/dist/chat/inbox.test.js +520 -0
- package/dist/chat/inbox.test.js.map +1 -0
- package/dist/chat/index.d.ts +5 -3
- package/dist/chat/index.d.ts.map +1 -1
- package/dist/chat/index.js +3 -2
- package/dist/chat/index.js.map +1 -1
- package/dist/context/context-keys.d.ts +7 -0
- package/dist/context/context-keys.d.ts.map +1 -0
- package/dist/context/context-keys.js +6 -0
- package/dist/context/context-keys.js.map +1 -0
- package/dist/context/format-context.d.ts +14 -0
- package/dist/context/format-context.d.ts.map +1 -0
- package/dist/context/format-context.js +82 -0
- package/dist/context/format-context.js.map +1 -0
- package/dist/context/format-context.test.d.ts +2 -0
- package/dist/context/format-context.test.d.ts.map +1 -0
- package/dist/context/format-context.test.js +130 -0
- package/dist/context/format-context.test.js.map +1 -0
- package/dist/context/index.d.ts +6 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +5 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/load-context.d.ts +8 -0
- package/dist/context/load-context.d.ts.map +1 -0
- package/dist/context/load-context.js +22 -0
- package/dist/context/load-context.js.map +1 -0
- package/dist/context/load-context.test.d.ts +2 -0
- package/dist/context/load-context.test.d.ts.map +1 -0
- package/dist/context/load-context.test.js +111 -0
- package/dist/context/load-context.test.js.map +1 -0
- package/dist/context/shared-context.d.ts +11 -0
- package/dist/context/shared-context.d.ts.map +1 -0
- package/dist/context/shared-context.js +14 -0
- package/dist/context/shared-context.js.map +1 -0
- package/dist/context/shared-context.test.d.ts +2 -0
- package/dist/context/shared-context.test.d.ts.map +1 -0
- package/dist/context/shared-context.test.js +90 -0
- package/dist/context/shared-context.test.js.map +1 -0
- package/dist/document/deletion.d.ts +17 -0
- package/dist/document/deletion.d.ts.map +1 -0
- package/dist/document/deletion.js +11 -0
- package/dist/document/deletion.js.map +1 -0
- package/dist/document/deletion.test.d.ts +2 -0
- package/dist/document/deletion.test.d.ts.map +1 -0
- package/dist/document/deletion.test.js +33 -0
- package/dist/document/deletion.test.js.map +1 -0
- package/dist/document/index.d.ts +12 -0
- package/dist/document/index.d.ts.map +1 -1
- package/dist/document/index.js +7 -0
- package/dist/document/index.js.map +1 -1
- package/dist/document/linking.d.ts +42 -0
- package/dist/document/linking.d.ts.map +1 -0
- package/dist/document/linking.js +49 -0
- package/dist/document/linking.js.map +1 -0
- package/dist/document/linking.test.d.ts +2 -0
- package/dist/document/linking.test.d.ts.map +1 -0
- package/dist/document/linking.test.js +86 -0
- package/dist/document/linking.test.js.map +1 -0
- package/dist/document/pagination.d.ts +24 -0
- package/dist/document/pagination.d.ts.map +1 -0
- package/dist/document/pagination.js +24 -0
- package/dist/document/pagination.js.map +1 -0
- package/dist/document/pagination.test.d.ts +2 -0
- package/dist/document/pagination.test.d.ts.map +1 -0
- package/dist/document/pagination.test.js +84 -0
- package/dist/document/pagination.test.js.map +1 -0
- package/dist/document/search.d.ts +37 -0
- package/dist/document/search.d.ts.map +1 -0
- package/dist/document/search.js +37 -0
- package/dist/document/search.js.map +1 -0
- package/dist/document/search.test.d.ts +2 -0
- package/dist/document/search.test.d.ts.map +1 -0
- package/dist/document/search.test.js +97 -0
- package/dist/document/search.test.js.map +1 -0
- package/dist/document/upload.d.ts +15 -0
- package/dist/document/upload.d.ts.map +1 -0
- package/dist/document/upload.js +12 -0
- package/dist/document/upload.js.map +1 -0
- package/dist/document/upload.test.d.ts +2 -0
- package/dist/document/upload.test.d.ts.map +1 -0
- package/dist/document/upload.test.js +70 -0
- package/dist/document/upload.test.js.map +1 -0
- package/dist/document/url-generation.d.ts +21 -0
- package/dist/document/url-generation.d.ts.map +1 -0
- package/dist/document/url-generation.js +14 -0
- package/dist/document/url-generation.js.map +1 -0
- package/dist/document/url-generation.test.d.ts +2 -0
- package/dist/document/url-generation.test.d.ts.map +1 -0
- package/dist/document/url-generation.test.js +38 -0
- package/dist/document/url-generation.test.js.map +1 -0
- package/dist/email/engine.d.ts +19 -0
- package/dist/email/engine.d.ts.map +1 -0
- package/dist/email/engine.js +30 -0
- package/dist/email/engine.js.map +1 -0
- package/dist/email/engine.test.d.ts +2 -0
- package/dist/email/engine.test.d.ts.map +1 -0
- package/dist/email/engine.test.js +128 -0
- package/dist/email/engine.test.js.map +1 -0
- package/dist/email/index.d.ts +5 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +3 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/templates.d.ts +33 -0
- package/dist/email/templates.d.ts.map +1 -0
- package/dist/email/templates.js +132 -0
- package/dist/email/templates.js.map +1 -0
- package/dist/email/templates.test.d.ts +2 -0
- package/dist/email/templates.test.d.ts.map +1 -0
- package/dist/email/templates.test.js +158 -0
- package/dist/email/templates.test.js.map +1 -0
- package/dist/entity/bulk-operations.d.ts +39 -0
- package/dist/entity/bulk-operations.d.ts.map +1 -0
- package/dist/entity/bulk-operations.js +127 -0
- package/dist/entity/bulk-operations.js.map +1 -0
- package/dist/entity/bulk-operations.test.d.ts +2 -0
- package/dist/entity/bulk-operations.test.d.ts.map +1 -0
- package/dist/entity/bulk-operations.test.js +212 -0
- package/dist/entity/bulk-operations.test.js.map +1 -0
- package/dist/entity/collections.d.ts +17 -0
- package/dist/entity/collections.d.ts.map +1 -0
- package/dist/entity/collections.js +22 -0
- package/dist/entity/collections.js.map +1 -0
- package/dist/entity/collections.test.d.ts +2 -0
- package/dist/entity/collections.test.d.ts.map +1 -0
- package/dist/entity/collections.test.js +92 -0
- package/dist/entity/collections.test.js.map +1 -0
- package/dist/entity/index.d.ts +9 -0
- package/dist/entity/index.d.ts.map +1 -0
- package/dist/entity/index.js +6 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/entity/relations.d.ts +65 -0
- package/dist/entity/relations.d.ts.map +1 -0
- package/dist/entity/relations.js +110 -0
- package/dist/entity/relations.js.map +1 -0
- package/dist/entity/relations.test.d.ts +2 -0
- package/dist/entity/relations.test.d.ts.map +1 -0
- package/dist/entity/relations.test.js +202 -0
- package/dist/entity/relations.test.js.map +1 -0
- package/dist/entity/resolve-relation-columns.d.ts +31 -0
- package/dist/entity/resolve-relation-columns.d.ts.map +1 -0
- package/dist/entity/resolve-relation-columns.js +156 -0
- package/dist/entity/resolve-relation-columns.js.map +1 -0
- package/dist/entity/resolve-relation-columns.test.d.ts +2 -0
- package/dist/entity/resolve-relation-columns.test.d.ts.map +1 -0
- package/dist/entity/resolve-relation-columns.test.js +281 -0
- package/dist/entity/resolve-relation-columns.test.js.map +1 -0
- package/dist/entity/sharing.d.ts +41 -0
- package/dist/entity/sharing.d.ts.map +1 -0
- package/dist/entity/sharing.js +52 -0
- package/dist/entity/sharing.js.map +1 -0
- package/dist/entity/sharing.test.d.ts +2 -0
- package/dist/entity/sharing.test.d.ts.map +1 -0
- package/dist/entity/sharing.test.js +178 -0
- package/dist/entity/sharing.test.js.map +1 -0
- package/dist/external-data/external-data-receiver.d.ts +43 -0
- package/dist/external-data/external-data-receiver.d.ts.map +1 -0
- package/dist/external-data/external-data-receiver.js +81 -0
- package/dist/external-data/external-data-receiver.js.map +1 -0
- package/dist/external-data/external-data-receiver.test.d.ts +2 -0
- package/dist/external-data/external-data-receiver.test.d.ts.map +1 -0
- package/dist/external-data/external-data-receiver.test.js +189 -0
- package/dist/external-data/external-data-receiver.test.js.map +1 -0
- package/dist/external-data/extract-by-path.d.ts +13 -0
- package/dist/external-data/extract-by-path.d.ts.map +1 -0
- package/dist/external-data/extract-by-path.js +25 -0
- package/dist/external-data/extract-by-path.js.map +1 -0
- package/dist/external-data/extract-by-path.test.d.ts +2 -0
- package/dist/external-data/extract-by-path.test.d.ts.map +1 -0
- package/dist/external-data/extract-by-path.test.js +47 -0
- package/dist/external-data/extract-by-path.test.js.map +1 -0
- package/dist/external-data/index.d.ts +4 -0
- package/dist/external-data/index.d.ts.map +1 -0
- package/dist/external-data/index.js +3 -0
- package/dist/external-data/index.js.map +1 -0
- package/dist/feed/digest.d.ts +35 -0
- package/dist/feed/digest.d.ts.map +1 -0
- package/dist/feed/digest.js +273 -0
- package/dist/feed/digest.js.map +1 -0
- package/dist/feed/filters.d.ts +41 -0
- package/dist/feed/filters.d.ts.map +1 -0
- package/dist/feed/filters.js +97 -0
- package/dist/feed/filters.js.map +1 -0
- package/dist/feed/index.d.ts +20 -0
- package/dist/feed/index.d.ts.map +1 -0
- package/dist/feed/index.js +23 -0
- package/dist/feed/index.js.map +1 -0
- package/dist/feed/ranking.d.ts +42 -0
- package/dist/feed/ranking.d.ts.map +1 -0
- package/dist/feed/ranking.js +133 -0
- package/dist/feed/ranking.js.map +1 -0
- package/dist/feed/resolver.d.ts +76 -0
- package/dist/feed/resolver.d.ts.map +1 -0
- package/dist/feed/resolver.js +173 -0
- package/dist/feed/resolver.js.map +1 -0
- package/dist/feed/transformers.d.ts +80 -0
- package/dist/feed/transformers.d.ts.map +1 -0
- package/dist/feed/transformers.js +179 -0
- package/dist/feed/transformers.js.map +1 -0
- package/dist/feed/types.d.ts +131 -0
- package/dist/feed/types.d.ts.map +1 -0
- package/dist/feed/types.js +6 -0
- package/dist/feed/types.js.map +1 -0
- package/dist/import/batch-upsert.d.ts +18 -0
- package/dist/import/batch-upsert.d.ts.map +1 -0
- package/dist/import/batch-upsert.js +67 -0
- package/dist/import/batch-upsert.js.map +1 -0
- package/dist/import/index.d.ts +7 -0
- package/dist/import/index.d.ts.map +1 -0
- package/dist/import/index.js +4 -0
- package/dist/import/index.js.map +1 -0
- package/dist/import/merge-content.d.ts +8 -0
- package/dist/import/merge-content.d.ts.map +1 -0
- package/dist/import/merge-content.js +20 -0
- package/dist/import/merge-content.js.map +1 -0
- package/dist/import/merge-content.test.d.ts +2 -0
- package/dist/import/merge-content.test.d.ts.map +1 -0
- package/dist/import/merge-content.test.js +53 -0
- package/dist/import/merge-content.test.js.map +1 -0
- package/dist/import/types.d.ts +20 -0
- package/dist/import/types.d.ts.map +1 -0
- package/dist/import/types.js +2 -0
- package/dist/import/types.js.map +1 -0
- package/dist/import/upsert-matcher.d.ts +39 -0
- package/dist/import/upsert-matcher.d.ts.map +1 -0
- package/dist/import/upsert-matcher.js +67 -0
- package/dist/import/upsert-matcher.js.map +1 -0
- package/dist/import/upsert-matcher.test.d.ts +2 -0
- package/dist/import/upsert-matcher.test.d.ts.map +1 -0
- package/dist/import/upsert-matcher.test.js +77 -0
- package/dist/import/upsert-matcher.test.js.map +1 -0
- package/dist/index.d.ts +77 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +55 -1
- package/dist/index.js.map +1 -1
- package/dist/inngest/create-extraction-functions.d.ts +71 -0
- package/dist/inngest/create-extraction-functions.d.ts.map +1 -0
- package/dist/inngest/create-extraction-functions.js +71 -0
- package/dist/inngest/create-extraction-functions.js.map +1 -0
- package/dist/inngest/event-names.d.ts +20 -0
- package/dist/inngest/event-names.d.ts.map +1 -0
- package/dist/inngest/event-names.js +19 -0
- package/dist/inngest/event-names.js.map +1 -0
- package/dist/inngest/index.d.ts +5 -0
- package/dist/inngest/index.d.ts.map +1 -0
- package/dist/inngest/index.js +3 -0
- package/dist/inngest/index.js.map +1 -0
- package/dist/memory/index.d.ts +4 -3
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +3 -2
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/user-memory.d.ts +15 -0
- package/dist/memory/user-memory.d.ts.map +1 -0
- package/dist/memory/user-memory.js +20 -0
- package/dist/memory/user-memory.js.map +1 -0
- package/dist/memory/user-memory.test.d.ts +2 -0
- package/dist/memory/user-memory.test.d.ts.map +1 -0
- package/dist/memory/user-memory.test.js +74 -0
- package/dist/memory/user-memory.test.js.map +1 -0
- package/dist/module/create-runtime.d.ts +4 -1
- package/dist/module/create-runtime.d.ts.map +1 -1
- package/dist/module/create-runtime.js.map +1 -1
- package/dist/module/map-supabase-stores.d.ts +3 -0
- package/dist/module/map-supabase-stores.d.ts.map +1 -1
- package/dist/module/map-supabase-stores.js +3 -0
- package/dist/module/map-supabase-stores.js.map +1 -1
- package/dist/package-exports.test.d.ts +2 -0
- package/dist/package-exports.test.d.ts.map +1 -0
- package/dist/package-exports.test.js +36 -0
- package/dist/package-exports.test.js.map +1 -0
- package/dist/providers/index.d.ts +2 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/model-resolver.d.ts +11 -3
- package/dist/providers/model-resolver.d.ts.map +1 -1
- package/dist/providers/model-resolver.js +166 -11
- package/dist/providers/model-resolver.js.map +1 -1
- package/dist/providers/model-resolver.test.js +10 -10
- package/dist/providers/model-resolver.test.js.map +1 -1
- package/dist/providers/provider-interfaces.d.ts +0 -20
- package/dist/providers/provider-interfaces.d.ts.map +1 -1
- package/dist/providers/provider-interfaces.js +1 -0
- package/dist/providers/provider-interfaces.js.map +1 -1
- package/dist/scoring/index.d.ts +4 -2
- package/dist/scoring/index.d.ts.map +1 -1
- package/dist/scoring/index.js +2 -1
- package/dist/scoring/index.js.map +1 -1
- package/dist/scoring/promotion.d.ts +20 -0
- package/dist/scoring/promotion.d.ts.map +1 -0
- package/dist/scoring/promotion.js +39 -0
- package/dist/scoring/promotion.js.map +1 -0
- package/dist/scoring/promotion.test.d.ts +2 -0
- package/dist/scoring/promotion.test.d.ts.map +1 -0
- package/dist/scoring/promotion.test.js +141 -0
- package/dist/scoring/promotion.test.js.map +1 -0
- package/dist/settings/index.d.ts +15 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +47 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/index.test.d.ts +2 -0
- package/dist/settings/index.test.d.ts.map +1 -0
- package/dist/settings/index.test.js +75 -0
- package/dist/settings/index.test.js.map +1 -0
- package/dist/skill/index.d.ts +4 -0
- package/dist/skill/index.d.ts.map +1 -0
- package/dist/skill/index.js +3 -0
- package/dist/skill/index.js.map +1 -0
- package/dist/skill/skill-loader.d.ts +18 -0
- package/dist/skill/skill-loader.d.ts.map +1 -0
- package/dist/skill/skill-loader.js +31 -0
- package/dist/skill/skill-loader.js.map +1 -0
- package/dist/skill/skill-loader.test.d.ts +2 -0
- package/dist/skill/skill-loader.test.d.ts.map +1 -0
- package/dist/skill/skill-loader.test.js +64 -0
- package/dist/skill/skill-loader.test.js.map +1 -0
- package/dist/skill/skill-prompt.d.ts +7 -0
- package/dist/skill/skill-prompt.d.ts.map +1 -0
- package/dist/skill/skill-prompt.js +17 -0
- package/dist/skill/skill-prompt.js.map +1 -0
- package/dist/skill/skill-prompt.test.d.ts +2 -0
- package/dist/skill/skill-prompt.test.d.ts.map +1 -0
- package/dist/skill/skill-prompt.test.js +44 -0
- package/dist/skill/skill-prompt.test.js.map +1 -0
- package/dist/source/index.d.ts +5 -0
- package/dist/source/index.d.ts.map +1 -0
- package/dist/source/index.js +3 -0
- package/dist/source/index.js.map +1 -0
- package/dist/source/source-poller.d.ts +66 -0
- package/dist/source/source-poller.d.ts.map +1 -0
- package/dist/source/source-poller.js +64 -0
- package/dist/source/source-poller.js.map +1 -0
- package/dist/source/source-poller.test.d.ts +2 -0
- package/dist/source/source-poller.test.d.ts.map +1 -0
- package/dist/source/source-poller.test.js +184 -0
- package/dist/source/source-poller.test.js.map +1 -0
- package/dist/source/source-status.d.ts +41 -0
- package/dist/source/source-status.d.ts.map +1 -0
- package/dist/source/source-status.js +73 -0
- package/dist/source/source-status.js.map +1 -0
- package/dist/source/source-status.test.d.ts +2 -0
- package/dist/source/source-status.test.d.ts.map +1 -0
- package/dist/source/source-status.test.js +116 -0
- package/dist/source/source-status.test.js.map +1 -0
- package/dist/template/index.d.ts +61 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/template/index.js +100 -0
- package/dist/template/index.js.map +1 -0
- package/dist/template/index.test.d.ts +2 -0
- package/dist/template/index.test.d.ts.map +1 -0
- package/dist/template/index.test.js +167 -0
- package/dist/template/index.test.js.map +1 -0
- package/dist/testing/in-memory-agent-version-store.d.ts +13 -0
- package/dist/testing/in-memory-agent-version-store.d.ts.map +1 -0
- package/dist/testing/in-memory-agent-version-store.js +36 -0
- package/dist/testing/in-memory-agent-version-store.js.map +1 -0
- package/dist/testing/in-memory-chat-store.d.ts +11 -1
- package/dist/testing/in-memory-chat-store.d.ts.map +1 -1
- package/dist/testing/in-memory-chat-store.js +66 -0
- package/dist/testing/in-memory-chat-store.js.map +1 -1
- package/dist/testing/in-memory-entity-store.d.ts +2 -0
- package/dist/testing/in-memory-entity-store.d.ts.map +1 -1
- package/dist/testing/in-memory-entity-store.js +8 -3
- package/dist/testing/in-memory-entity-store.js.map +1 -1
- package/dist/testing/in-memory-entity-store.test.js +2 -1
- package/dist/testing/in-memory-entity-store.test.js.map +1 -1
- package/dist/testing/in-memory-heartbeat-run-store.d.ts +21 -0
- package/dist/testing/in-memory-heartbeat-run-store.d.ts.map +1 -0
- package/dist/testing/in-memory-heartbeat-run-store.js +107 -0
- package/dist/testing/in-memory-heartbeat-run-store.js.map +1 -0
- package/dist/testing/index.d.ts +9 -7
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +9 -7
- package/dist/testing/index.js.map +1 -1
- package/dist/tool/gallery/gallery-module.d.ts +4 -0
- package/dist/tool/gallery/gallery-module.d.ts.map +1 -0
- package/dist/tool/gallery/gallery-module.js +10 -0
- package/dist/tool/gallery/gallery-module.js.map +1 -0
- package/dist/tool/gallery/gallery-tool-definitions.d.ts +17 -0
- package/dist/tool/gallery/gallery-tool-definitions.d.ts.map +1 -0
- package/dist/tool/gallery/gallery-tool-definitions.js +748 -0
- package/dist/tool/gallery/gallery-tool-definitions.js.map +1 -0
- package/dist/tool/gallery/gallery-tools.d.ts +11 -0
- package/dist/tool/gallery/gallery-tools.d.ts.map +1 -0
- package/dist/tool/gallery/gallery-tools.js +971 -0
- package/dist/tool/gallery/gallery-tools.js.map +1 -0
- package/dist/tool/gallery/gallery-tools.test.d.ts +2 -0
- package/dist/tool/gallery/gallery-tools.test.d.ts.map +1 -0
- package/dist/tool/gallery/gallery-tools.test.js +75 -0
- package/dist/tool/gallery/gallery-tools.test.js.map +1 -0
- package/dist/tool/gallery/index.d.ts +5 -0
- package/dist/tool/gallery/index.d.ts.map +1 -0
- package/dist/tool/gallery/index.js +4 -0
- package/dist/tool/gallery/index.js.map +1 -0
- package/dist/tool/index.d.ts +11 -7
- package/dist/tool/index.d.ts.map +1 -1
- package/dist/tool/index.js +7 -5
- package/dist/tool/index.js.map +1 -1
- package/dist/tool/session-manager.d.ts +35 -0
- package/dist/tool/session-manager.d.ts.map +1 -0
- package/dist/tool/session-manager.js +40 -0
- package/dist/tool/session-manager.js.map +1 -0
- package/dist/tool/session-manager.test.d.ts +2 -0
- package/dist/tool/session-manager.test.d.ts.map +1 -0
- package/dist/tool/session-manager.test.js +139 -0
- package/dist/tool/session-manager.test.js.map +1 -0
- package/dist/tool/tool-registry.d.ts +1 -1
- package/dist/tool/tool-registry.d.ts.map +1 -1
- package/dist/tool/tool-registry.js +1 -0
- package/dist/tool/tool-registry.js.map +1 -1
- package/dist/tool/tool-registry.test.js +7 -0
- package/dist/tool/tool-registry.test.js.map +1 -1
- package/dist/workflow/claim-manager.d.ts +24 -0
- package/dist/workflow/claim-manager.d.ts.map +1 -0
- package/dist/workflow/claim-manager.js +31 -0
- package/dist/workflow/claim-manager.js.map +1 -0
- package/dist/workflow/claim-manager.test.d.ts +2 -0
- package/dist/workflow/claim-manager.test.d.ts.map +1 -0
- package/dist/workflow/claim-manager.test.js +124 -0
- package/dist/workflow/claim-manager.test.js.map +1 -0
- package/dist/workflow/create-node-executor.d.ts +40 -0
- package/dist/workflow/create-node-executor.d.ts.map +1 -0
- package/dist/workflow/create-node-executor.js +234 -0
- package/dist/workflow/create-node-executor.js.map +1 -0
- package/dist/workflow/field-recovery.d.ts +12 -0
- package/dist/workflow/field-recovery.d.ts.map +1 -0
- package/dist/workflow/field-recovery.js +86 -0
- package/dist/workflow/field-recovery.js.map +1 -0
- package/dist/workflow/index.d.ts +8 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +7 -0
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/run-entity-workflow.d.ts +53 -0
- package/dist/workflow/run-entity-workflow.d.ts.map +1 -0
- package/dist/workflow/run-entity-workflow.js +72 -0
- package/dist/workflow/run-entity-workflow.js.map +1 -0
- package/dist/workflow/run-queries.d.ts +45 -0
- package/dist/workflow/run-queries.d.ts.map +1 -0
- package/dist/workflow/run-queries.js +80 -0
- package/dist/workflow/run-queries.js.map +1 -0
- package/dist/workflow/run-queries.test.d.ts +2 -0
- package/dist/workflow/run-queries.test.d.ts.map +1 -0
- package/dist/workflow/run-queries.test.js +177 -0
- package/dist/workflow/run-queries.test.js.map +1 -0
- package/package.json +227 -3
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { validateFeedParams } from './filters.js';
|
|
2
|
+
import { computeForYouScores } from './ranking.js';
|
|
3
|
+
import { rowsToFeedItems } from './transformers.js';
|
|
4
|
+
/**
|
|
5
|
+
* Resolve a daily digest of high-impact activities.
|
|
6
|
+
*
|
|
7
|
+
* Generates a summary of the most important activities from the past 24 hours.
|
|
8
|
+
* Useful for daily email digests, notifications, and summaries.
|
|
9
|
+
*
|
|
10
|
+
* Flow:
|
|
11
|
+
* 1. Query activities from the past 24 hours
|
|
12
|
+
* 2. Rank by importance + recency
|
|
13
|
+
* 3. Filter by score threshold (optional)
|
|
14
|
+
* 4. Select top N items
|
|
15
|
+
* 5. Compute summary statistics
|
|
16
|
+
* 6. Return FeedDigest with items and metadata
|
|
17
|
+
*
|
|
18
|
+
* @param store ActivityStore implementation
|
|
19
|
+
* @param config Digest configuration
|
|
20
|
+
* @returns FeedDigest with items and summary
|
|
21
|
+
* @throws Error if store query fails
|
|
22
|
+
*/
|
|
23
|
+
export async function resolveDigest(store, config) {
|
|
24
|
+
const { tenantId, digestLimit = 10, minScoreThreshold = 0.3, includeImportance = true, importanceWeight = 1.5, // Importance matters more in digests
|
|
25
|
+
recencyWeight = 1.0, entityId, actorId, action, } = config;
|
|
26
|
+
// Validate parameters
|
|
27
|
+
const { limit: digestLimitSafe } = validateFeedParams(digestLimit);
|
|
28
|
+
const { threshold } = validateFeedParams(undefined, minScoreThreshold);
|
|
29
|
+
// Query activities from past 24 hours
|
|
30
|
+
const now = new Date();
|
|
31
|
+
const yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000);
|
|
32
|
+
const queryOptions = {
|
|
33
|
+
limit: digestLimitSafe * 2, // Fetch extra to account for filtering
|
|
34
|
+
entityId,
|
|
35
|
+
actorId,
|
|
36
|
+
action,
|
|
37
|
+
};
|
|
38
|
+
const records = await store.listActivities(queryOptions);
|
|
39
|
+
// Filter to past 24 hours
|
|
40
|
+
const yesterdayTime = yesterday.getTime();
|
|
41
|
+
const recentRecords = records.filter((r) => new Date(r.created_at).getTime() >= yesterdayTime);
|
|
42
|
+
if (recentRecords.length === 0) {
|
|
43
|
+
return buildEmptyDigest(tenantId, new Date());
|
|
44
|
+
}
|
|
45
|
+
// Convert to FeedItems and rank
|
|
46
|
+
let items = rowsToFeedItems(recentRecords);
|
|
47
|
+
items = items.map((item) => {
|
|
48
|
+
const score = computeForYouScores({
|
|
49
|
+
createdAt: item.createdAt,
|
|
50
|
+
metadata: item.metadata,
|
|
51
|
+
importance: includeImportance ? extractImportanceFromMetadata(item.metadata) : undefined,
|
|
52
|
+
now,
|
|
53
|
+
recencyWeight,
|
|
54
|
+
importanceWeight,
|
|
55
|
+
});
|
|
56
|
+
return {
|
|
57
|
+
...item,
|
|
58
|
+
score,
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
// Sort by score (highest first)
|
|
62
|
+
items = items.sort((a, b) => b.score - a.score);
|
|
63
|
+
// Filter by score threshold
|
|
64
|
+
const filteredItems = items.filter((item) => item.score >= threshold);
|
|
65
|
+
// Take top N
|
|
66
|
+
const digestItems = filteredItems.slice(0, digestLimitSafe);
|
|
67
|
+
// Build summary statistics
|
|
68
|
+
const summary = buildDigestSummary(digestItems);
|
|
69
|
+
// Generate email subject and preview
|
|
70
|
+
const emailSubject = buildDigestEmailSubject(summary, new Date());
|
|
71
|
+
const emailPreview = buildDigestEmailPreview(digestItems);
|
|
72
|
+
return {
|
|
73
|
+
date: now.toISOString().split('T')[0], // YYYY-MM-DD
|
|
74
|
+
tenantId,
|
|
75
|
+
items: digestItems,
|
|
76
|
+
summary,
|
|
77
|
+
emailSubject,
|
|
78
|
+
emailPreview,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Build an empty digest for when no activities exist.
|
|
83
|
+
* Used as a placeholder when there's nothing to report.
|
|
84
|
+
*
|
|
85
|
+
* @param tenantId Tenant identifier
|
|
86
|
+
* @param date Date of the digest
|
|
87
|
+
* @returns Empty FeedDigest
|
|
88
|
+
*/
|
|
89
|
+
function buildEmptyDigest(tenantId, date) {
|
|
90
|
+
return {
|
|
91
|
+
date: date.toISOString().split('T')[0],
|
|
92
|
+
tenantId,
|
|
93
|
+
items: [],
|
|
94
|
+
summary: {
|
|
95
|
+
total: 0,
|
|
96
|
+
byAction: {},
|
|
97
|
+
byActor: {},
|
|
98
|
+
},
|
|
99
|
+
emailSubject: 'No activity today',
|
|
100
|
+
emailPreview: '',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Compute summary statistics for digest items.
|
|
105
|
+
* Counts activities by action type and actor.
|
|
106
|
+
*
|
|
107
|
+
* @param items Digest items
|
|
108
|
+
* @returns Summary with total and breakdown by action/actor
|
|
109
|
+
*/
|
|
110
|
+
function buildDigestSummary(items) {
|
|
111
|
+
const byAction = {};
|
|
112
|
+
const byActor = {};
|
|
113
|
+
for (const item of items) {
|
|
114
|
+
// Count by action
|
|
115
|
+
const action = item.action;
|
|
116
|
+
byAction[action] = (byAction[action] ?? 0) + 1;
|
|
117
|
+
// Count by actor
|
|
118
|
+
const actor = item.actorName ?? item.actorId ?? 'System';
|
|
119
|
+
byActor[actor] = (byActor[actor] ?? 0) + 1;
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
total: items.length,
|
|
123
|
+
byAction,
|
|
124
|
+
byActor,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Build a human-readable email subject line for digest.
|
|
129
|
+
*
|
|
130
|
+
* Examples:
|
|
131
|
+
* - "Daily Digest — 5 updates"
|
|
132
|
+
* - "Daily Digest — 12 activities"
|
|
133
|
+
* - "Daily Digest for Tuesday, Apr 8"
|
|
134
|
+
*
|
|
135
|
+
* @param summary Digest summary
|
|
136
|
+
* @param date Digest date
|
|
137
|
+
* @returns Email subject line
|
|
138
|
+
*/
|
|
139
|
+
function buildDigestEmailSubject(summary, _date) {
|
|
140
|
+
const total = summary.total;
|
|
141
|
+
if (total === 0) {
|
|
142
|
+
return 'Daily Digest — No activity';
|
|
143
|
+
}
|
|
144
|
+
const itemWord = total === 1 ? 'activity' : 'activities';
|
|
145
|
+
return `Daily Digest — ${total} ${itemWord}`;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Build a preview text for digest email.
|
|
149
|
+
* Creates a bulleted summary suitable for email rendering.
|
|
150
|
+
*
|
|
151
|
+
* Format:
|
|
152
|
+
* ```
|
|
153
|
+
* • Alice updated Project ABC
|
|
154
|
+
* • Bob commented on Task 123
|
|
155
|
+
* • System created Entity XYZ
|
|
156
|
+
* ```
|
|
157
|
+
*
|
|
158
|
+
* @param items Digest items (typically 5-10)
|
|
159
|
+
* @returns Plain text preview suitable for email
|
|
160
|
+
*/
|
|
161
|
+
function buildDigestEmailPreview(items) {
|
|
162
|
+
if (items.length === 0) {
|
|
163
|
+
return 'No activity in the past 24 hours.';
|
|
164
|
+
}
|
|
165
|
+
const lines = items
|
|
166
|
+
.slice(0, 10) // Cap at 10 items for email preview
|
|
167
|
+
.map((item) => {
|
|
168
|
+
const actor = item.actorName ?? 'System';
|
|
169
|
+
const action = formatActionForPreview(item.action);
|
|
170
|
+
const entity = item.entityName ?? item.entityId ?? 'item';
|
|
171
|
+
return `• ${actor} ${action} ${entity}`;
|
|
172
|
+
});
|
|
173
|
+
return lines.join('\n');
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Format action type for preview display.
|
|
177
|
+
*
|
|
178
|
+
* @param action Action code
|
|
179
|
+
* @returns Display-friendly action phrase
|
|
180
|
+
*/
|
|
181
|
+
function formatActionForPreview(action) {
|
|
182
|
+
const map = {
|
|
183
|
+
INSERT: 'created',
|
|
184
|
+
UPDATE: 'updated',
|
|
185
|
+
DELETE: 'deleted',
|
|
186
|
+
comment: 'commented on',
|
|
187
|
+
assigned: 'assigned',
|
|
188
|
+
shared: 'shared',
|
|
189
|
+
};
|
|
190
|
+
return map[action] ?? action.toLowerCase();
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Extract importance value from activity metadata.
|
|
194
|
+
* Looks for 'importance' or 'priority' fields.
|
|
195
|
+
*
|
|
196
|
+
* @param metadata Activity metadata
|
|
197
|
+
* @returns Importance value or null
|
|
198
|
+
*/
|
|
199
|
+
function extractImportanceFromMetadata(metadata) {
|
|
200
|
+
if (!metadata)
|
|
201
|
+
return null;
|
|
202
|
+
if ('importance' in metadata) {
|
|
203
|
+
const imp = metadata.importance;
|
|
204
|
+
if (typeof imp === 'number' || typeof imp === 'string') {
|
|
205
|
+
return imp;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if ('priority' in metadata) {
|
|
209
|
+
const pri = metadata.priority;
|
|
210
|
+
if (typeof pri === 'number' || typeof pri === 'string') {
|
|
211
|
+
return pri;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Build a multi-day digest.
|
|
218
|
+
*
|
|
219
|
+
* Generates a digest spanning multiple days.
|
|
220
|
+
* Useful for weekly/monthly summaries.
|
|
221
|
+
*
|
|
222
|
+
* @param store ActivityStore
|
|
223
|
+
* @param config Digest config
|
|
224
|
+
* @param days Number of days to include (default 7 for weekly)
|
|
225
|
+
* @returns FeedDigest combining items from multiple days
|
|
226
|
+
*/
|
|
227
|
+
export async function resolveMultiDayDigest(store, config, days = 7) {
|
|
228
|
+
const { tenantId, digestLimit = 20, minScoreThreshold = 0.4, includeImportance = true, importanceWeight = 1.5, recencyWeight = 1.0, } = config;
|
|
229
|
+
const { limit: digestLimitSafe } = validateFeedParams(digestLimit);
|
|
230
|
+
const { threshold } = validateFeedParams(undefined, minScoreThreshold);
|
|
231
|
+
const now = new Date();
|
|
232
|
+
const startDate = new Date(now.getTime() - days * 24 * 60 * 60 * 1000);
|
|
233
|
+
const queryOptions = {
|
|
234
|
+
limit: digestLimitSafe * 3, // Fetch extra for filtering
|
|
235
|
+
};
|
|
236
|
+
const records = await store.listActivities(queryOptions);
|
|
237
|
+
// Filter to date range
|
|
238
|
+
const startTime = startDate.getTime();
|
|
239
|
+
const filteredRecords = records.filter((r) => new Date(r.created_at).getTime() >= startTime);
|
|
240
|
+
if (filteredRecords.length === 0) {
|
|
241
|
+
return buildEmptyDigest(tenantId, now);
|
|
242
|
+
}
|
|
243
|
+
// Rank and filter
|
|
244
|
+
let items = rowsToFeedItems(filteredRecords);
|
|
245
|
+
items = items.map((item) => {
|
|
246
|
+
const score = computeForYouScores({
|
|
247
|
+
createdAt: item.createdAt,
|
|
248
|
+
metadata: item.metadata,
|
|
249
|
+
importance: includeImportance ? extractImportanceFromMetadata(item.metadata) : undefined,
|
|
250
|
+
now,
|
|
251
|
+
recencyWeight,
|
|
252
|
+
importanceWeight,
|
|
253
|
+
});
|
|
254
|
+
return {
|
|
255
|
+
...item,
|
|
256
|
+
score,
|
|
257
|
+
};
|
|
258
|
+
});
|
|
259
|
+
items = items.sort((a, b) => b.score - a.score);
|
|
260
|
+
const digestItems = items.filter((item) => item.score >= threshold).slice(0, digestLimitSafe);
|
|
261
|
+
const summary = buildDigestSummary(digestItems);
|
|
262
|
+
const emailSubject = `Weekly Digest — ${digestItems.length} activities`;
|
|
263
|
+
const emailPreview = buildDigestEmailPreview(digestItems);
|
|
264
|
+
return {
|
|
265
|
+
date: now.toISOString().split('T')[0],
|
|
266
|
+
tenantId,
|
|
267
|
+
items: digestItems,
|
|
268
|
+
summary,
|
|
269
|
+
emailSubject,
|
|
270
|
+
emailPreview,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=digest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.js","sourceRoot":"","sources":["../../src/feed/digest.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAoB,EACpB,MAAoB;IAEpB,MAAM,EACJ,QAAQ,EACR,WAAW,GAAG,EAAE,EAChB,iBAAiB,GAAG,GAAG,EACvB,iBAAiB,GAAG,IAAI,EACxB,gBAAgB,GAAG,GAAG,EAAE,qCAAqC;IAC7D,aAAa,GAAG,GAAG,EACnB,QAAQ,EACR,OAAO,EACP,MAAM,GACP,GAAG,MAAM,CAAC;IAEX,sBAAsB;IACtB,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACnE,MAAM,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAEvE,sCAAsC;IACtC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAEhE,MAAM,YAAY,GAAG;QACnB,KAAK,EAAE,eAAe,GAAG,CAAC,EAAE,uCAAuC;QACnE,QAAQ;QACR,OAAO;QACP,MAAM;KACP,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAEzD,0BAA0B;IAC1B,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;IAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,IAAI,aAAa,CAAC,CAAC;IAE/F,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,gBAAgB,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,gCAAgC;IAChC,IAAI,KAAK,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;IAE3C,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,KAAK,GAAG,mBAAmB,CAAC;YAChC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;YACxF,GAAG;YACH,aAAa;YACb,gBAAgB;SACjB,CAAC,CAAC;QAEH,OAAO;YACL,GAAG,IAAI;YACP,KAAK;SACN,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,gCAAgC;IAChC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAEhD,4BAA4B;IAC5B,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC;IAEtE,aAAa;IACb,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IAE5D,2BAA2B;IAC3B,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAEhD,qCAAqC;IACrC,MAAM,YAAY,GAAG,uBAAuB,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAE1D,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa;QACpD,QAAQ;QACR,KAAK,EAAE,WAAW;QAClB,OAAO;QACP,YAAY;QACZ,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,gBAAgB,CAAC,QAAgB,EAAE,IAAU;IACpD,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtC,QAAQ;QACR,KAAK,EAAE,EAAE;QACT,OAAO,EAAE;YACP,KAAK,EAAE,CAAC;YACR,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,EAAE;SACZ;QACD,YAAY,EAAE,mBAAmB;QACjC,YAAY,EAAE,EAAE;KACjB,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,KAAiB;IAC3C,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,kBAAkB;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAE/C,iBAAiB;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC;QACzD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,QAAQ;QACR,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,uBAAuB,CAAC,OAA8B,EAAE,KAAW;IAC1E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAE5B,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,4BAA4B,CAAC;IACtC,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC;IACzD,OAAO,kBAAkB,KAAK,IAAI,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,uBAAuB,CAAC,KAAiB;IAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,mCAAmC,CAAC;IAC7C,CAAC;IAED,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,oCAAoC;SACjD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC;QACzC,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;QAC1D,OAAO,KAAK,KAAK,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEL,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;GAKG;AACH,SAAS,sBAAsB,CAAC,MAAc;IAC5C,MAAM,GAAG,GAA2B;QAClC,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,cAAc;QACvB,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,QAAQ;KACjB,CAAC;IAEF,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;AAC7C,CAAC;AAED;;;;;;GAMG;AACH,SAAS,6BAA6B,CACpC,QAAyC;IAEzC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC;QAChC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAED,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC9B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAoB,EACpB,MAAoB,EACpB,OAAe,CAAC;IAEhB,MAAM,EACJ,QAAQ,EACR,WAAW,GAAG,EAAE,EAChB,iBAAiB,GAAG,GAAG,EACvB,iBAAiB,GAAG,IAAI,EACxB,gBAAgB,GAAG,GAAG,EACtB,aAAa,GAAG,GAAG,GACpB,GAAG,MAAM,CAAC;IAEX,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACnE,MAAM,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAEvE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAEvE,MAAM,YAAY,GAAG;QACnB,KAAK,EAAE,eAAe,GAAG,CAAC,EAAE,4BAA4B;KACzD,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAEzD,uBAAuB;IACvB,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;IACtC,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,IAAI,SAAS,CAAC,CAAC;IAE7F,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,kBAAkB;IAClB,IAAI,KAAK,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC;IAE7C,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,KAAK,GAAG,mBAAmB,CAAC;YAChC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;YACxF,GAAG;YACH,aAAa;YACb,gBAAgB;SACjB,CAAC,CAAC;QAEH,OAAO;YACL,GAAG,IAAI;YACP,KAAK;SACN,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IAE9F,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,mBAAmB,WAAW,CAAC,MAAM,aAAa,CAAC;IACxE,MAAM,YAAY,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAE1D,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrC,QAAQ;QACR,KAAK,EAAE,WAAW;QAClB,OAAO;QACP,YAAY;QACZ,YAAY;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { FeedTimeRange } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Get the start of a time range as an ISO timestamp.
|
|
4
|
+
* Used to filter activities by time window.
|
|
5
|
+
*
|
|
6
|
+
* @param timeRange Time range identifier ('today', 'week', etc)
|
|
7
|
+
* @param referenceDate Optional reference date (default: now)
|
|
8
|
+
* @returns ISO timestamp string (start of range)
|
|
9
|
+
*/
|
|
10
|
+
export declare function getTimeRangeStart(timeRange: FeedTimeRange, referenceDate?: Date): string;
|
|
11
|
+
/**
|
|
12
|
+
* Get the sort column for a feed tab.
|
|
13
|
+
* Determines primary sort order for different view types.
|
|
14
|
+
*
|
|
15
|
+
* 'all' and 'digest' use created_at (reverse chronological)
|
|
16
|
+
* 'for-you' uses computed score (highest first) with created_at as tie-breaker
|
|
17
|
+
*
|
|
18
|
+
* @param tab Feed tab type
|
|
19
|
+
* @returns Column name for sorting ('created_at' or 'score')
|
|
20
|
+
*/
|
|
21
|
+
export declare function getTabSortColumn(tab: 'all' | 'for-you' | 'digest'): 'created_at' | 'score';
|
|
22
|
+
/**
|
|
23
|
+
* Get the sort direction for a feed tab.
|
|
24
|
+
*
|
|
25
|
+
* @param tab Feed tab type
|
|
26
|
+
* @returns Sort direction ('DESC' for recent-first, 'ASC' for oldest-first)
|
|
27
|
+
*/
|
|
28
|
+
export declare function getTabSortDirection(tab: 'all' | 'for-you' | 'digest'): 'ASC' | 'DESC';
|
|
29
|
+
/**
|
|
30
|
+
* Validate feed configuration parameters.
|
|
31
|
+
* Ensures limits and thresholds are within acceptable ranges.
|
|
32
|
+
*
|
|
33
|
+
* @param limit Maximum items to return
|
|
34
|
+
* @param threshold Score threshold (0-1)
|
|
35
|
+
* @returns Object with validated/clamped values
|
|
36
|
+
*/
|
|
37
|
+
export declare function validateFeedParams(limit?: number, threshold?: number): {
|
|
38
|
+
limit: number;
|
|
39
|
+
threshold: number;
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=filters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/feed/filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,aAAa,EAAE,aAAa,OAAa,GAAG,MAAM,CAwC9F;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,OAAO,CAM1F;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAOrF;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB;IACD,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAeA"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the start of a time range as an ISO timestamp.
|
|
3
|
+
* Used to filter activities by time window.
|
|
4
|
+
*
|
|
5
|
+
* @param timeRange Time range identifier ('today', 'week', etc)
|
|
6
|
+
* @param referenceDate Optional reference date (default: now)
|
|
7
|
+
* @returns ISO timestamp string (start of range)
|
|
8
|
+
*/
|
|
9
|
+
export function getTimeRangeStart(timeRange, referenceDate = new Date()) {
|
|
10
|
+
const ref = new Date(referenceDate);
|
|
11
|
+
switch (timeRange) {
|
|
12
|
+
case 'today': {
|
|
13
|
+
// Start of today
|
|
14
|
+
const today = new Date(ref.getFullYear(), ref.getMonth(), ref.getDate());
|
|
15
|
+
return today.toISOString();
|
|
16
|
+
}
|
|
17
|
+
case 'yesterday': {
|
|
18
|
+
// Start of yesterday
|
|
19
|
+
const yesterday = new Date(ref);
|
|
20
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
21
|
+
const start = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate());
|
|
22
|
+
return start.toISOString();
|
|
23
|
+
}
|
|
24
|
+
case 'week': {
|
|
25
|
+
// Start of this calendar week (Monday, or Sunday if in ISO)
|
|
26
|
+
// Using ISO: Monday = 1, Sunday = 0
|
|
27
|
+
const dayOfWeek = ref.getDay(); // 0 = Sunday, 6 = Saturday
|
|
28
|
+
const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
|
|
29
|
+
const monday = new Date(ref);
|
|
30
|
+
monday.setDate(monday.getDate() - daysToMonday);
|
|
31
|
+
const start = new Date(monday.getFullYear(), monday.getMonth(), monday.getDate());
|
|
32
|
+
return start.toISOString();
|
|
33
|
+
}
|
|
34
|
+
case 'month': {
|
|
35
|
+
// Start of this month
|
|
36
|
+
const start = new Date(ref.getFullYear(), ref.getMonth(), 1);
|
|
37
|
+
return start.toISOString();
|
|
38
|
+
}
|
|
39
|
+
case 'all':
|
|
40
|
+
default:
|
|
41
|
+
// Beginning of epoch or very far back
|
|
42
|
+
return new Date(0).toISOString();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get the sort column for a feed tab.
|
|
47
|
+
* Determines primary sort order for different view types.
|
|
48
|
+
*
|
|
49
|
+
* 'all' and 'digest' use created_at (reverse chronological)
|
|
50
|
+
* 'for-you' uses computed score (highest first) with created_at as tie-breaker
|
|
51
|
+
*
|
|
52
|
+
* @param tab Feed tab type
|
|
53
|
+
* @returns Column name for sorting ('created_at' or 'score')
|
|
54
|
+
*/
|
|
55
|
+
export function getTabSortColumn(tab) {
|
|
56
|
+
if (tab === 'for-you') {
|
|
57
|
+
return 'score';
|
|
58
|
+
}
|
|
59
|
+
// 'all' and 'digest' default to chronological
|
|
60
|
+
return 'created_at';
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get the sort direction for a feed tab.
|
|
64
|
+
*
|
|
65
|
+
* @param tab Feed tab type
|
|
66
|
+
* @returns Sort direction ('DESC' for recent-first, 'ASC' for oldest-first)
|
|
67
|
+
*/
|
|
68
|
+
export function getTabSortDirection(tab) {
|
|
69
|
+
if (tab === 'for-you') {
|
|
70
|
+
// Score: highest first (DESC)
|
|
71
|
+
return 'DESC';
|
|
72
|
+
}
|
|
73
|
+
// Chronological: most recent first (DESC)
|
|
74
|
+
return 'DESC';
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Validate feed configuration parameters.
|
|
78
|
+
* Ensures limits and thresholds are within acceptable ranges.
|
|
79
|
+
*
|
|
80
|
+
* @param limit Maximum items to return
|
|
81
|
+
* @param threshold Score threshold (0-1)
|
|
82
|
+
* @returns Object with validated/clamped values
|
|
83
|
+
*/
|
|
84
|
+
export function validateFeedParams(limit, threshold) {
|
|
85
|
+
const MIN_LIMIT = 1;
|
|
86
|
+
const MAX_LIMIT = 500;
|
|
87
|
+
const DEFAULT_LIMIT = 50;
|
|
88
|
+
const MIN_THRESHOLD = 0;
|
|
89
|
+
const MAX_THRESHOLD = 1;
|
|
90
|
+
const safeLimit = limit ? Math.max(MIN_LIMIT, Math.min(MAX_LIMIT, limit)) : DEFAULT_LIMIT;
|
|
91
|
+
const safeThreshold = threshold ? Math.max(MIN_THRESHOLD, Math.min(MAX_THRESHOLD, threshold)) : 0;
|
|
92
|
+
return {
|
|
93
|
+
limit: safeLimit,
|
|
94
|
+
threshold: safeThreshold,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.js","sourceRoot":"","sources":["../../src/feed/filters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feed system module.
|
|
3
|
+
*
|
|
4
|
+
* Provides activity aggregation, personalized ranking, and digest generation.
|
|
5
|
+
* Storage-agnostic: works with any ActivityStore implementation.
|
|
6
|
+
*
|
|
7
|
+
* Key exports:
|
|
8
|
+
* - resolveFeed() — Main entry point for personalized feeds
|
|
9
|
+
* - resolveDigest() — Daily digest of high-impact activities
|
|
10
|
+
* - computeForYouScores() — Temporal decay + importance ranking
|
|
11
|
+
* - FeedItem, FeedConfig, FeedDigest — Type contracts
|
|
12
|
+
*/
|
|
13
|
+
export type { FeedItem, FeedConfig, FeedTimeRange, FeedTab, RankingInput } from './types.js';
|
|
14
|
+
export type { DigestConfig, FeedDigest } from './types.js';
|
|
15
|
+
export { resolveFeed, resolveFeedWithTimeFilter, resolveFeedPage, buildFeedDelta, } from './resolver.js';
|
|
16
|
+
export { resolveDigest, resolveMultiDayDigest } from './digest.js';
|
|
17
|
+
export { computeForYouScores, sortByScore, filterByScore } from './ranking.js';
|
|
18
|
+
export { rowToFeedItem, rowsToFeedItems, extractFeedPreview, extractActorDisplay, extractEntityDisplay, formatActivityPlainText, } from './transformers.js';
|
|
19
|
+
export { getTimeRangeStart, getTabSortColumn, getTabSortDirection, validateFeedParams, } from './filters.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feed/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC1F,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGxD,OAAO,EACL,WAAW,EACX,yBAAyB,EACzB,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAGhE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG5E,OAAO,EACL,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feed system module.
|
|
3
|
+
*
|
|
4
|
+
* Provides activity aggregation, personalized ranking, and digest generation.
|
|
5
|
+
* Storage-agnostic: works with any ActivityStore implementation.
|
|
6
|
+
*
|
|
7
|
+
* Key exports:
|
|
8
|
+
* - resolveFeed() — Main entry point for personalized feeds
|
|
9
|
+
* - resolveDigest() — Daily digest of high-impact activities
|
|
10
|
+
* - computeForYouScores() — Temporal decay + importance ranking
|
|
11
|
+
* - FeedItem, FeedConfig, FeedDigest — Type contracts
|
|
12
|
+
*/
|
|
13
|
+
// ─── Resolver (Main Entry Points) ────────────────────────────────
|
|
14
|
+
export { resolveFeed, resolveFeedWithTimeFilter, resolveFeedPage, buildFeedDelta, } from './resolver.js';
|
|
15
|
+
// ─── Digest ──────────────────────────────────────────────────────
|
|
16
|
+
export { resolveDigest, resolveMultiDayDigest } from './digest.js';
|
|
17
|
+
// ─── Ranking Algorithm ───────────────────────────────────────────
|
|
18
|
+
export { computeForYouScores, sortByScore, filterByScore } from './ranking.js';
|
|
19
|
+
// ─── Transformers (ActivityRecord → FeedItem) ───────────────────
|
|
20
|
+
export { rowToFeedItem, rowsToFeedItems, extractFeedPreview, extractActorDisplay, extractEntityDisplay, formatActivityPlainText, } from './transformers.js';
|
|
21
|
+
// ─── Filters & Sorting ───────────────────────────────────────────
|
|
22
|
+
export { getTimeRangeStart, getTabSortColumn, getTabSortDirection, validateFeedParams, } from './filters.js';
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/feed/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,oEAAoE;AACpE,OAAO,EACL,WAAW,EACX,yBAAyB,EACzB,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,oEAAoE;AACpE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEhE,oEAAoE;AACpE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE5E,mEAAmE;AACnE,OAAO,EACL,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AAExB,oEAAoE;AACpE,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { RankingInput } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Compute "For You" relevance score for an activity.
|
|
4
|
+
*
|
|
5
|
+
* Combines:
|
|
6
|
+
* 1. Temporal score (recent > old): exponential decay with 24h half-life
|
|
7
|
+
* 2. Importance score (high > low): from metadata or direct value
|
|
8
|
+
* 3. Configurable weights for tuning (default 1.0 for both)
|
|
9
|
+
*
|
|
10
|
+
* Final score = (temporal * recencyWeight + importance * importanceWeight) / 2
|
|
11
|
+
*
|
|
12
|
+
* The score is normalized to 0-1 range and should be interpreted as:
|
|
13
|
+
* - 0.9-1.0: Highly relevant (just happened, high importance)
|
|
14
|
+
* - 0.5-0.9: Moderately relevant (recent or important)
|
|
15
|
+
* - 0.0-0.5: Lower relevance (older and/or low importance)
|
|
16
|
+
*
|
|
17
|
+
* @param input Ranking input with activity data and configuration
|
|
18
|
+
* @returns Score from 0 to 1
|
|
19
|
+
*/
|
|
20
|
+
export declare function computeForYouScores(input: RankingInput): number;
|
|
21
|
+
/**
|
|
22
|
+
* Sort feed items by score (descending).
|
|
23
|
+
* Items with equal scores maintain relative order (stable sort).
|
|
24
|
+
*
|
|
25
|
+
* @param items Feed items to sort
|
|
26
|
+
* @returns Sorted items (highest score first)
|
|
27
|
+
*/
|
|
28
|
+
export declare function sortByScore<T extends {
|
|
29
|
+
score: number;
|
|
30
|
+
}>(items: T[]): T[];
|
|
31
|
+
/**
|
|
32
|
+
* Filter items by score threshold.
|
|
33
|
+
* Useful for digest generation and importance-based filtering.
|
|
34
|
+
*
|
|
35
|
+
* @param items Feed items to filter
|
|
36
|
+
* @param minScore Minimum score (0-1)
|
|
37
|
+
* @returns Items with score >= minScore
|
|
38
|
+
*/
|
|
39
|
+
export declare function filterByScore<T extends {
|
|
40
|
+
score: number;
|
|
41
|
+
}>(items: T[], minScore: number): T[];
|
|
42
|
+
//# sourceMappingURL=ranking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ranking.d.ts","sourceRoot":"","sources":["../../src/feed/ranking.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAkF5C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAmB/D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAOxE;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAG5F"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scoring constants for ranking algorithm.
|
|
3
|
+
*/
|
|
4
|
+
const TEMPORAL_DECAY_HALF_LIFE_HOURS = 24;
|
|
5
|
+
const DEFAULT_IMPORTANCE = 0.5;
|
|
6
|
+
const IMPORTANCE_MULTIPLIER_MAP = {
|
|
7
|
+
critical: 1.0,
|
|
8
|
+
high: 0.8,
|
|
9
|
+
medium: 0.5,
|
|
10
|
+
low: 0.3,
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Compute exponential temporal decay score.
|
|
14
|
+
* Recent activities score high, older activities decay exponentially.
|
|
15
|
+
*
|
|
16
|
+
* Uses exponential decay with half-life: score(t) = 2^(-t / halfLife)
|
|
17
|
+
* At half-life hours ago: score = 0.5
|
|
18
|
+
* At 2x half-life hours ago: score = 0.25
|
|
19
|
+
* At 3x half-life hours ago: score = 0.125
|
|
20
|
+
*
|
|
21
|
+
* @param createdAt ISO timestamp string
|
|
22
|
+
* @param now Current date for computing elapsed time
|
|
23
|
+
* @returns Temporal score (0-1)
|
|
24
|
+
*/
|
|
25
|
+
function computeTemporalScore(createdAt, now) {
|
|
26
|
+
const activityTime = new Date(createdAt).getTime();
|
|
27
|
+
const nowTime = now.getTime();
|
|
28
|
+
const elapsedMs = Math.max(0, nowTime - activityTime);
|
|
29
|
+
const elapsedHours = elapsedMs / (1000 * 60 * 60);
|
|
30
|
+
// Exponential decay: 2^(-elapsed / half-life)
|
|
31
|
+
const temporalScore = Math.pow(2, -elapsedHours / TEMPORAL_DECAY_HALF_LIFE_HOURS);
|
|
32
|
+
return Math.max(0, Math.min(1, temporalScore));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Extract and normalize importance value from metadata or direct input.
|
|
36
|
+
* Handles string ('high', 'low', etc) and numeric (0-1) formats.
|
|
37
|
+
*
|
|
38
|
+
* @param importance Direct importance value if available
|
|
39
|
+
* @param metadata Activity metadata which may contain importance signal
|
|
40
|
+
* @returns Normalized importance score (0-1)
|
|
41
|
+
*/
|
|
42
|
+
function getImportanceScore(importance, metadata) {
|
|
43
|
+
// Use direct importance if provided
|
|
44
|
+
if (importance !== null && importance !== undefined) {
|
|
45
|
+
if (typeof importance === 'number') {
|
|
46
|
+
return Math.max(0, Math.min(1, importance));
|
|
47
|
+
}
|
|
48
|
+
if (typeof importance === 'string') {
|
|
49
|
+
return IMPORTANCE_MULTIPLIER_MAP[importance.toLowerCase()] ?? DEFAULT_IMPORTANCE;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Check metadata for importance signal
|
|
53
|
+
if (metadata) {
|
|
54
|
+
const metaImportance = metadata.importance;
|
|
55
|
+
if (typeof metaImportance === 'number') {
|
|
56
|
+
return Math.max(0, Math.min(1, metaImportance));
|
|
57
|
+
}
|
|
58
|
+
if (typeof metaImportance === 'string') {
|
|
59
|
+
return IMPORTANCE_MULTIPLIER_MAP[metaImportance.toLowerCase()] ?? DEFAULT_IMPORTANCE;
|
|
60
|
+
}
|
|
61
|
+
const metaPriority = metadata.priority;
|
|
62
|
+
if (typeof metaPriority === 'number') {
|
|
63
|
+
return Math.max(0, Math.min(1, metaPriority));
|
|
64
|
+
}
|
|
65
|
+
if (typeof metaPriority === 'string') {
|
|
66
|
+
return IMPORTANCE_MULTIPLIER_MAP[metaPriority.toLowerCase()] ?? DEFAULT_IMPORTANCE;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return DEFAULT_IMPORTANCE;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Compute "For You" relevance score for an activity.
|
|
73
|
+
*
|
|
74
|
+
* Combines:
|
|
75
|
+
* 1. Temporal score (recent > old): exponential decay with 24h half-life
|
|
76
|
+
* 2. Importance score (high > low): from metadata or direct value
|
|
77
|
+
* 3. Configurable weights for tuning (default 1.0 for both)
|
|
78
|
+
*
|
|
79
|
+
* Final score = (temporal * recencyWeight + importance * importanceWeight) / 2
|
|
80
|
+
*
|
|
81
|
+
* The score is normalized to 0-1 range and should be interpreted as:
|
|
82
|
+
* - 0.9-1.0: Highly relevant (just happened, high importance)
|
|
83
|
+
* - 0.5-0.9: Moderately relevant (recent or important)
|
|
84
|
+
* - 0.0-0.5: Lower relevance (older and/or low importance)
|
|
85
|
+
*
|
|
86
|
+
* @param input Ranking input with activity data and configuration
|
|
87
|
+
* @returns Score from 0 to 1
|
|
88
|
+
*/
|
|
89
|
+
export function computeForYouScores(input) {
|
|
90
|
+
const { createdAt, metadata, importance, now, recencyWeight, importanceWeight } = input;
|
|
91
|
+
// Compute component scores
|
|
92
|
+
const temporalScore = computeTemporalScore(createdAt, now);
|
|
93
|
+
const importanceScore = getImportanceScore(importance, metadata);
|
|
94
|
+
// Apply weights (clamped to 0-2 range for safety)
|
|
95
|
+
const safeRecencyWeight = Math.max(0, Math.min(2, recencyWeight || 1));
|
|
96
|
+
const safeImportanceWeight = Math.max(0, Math.min(2, importanceWeight || 1));
|
|
97
|
+
// Weighted average of temporal and importance
|
|
98
|
+
// Both components equally important by default, but weights allow tuning
|
|
99
|
+
const weightedTemporal = temporalScore * safeRecencyWeight;
|
|
100
|
+
const weightedImportance = importanceScore * safeImportanceWeight;
|
|
101
|
+
const totalWeight = safeRecencyWeight + safeImportanceWeight;
|
|
102
|
+
const finalScore = (weightedTemporal + weightedImportance) / totalWeight;
|
|
103
|
+
return Math.max(0, Math.min(1, finalScore));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Sort feed items by score (descending).
|
|
107
|
+
* Items with equal scores maintain relative order (stable sort).
|
|
108
|
+
*
|
|
109
|
+
* @param items Feed items to sort
|
|
110
|
+
* @returns Sorted items (highest score first)
|
|
111
|
+
*/
|
|
112
|
+
export function sortByScore(items) {
|
|
113
|
+
return items.slice().sort((a, b) => {
|
|
114
|
+
const scoreDiff = b.score - a.score;
|
|
115
|
+
if (scoreDiff !== 0)
|
|
116
|
+
return scoreDiff;
|
|
117
|
+
// Tie-breaker: maintain insertion order (stable sort)
|
|
118
|
+
return 0;
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Filter items by score threshold.
|
|
123
|
+
* Useful for digest generation and importance-based filtering.
|
|
124
|
+
*
|
|
125
|
+
* @param items Feed items to filter
|
|
126
|
+
* @param minScore Minimum score (0-1)
|
|
127
|
+
* @returns Items with score >= minScore
|
|
128
|
+
*/
|
|
129
|
+
export function filterByScore(items, minScore) {
|
|
130
|
+
const safeThreshold = Math.max(0, Math.min(1, minScore));
|
|
131
|
+
return items.filter((item) => item.score >= safeThreshold);
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=ranking.js.map
|