@absolutejs/voice 0.0.22-beta.411 → 0.0.22-beta.413

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/audit.d.ts CHANGED
@@ -45,6 +45,7 @@ export type VoiceAuditEventStore<TEvent extends StoredVoiceAuditEvent = StoredVo
45
45
  get: (id: string) => Promise<TEvent | undefined> | TEvent | undefined;
46
46
  list: (filter?: VoiceAuditEventFilter) => Promise<TEvent[]> | TEvent[];
47
47
  };
48
+ export type VoiceScopedAuditEventStoreOptions = VoiceAuditEventFilter;
48
49
  export type VoiceAuditLogger = {
49
50
  handoff: (input: Omit<VoiceHandoffAuditEventInput, 'store'>) => Promise<StoredVoiceAuditEvent> | StoredVoiceAuditEvent;
50
51
  operatorAction: (input: Omit<VoiceOperatorAuditEventInput, 'store'>) => Promise<StoredVoiceAuditEvent> | StoredVoiceAuditEvent;
@@ -118,6 +119,7 @@ export type VoiceOperatorAuditEventInput = {
118
119
  };
119
120
  export declare const createVoiceAuditEvent: <TPayload extends Record<string, unknown> = Record<string, unknown>>(event: VoiceAuditEvent<TPayload>) => StoredVoiceAuditEvent<TPayload>;
120
121
  export declare const filterVoiceAuditEvents: <TEvent extends StoredVoiceAuditEvent = StoredVoiceAuditEvent>(events: TEvent[], filter?: VoiceAuditEventFilter) => TEvent[];
122
+ export declare const createVoiceScopedAuditEventStore: <TEvent extends StoredVoiceAuditEvent = StoredVoiceAuditEvent>(store: VoiceAuditEventStore<TEvent>, scope: VoiceScopedAuditEventStoreOptions) => VoiceAuditEventStore<TEvent>;
121
123
  export declare const createVoiceMemoryAuditEventStore: <TEvent extends StoredVoiceAuditEvent = StoredVoiceAuditEvent>() => VoiceAuditEventStore<TEvent>;
122
124
  export declare const recordVoiceAuditEvent: (store: VoiceAuditEventStore, event: VoiceAuditEvent) => StoredVoiceAuditEvent<Record<string, unknown>> | Promise<StoredVoiceAuditEvent<Record<string, unknown>>>;
123
125
  export declare const recordVoiceProviderAuditEvent: (input: VoiceProviderAuditEventInput) => StoredVoiceAuditEvent<Record<string, unknown>> | Promise<StoredVoiceAuditEvent<Record<string, unknown>>>;
@@ -5364,6 +5364,57 @@ var filterVoiceTraceEvents = (events, filter = {}) => {
5364
5364
  const sorted = events.filter((event) => matchesTraceFilter(event, filter)).sort((left, right) => left.at - right.at || left.id.localeCompare(right.id));
5365
5365
  return typeof filter.limit === "number" && filter.limit >= 0 ? sorted.slice(0, filter.limit) : sorted;
5366
5366
  };
5367
+ var createVoiceScopedTraceEventStore = (store, scope) => {
5368
+ const upstreamFilter = (filter = {}) => {
5369
+ const next = { ...filter };
5370
+ delete next.limit;
5371
+ if (scope.scenarioId !== undefined) {
5372
+ delete next.scenarioId;
5373
+ }
5374
+ if (scope.sessionId !== undefined) {
5375
+ delete next.sessionId;
5376
+ }
5377
+ if (scope.traceId !== undefined) {
5378
+ delete next.traceId;
5379
+ }
5380
+ if (scope.turnId !== undefined) {
5381
+ delete next.turnId;
5382
+ }
5383
+ if (scope.type !== undefined) {
5384
+ delete next.type;
5385
+ }
5386
+ return next;
5387
+ };
5388
+ const scopedFilter = (filter = {}) => ({
5389
+ ...filter,
5390
+ ...scope
5391
+ });
5392
+ return {
5393
+ append: (event) => store.append(event),
5394
+ get: (id) => store.get(id),
5395
+ list: async (filter) => filterVoiceTraceEvents(await store.list(upstreamFilter(filter)), scopedFilter(filter)),
5396
+ remove: (id) => store.remove(id)
5397
+ };
5398
+ };
5399
+ var createVoiceProofTraceStore = (options = {}) => {
5400
+ const proofStore = options.proofStore ?? createVoiceMemoryTraceEventStore();
5401
+ const scopedProofStore = options.scope ? createVoiceScopedTraceEventStore(proofStore, options.scope) : proofStore;
5402
+ return {
5403
+ append: async (event) => {
5404
+ const stored = await proofStore.append(event);
5405
+ await options.mirrorStore?.append(stored);
5406
+ return stored;
5407
+ },
5408
+ get: async (id) => await proofStore.get(id) ?? await options.mirrorStore?.get(id),
5409
+ list: (filter) => scopedProofStore.list(filter),
5410
+ remove: async (id) => {
5411
+ await Promise.all([
5412
+ proofStore.remove(id),
5413
+ options.mirrorStore?.remove(id) ?? Promise.resolve()
5414
+ ]);
5415
+ }
5416
+ };
5417
+ };
5367
5418
  var isPruneTimeMatch = (event, options) => {
5368
5419
  if (typeof options.before === "number" && event.at >= options.before) {
5369
5420
  return false;
@@ -8695,6 +8746,43 @@ var filterVoiceAuditEvents = (events, filter = {}) => {
8695
8746
  }).sort((left, right) => left.at - right.at || left.id.localeCompare(right.id));
8696
8747
  return typeof filter.limit === "number" && filter.limit >= 0 ? sorted.slice(0, filter.limit) : sorted;
8697
8748
  };
8749
+ var createVoiceScopedAuditEventStore = (store, scope) => {
8750
+ const upstreamFilter = (filter = {}) => {
8751
+ const next = { ...filter };
8752
+ delete next.limit;
8753
+ if (scope.actorId !== undefined) {
8754
+ delete next.actorId;
8755
+ }
8756
+ if (scope.outcome !== undefined) {
8757
+ delete next.outcome;
8758
+ }
8759
+ if (scope.resourceId !== undefined) {
8760
+ delete next.resourceId;
8761
+ }
8762
+ if (scope.resourceType !== undefined) {
8763
+ delete next.resourceType;
8764
+ }
8765
+ if (scope.sessionId !== undefined) {
8766
+ delete next.sessionId;
8767
+ }
8768
+ if (scope.traceId !== undefined) {
8769
+ delete next.traceId;
8770
+ }
8771
+ if (scope.type !== undefined) {
8772
+ delete next.type;
8773
+ }
8774
+ return next;
8775
+ };
8776
+ const scopedFilter = (filter = {}) => ({
8777
+ ...filter,
8778
+ ...scope
8779
+ });
8780
+ return {
8781
+ append: (event) => store.append(event),
8782
+ get: (id) => store.get(id),
8783
+ list: async (filter) => filterVoiceAuditEvents(await store.list(upstreamFilter(filter)), scopedFilter(filter))
8784
+ };
8785
+ };
8698
8786
  var createVoiceMemoryAuditEventStore = () => {
8699
8787
  const events = new Map;
8700
8788
  return {
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export { applyVoiceCampaignTelephonyOutcome, assertVoiceCampaignReadinessEvidenc
3
3
  export { assertVoiceCampaignDialerProofEvidence, createVoicePlivoCampaignDialer, createVoiceTelnyxCampaignDialer, createVoiceTwilioCampaignDialer, evaluateVoiceCampaignDialerProofEvidence, getVoiceCampaignDialerProofStatus, runVoiceCampaignDialerProof } from './campaignDialers';
4
4
  export { createVoiceAssistant, createVoiceExperiment, summarizeVoiceAssistantRuns } from './assistant';
5
5
  export { createVoiceAssistantHealthHTMLHandler, createVoiceAssistantHealthJSONHandler, createVoiceAssistantHealthRoutes, renderVoiceAssistantHealthHTML, summarizeVoiceAssistantHealth } from './assistantHealth';
6
- export { createVoiceAuditEvent, createVoiceAuditLogger, createVoiceMemoryAuditEventStore, filterVoiceAuditEvents, recordVoiceAuditEvent, recordVoiceHandoffAuditEvent, recordVoiceOperatorAuditEvent, recordVoiceProviderAuditEvent, recordVoiceRetentionAuditEvent, recordVoiceToolAuditEvent } from './audit';
6
+ export { createVoiceAuditEvent, createVoiceAuditLogger, createVoiceMemoryAuditEventStore, createVoiceScopedAuditEventStore, filterVoiceAuditEvents, recordVoiceAuditEvent, recordVoiceHandoffAuditEvent, recordVoiceOperatorAuditEvent, recordVoiceProviderAuditEvent, recordVoiceRetentionAuditEvent, recordVoiceToolAuditEvent } from './audit';
7
7
  export { buildVoiceAuditTrailReport, createVoiceAuditTrailRoutes, renderVoiceAuditTrailHTML, resolveVoiceAuditTrailFilter, summarizeVoiceAuditTrail } from './auditRoutes';
8
8
  export { buildVoiceAuditExport, exportVoiceAuditTrail, redactVoiceAuditEvent, redactVoiceAuditEvents, renderVoiceAuditHTML, renderVoiceAuditMarkdown } from './auditExport';
9
9
  export { createVoiceAuditHTTPSink, createVoiceAuditS3Sink, createVoiceAuditSinkDeliveryId, createVoiceAuditSinkDeliveryRecord, createVoiceAuditSinkDeliveryWorker, createVoiceAuditSinkDeliveryWorkerLoop, createVoiceAuditSinkStore, createVoiceMemoryAuditSinkDeliveryStore, deliverVoiceAuditEventsToSinks, summarizeVoiceAuditSinkDeliveries } from './auditSinks';
@@ -96,7 +96,7 @@ export { createVoiceOpsStatusRoutes, renderVoiceOpsStatusHTML } from './opsStatu
96
96
  export { createVoiceQualityRoutes, evaluateVoiceQuality, renderVoiceQualityHTML } from './qualityRoutes';
97
97
  export { createVoiceResilienceRoutes, createVoiceRoutingDecisionSummary, listVoiceRoutingEvents, renderVoiceResilienceHTML, summarizeVoiceRoutingDecision, summarizeVoiceRoutingSessions } from './resilienceRoutes';
98
98
  export { createVoiceSTTProviderRouter, createVoiceTTSProviderRouter } from './providerAdapters';
99
- export { buildVoiceTraceReplay, createVoiceMemoryTraceSinkDeliveryStore, createVoiceProfileTraceTagger, createVoiceTraceHTTPSink, createVoiceTraceS3Sink, createVoiceMemoryTraceEventStore, createVoiceTraceSinkDeliveryId, createVoiceTraceSinkDeliveryRecord, createVoiceTraceSinkStore, createVoiceTraceEvent, createVoiceTraceEventId, deliverVoiceTraceEventsToSinks, evaluateVoiceTrace, exportVoiceTrace, filterVoiceTraceEvents, pruneVoiceTraceEvents, redactVoiceTraceEvent, redactVoiceTraceEvents, redactVoiceTraceText, renderVoiceTraceHTML, renderVoiceTraceMarkdown, resolveVoiceTraceRedactionOptions, selectVoiceTraceEventsForPrune, summarizeVoiceTrace } from './trace';
99
+ export { buildVoiceTraceReplay, createVoiceMemoryTraceSinkDeliveryStore, createVoiceProfileTraceTagger, createVoiceTraceHTTPSink, createVoiceTraceS3Sink, createVoiceMemoryTraceEventStore, createVoiceProofTraceStore, createVoiceScopedTraceEventStore, createVoiceTraceSinkDeliveryId, createVoiceTraceSinkDeliveryRecord, createVoiceTraceSinkStore, createVoiceTraceEvent, createVoiceTraceEventId, deliverVoiceTraceEventsToSinks, evaluateVoiceTrace, exportVoiceTrace, filterVoiceTraceEvents, pruneVoiceTraceEvents, redactVoiceTraceEvent, redactVoiceTraceEvents, redactVoiceTraceText, renderVoiceTraceHTML, renderVoiceTraceMarkdown, resolveVoiceTraceRedactionOptions, selectVoiceTraceEventsForPrune, summarizeVoiceTrace } from './trace';
100
100
  export { buildVoiceTraceDeliveryReport, createVoiceTraceDeliveryHTMLHandler, createVoiceTraceDeliveryJSONHandler, createVoiceTraceDeliveryRoutes, renderVoiceTraceDeliveryHTML, resolveVoiceTraceDeliveryFilter } from './traceDeliveryRoutes';
101
101
  export { createVoiceTraceTimelineRoutes, renderVoiceTraceTimelineHTML, renderVoiceTraceTimelineSessionHTML, summarizeVoiceTraceTimeline } from './traceTimeline';
102
102
  export { createVoiceSQLiteAuditEventStore, createVoiceSQLiteAuditSinkDeliveryStore, createVoiceSQLiteCampaignStore, createVoiceSQLiteExternalObjectMapStore, createVoiceSQLiteIntegrationEventStore, createVoiceSQLiteReviewStore, createVoiceSQLiteRuntimeStorage, createVoiceSQLiteSessionStore, createVoiceSQLiteTaskStore, createVoiceSQLiteTelephonyWebhookIdempotencyStore, createVoiceSQLiteTraceSinkDeliveryStore, createVoiceSQLiteTraceEventStore } from './sqliteStore';
package/dist/index.js CHANGED
@@ -5266,6 +5266,43 @@ var filterVoiceAuditEvents = (events, filter = {}) => {
5266
5266
  }).sort((left, right) => left.at - right.at || left.id.localeCompare(right.id));
5267
5267
  return typeof filter.limit === "number" && filter.limit >= 0 ? sorted.slice(0, filter.limit) : sorted;
5268
5268
  };
5269
+ var createVoiceScopedAuditEventStore = (store, scope) => {
5270
+ const upstreamFilter = (filter = {}) => {
5271
+ const next = { ...filter };
5272
+ delete next.limit;
5273
+ if (scope.actorId !== undefined) {
5274
+ delete next.actorId;
5275
+ }
5276
+ if (scope.outcome !== undefined) {
5277
+ delete next.outcome;
5278
+ }
5279
+ if (scope.resourceId !== undefined) {
5280
+ delete next.resourceId;
5281
+ }
5282
+ if (scope.resourceType !== undefined) {
5283
+ delete next.resourceType;
5284
+ }
5285
+ if (scope.sessionId !== undefined) {
5286
+ delete next.sessionId;
5287
+ }
5288
+ if (scope.traceId !== undefined) {
5289
+ delete next.traceId;
5290
+ }
5291
+ if (scope.type !== undefined) {
5292
+ delete next.type;
5293
+ }
5294
+ return next;
5295
+ };
5296
+ const scopedFilter = (filter = {}) => ({
5297
+ ...filter,
5298
+ ...scope
5299
+ });
5300
+ return {
5301
+ append: (event) => store.append(event),
5302
+ get: (id) => store.get(id),
5303
+ list: async (filter) => filterVoiceAuditEvents(await store.list(upstreamFilter(filter)), scopedFilter(filter))
5304
+ };
5305
+ };
5269
5306
  var createVoiceMemoryAuditEventStore = () => {
5270
5307
  const events = new Map;
5271
5308
  return {
@@ -9860,6 +9897,57 @@ var filterVoiceTraceEvents = (events, filter = {}) => {
9860
9897
  const sorted = events.filter((event) => matchesTraceFilter(event, filter)).sort((left, right) => left.at - right.at || left.id.localeCompare(right.id));
9861
9898
  return typeof filter.limit === "number" && filter.limit >= 0 ? sorted.slice(0, filter.limit) : sorted;
9862
9899
  };
9900
+ var createVoiceScopedTraceEventStore = (store, scope) => {
9901
+ const upstreamFilter = (filter = {}) => {
9902
+ const next = { ...filter };
9903
+ delete next.limit;
9904
+ if (scope.scenarioId !== undefined) {
9905
+ delete next.scenarioId;
9906
+ }
9907
+ if (scope.sessionId !== undefined) {
9908
+ delete next.sessionId;
9909
+ }
9910
+ if (scope.traceId !== undefined) {
9911
+ delete next.traceId;
9912
+ }
9913
+ if (scope.turnId !== undefined) {
9914
+ delete next.turnId;
9915
+ }
9916
+ if (scope.type !== undefined) {
9917
+ delete next.type;
9918
+ }
9919
+ return next;
9920
+ };
9921
+ const scopedFilter = (filter = {}) => ({
9922
+ ...filter,
9923
+ ...scope
9924
+ });
9925
+ return {
9926
+ append: (event) => store.append(event),
9927
+ get: (id) => store.get(id),
9928
+ list: async (filter) => filterVoiceTraceEvents(await store.list(upstreamFilter(filter)), scopedFilter(filter)),
9929
+ remove: (id) => store.remove(id)
9930
+ };
9931
+ };
9932
+ var createVoiceProofTraceStore = (options = {}) => {
9933
+ const proofStore = options.proofStore ?? createVoiceMemoryTraceEventStore();
9934
+ const scopedProofStore = options.scope ? createVoiceScopedTraceEventStore(proofStore, options.scope) : proofStore;
9935
+ return {
9936
+ append: async (event) => {
9937
+ const stored = await proofStore.append(event);
9938
+ await options.mirrorStore?.append(stored);
9939
+ return stored;
9940
+ },
9941
+ get: async (id) => await proofStore.get(id) ?? await options.mirrorStore?.get(id),
9942
+ list: (filter) => scopedProofStore.list(filter),
9943
+ remove: async (id) => {
9944
+ await Promise.all([
9945
+ proofStore.remove(id),
9946
+ options.mirrorStore?.remove(id) ?? Promise.resolve()
9947
+ ]);
9948
+ }
9949
+ };
9950
+ };
9863
9951
  var isPruneTimeMatch = (event, options) => {
9864
9952
  if (typeof options.before === "number" && event.at >= options.before) {
9865
9953
  return false;
@@ -40577,6 +40665,8 @@ export {
40577
40665
  createVoiceSessionRecord,
40578
40666
  createVoiceSessionListRoutes,
40579
40667
  createVoiceSession,
40668
+ createVoiceScopedTraceEventStore,
40669
+ createVoiceScopedAuditEventStore,
40580
40670
  createVoiceSTTRoutingCorrectionHandler,
40581
40671
  createVoiceSTTProviderRouter,
40582
40672
  createVoiceSQLiteTraceSinkDeliveryStore,
@@ -40632,6 +40722,7 @@ export {
40632
40722
  createVoiceProviderCapabilityHTMLHandler,
40633
40723
  createVoiceProofTrendRoutes,
40634
40724
  createVoiceProofTrendRecommendationRoutes,
40725
+ createVoiceProofTraceStore,
40635
40726
  createVoiceProofPackSupportBundleSection,
40636
40727
  createVoiceProofPackRoutes,
40637
40728
  createVoiceProofPackProviderSloSection,
@@ -2556,6 +2556,57 @@ var filterVoiceTraceEvents = (events, filter = {}) => {
2556
2556
  const sorted = events.filter((event) => matchesTraceFilter(event, filter)).sort((left, right) => left.at - right.at || left.id.localeCompare(right.id));
2557
2557
  return typeof filter.limit === "number" && filter.limit >= 0 ? sorted.slice(0, filter.limit) : sorted;
2558
2558
  };
2559
+ var createVoiceScopedTraceEventStore = (store, scope) => {
2560
+ const upstreamFilter = (filter = {}) => {
2561
+ const next = { ...filter };
2562
+ delete next.limit;
2563
+ if (scope.scenarioId !== undefined) {
2564
+ delete next.scenarioId;
2565
+ }
2566
+ if (scope.sessionId !== undefined) {
2567
+ delete next.sessionId;
2568
+ }
2569
+ if (scope.traceId !== undefined) {
2570
+ delete next.traceId;
2571
+ }
2572
+ if (scope.turnId !== undefined) {
2573
+ delete next.turnId;
2574
+ }
2575
+ if (scope.type !== undefined) {
2576
+ delete next.type;
2577
+ }
2578
+ return next;
2579
+ };
2580
+ const scopedFilter = (filter = {}) => ({
2581
+ ...filter,
2582
+ ...scope
2583
+ });
2584
+ return {
2585
+ append: (event) => store.append(event),
2586
+ get: (id) => store.get(id),
2587
+ list: async (filter) => filterVoiceTraceEvents(await store.list(upstreamFilter(filter)), scopedFilter(filter)),
2588
+ remove: (id) => store.remove(id)
2589
+ };
2590
+ };
2591
+ var createVoiceProofTraceStore = (options = {}) => {
2592
+ const proofStore = options.proofStore ?? createVoiceMemoryTraceEventStore();
2593
+ const scopedProofStore = options.scope ? createVoiceScopedTraceEventStore(proofStore, options.scope) : proofStore;
2594
+ return {
2595
+ append: async (event) => {
2596
+ const stored = await proofStore.append(event);
2597
+ await options.mirrorStore?.append(stored);
2598
+ return stored;
2599
+ },
2600
+ get: async (id) => await proofStore.get(id) ?? await options.mirrorStore?.get(id),
2601
+ list: (filter) => scopedProofStore.list(filter),
2602
+ remove: async (id) => {
2603
+ await Promise.all([
2604
+ proofStore.remove(id),
2605
+ options.mirrorStore?.remove(id) ?? Promise.resolve()
2606
+ ]);
2607
+ }
2608
+ };
2609
+ };
2559
2610
  var isPruneTimeMatch = (event, options) => {
2560
2611
  if (typeof options.before === "number" && event.at >= options.before) {
2561
2612
  return false;
@@ -904,6 +904,43 @@ var filterVoiceAuditEvents = (events, filter = {}) => {
904
904
  }).sort((left, right) => left.at - right.at || left.id.localeCompare(right.id));
905
905
  return typeof filter.limit === "number" && filter.limit >= 0 ? sorted.slice(0, filter.limit) : sorted;
906
906
  };
907
+ var createVoiceScopedAuditEventStore = (store, scope) => {
908
+ const upstreamFilter = (filter = {}) => {
909
+ const next = { ...filter };
910
+ delete next.limit;
911
+ if (scope.actorId !== undefined) {
912
+ delete next.actorId;
913
+ }
914
+ if (scope.outcome !== undefined) {
915
+ delete next.outcome;
916
+ }
917
+ if (scope.resourceId !== undefined) {
918
+ delete next.resourceId;
919
+ }
920
+ if (scope.resourceType !== undefined) {
921
+ delete next.resourceType;
922
+ }
923
+ if (scope.sessionId !== undefined) {
924
+ delete next.sessionId;
925
+ }
926
+ if (scope.traceId !== undefined) {
927
+ delete next.traceId;
928
+ }
929
+ if (scope.type !== undefined) {
930
+ delete next.type;
931
+ }
932
+ return next;
933
+ };
934
+ const scopedFilter = (filter = {}) => ({
935
+ ...filter,
936
+ ...scope
937
+ });
938
+ return {
939
+ append: (event) => store.append(event),
940
+ get: (id) => store.get(id),
941
+ list: async (filter) => filterVoiceAuditEvents(await store.list(upstreamFilter(filter)), scopedFilter(filter))
942
+ };
943
+ };
907
944
  var createVoiceMemoryAuditEventStore = () => {
908
945
  const events = new Map;
909
946
  return {
@@ -1080,6 +1117,57 @@ var filterVoiceTraceEvents = (events, filter = {}) => {
1080
1117
  const sorted = events.filter((event) => matchesTraceFilter(event, filter)).sort((left, right) => left.at - right.at || left.id.localeCompare(right.id));
1081
1118
  return typeof filter.limit === "number" && filter.limit >= 0 ? sorted.slice(0, filter.limit) : sorted;
1082
1119
  };
1120
+ var createVoiceScopedTraceEventStore = (store, scope) => {
1121
+ const upstreamFilter = (filter = {}) => {
1122
+ const next = { ...filter };
1123
+ delete next.limit;
1124
+ if (scope.scenarioId !== undefined) {
1125
+ delete next.scenarioId;
1126
+ }
1127
+ if (scope.sessionId !== undefined) {
1128
+ delete next.sessionId;
1129
+ }
1130
+ if (scope.traceId !== undefined) {
1131
+ delete next.traceId;
1132
+ }
1133
+ if (scope.turnId !== undefined) {
1134
+ delete next.turnId;
1135
+ }
1136
+ if (scope.type !== undefined) {
1137
+ delete next.type;
1138
+ }
1139
+ return next;
1140
+ };
1141
+ const scopedFilter = (filter = {}) => ({
1142
+ ...filter,
1143
+ ...scope
1144
+ });
1145
+ return {
1146
+ append: (event) => store.append(event),
1147
+ get: (id) => store.get(id),
1148
+ list: async (filter) => filterVoiceTraceEvents(await store.list(upstreamFilter(filter)), scopedFilter(filter)),
1149
+ remove: (id) => store.remove(id)
1150
+ };
1151
+ };
1152
+ var createVoiceProofTraceStore = (options = {}) => {
1153
+ const proofStore = options.proofStore ?? createVoiceMemoryTraceEventStore();
1154
+ const scopedProofStore = options.scope ? createVoiceScopedTraceEventStore(proofStore, options.scope) : proofStore;
1155
+ return {
1156
+ append: async (event) => {
1157
+ const stored = await proofStore.append(event);
1158
+ await options.mirrorStore?.append(stored);
1159
+ return stored;
1160
+ },
1161
+ get: async (id) => await proofStore.get(id) ?? await options.mirrorStore?.get(id),
1162
+ list: (filter) => scopedProofStore.list(filter),
1163
+ remove: async (id) => {
1164
+ await Promise.all([
1165
+ proofStore.remove(id),
1166
+ options.mirrorStore?.remove(id) ?? Promise.resolve()
1167
+ ]);
1168
+ }
1169
+ };
1170
+ };
1083
1171
  var isPruneTimeMatch = (event, options) => {
1084
1172
  if (typeof options.before === "number" && event.at >= options.before) {
1085
1173
  return false;
@@ -9069,6 +9069,43 @@ var filterVoiceAuditEvents = (events, filter = {}) => {
9069
9069
  }).sort((left, right) => left.at - right.at || left.id.localeCompare(right.id));
9070
9070
  return typeof filter.limit === "number" && filter.limit >= 0 ? sorted.slice(0, filter.limit) : sorted;
9071
9071
  };
9072
+ var createVoiceScopedAuditEventStore = (store, scope) => {
9073
+ const upstreamFilter = (filter = {}) => {
9074
+ const next = { ...filter };
9075
+ delete next.limit;
9076
+ if (scope.actorId !== undefined) {
9077
+ delete next.actorId;
9078
+ }
9079
+ if (scope.outcome !== undefined) {
9080
+ delete next.outcome;
9081
+ }
9082
+ if (scope.resourceId !== undefined) {
9083
+ delete next.resourceId;
9084
+ }
9085
+ if (scope.resourceType !== undefined) {
9086
+ delete next.resourceType;
9087
+ }
9088
+ if (scope.sessionId !== undefined) {
9089
+ delete next.sessionId;
9090
+ }
9091
+ if (scope.traceId !== undefined) {
9092
+ delete next.traceId;
9093
+ }
9094
+ if (scope.type !== undefined) {
9095
+ delete next.type;
9096
+ }
9097
+ return next;
9098
+ };
9099
+ const scopedFilter = (filter = {}) => ({
9100
+ ...filter,
9101
+ ...scope
9102
+ });
9103
+ return {
9104
+ append: (event) => store.append(event),
9105
+ get: (id) => store.get(id),
9106
+ list: async (filter) => filterVoiceAuditEvents(await store.list(upstreamFilter(filter)), scopedFilter(filter))
9107
+ };
9108
+ };
9072
9109
  var createVoiceMemoryAuditEventStore = () => {
9073
9110
  const events = new Map;
9074
9111
  return {
@@ -9245,6 +9282,57 @@ var filterVoiceTraceEvents = (events, filter = {}) => {
9245
9282
  const sorted = events.filter((event) => matchesTraceFilter(event, filter)).sort((left, right) => left.at - right.at || left.id.localeCompare(right.id));
9246
9283
  return typeof filter.limit === "number" && filter.limit >= 0 ? sorted.slice(0, filter.limit) : sorted;
9247
9284
  };
9285
+ var createVoiceScopedTraceEventStore = (store, scope) => {
9286
+ const upstreamFilter = (filter = {}) => {
9287
+ const next = { ...filter };
9288
+ delete next.limit;
9289
+ if (scope.scenarioId !== undefined) {
9290
+ delete next.scenarioId;
9291
+ }
9292
+ if (scope.sessionId !== undefined) {
9293
+ delete next.sessionId;
9294
+ }
9295
+ if (scope.traceId !== undefined) {
9296
+ delete next.traceId;
9297
+ }
9298
+ if (scope.turnId !== undefined) {
9299
+ delete next.turnId;
9300
+ }
9301
+ if (scope.type !== undefined) {
9302
+ delete next.type;
9303
+ }
9304
+ return next;
9305
+ };
9306
+ const scopedFilter = (filter = {}) => ({
9307
+ ...filter,
9308
+ ...scope
9309
+ });
9310
+ return {
9311
+ append: (event) => store.append(event),
9312
+ get: (id) => store.get(id),
9313
+ list: async (filter) => filterVoiceTraceEvents(await store.list(upstreamFilter(filter)), scopedFilter(filter)),
9314
+ remove: (id) => store.remove(id)
9315
+ };
9316
+ };
9317
+ var createVoiceProofTraceStore = (options = {}) => {
9318
+ const proofStore = options.proofStore ?? createVoiceMemoryTraceEventStore();
9319
+ const scopedProofStore = options.scope ? createVoiceScopedTraceEventStore(proofStore, options.scope) : proofStore;
9320
+ return {
9321
+ append: async (event) => {
9322
+ const stored = await proofStore.append(event);
9323
+ await options.mirrorStore?.append(stored);
9324
+ return stored;
9325
+ },
9326
+ get: async (id) => await proofStore.get(id) ?? await options.mirrorStore?.get(id),
9327
+ list: (filter) => scopedProofStore.list(filter),
9328
+ remove: async (id) => {
9329
+ await Promise.all([
9330
+ proofStore.remove(id),
9331
+ options.mirrorStore?.remove(id) ?? Promise.resolve()
9332
+ ]);
9333
+ }
9334
+ };
9335
+ };
9248
9336
  var isPruneTimeMatch = (event, options) => {
9249
9337
  if (typeof options.before === "number" && event.at >= options.before) {
9250
9338
  return false;
package/dist/trace.d.ts CHANGED
@@ -28,6 +28,12 @@ export type VoiceTraceEventStore<TEvent extends StoredVoiceTraceEvent = StoredVo
28
28
  list: (filter?: VoiceTraceEventFilter) => Promise<TEvent[]>;
29
29
  remove: (id: string) => Promise<void>;
30
30
  };
31
+ export type VoiceScopedTraceEventStoreOptions = VoiceTraceEventFilter;
32
+ export type VoiceProofTraceStoreOptions<TEvent extends StoredVoiceTraceEvent = StoredVoiceTraceEvent> = {
33
+ mirrorStore?: VoiceTraceEventStore<TEvent>;
34
+ proofStore?: VoiceTraceEventStore<TEvent>;
35
+ scope?: VoiceScopedTraceEventStoreOptions;
36
+ };
31
37
  export type VoiceTracePruneFilter = Omit<VoiceTraceEventFilter, 'limit'>;
32
38
  export type VoiceTracePruneOptions = {
33
39
  before?: number;
@@ -212,6 +218,8 @@ export declare const createVoiceTraceSinkDeliveryRecord: (input: {
212
218
  id?: string;
213
219
  } & Partial<Omit<VoiceTraceSinkDeliveryRecord, "createdAt" | "events" | "id">>) => VoiceTraceSinkDeliveryRecord;
214
220
  export declare const filterVoiceTraceEvents: <TEvent extends StoredVoiceTraceEvent = StoredVoiceTraceEvent>(events: TEvent[], filter?: VoiceTraceEventFilter) => TEvent[];
221
+ export declare const createVoiceScopedTraceEventStore: <TEvent extends StoredVoiceTraceEvent = StoredVoiceTraceEvent>(store: VoiceTraceEventStore<TEvent>, scope: VoiceScopedTraceEventStoreOptions) => VoiceTraceEventStore<TEvent>;
222
+ export declare const createVoiceProofTraceStore: <TEvent extends StoredVoiceTraceEvent = StoredVoiceTraceEvent>(options?: VoiceProofTraceStoreOptions<TEvent>) => VoiceTraceEventStore<TEvent>;
215
223
  export declare const selectVoiceTraceEventsForPrune: <TEvent extends StoredVoiceTraceEvent = StoredVoiceTraceEvent>(events: TEvent[], options?: Omit<VoiceTracePruneOptions, "store">) => TEvent[];
216
224
  export declare const pruneVoiceTraceEvents: (options: VoiceTracePruneOptions) => Promise<VoiceTracePruneResult>;
217
225
  export declare const createVoiceTraceHTTPSink: <TBody extends Record<string, unknown> = Record<string, unknown>>(options: VoiceTraceHTTPSinkOptions<TBody>) => VoiceTraceSink;
package/dist/vue/index.js CHANGED
@@ -2477,6 +2477,57 @@ var filterVoiceTraceEvents = (events, filter = {}) => {
2477
2477
  const sorted = events.filter((event) => matchesTraceFilter(event, filter)).sort((left, right) => left.at - right.at || left.id.localeCompare(right.id));
2478
2478
  return typeof filter.limit === "number" && filter.limit >= 0 ? sorted.slice(0, filter.limit) : sorted;
2479
2479
  };
2480
+ var createVoiceScopedTraceEventStore = (store, scope) => {
2481
+ const upstreamFilter = (filter = {}) => {
2482
+ const next = { ...filter };
2483
+ delete next.limit;
2484
+ if (scope.scenarioId !== undefined) {
2485
+ delete next.scenarioId;
2486
+ }
2487
+ if (scope.sessionId !== undefined) {
2488
+ delete next.sessionId;
2489
+ }
2490
+ if (scope.traceId !== undefined) {
2491
+ delete next.traceId;
2492
+ }
2493
+ if (scope.turnId !== undefined) {
2494
+ delete next.turnId;
2495
+ }
2496
+ if (scope.type !== undefined) {
2497
+ delete next.type;
2498
+ }
2499
+ return next;
2500
+ };
2501
+ const scopedFilter = (filter = {}) => ({
2502
+ ...filter,
2503
+ ...scope
2504
+ });
2505
+ return {
2506
+ append: (event) => store.append(event),
2507
+ get: (id) => store.get(id),
2508
+ list: async (filter) => filterVoiceTraceEvents(await store.list(upstreamFilter(filter)), scopedFilter(filter)),
2509
+ remove: (id) => store.remove(id)
2510
+ };
2511
+ };
2512
+ var createVoiceProofTraceStore = (options = {}) => {
2513
+ const proofStore = options.proofStore ?? createVoiceMemoryTraceEventStore();
2514
+ const scopedProofStore = options.scope ? createVoiceScopedTraceEventStore(proofStore, options.scope) : proofStore;
2515
+ return {
2516
+ append: async (event) => {
2517
+ const stored = await proofStore.append(event);
2518
+ await options.mirrorStore?.append(stored);
2519
+ return stored;
2520
+ },
2521
+ get: async (id) => await proofStore.get(id) ?? await options.mirrorStore?.get(id),
2522
+ list: (filter) => scopedProofStore.list(filter),
2523
+ remove: async (id) => {
2524
+ await Promise.all([
2525
+ proofStore.remove(id),
2526
+ options.mirrorStore?.remove(id) ?? Promise.resolve()
2527
+ ]);
2528
+ }
2529
+ };
2530
+ };
2480
2531
  var isPruneTimeMatch = (event, options) => {
2481
2532
  if (typeof options.before === "number" && event.at >= options.before) {
2482
2533
  return false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.411",
3
+ "version": "0.0.22-beta.413",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",