@absolutejs/voice 0.0.22-beta.149 → 0.0.22-beta.150

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.
@@ -1,7 +1,8 @@
1
1
  import { Elysia } from 'elysia';
2
- import { createVoiceAuditSinkDeliveryWorker, type VoiceAuditSinkDeliveryQueueSummary, type VoiceAuditSinkDeliveryRecord, type VoiceAuditSinkDeliveryWorkerOptions, type VoiceAuditSinkDeliveryWorkerResult } from './auditSinks';
3
- import { createVoiceTraceSinkDeliveryWorker, type VoiceTraceSinkDeliveryQueueSummary, type VoiceTraceSinkDeliveryWorkerOptions, type VoiceTraceSinkDeliveryWorkerResult } from './queue';
4
- import type { VoiceTraceSinkDeliveryRecord } from './trace';
2
+ import { createVoiceAuditSinkDeliveryWorker, type VoiceAuditSinkDeliveryQueueSummary, type VoiceAuditSinkDeliveryRecord, type VoiceAuditSinkDeliveryStore, type VoiceAuditSinkDeliveryWorkerOptions, type VoiceAuditSinkDeliveryWorkerResult, type VoiceS3AuditSinkClient } from './auditSinks';
3
+ import { createVoiceTraceSinkDeliveryWorker, type VoiceRedisTaskLeaseCoordinator, type VoiceTraceSinkDeliveryQueueSummary, type VoiceTraceSinkDeliveryWorkerOptions, type VoiceTraceSinkDeliveryWorkerResult } from './queue';
4
+ import { type StoredVoiceTraceEvent, type VoiceS3TraceSinkClient, VoiceTraceSinkDeliveryRecord, VoiceTraceSinkDeliveryStore } from './trace';
5
+ import type { StoredVoiceAuditEvent } from './audit';
5
6
  export type VoiceDeliveryRuntimeAuditConfig<TDelivery extends VoiceAuditSinkDeliveryRecord = VoiceAuditSinkDeliveryRecord> = VoiceAuditSinkDeliveryWorkerOptions<TDelivery> & {
6
7
  autoStart?: boolean;
7
8
  onError?: (error: unknown) => Promise<void> | void;
@@ -48,6 +49,55 @@ export type VoiceDeliveryRuntimeRoutesOptions = {
48
49
  tickPath?: false | string;
49
50
  title?: string;
50
51
  };
52
+ export type VoiceDeliveryRuntimePresetMode = 'file' | 's3' | 'webhook';
53
+ export type VoiceDeliveryRuntimePresetLeaseConfig = VoiceRedisTaskLeaseCoordinator | {
54
+ audit: VoiceRedisTaskLeaseCoordinator;
55
+ trace: VoiceRedisTaskLeaseCoordinator;
56
+ };
57
+ export type VoiceDeliveryRuntimePresetBaseOptions = {
58
+ auditDeliveries: VoiceAuditSinkDeliveryStore;
59
+ auditSinkId?: string;
60
+ auditWorkerId?: string;
61
+ autoStart?: boolean;
62
+ failures?: {
63
+ maxFailures?: number;
64
+ };
65
+ leases: VoiceDeliveryRuntimePresetLeaseConfig;
66
+ pollIntervalMs?: number;
67
+ traceDeliveries: VoiceTraceSinkDeliveryStore;
68
+ traceSinkId?: string;
69
+ traceWorkerId?: string;
70
+ };
71
+ export type VoiceDeliveryRuntimeWebhookPresetOptions = VoiceDeliveryRuntimePresetBaseOptions & {
72
+ backoffMs?: number;
73
+ body?: {
74
+ audit?: (input: {
75
+ events: StoredVoiceAuditEvent[];
76
+ }) => Promise<Record<string, unknown>> | Record<string, unknown>;
77
+ trace?: (input: {
78
+ events: StoredVoiceTraceEvent[];
79
+ }) => Promise<Record<string, unknown>> | Record<string, unknown>;
80
+ };
81
+ fetch?: typeof fetch;
82
+ headers?: Record<string, string>;
83
+ mode: 'webhook';
84
+ retries?: number;
85
+ signingSecret?: string;
86
+ timeoutMs?: number;
87
+ url: string;
88
+ };
89
+ export type VoiceDeliveryRuntimeS3PresetOptions = VoiceDeliveryRuntimePresetBaseOptions & {
90
+ bucket?: string;
91
+ client?: VoiceS3AuditSinkClient & VoiceS3TraceSinkClient;
92
+ keyPrefix?: string;
93
+ mode: 's3';
94
+ };
95
+ export type VoiceDeliveryRuntimeFilePresetOptions = VoiceDeliveryRuntimePresetBaseOptions & {
96
+ directory: string;
97
+ mode: 'file';
98
+ };
99
+ export type VoiceDeliveryRuntimePresetOptions = VoiceDeliveryRuntimeFilePresetOptions | VoiceDeliveryRuntimeS3PresetOptions | VoiceDeliveryRuntimeWebhookPresetOptions;
100
+ export declare const createVoiceDeliveryRuntimePresetConfig: (options: VoiceDeliveryRuntimePresetOptions) => VoiceDeliveryRuntimeConfig;
51
101
  export declare const createVoiceDeliveryRuntime: <TAuditDelivery extends VoiceAuditSinkDeliveryRecord = VoiceAuditSinkDeliveryRecord, TTraceDelivery extends VoiceTraceSinkDeliveryRecord = VoiceTraceSinkDeliveryRecord>(config: VoiceDeliveryRuntimeConfig<TAuditDelivery, TTraceDelivery>) => VoiceDeliveryRuntime;
52
102
  export declare const buildVoiceDeliveryRuntimeReport: (runtime: VoiceDeliveryRuntime) => Promise<VoiceDeliveryRuntimeReport>;
53
103
  export declare const renderVoiceDeliveryRuntimeHTML: (report: VoiceDeliveryRuntimeReport, options?: {
package/dist/index.d.ts CHANGED
@@ -13,12 +13,12 @@ export { createVoiceReconnectContractRoutes, renderVoiceReconnectContractHTML, s
13
13
  export { buildVoiceDiagnosticsMarkdown, createVoiceDiagnosticsRoutes, resolveVoiceDiagnosticsTraceFilter } from './diagnosticsRoutes';
14
14
  export { buildVoiceDemoReadyReport, createVoiceDemoReadyRoutes, renderVoiceDemoReadyHTML } from './demoReadyRoutes';
15
15
  export { buildVoiceDeliverySinkReport, createVoiceDeliverySinkDescriptor, createVoiceDeliverySinkPair, createVoiceDeliverySinkRoutes, createVoiceFileDeliverySink, createVoicePostgresDeliverySink, createVoiceS3DeliverySink, createVoiceSQLiteDeliverySink, createVoiceWebhookDeliverySink, renderVoiceDeliverySinkHTML } from './deliverySinkRoutes';
16
- export { buildVoiceDeliveryRuntimeReport, createVoiceDeliveryRuntime, createVoiceDeliveryRuntimeRoutes, renderVoiceDeliveryRuntimeHTML } from './deliveryRuntime';
16
+ export { buildVoiceDeliveryRuntimeReport, createVoiceDeliveryRuntime, createVoiceDeliveryRuntimePresetConfig, createVoiceDeliveryRuntimeRoutes, renderVoiceDeliveryRuntimeHTML } from './deliveryRuntime';
17
17
  export { applyVoiceDataRetentionPolicy, buildVoiceDataRetentionPlan } from './dataControl';
18
18
  export type { VoiceDataRetentionPolicy, VoiceDataRetentionReport, VoiceDataRetentionScope, VoiceDataRetentionScopeReport, VoiceDataRetentionStores } from './dataControl';
19
19
  export type { VoiceDemoReadyReport, VoiceDemoReadyRoutesOptions, VoiceDemoReadySection, VoiceDemoReadyStatus } from './demoReadyRoutes';
20
20
  export type { VoiceDeliverySinkDescriptor, VoiceDeliverySinkDescriptorInput, VoiceDeliverySinkKind, VoiceDeliverySinkPairOptions, VoiceDeliverySinkReport, VoiceDeliverySinkRoutesOptions, VoiceTraceDeliverySinkSurface } from './deliverySinkRoutes';
21
- export type { VoiceDeliveryRuntime, VoiceDeliveryRuntimeAuditConfig, VoiceDeliveryRuntimeConfig, VoiceDeliveryRuntimeReport, VoiceDeliveryRuntimeRoutesOptions, VoiceDeliveryRuntimeSummary, VoiceDeliveryRuntimeTickResult, VoiceDeliveryRuntimeTraceConfig } from './deliveryRuntime';
21
+ export type { VoiceDeliveryRuntime, VoiceDeliveryRuntimeAuditConfig, VoiceDeliveryRuntimeConfig, VoiceDeliveryRuntimeFilePresetOptions, VoiceDeliveryRuntimePresetLeaseConfig, VoiceDeliveryRuntimePresetMode, VoiceDeliveryRuntimePresetOptions, VoiceDeliveryRuntimeReport, VoiceDeliveryRuntimeRoutesOptions, VoiceDeliveryRuntimeS3PresetOptions, VoiceDeliveryRuntimeSummary, VoiceDeliveryRuntimeTickResult, VoiceDeliveryRuntimeTraceConfig, VoiceDeliveryRuntimeWebhookPresetOptions } from './deliveryRuntime';
22
22
  export { compareVoiceEvalBaseline, createVoiceFileEvalBaselineStore, createVoiceFileScenarioFixtureStore, createVoiceEvalRoutes, renderVoiceEvalBaselineHTML, renderVoiceEvalHTML, renderVoiceScenarioEvalHTML, renderVoiceScenarioFixtureEvalHTML, runVoiceScenarioEvals, runVoiceScenarioFixtureEvals, runVoiceSessionEvals } from './evalRoutes';
23
23
  export { createVoiceSimulationSuiteRoutes, renderVoiceSimulationSuiteHTML, runVoiceSimulationSuite } from './simulationSuite';
24
24
  export { createVoiceWorkflowContract, createVoiceWorkflowContractHandler, createVoiceWorkflowContractPreset, createVoiceWorkflowScenario, recordVoiceWorkflowContractTrace, validateVoiceWorkflowRouteResult } from './workflowContract';
package/dist/index.js CHANGED
@@ -11566,6 +11566,8 @@ var createVoiceDeliverySinkRoutes = (options) => {
11566
11566
  };
11567
11567
  // src/deliveryRuntime.ts
11568
11568
  import { Elysia as Elysia12 } from "elysia";
11569
+ import { mkdir } from "fs/promises";
11570
+ import { dirname, join } from "path";
11569
11571
  var escapeHtml15 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
11570
11572
  var renderSummaryCard = (label, summary) => {
11571
11573
  if (!summary) {
@@ -11573,6 +11575,115 @@ var renderSummaryCard = (label, summary) => {
11573
11575
  }
11574
11576
  return `<article><span>${escapeHtml15(label)}</span><strong>${String(summary.delivered)}/${String(summary.total)}</strong><p class="muted">${String(summary.pending)} pending &middot; ${String(summary.failed)} failed &middot; ${String(summary.deadLettered)} dead-lettered</p></article>`;
11575
11577
  };
11578
+ var resolvePresetLeases = (leases) => ("claim" in leases) ? {
11579
+ audit: leases,
11580
+ trace: leases
11581
+ } : leases;
11582
+ var createDeliveryRuntimeFileSink = (input) => ({
11583
+ deliver: async ({ events }) => {
11584
+ const firstEvent = events[0];
11585
+ const fileName = `${Date.now()}-${encodeURIComponent(firstEvent?.id ?? crypto.randomUUID())}.json`;
11586
+ const path = join(input.directory, input.kind, fileName);
11587
+ await mkdir(dirname(path), { recursive: true });
11588
+ await Bun.write(path, JSON.stringify({
11589
+ eventCount: events.length,
11590
+ events,
11591
+ source: "absolutejs-voice"
11592
+ }, null, 2));
11593
+ return {
11594
+ attempts: 1,
11595
+ deliveredAt: Date.now(),
11596
+ deliveredTo: `file://${path}`,
11597
+ eventCount: events.length,
11598
+ responseBody: { path },
11599
+ status: "delivered"
11600
+ };
11601
+ },
11602
+ id: input.id,
11603
+ kind: "file"
11604
+ });
11605
+ var createPresetSinks = (options) => {
11606
+ const auditSinkId = options.auditSinkId ?? `voice-${options.mode}-audit-sink`;
11607
+ const traceSinkId = options.traceSinkId ?? `voice-${options.mode}-trace-sink`;
11608
+ if (options.mode === "webhook") {
11609
+ return {
11610
+ audit: createVoiceAuditHTTPSink({
11611
+ backoffMs: options.backoffMs,
11612
+ body: options.body?.audit,
11613
+ fetch: options.fetch,
11614
+ headers: options.headers,
11615
+ id: auditSinkId,
11616
+ retries: options.retries,
11617
+ signingSecret: options.signingSecret,
11618
+ timeoutMs: options.timeoutMs,
11619
+ url: options.url
11620
+ }),
11621
+ trace: createVoiceTraceHTTPSink({
11622
+ backoffMs: options.backoffMs,
11623
+ body: options.body?.trace,
11624
+ fetch: options.fetch,
11625
+ headers: options.headers,
11626
+ id: traceSinkId,
11627
+ retries: options.retries,
11628
+ signingSecret: options.signingSecret,
11629
+ timeoutMs: options.timeoutMs,
11630
+ url: options.url
11631
+ })
11632
+ };
11633
+ }
11634
+ if (options.mode === "s3") {
11635
+ return {
11636
+ audit: createVoiceAuditS3Sink({
11637
+ bucket: options.bucket,
11638
+ client: options.client,
11639
+ id: auditSinkId,
11640
+ keyPrefix: `${options.keyPrefix ?? "voice/deliveries"}/audit`
11641
+ }),
11642
+ trace: createVoiceTraceS3Sink({
11643
+ bucket: options.bucket,
11644
+ client: options.client,
11645
+ id: traceSinkId,
11646
+ keyPrefix: `${options.keyPrefix ?? "voice/deliveries"}/trace`
11647
+ })
11648
+ };
11649
+ }
11650
+ return {
11651
+ audit: createDeliveryRuntimeFileSink({
11652
+ directory: options.directory,
11653
+ id: auditSinkId,
11654
+ kind: "audit"
11655
+ }),
11656
+ trace: createDeliveryRuntimeFileSink({
11657
+ directory: options.directory,
11658
+ id: traceSinkId,
11659
+ kind: "trace"
11660
+ })
11661
+ };
11662
+ };
11663
+ var createVoiceDeliveryRuntimePresetConfig = (options) => {
11664
+ const leases = resolvePresetLeases(options.leases);
11665
+ const sinks = createPresetSinks(options);
11666
+ return {
11667
+ audit: {
11668
+ autoStart: options.autoStart,
11669
+ deliveries: options.auditDeliveries,
11670
+ leases: leases.audit,
11671
+ maxFailures: options.failures?.maxFailures,
11672
+ pollIntervalMs: options.pollIntervalMs,
11673
+ sinks: [sinks.audit],
11674
+ workerId: options.auditWorkerId ?? `voice-${options.mode}-audit-worker`
11675
+ },
11676
+ trace: {
11677
+ autoStart: options.autoStart,
11678
+ deliveries: options.traceDeliveries,
11679
+ leases: leases.trace,
11680
+ maxFailures: options.failures?.maxFailures,
11681
+ pollIntervalMs: options.pollIntervalMs,
11682
+ sinks: [sinks.trace],
11683
+ workerId: options.traceWorkerId ?? `voice-${options.mode}-trace-worker`
11684
+ }
11685
+ };
11686
+ };
11576
11687
  var createVoiceDeliveryRuntime = (config) => {
11577
11688
  const audit = config.audit ? createVoiceAuditSinkDeliveryWorker(config.audit) : undefined;
11578
11689
  const trace = config.trace ? createVoiceTraceSinkDeliveryWorker(config.trace) : undefined;
@@ -11882,8 +11993,8 @@ var applyVoiceDataRetentionPolicy = async (options) => {
11882
11993
  var buildVoiceDataRetentionPlan = (options) => applyVoiceDataRetentionPolicy({ ...options, dryRun: true });
11883
11994
  // src/evalRoutes.ts
11884
11995
  import { Elysia as Elysia15 } from "elysia";
11885
- import { mkdir } from "fs/promises";
11886
- import { dirname } from "path";
11996
+ import { mkdir as mkdir2 } from "fs/promises";
11997
+ import { dirname as dirname2 } from "path";
11887
11998
 
11888
11999
  // src/qualityRoutes.ts
11889
12000
  import { Elysia as Elysia14 } from "elysia";
@@ -12519,7 +12630,7 @@ var createVoiceFileEvalBaselineStore = (filePath) => ({
12519
12630
  return text.trim() ? JSON.parse(text) : undefined;
12520
12631
  },
12521
12632
  set: async (report) => {
12522
- await mkdir(dirname(filePath), { recursive: true });
12633
+ await mkdir2(dirname2(filePath), { recursive: true });
12523
12634
  await Bun.write(filePath, JSON.stringify(report, null, 2));
12524
12635
  }
12525
12636
  });
@@ -17325,14 +17436,14 @@ var createVoicePhoneAgent = (options) => {
17325
17436
  };
17326
17437
  };
17327
17438
  // src/fileStore.ts
17328
- import { mkdir as mkdir2, readFile, readdir, rename, rm, writeFile } from "fs/promises";
17329
- import { join } from "path";
17439
+ import { mkdir as mkdir3, readFile, readdir, rename, rm, writeFile } from "fs/promises";
17440
+ import { join as join2 } from "path";
17330
17441
  var listJsonFiles = async (directory) => {
17331
17442
  try {
17332
17443
  const entries = await readdir(directory, {
17333
17444
  withFileTypes: true
17334
17445
  });
17335
- return entries.filter((entry) => entry.isFile() && entry.name.endsWith(".json")).map((entry) => join(directory, entry.name));
17446
+ return entries.filter((entry) => entry.isFile() && entry.name.endsWith(".json")).map((entry) => join2(directory, entry.name));
17336
17447
  } catch (error) {
17337
17448
  if (error.code === "ENOENT") {
17338
17449
  return [];
@@ -17341,11 +17452,11 @@ var listJsonFiles = async (directory) => {
17341
17452
  }
17342
17453
  };
17343
17454
  var encodeStoreId = (id) => `${encodeURIComponent(id)}.json`;
17344
- var resolveFilePath = (directory, id) => join(directory, encodeStoreId(id));
17455
+ var resolveFilePath = (directory, id) => join2(directory, encodeStoreId(id));
17345
17456
  var createMemoryStoreId = (input) => `${input.assistantId}:${input.namespace}:${input.key}`;
17346
17457
  var readJsonFile = async (path) => JSON.parse(await readFile(path, "utf8"));
17347
17458
  var writeJsonFile = async (path, value, options) => {
17348
- await mkdir2(options.directory, {
17459
+ await mkdir3(options.directory, {
17349
17460
  recursive: true
17350
17461
  });
17351
17462
  const tempPath = `${path}.${crypto.randomUUID()}.tmp`;
@@ -17680,47 +17791,47 @@ var createVoiceFileAssistantMemoryStore = (options) => {
17680
17791
  var createVoiceFileRuntimeStorage = (options) => ({
17681
17792
  audit: createVoiceFileAuditEventStore({
17682
17793
  ...options,
17683
- directory: join(options.directory, "audit")
17794
+ directory: join2(options.directory, "audit")
17684
17795
  }),
17685
17796
  auditDeliveries: createVoiceFileAuditSinkDeliveryStore({
17686
17797
  ...options,
17687
- directory: join(options.directory, "audit-deliveries")
17798
+ directory: join2(options.directory, "audit-deliveries")
17688
17799
  }),
17689
17800
  campaigns: createVoiceFileCampaignStore({
17690
17801
  ...options,
17691
- directory: join(options.directory, "campaigns")
17802
+ directory: join2(options.directory, "campaigns")
17692
17803
  }),
17693
17804
  events: createVoiceFileIntegrationEventStore({
17694
17805
  ...options,
17695
- directory: join(options.directory, "events")
17806
+ directory: join2(options.directory, "events")
17696
17807
  }),
17697
17808
  externalObjects: createVoiceFileExternalObjectMapStore({
17698
17809
  ...options,
17699
- directory: join(options.directory, "external-objects")
17810
+ directory: join2(options.directory, "external-objects")
17700
17811
  }),
17701
17812
  memories: createVoiceFileAssistantMemoryStore({
17702
17813
  ...options,
17703
- directory: join(options.directory, "memories")
17814
+ directory: join2(options.directory, "memories")
17704
17815
  }),
17705
17816
  reviews: createVoiceFileReviewStore({
17706
17817
  ...options,
17707
- directory: join(options.directory, "reviews")
17818
+ directory: join2(options.directory, "reviews")
17708
17819
  }),
17709
17820
  session: createVoiceFileSessionStore({
17710
17821
  ...options,
17711
- directory: join(options.directory, "sessions")
17822
+ directory: join2(options.directory, "sessions")
17712
17823
  }),
17713
17824
  tasks: createVoiceFileTaskStore({
17714
17825
  ...options,
17715
- directory: join(options.directory, "tasks")
17826
+ directory: join2(options.directory, "tasks")
17716
17827
  }),
17717
17828
  traceDeliveries: createVoiceFileTraceSinkDeliveryStore({
17718
17829
  ...options,
17719
- directory: join(options.directory, "trace-deliveries")
17830
+ directory: join2(options.directory, "trace-deliveries")
17720
17831
  }),
17721
17832
  traces: createVoiceFileTraceEventStore({
17722
17833
  ...options,
17723
- directory: join(options.directory, "traces")
17834
+ directory: join2(options.directory, "traces")
17724
17835
  })
17725
17836
  });
17726
17837
  var createStoredVoiceCallReviewArtifact = (id, artifact) => withVoiceCallReviewId(id, artifact);
@@ -23566,6 +23677,7 @@ export {
23566
23677
  createVoiceDeliverySinkPair,
23567
23678
  createVoiceDeliverySinkDescriptor,
23568
23679
  createVoiceDeliveryRuntimeRoutes,
23680
+ createVoiceDeliveryRuntimePresetConfig,
23569
23681
  createVoiceDeliveryRuntime,
23570
23682
  createVoiceCampaignWorkerLoop,
23571
23683
  createVoiceCampaignWorker,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.149",
3
+ "version": "0.0.22-beta.150",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",