@sprinterai/runtime 0.7.1 → 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 +66 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +48 -1
- package/dist/index.js.map +1 -1
- 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/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/index.d.ts +2 -0
- package/dist/tool/index.d.ts.map +1 -1
- package/dist/tool/index.js +1 -0
- 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/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/index.d.ts +3 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +4 -0
- package/dist/workflow/index.js.map +1 -1
- 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 +106 -2
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { HeartbeatRunStore, HeartbeatRunRecord, CompleteHeartbeatRunMetrics } from '@sprinterai/core';
|
|
2
|
+
export interface CreateHeartbeatRunOptions {
|
|
3
|
+
tenantId: string;
|
|
4
|
+
triggerType?: string;
|
|
5
|
+
prompt?: string;
|
|
6
|
+
/** Optional idempotency key (e.g. Inngest run ID) for deduplication. */
|
|
7
|
+
idempotencyKey?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Create a new heartbeat run for an agent.
|
|
11
|
+
* If an idempotency key is provided and a run with that key already exists,
|
|
12
|
+
* the existing run is returned (safe for retry scenarios).
|
|
13
|
+
*/
|
|
14
|
+
export declare function createHeartbeatRun(store: HeartbeatRunStore, agentId: string, options: CreateHeartbeatRunOptions): Promise<HeartbeatRunRecord>;
|
|
15
|
+
/**
|
|
16
|
+
* Mark a heartbeat run as completed with optional metrics.
|
|
17
|
+
*/
|
|
18
|
+
export declare function completeHeartbeatRun(store: HeartbeatRunStore, runId: string, metrics?: CompleteHeartbeatRunMetrics): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Mark a heartbeat run as failed with an error message.
|
|
21
|
+
*/
|
|
22
|
+
export declare function failHeartbeatRun(store: HeartbeatRunStore, runId: string, error: string | Error): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Get recent heartbeat run history for a specific agent.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getHeartbeatRunHistory(store: HeartbeatRunStore, agentId: string, limit?: number): Promise<HeartbeatRunRecord[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Get all recent heartbeat runs across all agents for a tenant.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getAllRecentHeartbeatRuns(store: HeartbeatRunStore, tenantId: string, limit?: number): Promise<HeartbeatRunRecord[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Mark all still-running heartbeat runs that have exceeded `maxDurationMs`
|
|
33
|
+
* as stale. Returns the number of runs cleaned up.
|
|
34
|
+
*/
|
|
35
|
+
export declare function cleanupStaleHeartbeatRuns(store: HeartbeatRunStore, maxDurationMs: number): Promise<number>;
|
|
36
|
+
//# sourceMappingURL=heartbeat-scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat-scheduler.d.ts","sourceRoot":"","sources":["../../src/agent/heartbeat-scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,2BAA2B,EAC5B,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,kBAAkB,CAAC,CAiB7B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GAAG,KAAK,GACpB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,MAAM,EACf,KAAK,SAAK,GACT,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAE/B;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAK,GACT,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAE/B;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,iBAAiB,EACxB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAMjB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a new heartbeat run for an agent.
|
|
3
|
+
* If an idempotency key is provided and a run with that key already exists,
|
|
4
|
+
* the existing run is returned (safe for retry scenarios).
|
|
5
|
+
*/
|
|
6
|
+
export async function createHeartbeatRun(store, agentId, options) {
|
|
7
|
+
if (options.idempotencyKey) {
|
|
8
|
+
const existing = await store.findByIdempotencyKey(agentId, options.tenantId, options.idempotencyKey);
|
|
9
|
+
if (existing)
|
|
10
|
+
return existing;
|
|
11
|
+
}
|
|
12
|
+
return store.createRun({
|
|
13
|
+
agentId,
|
|
14
|
+
tenantId: options.tenantId,
|
|
15
|
+
triggerType: options.triggerType,
|
|
16
|
+
prompt: options.prompt,
|
|
17
|
+
idempotencyKey: options.idempotencyKey,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Mark a heartbeat run as completed with optional metrics.
|
|
22
|
+
*/
|
|
23
|
+
export async function completeHeartbeatRun(store, runId, metrics) {
|
|
24
|
+
return store.completeRun(runId, metrics);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Mark a heartbeat run as failed with an error message.
|
|
28
|
+
*/
|
|
29
|
+
export async function failHeartbeatRun(store, runId, error) {
|
|
30
|
+
const message = error instanceof Error ? error.message : error;
|
|
31
|
+
return store.failRun(runId, message);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get recent heartbeat run history for a specific agent.
|
|
35
|
+
*/
|
|
36
|
+
export async function getHeartbeatRunHistory(store, agentId, limit = 20) {
|
|
37
|
+
return store.getRunHistory(agentId, limit);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get all recent heartbeat runs across all agents for a tenant.
|
|
41
|
+
*/
|
|
42
|
+
export async function getAllRecentHeartbeatRuns(store, tenantId, limit = 50) {
|
|
43
|
+
return store.getAllRecentRuns(tenantId, limit);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Mark all still-running heartbeat runs that have exceeded `maxDurationMs`
|
|
47
|
+
* as stale. Returns the number of runs cleaned up.
|
|
48
|
+
*/
|
|
49
|
+
export async function cleanupStaleHeartbeatRuns(store, maxDurationMs) {
|
|
50
|
+
const cutoff = new Date(Date.now() - maxDurationMs).toISOString();
|
|
51
|
+
const staleRuns = await store.getStaleRuns(cutoff);
|
|
52
|
+
if (staleRuns.length === 0)
|
|
53
|
+
return 0;
|
|
54
|
+
await store.markStale(staleRuns.map((r) => r.id));
|
|
55
|
+
return staleRuns.length;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=heartbeat-scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat-scheduler.js","sourceRoot":"","sources":["../../src/agent/heartbeat-scheduler.ts"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAwB,EACxB,OAAe,EACf,OAAkC;IAElC,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAC/C,OAAO,EACP,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,cAAc,CACvB,CAAC;QACF,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IAED,OAAO,KAAK,CAAC,SAAS,CAAC;QACrB,OAAO;QACP,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAwB,EACxB,KAAa,EACb,OAAqC;IAErC,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAwB,EACxB,KAAa,EACb,KAAqB;IAErB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/D,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAwB,EACxB,OAAe,EACf,KAAK,GAAG,EAAE;IAEV,OAAO,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,KAAwB,EACxB,QAAgB,EAChB,KAAK,GAAG,EAAE;IAEV,OAAO,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,KAAwB,EACxB,aAAqB;IAErB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IAClE,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACrC,MAAM,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,OAAO,SAAS,CAAC,MAAM,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat-scheduler.test.d.ts","sourceRoot":"","sources":["../../src/agent/heartbeat-scheduler.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { InMemoryHeartbeatRunStore } from '../testing/in-memory-heartbeat-run-store.js';
|
|
3
|
+
import { createHeartbeatRun, completeHeartbeatRun, failHeartbeatRun, getHeartbeatRunHistory, getAllRecentHeartbeatRuns, cleanupStaleHeartbeatRuns, } from './heartbeat-scheduler.js';
|
|
4
|
+
const AGENT_ID = 'agent-1';
|
|
5
|
+
const TENANT_ID = 'tenant-1';
|
|
6
|
+
describe('createHeartbeatRun', () => {
|
|
7
|
+
let store;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
store = new InMemoryHeartbeatRunStore();
|
|
10
|
+
});
|
|
11
|
+
it('creates a new run with status running', async () => {
|
|
12
|
+
const run = await createHeartbeatRun(store, AGENT_ID, { tenantId: TENANT_ID });
|
|
13
|
+
expect(run.status).toBe('running');
|
|
14
|
+
expect(run.agent_id).toBe(AGENT_ID);
|
|
15
|
+
expect(run.tenant_id).toBe(TENANT_ID);
|
|
16
|
+
expect(run.id).toBeDefined();
|
|
17
|
+
expect(run.started_at).toBeDefined();
|
|
18
|
+
expect(run.completed_at).toBeNull();
|
|
19
|
+
});
|
|
20
|
+
it('sets trigger type and prompt', async () => {
|
|
21
|
+
const run = await createHeartbeatRun(store, AGENT_ID, {
|
|
22
|
+
tenantId: TENANT_ID,
|
|
23
|
+
triggerType: 'manual',
|
|
24
|
+
prompt: 'Check open tasks',
|
|
25
|
+
});
|
|
26
|
+
expect(run.trigger_type).toBe('manual');
|
|
27
|
+
expect(run.prompt).toBe('Check open tasks');
|
|
28
|
+
});
|
|
29
|
+
describe('idempotency', () => {
|
|
30
|
+
it('returns existing run when idempotency key matches', async () => {
|
|
31
|
+
const first = await createHeartbeatRun(store, AGENT_ID, {
|
|
32
|
+
tenantId: TENANT_ID,
|
|
33
|
+
idempotencyKey: 'run-abc-123',
|
|
34
|
+
});
|
|
35
|
+
const second = await createHeartbeatRun(store, AGENT_ID, {
|
|
36
|
+
tenantId: TENANT_ID,
|
|
37
|
+
idempotencyKey: 'run-abc-123',
|
|
38
|
+
});
|
|
39
|
+
expect(second.id).toBe(first.id);
|
|
40
|
+
expect(store.all()).toHaveLength(1);
|
|
41
|
+
});
|
|
42
|
+
it('creates a separate run for a different idempotency key', async () => {
|
|
43
|
+
await createHeartbeatRun(store, AGENT_ID, {
|
|
44
|
+
tenantId: TENANT_ID,
|
|
45
|
+
idempotencyKey: 'key-1',
|
|
46
|
+
});
|
|
47
|
+
await createHeartbeatRun(store, AGENT_ID, {
|
|
48
|
+
tenantId: TENANT_ID,
|
|
49
|
+
idempotencyKey: 'key-2',
|
|
50
|
+
});
|
|
51
|
+
expect(store.all()).toHaveLength(2);
|
|
52
|
+
});
|
|
53
|
+
it('creates a new run when no idempotency key is given', async () => {
|
|
54
|
+
await createHeartbeatRun(store, AGENT_ID, { tenantId: TENANT_ID });
|
|
55
|
+
await createHeartbeatRun(store, AGENT_ID, { tenantId: TENANT_ID });
|
|
56
|
+
expect(store.all()).toHaveLength(2);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('completeHeartbeatRun', () => {
|
|
61
|
+
let store;
|
|
62
|
+
beforeEach(() => {
|
|
63
|
+
store = new InMemoryHeartbeatRunStore();
|
|
64
|
+
});
|
|
65
|
+
it('marks a run as completed', async () => {
|
|
66
|
+
const run = await createHeartbeatRun(store, AGENT_ID, { tenantId: TENANT_ID });
|
|
67
|
+
await completeHeartbeatRun(store, run.id);
|
|
68
|
+
const updated = store.all().find((r) => r.id === run.id);
|
|
69
|
+
expect(updated?.status).toBe('completed');
|
|
70
|
+
expect(updated?.completed_at).not.toBeNull();
|
|
71
|
+
});
|
|
72
|
+
it('records token count and result metrics', async () => {
|
|
73
|
+
const run = await createHeartbeatRun(store, AGENT_ID, { tenantId: TENANT_ID });
|
|
74
|
+
await completeHeartbeatRun(store, run.id, {
|
|
75
|
+
tokenCount: 512,
|
|
76
|
+
result: { summary: 'done' },
|
|
77
|
+
});
|
|
78
|
+
const updated = store.all().find((r) => r.id === run.id);
|
|
79
|
+
expect(updated?.token_count).toBe(512);
|
|
80
|
+
expect(updated?.result).toEqual({ summary: 'done' });
|
|
81
|
+
});
|
|
82
|
+
it('records duration_ms', async () => {
|
|
83
|
+
const run = await createHeartbeatRun(store, AGENT_ID, { tenantId: TENANT_ID });
|
|
84
|
+
await completeHeartbeatRun(store, run.id, { durationMs: 3000 });
|
|
85
|
+
const updated = store.all().find((r) => r.id === run.id);
|
|
86
|
+
expect(updated?.duration_ms).toBe(3000);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe('failHeartbeatRun', () => {
|
|
90
|
+
let store;
|
|
91
|
+
beforeEach(() => {
|
|
92
|
+
store = new InMemoryHeartbeatRunStore();
|
|
93
|
+
});
|
|
94
|
+
it('marks a run as failed with error string', async () => {
|
|
95
|
+
const run = await createHeartbeatRun(store, AGENT_ID, { tenantId: TENANT_ID });
|
|
96
|
+
await failHeartbeatRun(store, run.id, 'Timeout exceeded');
|
|
97
|
+
const updated = store.all().find((r) => r.id === run.id);
|
|
98
|
+
expect(updated?.status).toBe('failed');
|
|
99
|
+
expect(updated?.error_message).toBe('Timeout exceeded');
|
|
100
|
+
expect(updated?.completed_at).not.toBeNull();
|
|
101
|
+
});
|
|
102
|
+
it('accepts an Error object and extracts the message', async () => {
|
|
103
|
+
const run = await createHeartbeatRun(store, AGENT_ID, { tenantId: TENANT_ID });
|
|
104
|
+
await failHeartbeatRun(store, run.id, new Error('Model error'));
|
|
105
|
+
const updated = store.all().find((r) => r.id === run.id);
|
|
106
|
+
expect(updated?.error_message).toBe('Model error');
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe('getHeartbeatRunHistory', () => {
|
|
110
|
+
let store;
|
|
111
|
+
beforeEach(() => {
|
|
112
|
+
store = new InMemoryHeartbeatRunStore();
|
|
113
|
+
});
|
|
114
|
+
it('returns runs for the specified agent only', async () => {
|
|
115
|
+
await createHeartbeatRun(store, 'agent-1', { tenantId: TENANT_ID });
|
|
116
|
+
await createHeartbeatRun(store, 'agent-2', { tenantId: TENANT_ID });
|
|
117
|
+
const history = await getHeartbeatRunHistory(store, 'agent-1');
|
|
118
|
+
expect(history).toHaveLength(1);
|
|
119
|
+
expect(history[0]?.agent_id).toBe('agent-1');
|
|
120
|
+
});
|
|
121
|
+
it('returns empty array when no runs for agent', async () => {
|
|
122
|
+
const history = await getHeartbeatRunHistory(store, 'unknown-agent');
|
|
123
|
+
expect(history).toEqual([]);
|
|
124
|
+
});
|
|
125
|
+
it('respects the limit parameter', async () => {
|
|
126
|
+
for (let i = 0; i < 5; i++) {
|
|
127
|
+
await createHeartbeatRun(store, AGENT_ID, { tenantId: TENANT_ID });
|
|
128
|
+
}
|
|
129
|
+
const history = await getHeartbeatRunHistory(store, AGENT_ID, 3);
|
|
130
|
+
expect(history).toHaveLength(3);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe('getAllRecentHeartbeatRuns', () => {
|
|
134
|
+
let store;
|
|
135
|
+
beforeEach(() => {
|
|
136
|
+
store = new InMemoryHeartbeatRunStore();
|
|
137
|
+
});
|
|
138
|
+
it('returns all runs for the tenant', async () => {
|
|
139
|
+
await createHeartbeatRun(store, 'agent-1', { tenantId: 'tenant-A' });
|
|
140
|
+
await createHeartbeatRun(store, 'agent-2', { tenantId: 'tenant-A' });
|
|
141
|
+
await createHeartbeatRun(store, 'agent-3', { tenantId: 'tenant-B' });
|
|
142
|
+
const runs = await getAllRecentHeartbeatRuns(store, 'tenant-A');
|
|
143
|
+
expect(runs).toHaveLength(2);
|
|
144
|
+
expect(runs.every((r) => r.tenant_id === 'tenant-A')).toBe(true);
|
|
145
|
+
});
|
|
146
|
+
it('respects the limit parameter', async () => {
|
|
147
|
+
for (let i = 0; i < 10; i++) {
|
|
148
|
+
await createHeartbeatRun(store, `agent-${i}`, { tenantId: TENANT_ID });
|
|
149
|
+
}
|
|
150
|
+
const runs = await getAllRecentHeartbeatRuns(store, TENANT_ID, 4);
|
|
151
|
+
expect(runs).toHaveLength(4);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe('cleanupStaleHeartbeatRuns', () => {
|
|
155
|
+
let store;
|
|
156
|
+
beforeEach(() => {
|
|
157
|
+
store = new InMemoryHeartbeatRunStore();
|
|
158
|
+
});
|
|
159
|
+
it('marks runs exceeding maxDurationMs as stale', async () => {
|
|
160
|
+
const oldDate = new Date(Date.now() - 10 * 60 * 1000).toISOString(); // 10 min ago
|
|
161
|
+
const staleRun = {
|
|
162
|
+
id: 'old-run',
|
|
163
|
+
tenant_id: TENANT_ID,
|
|
164
|
+
agent_id: AGENT_ID,
|
|
165
|
+
status: 'running',
|
|
166
|
+
trigger_type: 'scheduled',
|
|
167
|
+
prompt: null,
|
|
168
|
+
result: null,
|
|
169
|
+
token_count: null,
|
|
170
|
+
duration_ms: null,
|
|
171
|
+
error_message: null,
|
|
172
|
+
started_at: oldDate,
|
|
173
|
+
completed_at: null,
|
|
174
|
+
created_at: oldDate,
|
|
175
|
+
};
|
|
176
|
+
store.seedRun(staleRun);
|
|
177
|
+
const count = await cleanupStaleHeartbeatRuns(store, 5 * 60 * 1000); // 5 min max
|
|
178
|
+
expect(count).toBe(1);
|
|
179
|
+
const updated = store.all().find((r) => r.id === 'old-run');
|
|
180
|
+
expect(updated?.status).toBe('stale');
|
|
181
|
+
expect(updated?.error_message).toBe('Run exceeded max duration');
|
|
182
|
+
});
|
|
183
|
+
it('does not mark recent runs as stale', async () => {
|
|
184
|
+
const run = await createHeartbeatRun(store, AGENT_ID, { tenantId: TENANT_ID });
|
|
185
|
+
const count = await cleanupStaleHeartbeatRuns(store, 5 * 60 * 1000);
|
|
186
|
+
expect(count).toBe(0);
|
|
187
|
+
const unchanged = store.all().find((r) => r.id === run.id);
|
|
188
|
+
expect(unchanged?.status).toBe('running');
|
|
189
|
+
});
|
|
190
|
+
it('returns 0 when there are no stale runs', async () => {
|
|
191
|
+
const count = await cleanupStaleHeartbeatRuns(store, 1000);
|
|
192
|
+
expect(count).toBe(0);
|
|
193
|
+
});
|
|
194
|
+
it('does not mark already-completed runs as stale', async () => {
|
|
195
|
+
const oldDate = new Date(Date.now() - 10 * 60 * 1000).toISOString();
|
|
196
|
+
const completedRun = {
|
|
197
|
+
id: 'completed-run',
|
|
198
|
+
tenant_id: TENANT_ID,
|
|
199
|
+
agent_id: AGENT_ID,
|
|
200
|
+
status: 'completed',
|
|
201
|
+
trigger_type: 'scheduled',
|
|
202
|
+
prompt: null,
|
|
203
|
+
result: null,
|
|
204
|
+
token_count: null,
|
|
205
|
+
duration_ms: null,
|
|
206
|
+
error_message: null,
|
|
207
|
+
started_at: oldDate,
|
|
208
|
+
completed_at: new Date().toISOString(),
|
|
209
|
+
created_at: oldDate,
|
|
210
|
+
};
|
|
211
|
+
store.seedRun(completedRun);
|
|
212
|
+
const count = await cleanupStaleHeartbeatRuns(store, 1000);
|
|
213
|
+
expect(count).toBe(0);
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
//# sourceMappingURL=heartbeat-scheduler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat-scheduler.test.js","sourceRoot":"","sources":["../../src/agent/heartbeat-scheduler.test.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/index.d.ts
CHANGED
|
@@ -7,4 +7,7 @@ export { executeAgentStream, executeAgentGenerate } from './execute-agent.js';
|
|
|
7
7
|
export type { ExecuteAgentConfig, ExecuteAgentResult, AgentStreamResult, AgentFinishEvent, } from './execute-agent.js';
|
|
8
8
|
export { createDelegateToAgentTool } from './delegate.js';
|
|
9
9
|
export type { CreateDelegateToolOptions } from './delegate.js';
|
|
10
|
+
export { createHeartbeatRun, completeHeartbeatRun, failHeartbeatRun, getHeartbeatRunHistory, getAllRecentHeartbeatRuns, cleanupStaleHeartbeatRuns, } from './heartbeat-scheduler.js';
|
|
11
|
+
export type { CreateHeartbeatRunOptions } from './heartbeat-scheduler.js';
|
|
12
|
+
export { createAgentVersion, getVersionHistory, rollbackToVersion } from './versioning.js';
|
|
10
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/agent/index.js
CHANGED
|
@@ -3,4 +3,6 @@ export { AgentRegistry } from './agent-registry.js';
|
|
|
3
3
|
export { resolveAgent } from './agent-resolver.js';
|
|
4
4
|
export { executeAgentStream, executeAgentGenerate } from './execute-agent.js';
|
|
5
5
|
export { createDelegateToAgentTool } from './delegate.js';
|
|
6
|
+
export { createHeartbeatRun, completeHeartbeatRun, failHeartbeatRun, getHeartbeatRunHistory, getAllRecentHeartbeatRuns, cleanupStaleHeartbeatRuns, } from './heartbeat-scheduler.js';
|
|
7
|
+
export { createAgentVersion, getVersionHistory, rollbackToVersion } from './versioning.js';
|
|
6
8
|
//# sourceMappingURL=index.js.map
|
package/dist/agent/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAO3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAO3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AgentVersionStore, AgentVersionRecord, AgentStore, AgentConfig } from '@sprinterai/core';
|
|
2
|
+
/**
|
|
3
|
+
* Snapshot the current agent configuration as a new version.
|
|
4
|
+
* The version number is auto-incremented relative to the latest existing version.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createAgentVersion(store: AgentVersionStore, agentId: string, config: {
|
|
7
|
+
agentConfig: AgentConfig | null;
|
|
8
|
+
systemPrompt: string;
|
|
9
|
+
model: string | null;
|
|
10
|
+
changeSummary?: string;
|
|
11
|
+
}): Promise<AgentVersionRecord>;
|
|
12
|
+
/**
|
|
13
|
+
* Return the version history for an agent, ordered newest first.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getVersionHistory(store: AgentVersionStore, agentId: string, limit?: number): Promise<AgentVersionRecord[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Restore an agent to a previous configuration snapshot.
|
|
18
|
+
* Before applying the rollback, the current state is saved as a new version
|
|
19
|
+
* so the rollback itself is reversible.
|
|
20
|
+
*/
|
|
21
|
+
export declare function rollbackToVersion(versionStore: AgentVersionStore, agentStore: AgentStore, agentId: string, versionId: string): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=versioning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versioning.d.ts","sourceRoot":"","sources":["../../src/agent/versioning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAE1B;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;IACN,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GACA,OAAO,CAAC,kBAAkB,CAAC,CAU7B;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,MAAM,EACf,KAAK,SAAK,GACT,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAE/B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,iBAAiB,EAC/B,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Snapshot the current agent configuration as a new version.
|
|
3
|
+
* The version number is auto-incremented relative to the latest existing version.
|
|
4
|
+
*/
|
|
5
|
+
export async function createAgentVersion(store, agentId, config) {
|
|
6
|
+
const latestNumber = await store.getLatestVersionNumber(agentId);
|
|
7
|
+
return store.createVersion({
|
|
8
|
+
agent_id: agentId,
|
|
9
|
+
version_number: latestNumber + 1,
|
|
10
|
+
config: config.agentConfig,
|
|
11
|
+
system_prompt: config.systemPrompt,
|
|
12
|
+
model: config.model,
|
|
13
|
+
change_summary: config.changeSummary ?? null,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Return the version history for an agent, ordered newest first.
|
|
18
|
+
*/
|
|
19
|
+
export async function getVersionHistory(store, agentId, limit = 20) {
|
|
20
|
+
return store.getVersionHistory(agentId, limit);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Restore an agent to a previous configuration snapshot.
|
|
24
|
+
* Before applying the rollback, the current state is saved as a new version
|
|
25
|
+
* so the rollback itself is reversible.
|
|
26
|
+
*/
|
|
27
|
+
export async function rollbackToVersion(versionStore, agentStore, agentId, versionId) {
|
|
28
|
+
const target = await versionStore.getVersionById(versionId);
|
|
29
|
+
if (!target)
|
|
30
|
+
throw new Error(`Version not found: ${versionId}`);
|
|
31
|
+
// Snapshot current state before rolling back so it can be undone
|
|
32
|
+
const current = await agentStore.getAgentById(agentId);
|
|
33
|
+
if (current) {
|
|
34
|
+
await createAgentVersion(versionStore, agentId, {
|
|
35
|
+
agentConfig: current.config,
|
|
36
|
+
systemPrompt: current.system_prompt,
|
|
37
|
+
model: current.model,
|
|
38
|
+
changeSummary: `Pre-rollback snapshot (rolling back to v${String(target.version_number)})`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
await agentStore.updateAgent(agentId, {
|
|
42
|
+
config: target.config,
|
|
43
|
+
system_prompt: target.system_prompt,
|
|
44
|
+
model: target.model,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=versioning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versioning.js","sourceRoot":"","sources":["../../src/agent/versioning.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAwB,EACxB,OAAe,EACf,MAKC;IAED,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACjE,OAAO,KAAK,CAAC,aAAa,CAAC;QACzB,QAAQ,EAAE,OAAO;QACjB,cAAc,EAAE,YAAY,GAAG,CAAC;QAChC,MAAM,EAAE,MAAM,CAAC,WAAW;QAC1B,aAAa,EAAE,MAAM,CAAC,YAAY;QAClC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,cAAc,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;KAC7C,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAwB,EACxB,OAAe,EACf,KAAK,GAAG,EAAE;IAEV,OAAO,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,YAA+B,EAC/B,UAAsB,EACtB,OAAe,EACf,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;IAEhE,iEAAiE;IACjE,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,kBAAkB,CAAC,YAAY,EAAE,OAAO,EAAE;YAC9C,WAAW,EAAE,OAAO,CAAC,MAAM;YAC3B,YAAY,EAAE,OAAO,CAAC,aAAa;YACnC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,aAAa,EAAE,2CAA2C,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG;SAC3F,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE;QACpC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versioning.test.d.ts","sourceRoot":"","sources":["../../src/agent/versioning.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { InMemoryAgentVersionStore, InMemoryAgentStore } from '../testing/index.js';
|
|
3
|
+
import { createAgentVersion, getVersionHistory, rollbackToVersion } from './versioning.js';
|
|
4
|
+
function makeAgent(overrides = {}) {
|
|
5
|
+
return {
|
|
6
|
+
id: 'agent-1',
|
|
7
|
+
tenant_id: 'tenant-1',
|
|
8
|
+
slug: 'default',
|
|
9
|
+
name: 'Assistant',
|
|
10
|
+
description: 'Test agent',
|
|
11
|
+
icon: 'sparkles',
|
|
12
|
+
system_prompt: 'You are an assistant.',
|
|
13
|
+
model: null,
|
|
14
|
+
role_id: null,
|
|
15
|
+
config: null,
|
|
16
|
+
is_enabled: true,
|
|
17
|
+
created_at: new Date().toISOString(),
|
|
18
|
+
updated_at: new Date().toISOString(),
|
|
19
|
+
...overrides,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
describe('createAgentVersion', () => {
|
|
23
|
+
let versionStore;
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
versionStore = new InMemoryAgentVersionStore();
|
|
26
|
+
});
|
|
27
|
+
it('creates a version with number 1 when no prior versions exist', async () => {
|
|
28
|
+
const version = await createAgentVersion(versionStore, 'agent-1', {
|
|
29
|
+
agentConfig: null,
|
|
30
|
+
systemPrompt: 'You are an assistant.',
|
|
31
|
+
model: null,
|
|
32
|
+
});
|
|
33
|
+
expect(version.version_number).toBe(1);
|
|
34
|
+
expect(version.agent_id).toBe('agent-1');
|
|
35
|
+
});
|
|
36
|
+
it('auto-increments version numbers', async () => {
|
|
37
|
+
await createAgentVersion(versionStore, 'agent-1', {
|
|
38
|
+
agentConfig: null,
|
|
39
|
+
systemPrompt: 'v1',
|
|
40
|
+
model: null,
|
|
41
|
+
});
|
|
42
|
+
const v2 = await createAgentVersion(versionStore, 'agent-1', {
|
|
43
|
+
agentConfig: null,
|
|
44
|
+
systemPrompt: 'v2',
|
|
45
|
+
model: null,
|
|
46
|
+
});
|
|
47
|
+
expect(v2.version_number).toBe(2);
|
|
48
|
+
});
|
|
49
|
+
it('stores the change summary', async () => {
|
|
50
|
+
const version = await createAgentVersion(versionStore, 'agent-1', {
|
|
51
|
+
agentConfig: null,
|
|
52
|
+
systemPrompt: 'prompt',
|
|
53
|
+
model: null,
|
|
54
|
+
changeSummary: 'Updated instructions',
|
|
55
|
+
});
|
|
56
|
+
expect(version.change_summary).toBe('Updated instructions');
|
|
57
|
+
});
|
|
58
|
+
it('version numbers are independent per agent', async () => {
|
|
59
|
+
await createAgentVersion(versionStore, 'agent-1', {
|
|
60
|
+
agentConfig: null,
|
|
61
|
+
systemPrompt: 'a1-v1',
|
|
62
|
+
model: null,
|
|
63
|
+
});
|
|
64
|
+
const a2v1 = await createAgentVersion(versionStore, 'agent-2', {
|
|
65
|
+
agentConfig: null,
|
|
66
|
+
systemPrompt: 'a2-v1',
|
|
67
|
+
model: null,
|
|
68
|
+
});
|
|
69
|
+
expect(a2v1.version_number).toBe(1);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('getVersionHistory', () => {
|
|
73
|
+
let versionStore;
|
|
74
|
+
beforeEach(() => {
|
|
75
|
+
versionStore = new InMemoryAgentVersionStore();
|
|
76
|
+
});
|
|
77
|
+
it('returns versions ordered newest first', async () => {
|
|
78
|
+
await createAgentVersion(versionStore, 'agent-1', {
|
|
79
|
+
agentConfig: null,
|
|
80
|
+
systemPrompt: 'v1',
|
|
81
|
+
model: null,
|
|
82
|
+
});
|
|
83
|
+
await createAgentVersion(versionStore, 'agent-1', {
|
|
84
|
+
agentConfig: null,
|
|
85
|
+
systemPrompt: 'v2',
|
|
86
|
+
model: null,
|
|
87
|
+
});
|
|
88
|
+
const history = await getVersionHistory(versionStore, 'agent-1');
|
|
89
|
+
expect(history[0].version_number).toBe(2);
|
|
90
|
+
expect(history[1].version_number).toBe(1);
|
|
91
|
+
});
|
|
92
|
+
it('returns empty array when no versions exist', async () => {
|
|
93
|
+
const history = await getVersionHistory(versionStore, 'nonexistent');
|
|
94
|
+
expect(history).toHaveLength(0);
|
|
95
|
+
});
|
|
96
|
+
it('respects the limit parameter', async () => {
|
|
97
|
+
for (let i = 0; i < 5; i++) {
|
|
98
|
+
await createAgentVersion(versionStore, 'agent-1', {
|
|
99
|
+
agentConfig: null,
|
|
100
|
+
systemPrompt: `v${String(i + 1)}`,
|
|
101
|
+
model: null,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
const history = await getVersionHistory(versionStore, 'agent-1', 3);
|
|
105
|
+
expect(history).toHaveLength(3);
|
|
106
|
+
expect(history[0].version_number).toBe(5);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe('rollbackToVersion', () => {
|
|
110
|
+
let versionStore;
|
|
111
|
+
let agentStore;
|
|
112
|
+
beforeEach(() => {
|
|
113
|
+
versionStore = new InMemoryAgentVersionStore();
|
|
114
|
+
agentStore = new InMemoryAgentStore();
|
|
115
|
+
});
|
|
116
|
+
it('restores the agent to the target version config', async () => {
|
|
117
|
+
agentStore.seedAgent(makeAgent({ system_prompt: 'current prompt' }));
|
|
118
|
+
const v1 = await createAgentVersion(versionStore, 'agent-1', {
|
|
119
|
+
agentConfig: null,
|
|
120
|
+
systemPrompt: 'original prompt',
|
|
121
|
+
model: null,
|
|
122
|
+
});
|
|
123
|
+
await rollbackToVersion(versionStore, agentStore, 'agent-1', v1.id);
|
|
124
|
+
const agent = await agentStore.getAgentById('agent-1');
|
|
125
|
+
expect(agent?.system_prompt).toBe('original prompt');
|
|
126
|
+
});
|
|
127
|
+
it('saves a pre-rollback snapshot before applying', async () => {
|
|
128
|
+
agentStore.seedAgent(makeAgent({ system_prompt: 'current prompt' }));
|
|
129
|
+
const v1 = await createAgentVersion(versionStore, 'agent-1', {
|
|
130
|
+
agentConfig: null,
|
|
131
|
+
systemPrompt: 'v1',
|
|
132
|
+
model: null,
|
|
133
|
+
});
|
|
134
|
+
await rollbackToVersion(versionStore, agentStore, 'agent-1', v1.id);
|
|
135
|
+
const history = await getVersionHistory(versionStore, 'agent-1');
|
|
136
|
+
// v1 + the pre-rollback snapshot
|
|
137
|
+
expect(history.length).toBeGreaterThanOrEqual(2);
|
|
138
|
+
const snapshot = history.find((v) => v.change_summary?.includes('Pre-rollback'));
|
|
139
|
+
expect(snapshot).toBeDefined();
|
|
140
|
+
expect(snapshot?.system_prompt).toBe('current prompt');
|
|
141
|
+
});
|
|
142
|
+
it('throws when the version ID does not exist', async () => {
|
|
143
|
+
agentStore.seedAgent(makeAgent());
|
|
144
|
+
await expect(rollbackToVersion(versionStore, agentStore, 'agent-1', 'nonexistent-id')).rejects.toThrow('Version not found');
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=versioning.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versioning.test.js","sourceRoot":"","sources":["../../src/agent/versioning.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AnalyticsProvider } from './analytics-types.js';
|
|
2
|
+
export interface AnalyticsRecorderConfig {
|
|
3
|
+
providers: AnalyticsProvider[];
|
|
4
|
+
/** Called when a provider throws. Default: swallow silently. */
|
|
5
|
+
onError?: (provider: AnalyticsProvider, error: unknown) => void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Creates a fire-and-forget analytics recorder that fans out events to multiple providers.
|
|
9
|
+
* Provider errors are caught and passed to onError (or swallowed if not configured).
|
|
10
|
+
*/
|
|
11
|
+
export declare function createAnalyticsRecorder(config: AnalyticsRecorderConfig): (type: string, metadata: Record<string, unknown>, tenantId: string, userId?: string) => void;
|
|
12
|
+
//# sourceMappingURL=analytics-recorder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics-recorder.d.ts","sourceRoot":"","sources":["../../src/analytics/analytics-recorder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3E,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,gEAAgE;IAChE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACjE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,uBAAuB,IAEnE,MAAM,MAAM,EACZ,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,UAAU,MAAM,EAChB,SAAS,MAAM,KACd,IAAI,CAoBR"}
|