@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 @@
|
|
|
1
|
+
{"version":3,"file":"ranking.js","sourceRoot":"","sources":["../../src/feed/ranking.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { ActivityStore } from '@sprinterai/core';
|
|
2
|
+
import type { FeedConfig, FeedItem } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve a personalized feed for a user.
|
|
5
|
+
*
|
|
6
|
+
* Main entry point for feed resolution. Queries activities from storage,
|
|
7
|
+
* applies filtering and ranking based on configuration, and returns ordered items.
|
|
8
|
+
*
|
|
9
|
+
* Flow:
|
|
10
|
+
* 1. Validate parameters (limits, thresholds)
|
|
11
|
+
* 2. Query activities from store with filters
|
|
12
|
+
* 3. Convert ActivityRecords to FeedItems
|
|
13
|
+
* 4. Apply ranking based on tab type ('for-you', 'all', 'digest')
|
|
14
|
+
* 5. Sort by score/time
|
|
15
|
+
* 6. Return final items
|
|
16
|
+
*
|
|
17
|
+
* Storage-agnostic: works with any ActivityStore implementation.
|
|
18
|
+
*
|
|
19
|
+
* @param store ActivityStore implementation
|
|
20
|
+
* @param config Feed configuration (filters, limits, personalization)
|
|
21
|
+
* @returns Array of FeedItems sorted by relevance (for-you) or recency (all/digest)
|
|
22
|
+
* @throws Error if store query fails
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveFeed(store: ActivityStore, config: FeedConfig): Promise<FeedItem[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Resolve feed with time-based filtering.
|
|
27
|
+
*
|
|
28
|
+
* Convenience wrapper around resolveFeed that automatically adds time range filtering.
|
|
29
|
+
* Queries activities created after the start of the specified time window.
|
|
30
|
+
*
|
|
31
|
+
* @param store ActivityStore implementation
|
|
32
|
+
* @param config Feed configuration
|
|
33
|
+
* @returns Array of FeedItems within the time range
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveFeedWithTimeFilter(store: ActivityStore, config: FeedConfig): Promise<FeedItem[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Paginate through feed items using cursor-based pagination.
|
|
38
|
+
*
|
|
39
|
+
* Convenience helper for implementing pagination in UIs.
|
|
40
|
+
* Returns items before the given cursor (ISO timestamp).
|
|
41
|
+
*
|
|
42
|
+
* Usage:
|
|
43
|
+
* ```
|
|
44
|
+
* const page1 = await resolveFeedPage(store, config); // First page
|
|
45
|
+
* const page2 = await resolveFeedPage(store, {
|
|
46
|
+
* ...config,
|
|
47
|
+
* before: page1[page1.length - 1].createdAt, // Use last item as cursor
|
|
48
|
+
* }); // Next page
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* @param store ActivityStore implementation
|
|
52
|
+
* @param config Feed configuration with optional 'before' cursor
|
|
53
|
+
* @returns Array of FeedItems for this page
|
|
54
|
+
*/
|
|
55
|
+
export declare function resolveFeedPage(store: ActivityStore, config: FeedConfig): Promise<FeedItem[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Build a feed update delta for real-time feeds.
|
|
58
|
+
*
|
|
59
|
+
* Compares old feed state with new state and returns only changed items.
|
|
60
|
+
* Useful for real-time updates without re-rendering entire feed.
|
|
61
|
+
*
|
|
62
|
+
* Returns an object with:
|
|
63
|
+
* - added: Items in new but not in old
|
|
64
|
+
* - removed: Items in old but not in new
|
|
65
|
+
* - updated: Items that changed (same id, different fields)
|
|
66
|
+
*
|
|
67
|
+
* @param oldItems Previous feed state
|
|
68
|
+
* @param newItems Current feed state
|
|
69
|
+
* @returns Delta with added/removed/updated items
|
|
70
|
+
*/
|
|
71
|
+
export declare function buildFeedDelta(oldItems: FeedItem[], newItems: FeedItem[]): {
|
|
72
|
+
added: FeedItem[];
|
|
73
|
+
removed: FeedItem[];
|
|
74
|
+
updated: FeedItem[];
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/feed/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKtD,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAmE/F;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAgBrB;AA+BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAErB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,EAAE,EACpB,QAAQ,EAAE,QAAQ,EAAE,GACnB;IACD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB,CAeA"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { getTimeRangeStart, validateFeedParams } from './filters.js';
|
|
2
|
+
import { computeForYouScores, sortByScore } from './ranking.js';
|
|
3
|
+
import { rowsToFeedItems } from './transformers.js';
|
|
4
|
+
/**
|
|
5
|
+
* Resolve a personalized feed for a user.
|
|
6
|
+
*
|
|
7
|
+
* Main entry point for feed resolution. Queries activities from storage,
|
|
8
|
+
* applies filtering and ranking based on configuration, and returns ordered items.
|
|
9
|
+
*
|
|
10
|
+
* Flow:
|
|
11
|
+
* 1. Validate parameters (limits, thresholds)
|
|
12
|
+
* 2. Query activities from store with filters
|
|
13
|
+
* 3. Convert ActivityRecords to FeedItems
|
|
14
|
+
* 4. Apply ranking based on tab type ('for-you', 'all', 'digest')
|
|
15
|
+
* 5. Sort by score/time
|
|
16
|
+
* 6. Return final items
|
|
17
|
+
*
|
|
18
|
+
* Storage-agnostic: works with any ActivityStore implementation.
|
|
19
|
+
*
|
|
20
|
+
* @param store ActivityStore implementation
|
|
21
|
+
* @param config Feed configuration (filters, limits, personalization)
|
|
22
|
+
* @returns Array of FeedItems sorted by relevance (for-you) or recency (all/digest)
|
|
23
|
+
* @throws Error if store query fails
|
|
24
|
+
*/
|
|
25
|
+
export async function resolveFeed(store, config) {
|
|
26
|
+
const { tab = 'all', entityId, actorId, action, limit, before, userId, includeImportance = true, importanceWeight = 1.0, recencyWeight = 1.0, } = config;
|
|
27
|
+
// Validate parameters
|
|
28
|
+
const { limit: safeLimit } = validateFeedParams(limit);
|
|
29
|
+
// Build activity query options
|
|
30
|
+
const queryOptions = {
|
|
31
|
+
limit: safeLimit,
|
|
32
|
+
entityId,
|
|
33
|
+
actorId,
|
|
34
|
+
action,
|
|
35
|
+
before,
|
|
36
|
+
};
|
|
37
|
+
// Query activities from store
|
|
38
|
+
const records = await store.listActivities(queryOptions);
|
|
39
|
+
if (records.length === 0) {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
// Convert to FeedItems with default scores
|
|
43
|
+
let feedItems = rowsToFeedItems(records);
|
|
44
|
+
// Apply ranking if 'for-you' tab
|
|
45
|
+
if (tab === 'for-you' && userId) {
|
|
46
|
+
const now = new Date();
|
|
47
|
+
feedItems = feedItems.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
|
+
feedItems = sortByScore(feedItems);
|
|
63
|
+
}
|
|
64
|
+
else if (tab === 'all' || tab === 'digest') {
|
|
65
|
+
// Sort by creation time (most recent first)
|
|
66
|
+
feedItems = feedItems.sort((a, b) => {
|
|
67
|
+
const timeA = new Date(a.createdAt).getTime();
|
|
68
|
+
const timeB = new Date(b.createdAt).getTime();
|
|
69
|
+
return timeB - timeA; // Descending (most recent first)
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return feedItems;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Resolve feed with time-based filtering.
|
|
76
|
+
*
|
|
77
|
+
* Convenience wrapper around resolveFeed that automatically adds time range filtering.
|
|
78
|
+
* Queries activities created after the start of the specified time window.
|
|
79
|
+
*
|
|
80
|
+
* @param store ActivityStore implementation
|
|
81
|
+
* @param config Feed configuration
|
|
82
|
+
* @returns Array of FeedItems within the time range
|
|
83
|
+
*/
|
|
84
|
+
export async function resolveFeedWithTimeFilter(store, config) {
|
|
85
|
+
// Get time range start (if specified)
|
|
86
|
+
const timeRange = config.timeRange ?? 'week';
|
|
87
|
+
const startISO = getTimeRangeStart(timeRange);
|
|
88
|
+
// Query returns items created BEFORE the 'before' cursor
|
|
89
|
+
// To filter by time range, we don't use 'before' -- the store returns
|
|
90
|
+
// recent items by default (or we trust the store's ordering).
|
|
91
|
+
// If we want to enforce a time window, consumers can add this logic:
|
|
92
|
+
// After fetching, filter out items older than startISO
|
|
93
|
+
const items = await resolveFeed(store, config);
|
|
94
|
+
// Filter by time range
|
|
95
|
+
const startTime = new Date(startISO).getTime();
|
|
96
|
+
return items.filter((item) => new Date(item.createdAt).getTime() >= startTime);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Extract importance value from activity metadata.
|
|
100
|
+
* Looks for 'importance' or 'priority' fields (numeric or string).
|
|
101
|
+
*
|
|
102
|
+
* @param metadata Activity metadata
|
|
103
|
+
* @returns Importance value (number, string) or null
|
|
104
|
+
*/
|
|
105
|
+
function extractImportanceFromMetadata(metadata) {
|
|
106
|
+
if (!metadata)
|
|
107
|
+
return null;
|
|
108
|
+
if ('importance' in metadata) {
|
|
109
|
+
const imp = metadata.importance;
|
|
110
|
+
if (typeof imp === 'number' || typeof imp === 'string') {
|
|
111
|
+
return imp;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if ('priority' in metadata) {
|
|
115
|
+
const pri = metadata.priority;
|
|
116
|
+
if (typeof pri === 'number' || typeof pri === 'string') {
|
|
117
|
+
return pri;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Paginate through feed items using cursor-based pagination.
|
|
124
|
+
*
|
|
125
|
+
* Convenience helper for implementing pagination in UIs.
|
|
126
|
+
* Returns items before the given cursor (ISO timestamp).
|
|
127
|
+
*
|
|
128
|
+
* Usage:
|
|
129
|
+
* ```
|
|
130
|
+
* const page1 = await resolveFeedPage(store, config); // First page
|
|
131
|
+
* const page2 = await resolveFeedPage(store, {
|
|
132
|
+
* ...config,
|
|
133
|
+
* before: page1[page1.length - 1].createdAt, // Use last item as cursor
|
|
134
|
+
* }); // Next page
|
|
135
|
+
* ```
|
|
136
|
+
*
|
|
137
|
+
* @param store ActivityStore implementation
|
|
138
|
+
* @param config Feed configuration with optional 'before' cursor
|
|
139
|
+
* @returns Array of FeedItems for this page
|
|
140
|
+
*/
|
|
141
|
+
export async function resolveFeedPage(store, config) {
|
|
142
|
+
return resolveFeed(store, config);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Build a feed update delta for real-time feeds.
|
|
146
|
+
*
|
|
147
|
+
* Compares old feed state with new state and returns only changed items.
|
|
148
|
+
* Useful for real-time updates without re-rendering entire feed.
|
|
149
|
+
*
|
|
150
|
+
* Returns an object with:
|
|
151
|
+
* - added: Items in new but not in old
|
|
152
|
+
* - removed: Items in old but not in new
|
|
153
|
+
* - updated: Items that changed (same id, different fields)
|
|
154
|
+
*
|
|
155
|
+
* @param oldItems Previous feed state
|
|
156
|
+
* @param newItems Current feed state
|
|
157
|
+
* @returns Delta with added/removed/updated items
|
|
158
|
+
*/
|
|
159
|
+
export function buildFeedDelta(oldItems, newItems) {
|
|
160
|
+
const oldIds = new Map(oldItems.map((item) => [item.id, item]));
|
|
161
|
+
const newIds = new Map(newItems.map((item) => [item.id, item]));
|
|
162
|
+
const added = newItems.filter((item) => !oldIds.has(item.id));
|
|
163
|
+
const removed = oldItems.filter((item) => !newIds.has(item.id));
|
|
164
|
+
const updated = newItems.filter((newItem) => {
|
|
165
|
+
const oldItem = oldIds.get(newItem.id);
|
|
166
|
+
if (!oldItem)
|
|
167
|
+
return false;
|
|
168
|
+
// Check if any field changed (shallow comparison)
|
|
169
|
+
return JSON.stringify(oldItem) !== JSON.stringify(newItem);
|
|
170
|
+
});
|
|
171
|
+
return { added, removed, updated };
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/feed/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { ActivityRecord } from '@sprinterai/core';
|
|
2
|
+
import type { FeedItem } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Transform an ActivityRecord to a FeedItem.
|
|
5
|
+
* Converts storage format to display format with score and preview.
|
|
6
|
+
*
|
|
7
|
+
* This is the primary transformer for converting database records to feed display items.
|
|
8
|
+
* It handles:
|
|
9
|
+
* - Name extraction from metadata (entity and actor names)
|
|
10
|
+
* - Score defaulting (if not provided)
|
|
11
|
+
* - Preview text generation
|
|
12
|
+
* - Type-safe field mapping
|
|
13
|
+
*
|
|
14
|
+
* @param record Activity record from storage
|
|
15
|
+
* @param score Ranking score (0-1), defaults to 0.5
|
|
16
|
+
* @param entityName Optional entity name to override metadata lookup
|
|
17
|
+
* @param actorName Optional actor name to override metadata lookup
|
|
18
|
+
* @returns FeedItem ready for display
|
|
19
|
+
*/
|
|
20
|
+
export declare function rowToFeedItem(record: ActivityRecord, score?: number, entityName?: string, actorName?: string): FeedItem;
|
|
21
|
+
/**
|
|
22
|
+
* Transform multiple ActivityRecords to FeedItems.
|
|
23
|
+
* Convenience bulk version of rowToFeedItem.
|
|
24
|
+
*
|
|
25
|
+
* @param records Activity records from storage
|
|
26
|
+
* @param scores Optional array of scores (must match records length if provided)
|
|
27
|
+
* @returns Array of FeedItems
|
|
28
|
+
*/
|
|
29
|
+
export declare function rowsToFeedItems(records: ActivityRecord[], scores?: number[]): FeedItem[];
|
|
30
|
+
/**
|
|
31
|
+
* Extract preview text for display in feed items.
|
|
32
|
+
* Creates a short human-readable summary of the activity.
|
|
33
|
+
*
|
|
34
|
+
* Priority:
|
|
35
|
+
* 1. If description exists, use it (typically for comments, detailed updates)
|
|
36
|
+
* 2. If metadata.preview exists, use it (pre-computed display text)
|
|
37
|
+
* 3. Generate from metadata.field + old/new values (for field changes)
|
|
38
|
+
* 4. Generate from action type (INSERT → "created", UPDATE → "updated", etc)
|
|
39
|
+
* 5. Default fallback text
|
|
40
|
+
*
|
|
41
|
+
* The preview is typically 1-2 lines and used in list views.
|
|
42
|
+
*
|
|
43
|
+
* @param record Activity record
|
|
44
|
+
* @returns Preview text suitable for display
|
|
45
|
+
*/
|
|
46
|
+
export declare function extractFeedPreview(record: ActivityRecord): string;
|
|
47
|
+
/**
|
|
48
|
+
* Extract actor display info from record.
|
|
49
|
+
* Returns name and type suitable for avatar and label display.
|
|
50
|
+
*
|
|
51
|
+
* @param record Activity record
|
|
52
|
+
* @returns Object with name and type for display
|
|
53
|
+
*/
|
|
54
|
+
export declare function extractActorDisplay(record: ActivityRecord): {
|
|
55
|
+
name: string;
|
|
56
|
+
type: 'user' | 'agent' | 'system';
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Extract entity display info from record.
|
|
60
|
+
* Returns name and type suitable for label and badge display.
|
|
61
|
+
*
|
|
62
|
+
* @param record Activity record
|
|
63
|
+
* @returns Object with name and type for display
|
|
64
|
+
*/
|
|
65
|
+
export declare function extractEntityDisplay(record: ActivityRecord): {
|
|
66
|
+
name?: string;
|
|
67
|
+
type?: string;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Format activity for plain text output (logs, exports, etc).
|
|
71
|
+
* Creates a one-line summary suitable for text-based feeds.
|
|
72
|
+
*
|
|
73
|
+
* Format: "[Actor] [action] [entity] at [time]"
|
|
74
|
+
* Example: "Alice updated Project ABC at 2:45 PM"
|
|
75
|
+
*
|
|
76
|
+
* @param record Activity record
|
|
77
|
+
* @returns Plain text summary
|
|
78
|
+
*/
|
|
79
|
+
export declare function formatActivityPlainText(record: ActivityRecord): string;
|
|
80
|
+
//# sourceMappingURL=transformers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers.d.ts","sourceRoot":"","sources":["../../src/feed/transformers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAQxC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,KAAK,GAAE,MAAsB,EAC7B,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,QAAQ,CAgCV;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAKxF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAmCjE;AAwBD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;CACnC,CAUA;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAQA;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAYtE"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default score when no ranking has been applied yet.
|
|
3
|
+
* Used as fallback for items not yet ranked.
|
|
4
|
+
*/
|
|
5
|
+
const DEFAULT_SCORE = 0.5;
|
|
6
|
+
/**
|
|
7
|
+
* Transform an ActivityRecord to a FeedItem.
|
|
8
|
+
* Converts storage format to display format with score and preview.
|
|
9
|
+
*
|
|
10
|
+
* This is the primary transformer for converting database records to feed display items.
|
|
11
|
+
* It handles:
|
|
12
|
+
* - Name extraction from metadata (entity and actor names)
|
|
13
|
+
* - Score defaulting (if not provided)
|
|
14
|
+
* - Preview text generation
|
|
15
|
+
* - Type-safe field mapping
|
|
16
|
+
*
|
|
17
|
+
* @param record Activity record from storage
|
|
18
|
+
* @param score Ranking score (0-1), defaults to 0.5
|
|
19
|
+
* @param entityName Optional entity name to override metadata lookup
|
|
20
|
+
* @param actorName Optional actor name to override metadata lookup
|
|
21
|
+
* @returns FeedItem ready for display
|
|
22
|
+
*/
|
|
23
|
+
export function rowToFeedItem(record, score = DEFAULT_SCORE, entityName, actorName) {
|
|
24
|
+
const safeScore = Math.max(0, Math.min(1, score));
|
|
25
|
+
// Extract entity name from metadata if not provided
|
|
26
|
+
const finalEntityName = entityName ??
|
|
27
|
+
(typeof record.metadata?.entityName === 'string' ? record.metadata.entityName : undefined);
|
|
28
|
+
// Extract actor name from metadata if not provided
|
|
29
|
+
const finalActorName = actorName ??
|
|
30
|
+
(typeof record.metadata?.actorName === 'string' ? record.metadata.actorName : undefined);
|
|
31
|
+
// Generate preview text
|
|
32
|
+
const preview = extractFeedPreview(record);
|
|
33
|
+
return {
|
|
34
|
+
id: record.id,
|
|
35
|
+
entityId: record.entity_id,
|
|
36
|
+
entityTypeSlug: record.entity_type_slug,
|
|
37
|
+
entityName: finalEntityName,
|
|
38
|
+
action: record.action,
|
|
39
|
+
description: record.description,
|
|
40
|
+
actorId: record.actor_id,
|
|
41
|
+
actorName: finalActorName,
|
|
42
|
+
actorType: record.actor_type,
|
|
43
|
+
metadata: record.metadata,
|
|
44
|
+
createdAt: record.created_at,
|
|
45
|
+
score: safeScore,
|
|
46
|
+
preview,
|
|
47
|
+
tenantId: record.tenant_id,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Transform multiple ActivityRecords to FeedItems.
|
|
52
|
+
* Convenience bulk version of rowToFeedItem.
|
|
53
|
+
*
|
|
54
|
+
* @param records Activity records from storage
|
|
55
|
+
* @param scores Optional array of scores (must match records length if provided)
|
|
56
|
+
* @returns Array of FeedItems
|
|
57
|
+
*/
|
|
58
|
+
export function rowsToFeedItems(records, scores) {
|
|
59
|
+
return records.map((record, index) => {
|
|
60
|
+
const score = scores ? (scores[index] ?? DEFAULT_SCORE) : DEFAULT_SCORE;
|
|
61
|
+
return rowToFeedItem(record, score);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Extract preview text for display in feed items.
|
|
66
|
+
* Creates a short human-readable summary of the activity.
|
|
67
|
+
*
|
|
68
|
+
* Priority:
|
|
69
|
+
* 1. If description exists, use it (typically for comments, detailed updates)
|
|
70
|
+
* 2. If metadata.preview exists, use it (pre-computed display text)
|
|
71
|
+
* 3. Generate from metadata.field + old/new values (for field changes)
|
|
72
|
+
* 4. Generate from action type (INSERT → "created", UPDATE → "updated", etc)
|
|
73
|
+
* 5. Default fallback text
|
|
74
|
+
*
|
|
75
|
+
* The preview is typically 1-2 lines and used in list views.
|
|
76
|
+
*
|
|
77
|
+
* @param record Activity record
|
|
78
|
+
* @returns Preview text suitable for display
|
|
79
|
+
*/
|
|
80
|
+
export function extractFeedPreview(record) {
|
|
81
|
+
// Use description if available (comments, detailed changes)
|
|
82
|
+
if (record.description) {
|
|
83
|
+
return record.description.slice(0, 200); // Cap at 200 chars
|
|
84
|
+
}
|
|
85
|
+
// Check metadata for pre-computed preview
|
|
86
|
+
if (typeof record.metadata?.preview === 'string') {
|
|
87
|
+
return record.metadata.preview.slice(0, 200);
|
|
88
|
+
}
|
|
89
|
+
// Generate from field change data
|
|
90
|
+
if (record.metadata &&
|
|
91
|
+
typeof record.metadata.field === 'string' &&
|
|
92
|
+
record.metadata.oldValue !== undefined &&
|
|
93
|
+
record.metadata.newValue !== undefined) {
|
|
94
|
+
const oldVal = String(record.metadata.oldValue).slice(0, 50);
|
|
95
|
+
const newVal = String(record.metadata.newValue).slice(0, 50);
|
|
96
|
+
return `${record.metadata.field}: ${oldVal} → ${newVal}`;
|
|
97
|
+
}
|
|
98
|
+
// Generate from action type
|
|
99
|
+
const actionLabel = getActionLabel(record.action);
|
|
100
|
+
if (actionLabel !== record.action) {
|
|
101
|
+
// We have a better label
|
|
102
|
+
if (record.entity_type_slug) {
|
|
103
|
+
return `${actionLabel} ${record.entity_type_slug}`;
|
|
104
|
+
}
|
|
105
|
+
return actionLabel;
|
|
106
|
+
}
|
|
107
|
+
// Fallback
|
|
108
|
+
return record.action.toLowerCase();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get human-readable label for an action type.
|
|
112
|
+
* Maps database action codes to display labels.
|
|
113
|
+
*
|
|
114
|
+
* @param action Action code (INSERT, UPDATE, DELETE, etc)
|
|
115
|
+
* @returns Display label
|
|
116
|
+
*/
|
|
117
|
+
function getActionLabel(action) {
|
|
118
|
+
const labels = {
|
|
119
|
+
INSERT: 'Created',
|
|
120
|
+
UPDATE: 'Updated',
|
|
121
|
+
DELETE: 'Deleted',
|
|
122
|
+
comment: 'Commented',
|
|
123
|
+
status_change: 'Changed status',
|
|
124
|
+
assigned: 'Assigned',
|
|
125
|
+
shared: 'Shared',
|
|
126
|
+
unshared: 'Unshared',
|
|
127
|
+
};
|
|
128
|
+
return labels[action] ?? action;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Extract actor display info from record.
|
|
132
|
+
* Returns name and type suitable for avatar and label display.
|
|
133
|
+
*
|
|
134
|
+
* @param record Activity record
|
|
135
|
+
* @returns Object with name and type for display
|
|
136
|
+
*/
|
|
137
|
+
export function extractActorDisplay(record) {
|
|
138
|
+
// Prefer metadata.actorName
|
|
139
|
+
const nameFromMeta = typeof record.metadata?.actorName === 'string' ? record.metadata.actorName : null;
|
|
140
|
+
const name = nameFromMeta ?? record.actor_id ?? 'System';
|
|
141
|
+
const type = record.actor_type === 'user' || record.actor_type === 'agent' ? record.actor_type : 'system';
|
|
142
|
+
return { name, type };
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Extract entity display info from record.
|
|
146
|
+
* Returns name and type suitable for label and badge display.
|
|
147
|
+
*
|
|
148
|
+
* @param record Activity record
|
|
149
|
+
* @returns Object with name and type for display
|
|
150
|
+
*/
|
|
151
|
+
export function extractEntityDisplay(record) {
|
|
152
|
+
const nameFromMeta = typeof record.metadata?.entityName === 'string' ? record.metadata.entityName : null;
|
|
153
|
+
return {
|
|
154
|
+
name: nameFromMeta ?? record.entity_id ?? undefined,
|
|
155
|
+
type: record.entity_type_slug ?? undefined,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Format activity for plain text output (logs, exports, etc).
|
|
160
|
+
* Creates a one-line summary suitable for text-based feeds.
|
|
161
|
+
*
|
|
162
|
+
* Format: "[Actor] [action] [entity] at [time]"
|
|
163
|
+
* Example: "Alice updated Project ABC at 2:45 PM"
|
|
164
|
+
*
|
|
165
|
+
* @param record Activity record
|
|
166
|
+
* @returns Plain text summary
|
|
167
|
+
*/
|
|
168
|
+
export function formatActivityPlainText(record) {
|
|
169
|
+
const actor = extractActorDisplay(record);
|
|
170
|
+
const entity = extractEntityDisplay(record);
|
|
171
|
+
const actionLabel = getActionLabel(record.action);
|
|
172
|
+
const time = new Date(record.created_at).toLocaleTimeString('en-US', {
|
|
173
|
+
hour: 'numeric',
|
|
174
|
+
minute: '2-digit',
|
|
175
|
+
});
|
|
176
|
+
const entityPart = entity.name ? ` ${entity.name}` : '';
|
|
177
|
+
return `${actor.name} ${actionLabel.toLowerCase()}${entityPart} at ${time}`;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=transformers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers.js","sourceRoot":"","sources":["../../src/feed/transformers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feed system types for activity aggregation, ranking, and digest generation.
|
|
3
|
+
* Supports time-based filtering, personalized ranking, and daily digest summaries.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Time range for feed queries.
|
|
7
|
+
* Allows filtering activities by relative windows (last 24h, 7d, etc).
|
|
8
|
+
*/
|
|
9
|
+
export type FeedTimeRange = 'today' | 'yesterday' | 'week' | 'month' | 'all';
|
|
10
|
+
/**
|
|
11
|
+
* Available feed tabs/views.
|
|
12
|
+
* Determines which activities to show and sorting strategy.
|
|
13
|
+
*/
|
|
14
|
+
export type FeedTab = 'all' | 'for-you' | 'digest';
|
|
15
|
+
/**
|
|
16
|
+
* A feed item combining activity data with ranking score and preview text.
|
|
17
|
+
* Used for display in activity feeds, digests, and notifications.
|
|
18
|
+
*/
|
|
19
|
+
export interface FeedItem {
|
|
20
|
+
/** Unique identifier */
|
|
21
|
+
id: string;
|
|
22
|
+
/** Entity being acted upon (e.g., document ID) */
|
|
23
|
+
entityId: string | null;
|
|
24
|
+
/** Entity type slug (e.g., 'project', 'task') */
|
|
25
|
+
entityTypeSlug: string | null;
|
|
26
|
+
/** User-facing entity name for display */
|
|
27
|
+
entityName?: string;
|
|
28
|
+
/** Action type: 'INSERT', 'UPDATE', 'DELETE', 'comment', etc. */
|
|
29
|
+
action: string;
|
|
30
|
+
/** Short description of what happened */
|
|
31
|
+
description: string | null;
|
|
32
|
+
/** Who performed the action */
|
|
33
|
+
actorId: string | null;
|
|
34
|
+
/** Actor name for display (may be system) */
|
|
35
|
+
actorName?: string;
|
|
36
|
+
/** Actor type: 'user', 'agent', or null for system */
|
|
37
|
+
actorType: 'user' | 'agent' | null;
|
|
38
|
+
/** Additional metadata from the activity */
|
|
39
|
+
metadata?: Record<string, unknown> | null;
|
|
40
|
+
/** ISO timestamp */
|
|
41
|
+
createdAt: string;
|
|
42
|
+
/** Ranking score (0-1). Higher = more relevant. Used in 'for-you' tab. */
|
|
43
|
+
score: number;
|
|
44
|
+
/** Short preview text for display (typically description or generated) */
|
|
45
|
+
preview?: string;
|
|
46
|
+
/** Tenant ID for scoping */
|
|
47
|
+
tenantId: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Configuration for feed resolution.
|
|
51
|
+
* Controls filtering, time range, limit, and personalization.
|
|
52
|
+
*/
|
|
53
|
+
export interface FeedConfig {
|
|
54
|
+
/** Which feed tab (all, for-you, digest) */
|
|
55
|
+
tab?: FeedTab;
|
|
56
|
+
/** Time range filter */
|
|
57
|
+
timeRange?: FeedTimeRange;
|
|
58
|
+
/** Filter to specific entity */
|
|
59
|
+
entityId?: string;
|
|
60
|
+
/** Filter to specific actor */
|
|
61
|
+
actorId?: string;
|
|
62
|
+
/** Filter to specific action type */
|
|
63
|
+
action?: string;
|
|
64
|
+
/** Maximum number of items */
|
|
65
|
+
limit?: number;
|
|
66
|
+
/** Cursor for pagination (ISO timestamp, return items created before this) */
|
|
67
|
+
before?: string;
|
|
68
|
+
/** Tenant ID (required for RLS / scoping) */
|
|
69
|
+
tenantId: string;
|
|
70
|
+
/** User ID for personalization (optional, used by 'for-you' ranking) */
|
|
71
|
+
userId?: string;
|
|
72
|
+
/** Include importance scores in ranking (if available in metadata) */
|
|
73
|
+
includeImportance?: boolean;
|
|
74
|
+
/** Custom importance weight multiplier (0-2). Default 1. */
|
|
75
|
+
importanceWeight?: number;
|
|
76
|
+
/** Custom recency weight multiplier (0-2). Default 1. */
|
|
77
|
+
recencyWeight?: number;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Ranking input for scoring activities.
|
|
81
|
+
* Combines activity metadata with temporal decay and optional importance.
|
|
82
|
+
*/
|
|
83
|
+
export interface RankingInput {
|
|
84
|
+
/** ISO timestamp of activity */
|
|
85
|
+
createdAt: string;
|
|
86
|
+
/** Activity metadata which may contain importance signal */
|
|
87
|
+
metadata?: Record<string, unknown> | null;
|
|
88
|
+
/** Importance value if available (typically 0-1 or 'high'/'medium'/'low') */
|
|
89
|
+
importance?: number | string | null;
|
|
90
|
+
/** Current time for computing temporal decay */
|
|
91
|
+
now: Date;
|
|
92
|
+
/** Weight multiplier for recency (0-2) */
|
|
93
|
+
recencyWeight: number;
|
|
94
|
+
/** Weight multiplier for importance (0-2) */
|
|
95
|
+
importanceWeight: number;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Digest configuration for daily summaries.
|
|
99
|
+
* Identifies high-impact activities for notification/email.
|
|
100
|
+
*/
|
|
101
|
+
export interface DigestConfig extends FeedConfig {
|
|
102
|
+
/** Maximum items in digest (typically 5-10) */
|
|
103
|
+
digestLimit?: number;
|
|
104
|
+
/** Minimum score threshold to include in digest (0-1) */
|
|
105
|
+
minScoreThreshold?: number;
|
|
106
|
+
/** Include low-scoring but recent items (for variety) */
|
|
107
|
+
includeRecent?: boolean;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Daily digest result.
|
|
111
|
+
* Summarizes important activities from the past 24 hours.
|
|
112
|
+
*/
|
|
113
|
+
export interface FeedDigest {
|
|
114
|
+
/** ISO date string (YYYY-MM-DD) */
|
|
115
|
+
date: string;
|
|
116
|
+
/** Tenant ID */
|
|
117
|
+
tenantId: string;
|
|
118
|
+
/** High-impact activities (ranked by importance + recency) */
|
|
119
|
+
items: FeedItem[];
|
|
120
|
+
/** Summary statistics */
|
|
121
|
+
summary: {
|
|
122
|
+
total: number;
|
|
123
|
+
byAction: Record<string, number>;
|
|
124
|
+
byActor: Record<string, number>;
|
|
125
|
+
};
|
|
126
|
+
/** Suggested email subject line */
|
|
127
|
+
emailSubject?: string;
|
|
128
|
+
/** Pre-computed HTML preview for email rendering */
|
|
129
|
+
emailPreview?: string;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=types.d.ts.map
|