@absolutejs/voice 0.0.22-beta.422 → 0.0.22-beta.423

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
@@ -34,6 +34,7 @@ export type VoiceAuditEventFilter = {
34
34
  beforeOrAt?: number;
35
35
  limit?: number;
36
36
  outcome?: VoiceAuditOutcome | VoiceAuditOutcome[];
37
+ readWindow?: 'recent';
37
38
  resourceId?: string;
38
39
  resourceType?: string;
39
40
  sessionId?: string;
package/dist/index.js CHANGED
@@ -28724,7 +28724,15 @@ var createVoicePhoneAgent = (options) => {
28724
28724
  };
28725
28725
  };
28726
28726
  // src/fileStore.ts
28727
- import { mkdir as mkdir3, readFile, readdir, rename, rm, writeFile } from "fs/promises";
28727
+ import {
28728
+ mkdir as mkdir3,
28729
+ readFile,
28730
+ readdir,
28731
+ rename,
28732
+ rm,
28733
+ stat,
28734
+ writeFile
28735
+ } from "fs/promises";
28728
28736
  import { join as join2 } from "path";
28729
28737
  var listJsonFiles = async (directory) => {
28730
28738
  try {
@@ -28739,6 +28747,31 @@ var listJsonFiles = async (directory) => {
28739
28747
  throw error;
28740
28748
  }
28741
28749
  };
28750
+ var listRecentJsonFiles = async (directory, limit) => {
28751
+ if (limit === 0) {
28752
+ return [];
28753
+ }
28754
+ const files = await listJsonFiles(directory);
28755
+ const candidates = await Promise.all(files.map(async (path) => {
28756
+ try {
28757
+ return {
28758
+ path,
28759
+ updatedAt: (await stat(path)).mtimeMs
28760
+ };
28761
+ } catch (error) {
28762
+ if (error.code === "ENOENT") {
28763
+ return;
28764
+ }
28765
+ throw error;
28766
+ }
28767
+ }));
28768
+ return candidates.filter((candidate) => Boolean(candidate)).sort((left, right) => right.updatedAt - left.updatedAt).slice(0, limit).map((candidate) => candidate.path);
28769
+ };
28770
+ var shouldUseRecentReadWindow = (filter) => filter.readWindow === "recent" && typeof filter.limit === "number" && filter.limit >= 0;
28771
+ var omitReadWindow = (filter) => {
28772
+ const { readWindow: _readWindow, ...next } = filter;
28773
+ return next;
28774
+ };
28742
28775
  var encodeStoreId = (id) => `${encodeURIComponent(id)}.json`;
28743
28776
  var resolveFilePath = (directory, id) => join2(directory, encodeStoreId(id));
28744
28777
  var createMemoryStoreId = (input) => `${input.assistantId}:${input.namespace}:${input.key}`;
@@ -28947,9 +28980,9 @@ var createVoiceFileTraceEventStore = (options) => {
28947
28980
  }
28948
28981
  };
28949
28982
  const list = async (filter = {}) => {
28950
- const files = await listJsonFiles(options.directory);
28983
+ const files = shouldUseRecentReadWindow(filter) ? await listRecentJsonFiles(options.directory, filter.limit) : await listJsonFiles(options.directory);
28951
28984
  const events = await Promise.all(files.map((file) => readJsonFile(file)));
28952
- return filterVoiceTraceEvents(events, filter);
28985
+ return filterVoiceTraceEvents(events, omitReadWindow(filter));
28953
28986
  };
28954
28987
  const remove = async (id) => {
28955
28988
  await rm(resolveFilePath(options.directory, id), {
@@ -29006,9 +29039,10 @@ var createVoiceFileAuditEventStore = (options) => {
29006
29039
  return stored;
29007
29040
  };
29008
29041
  const list = async (filter) => {
29009
- const files = await listJsonFiles(options.directory);
29042
+ const resolvedFilter = filter ?? {};
29043
+ const files = shouldUseRecentReadWindow(resolvedFilter) ? await listRecentJsonFiles(options.directory, resolvedFilter.limit) : await listJsonFiles(options.directory);
29010
29044
  const events = await Promise.all(files.map((file) => readJsonFile(file)));
29011
- return filterVoiceAuditEvents(events, filter);
29045
+ return filterVoiceAuditEvents(events, omitReadWindow(resolvedFilter));
29012
29046
  };
29013
29047
  return { append, get, list };
29014
29048
  };
@@ -32162,7 +32196,7 @@ var createVoiceOpsRecoveryRoutes = (options = {}) => {
32162
32196
  import { Elysia as Elysia55 } from "elysia";
32163
32197
  import { Database as Database4 } from "bun:sqlite";
32164
32198
  import { createHash } from "crypto";
32165
- import { mkdir as mkdir4, readFile as readFile2, stat, unlink } from "fs/promises";
32199
+ import { mkdir as mkdir4, readFile as readFile2, stat as stat2, unlink } from "fs/promises";
32166
32200
  import { join as join3 } from "path";
32167
32201
  var voiceObservabilityExportSchemaVersion = "1.0.0";
32168
32202
  var voiceObservabilityExportSchemaId = "com.absolutejs.voice.observability-export";
@@ -33097,7 +33131,7 @@ var verifyArtifact = async (artifact, options) => {
33097
33131
  }
33098
33132
  const filePath = stripArtifactPathAnchor(artifact.path);
33099
33133
  try {
33100
- const file = await stat(filePath);
33134
+ const file = await stat2(filePath);
33101
33135
  const generatedAt = artifact.generatedAt ?? file.mtimeMs;
33102
33136
  const generatedAtMs = toEpochMs(generatedAt);
33103
33137
  const ageMs = generatedAtMs === undefined ? undefined : now - generatedAtMs;
package/dist/trace.d.ts CHANGED
@@ -16,6 +16,7 @@ export type StoredVoiceTraceEvent<TPayload extends Record<string, unknown> = Rec
16
16
  };
17
17
  export type VoiceTraceEventFilter = {
18
18
  limit?: number;
19
+ readWindow?: 'recent';
19
20
  scenarioId?: string;
20
21
  sessionId?: string;
21
22
  traceId?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.422",
3
+ "version": "0.0.22-beta.423",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",