@recombine-ai/platform 0.2.6-test.1 → 0.2.6-test.10
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/build/analytics.d.ts +30 -27
- package/build/analytics.d.ts.map +1 -1
- package/build/analytics.js +112 -60
- package/build/context-cache.js +6 -2
- package/build/index.d.ts +7 -5
- package/build/index.d.ts.map +1 -1
- package/build/index.js +23 -5
- package/build/interfaces/platform.d.ts +31 -12
- package/build/interfaces/platform.d.ts.map +1 -1
- package/build/interfaces/platform.js +20 -2
- package/build/interfaces/rc-voice.js +2 -1
- package/build/postgres-analytics-query.d.ts +87 -0
- package/build/postgres-analytics-query.d.ts.map +1 -0
- package/build/postgres-analytics-query.js +392 -0
- package/build/postgres-analytics.d.ts +45 -0
- package/build/postgres-analytics.d.ts.map +1 -0
- package/build/postgres-analytics.js +295 -0
- package/build/timeouts-manager.d.ts +1 -1
- package/build/timeouts-manager.d.ts.map +1 -1
- package/build/timeouts-manager.js +5 -1
- package/package.json +5 -10
- package/build/analytics.spec.d.ts +0 -2
- package/build/analytics.spec.d.ts.map +0 -1
- package/build/analytics.spec.js +0 -57
package/build/analytics.d.ts
CHANGED
|
@@ -1,39 +1,42 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export type
|
|
3
|
-
export type
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
readonly key: string;
|
|
8
|
-
readonly valueType: AnalyticsValueType;
|
|
2
|
+
export type AnalyticsScalar = boolean | number | string;
|
|
3
|
+
export type AnalyticsFieldType = 'boolean' | 'number' | 'string';
|
|
4
|
+
declare const analyticsFieldDefinitionBrand: unique symbol;
|
|
5
|
+
export interface AnalyticsFieldDefinition<T> {
|
|
6
|
+
readonly type: AnalyticsFieldType;
|
|
9
7
|
readonly schema: z.ZodType<T>;
|
|
8
|
+
readonly [analyticsFieldDefinitionBrand]: true;
|
|
10
9
|
}
|
|
11
|
-
export type
|
|
10
|
+
export type AnalyticsFieldDefinitions = Readonly<Record<string, AnalyticsFieldDefinition<unknown>>>;
|
|
11
|
+
export type AnalyticsValue<TField extends AnalyticsFieldDefinition<unknown>> = TField extends AnalyticsFieldDefinition<infer TValue> ? TValue : never;
|
|
12
|
+
type AnalyticsFieldName<TFields extends AnalyticsFieldDefinitions> = Extract<keyof TFields, string>;
|
|
12
13
|
export interface ConversationAnalyticsSummary {
|
|
13
14
|
conversationId: string;
|
|
14
|
-
agentId
|
|
15
|
+
agentId: string;
|
|
15
16
|
channel: string;
|
|
16
|
-
region?: string;
|
|
17
17
|
startedAt: Date;
|
|
18
|
-
endedAt?: Date;
|
|
19
|
-
durationSeconds?: number;
|
|
20
18
|
}
|
|
21
|
-
export interface
|
|
22
|
-
set
|
|
23
|
-
clear(
|
|
24
|
-
get
|
|
25
|
-
getSummary(): Promise<ConversationAnalyticsSummary | undefined>;
|
|
19
|
+
export interface AnalyticsStore {
|
|
20
|
+
set(conversationId: string, agentId: string, fieldName: string, value: AnalyticsScalar): Promise<void>;
|
|
21
|
+
clear(conversationId: string, agentId: string, fieldName: string): Promise<void>;
|
|
22
|
+
get(conversationId: string, agentId: string, fieldName: string): Promise<unknown | undefined>;
|
|
23
|
+
getSummary(conversationId: string, agentId: string): Promise<ConversationAnalyticsSummary | undefined>;
|
|
26
24
|
}
|
|
27
|
-
export interface
|
|
28
|
-
|
|
25
|
+
export interface AgentAnalytics<TFields extends AnalyticsFieldDefinitions> {
|
|
26
|
+
set<TName extends AnalyticsFieldName<TFields>>(conversationId: string, fieldName: TName, value: AnalyticsValue<TFields[TName]>): Promise<void>;
|
|
27
|
+
clear<TName extends AnalyticsFieldName<TFields>>(conversationId: string, fieldName: TName): Promise<void>;
|
|
28
|
+
get<TName extends AnalyticsFieldName<TFields>>(conversationId: string, fieldName: TName): Promise<AnalyticsValue<TFields[TName]> | undefined>;
|
|
29
|
+
getSummary(conversationId: string): Promise<ConversationAnalyticsSummary | undefined>;
|
|
29
30
|
}
|
|
30
|
-
export declare const
|
|
31
|
-
boolean(
|
|
32
|
-
number(
|
|
33
|
-
string(
|
|
34
|
-
enum<const TValues extends readonly [string, ...string[]]>(
|
|
35
|
-
json<T extends AnalyticsJsonValue>(key: string, schema: z.ZodType<T>): AnalyticsKey<T>;
|
|
31
|
+
export declare const analyticsField: {
|
|
32
|
+
boolean(): AnalyticsFieldDefinition<boolean>;
|
|
33
|
+
number(): AnalyticsFieldDefinition<number>;
|
|
34
|
+
string(): AnalyticsFieldDefinition<string>;
|
|
35
|
+
enum<const TValues extends readonly [string, ...string[]]>(values: TValues): AnalyticsFieldDefinition<TValues[number]>;
|
|
36
36
|
};
|
|
37
|
-
export declare function
|
|
38
|
-
export declare function
|
|
37
|
+
export declare function validateAgentAnalytics(agentId: string, fields: AnalyticsFieldDefinitions): void;
|
|
38
|
+
export declare function createAgentAnalytics<TFields extends AnalyticsFieldDefinitions>(store: AnalyticsStore, agentId: string, fields: TFields): AgentAnalytics<TFields>;
|
|
39
|
+
export declare function createInMemoryAnalytics(summaries?: ConversationAnalyticsSummary[]): AnalyticsStore;
|
|
40
|
+
export declare function assertAnalyticsScalar(value: unknown): asserts value is AnalyticsScalar;
|
|
41
|
+
export {};
|
|
39
42
|
//# sourceMappingURL=analytics.d.ts.map
|
package/build/analytics.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AACvD,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAIhE,QAAA,MAAM,6BAA6B,eAAqC,CAAA;AAKxE,MAAM,WAAW,wBAAwB,CAAC,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAC7B,QAAQ,CAAC,CAAC,6BAA6B,CAAC,EAAE,IAAI,CAAA;CACjD;AAED,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAInG,MAAM,MAAM,cAAc,CAAC,MAAM,SAAS,wBAAwB,CAAC,OAAO,CAAC,IACvE,MAAM,SAAS,wBAAwB,CAAC,MAAM,MAAM,CAAC,GAAG,MAAM,GAAG,KAAK,CAAA;AAE1E,KAAK,kBAAkB,CAAC,OAAO,SAAS,yBAAyB,IAAI,OAAO,CAAC,MAAM,OAAO,EAAE,MAAM,CAAC,CAAA;AAEnG,MAAM,WAAW,4BAA4B;IACzC,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAClB;AAMD,MAAM,WAAW,cAAc;IAC3B,GAAG,CACC,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAAA;IAChB,KAAK,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChF,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAA;IAC7F,UAAU,CACN,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,4BAA4B,GAAG,SAAS,CAAC,CAAA;CACvD;AAMD,MAAM,WAAW,cAAc,CAAC,OAAO,SAAS,yBAAyB;IACrE,GAAG,CAAC,KAAK,SAAS,kBAAkB,CAAC,OAAO,CAAC,EACzC,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,KAAK,EAChB,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC,CAAA;IAChB,KAAK,CAAC,KAAK,SAAS,kBAAkB,CAAC,OAAO,CAAC,EAC3C,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,KAAK,GACjB,OAAO,CAAC,IAAI,CAAC,CAAA;IAChB,GAAG,CAAC,KAAK,SAAS,kBAAkB,CAAC,OAAO,CAAC,EACzC,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,KAAK,GACjB,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;IACtD,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,4BAA4B,GAAG,SAAS,CAAC,CAAA;CACxF;AAiBD,eAAO,MAAM,cAAc;eACZ,wBAAwB,CAAC,OAAO,CAAC;cAGlC,wBAAwB,CAAC,MAAM,CAAC;cAGhC,wBAAwB,CAAC,MAAM,CAAC;eAG/B,OAAO,SAAS,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,UAC7C,OAAO,GAChB,wBAAwB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;CAG/C,CAAA;AAID,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,GAAG,IAAI,CAiB/F;AAaD,wBAAgB,oBAAoB,CAAC,OAAO,SAAS,yBAAyB,EAC1E,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,GAChB,cAAc,CAAC,OAAO,CAAC,CAsCzB;AAID,wBAAgB,uBAAuB,CACnC,SAAS,GAAE,4BAA4B,EAAO,GAC/C,cAAc,CA2ChB;AAID,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,eAAe,CAStF"}
|
package/build/analytics.js
CHANGED
|
@@ -1,77 +1,129 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.analyticsField = void 0;
|
|
4
|
+
exports.validateAgentAnalytics = validateAgentAnalytics;
|
|
5
|
+
exports.createAgentAnalytics = createAgentAnalytics;
|
|
6
|
+
exports.createInMemoryAnalytics = createInMemoryAnalytics;
|
|
7
|
+
exports.assertAnalyticsScalar = assertAnalyticsScalar;
|
|
8
|
+
const zod_1 = require("zod");
|
|
9
|
+
const analyticsFieldDefinitionBrand = Symbol('AnalyticsFieldDefinition');
|
|
10
|
+
const analyticsFieldDefinitions = new WeakSet();
|
|
11
|
+
function defineField(type, schema) {
|
|
12
|
+
const definition = {
|
|
13
|
+
type,
|
|
14
|
+
schema,
|
|
15
|
+
[analyticsFieldDefinitionBrand]: true,
|
|
16
|
+
};
|
|
17
|
+
analyticsFieldDefinitions.add(definition);
|
|
18
|
+
return Object.freeze(definition);
|
|
7
19
|
}
|
|
8
|
-
|
|
9
|
-
boolean(
|
|
10
|
-
return
|
|
11
|
-
},
|
|
12
|
-
number(key) {
|
|
13
|
-
return defineKey(key, 'number', z.number().finite());
|
|
20
|
+
exports.analyticsField = {
|
|
21
|
+
boolean() {
|
|
22
|
+
return defineField('boolean', zod_1.z.boolean());
|
|
14
23
|
},
|
|
15
|
-
|
|
16
|
-
return
|
|
24
|
+
number() {
|
|
25
|
+
return defineField('number', zod_1.z.number().finite());
|
|
17
26
|
},
|
|
18
|
-
|
|
19
|
-
return
|
|
27
|
+
string() {
|
|
28
|
+
return defineField('string', zod_1.z.string());
|
|
20
29
|
},
|
|
21
|
-
|
|
22
|
-
return
|
|
30
|
+
enum(values) {
|
|
31
|
+
return defineField('string', zod_1.z.enum(values));
|
|
23
32
|
},
|
|
24
33
|
};
|
|
25
|
-
|
|
34
|
+
function validateAgentAnalytics(agentId, fields) {
|
|
35
|
+
if (agentId.trim() === '') {
|
|
36
|
+
throw new Error('Analytics agent ID must not be empty');
|
|
37
|
+
}
|
|
38
|
+
for (const [fieldName, value] of Object.entries(fields)) {
|
|
39
|
+
if (!/^[A-Za-z0-9_.:-]{1,128}$/.test(fieldName)) {
|
|
40
|
+
throw new Error('Analytics field name contains unsupported characters');
|
|
41
|
+
}
|
|
42
|
+
if (!isAnalyticsFieldDefinition(value)) {
|
|
43
|
+
throw new Error(`Analytics field '${fieldName}' must be declared with analyticsField`);
|
|
44
|
+
}
|
|
45
|
+
const definition = value;
|
|
46
|
+
if (!['boolean', 'number', 'string'].includes(definition.type)) {
|
|
47
|
+
throw new Error(`Analytics field '${fieldName}' has an unsupported type`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function isAnalyticsFieldDefinition(value) {
|
|
52
|
+
return typeof value === 'object' && value !== null && analyticsFieldDefinitions.has(value);
|
|
53
|
+
}
|
|
54
|
+
function createAgentAnalytics(store, agentId, fields) {
|
|
55
|
+
validateAgentAnalytics(agentId, fields);
|
|
56
|
+
const getDefinition = (fieldName) => {
|
|
57
|
+
const definition = fields[fieldName];
|
|
58
|
+
if (!definition) {
|
|
59
|
+
throw new Error(`Analytics field '${fieldName}' is not declared for agent '${agentId}'`);
|
|
60
|
+
}
|
|
61
|
+
return definition;
|
|
62
|
+
};
|
|
63
|
+
const parseValue = (fieldName, value) => getDefinition(fieldName).schema.parse(value);
|
|
64
|
+
return {
|
|
65
|
+
async set(conversationId, fieldName, value) {
|
|
66
|
+
const parsed = parseValue(fieldName, value);
|
|
67
|
+
assertAnalyticsScalar(parsed);
|
|
68
|
+
await store.set(conversationId, agentId, fieldName, parsed);
|
|
69
|
+
},
|
|
70
|
+
async clear(conversationId, fieldName) {
|
|
71
|
+
getDefinition(fieldName);
|
|
72
|
+
await store.clear(conversationId, agentId, fieldName);
|
|
73
|
+
},
|
|
74
|
+
async get(conversationId, fieldName) {
|
|
75
|
+
getDefinition(fieldName);
|
|
76
|
+
const value = await store.get(conversationId, agentId, fieldName);
|
|
77
|
+
return value === undefined ? undefined : parseValue(fieldName, value);
|
|
78
|
+
},
|
|
79
|
+
getSummary(conversationId) {
|
|
80
|
+
return store.getSummary(conversationId, agentId);
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function createInMemoryAnalytics(summaries = []) {
|
|
26
85
|
const conversations = new Map();
|
|
86
|
+
const conversationAgents = new Map(summaries.map((summary) => [summary.conversationId, summary.agentId]));
|
|
27
87
|
const summariesById = new Map(summaries.map((summary) => [summary.conversationId, structuredClone(summary)]));
|
|
28
88
|
return {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
89
|
+
async set(conversationId, agentId, fieldName, value) {
|
|
90
|
+
const existingAgentId = conversationAgents.get(conversationId);
|
|
91
|
+
if (existingAgentId !== undefined && existingAgentId !== agentId) {
|
|
92
|
+
throw new Error(`Conversation '${conversationId}' belongs to another agent`);
|
|
93
|
+
}
|
|
94
|
+
assertAnalyticsScalar(value);
|
|
95
|
+
const values = conversations.get(conversationId) ?? new Map();
|
|
96
|
+
values.set(fieldName, value);
|
|
97
|
+
conversations.set(conversationId, values);
|
|
98
|
+
conversationAgents.set(conversationId, agentId);
|
|
99
|
+
},
|
|
100
|
+
async clear(conversationId, agentId, fieldName) {
|
|
101
|
+
if (conversationAgents.get(conversationId) !== agentId) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const values = conversations.get(conversationId);
|
|
105
|
+
values?.delete(fieldName);
|
|
106
|
+
if (values?.size === 0) {
|
|
107
|
+
conversations.delete(conversationId);
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
async get(conversationId, agentId, fieldName) {
|
|
111
|
+
if (conversationAgents.get(conversationId) !== agentId) {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
return conversations.get(conversationId)?.get(fieldName);
|
|
115
|
+
},
|
|
116
|
+
async getSummary(conversationId, agentId) {
|
|
117
|
+
const summary = summariesById.get(conversationId);
|
|
118
|
+
return summary?.agentId === agentId ? structuredClone(summary) : undefined;
|
|
58
119
|
},
|
|
59
120
|
};
|
|
60
121
|
}
|
|
61
|
-
|
|
62
|
-
if (value ===
|
|
63
|
-
typeof value === 'boolean' ||
|
|
122
|
+
function assertAnalyticsScalar(value) {
|
|
123
|
+
if (typeof value === 'boolean' ||
|
|
64
124
|
typeof value === 'string' ||
|
|
65
125
|
(typeof value === 'number' && Number.isFinite(value))) {
|
|
66
126
|
return;
|
|
67
127
|
}
|
|
68
|
-
|
|
69
|
-
value.forEach(assertAnalyticsJsonValue);
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
if (typeof value === 'object' && Object.getPrototypeOf(value) === Object.prototype) {
|
|
73
|
-
Object.values(value).forEach(assertAnalyticsJsonValue);
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
throw new Error('Analytics value must be valid JSON');
|
|
128
|
+
throw new Error('Analytics value must be a boolean, finite number, or string');
|
|
77
129
|
}
|
package/build/context-cache.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createInMemoryCache = createInMemoryCache;
|
|
4
|
+
exports.createRedisCache = createRedisCache;
|
|
5
|
+
function createInMemoryCache() {
|
|
2
6
|
const cache = new Map();
|
|
3
7
|
async function getContext(callId, defaultContext) {
|
|
4
8
|
if (cache.has(callId)) {
|
|
@@ -21,7 +25,7 @@ export function createInMemoryCache() {
|
|
|
21
25
|
},
|
|
22
26
|
};
|
|
23
27
|
}
|
|
24
|
-
|
|
28
|
+
function createRedisCache(client, options = DEFAULT_REDIS_CACHE_OPTIONS) {
|
|
25
29
|
function createKey(callId) {
|
|
26
30
|
return options.keyPrefix + callId;
|
|
27
31
|
}
|
package/build/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
export * from './interfaces/platform
|
|
2
|
-
export * from './interfaces/rc-voice
|
|
3
|
-
export * from './context-cache
|
|
4
|
-
export * from './analytics
|
|
5
|
-
export * from './
|
|
1
|
+
export * from './interfaces/platform';
|
|
2
|
+
export * from './interfaces/rc-voice';
|
|
3
|
+
export * from './context-cache';
|
|
4
|
+
export * from './analytics';
|
|
5
|
+
export * from './postgres-analytics';
|
|
6
|
+
export * from './postgres-analytics-query';
|
|
7
|
+
export * from './timeouts-manager';
|
|
6
8
|
//# sourceMappingURL=index.d.ts.map
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAG/B,cAAc,aAAa,CAAA;AAC3B,cAAc,sBAAsB,CAAA;AACpC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,oBAAoB,CAAA"}
|
package/build/index.js
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./interfaces/platform"), exports);
|
|
18
|
+
__exportStar(require("./interfaces/rc-voice"), exports);
|
|
19
|
+
__exportStar(require("./context-cache"), exports);
|
|
20
|
+
__exportStar(require("./analytics"), exports);
|
|
21
|
+
__exportStar(require("./postgres-analytics"), exports);
|
|
22
|
+
__exportStar(require("./postgres-analytics-query"), exports);
|
|
23
|
+
__exportStar(require("./timeouts-manager"), exports);
|
|
@@ -1,41 +1,60 @@
|
|
|
1
1
|
import { ReadableStream } from 'node:stream/web';
|
|
2
2
|
import { AIEngine, AIStreamEngine, LlmAdapter, LlmStreamAdapter, Logger, Message, PromptFS, ResponseChunk } from '@recombine-ai/engine';
|
|
3
|
-
import {
|
|
4
|
-
import { ContextCache } from '../context-cache
|
|
5
|
-
import { TimeoutManager } from '../timeouts-manager
|
|
6
|
-
import { IRcVoice } from './rc-voice
|
|
3
|
+
import { AgentAnalytics, AnalyticsFieldDefinitions, AnalyticsStore } from '../analytics';
|
|
4
|
+
import { ContextCache } from '../context-cache';
|
|
5
|
+
import { TimeoutManager } from '../timeouts-manager';
|
|
6
|
+
import { IRcVoice } from './rc-voice';
|
|
7
7
|
export interface IModels {
|
|
8
8
|
models: Record<string, LlmAdapter>;
|
|
9
9
|
streamingModels: Record<string, LlmStreamAdapter>;
|
|
10
10
|
}
|
|
11
|
-
export interface Platform<TContext extends {}, TModels extends IModels
|
|
11
|
+
export interface Platform<TContext extends {}, TModels extends IModels, TRcVoice = IRcVoice, TTimeoutManager = TimeoutManager, TContextCache = ContextCache<TContext>> {
|
|
12
12
|
streamAi: AIStreamEngine<TContext>;
|
|
13
13
|
ai: AIEngine<TContext>;
|
|
14
14
|
fs: PromptFS;
|
|
15
|
-
rcVoice:
|
|
15
|
+
rcVoice: TRcVoice;
|
|
16
16
|
logger: Logger;
|
|
17
|
-
timeoutManager:
|
|
17
|
+
timeoutManager: TTimeoutManager;
|
|
18
18
|
models: TModels['models'];
|
|
19
19
|
streamingModels: TModels['streamingModels'];
|
|
20
|
-
contextCache:
|
|
21
|
-
analytics:
|
|
20
|
+
contextCache: TContextCache;
|
|
21
|
+
analytics: AnalyticsStore;
|
|
22
22
|
}
|
|
23
23
|
export interface CallInfo {
|
|
24
24
|
callId: string;
|
|
25
25
|
phoneNumber?: string;
|
|
26
26
|
headers: Record<string, unknown>;
|
|
27
27
|
}
|
|
28
|
+
export type VoiceSettings = Record<string, string | number | boolean | number[]>;
|
|
28
29
|
export interface VoiceAgent {
|
|
29
30
|
onCallStart: (call: CallInfo) => Promise<{
|
|
30
31
|
initialMessage: string;
|
|
31
|
-
initialSettings?:
|
|
32
|
+
initialSettings?: VoiceSettings;
|
|
32
33
|
}>;
|
|
33
34
|
onCallReady: (call: CallInfo) => Promise<void>;
|
|
34
35
|
streamResponse: (messages: Message[], call: CallInfo) => Promise<ReadableStream<ResponseChunk>>;
|
|
35
|
-
onCallEnd: (call: CallInfo) => Promise<void>;
|
|
36
|
+
onCallEnd: (call: CallInfo, completedConversation?: Message[]) => Promise<void>;
|
|
36
37
|
onAgentSpeechDone: (messages: Message[], call: CallInfo) => Promise<void>;
|
|
37
38
|
onServiceStartup: () => Promise<void>;
|
|
38
39
|
onFatalError: (callId: string, err: any) => Promise<void>;
|
|
39
40
|
}
|
|
40
|
-
export
|
|
41
|
+
export type AgentPlatform<TPlatform extends {
|
|
42
|
+
analytics: AnalyticsStore;
|
|
43
|
+
}, TFields extends AnalyticsFieldDefinitions> = Omit<TPlatform, 'analytics'> & {
|
|
44
|
+
analytics: AgentAnalytics<TFields>;
|
|
45
|
+
};
|
|
46
|
+
type ComposedPlatform<TContext extends object, TModels extends IModels> = Platform<TContext, TModels, unknown, unknown, unknown>;
|
|
47
|
+
export interface AgentDefinition<TFields extends AnalyticsFieldDefinitions> {
|
|
48
|
+
readonly agentId: string;
|
|
49
|
+
readonly analytics: Readonly<TFields>;
|
|
50
|
+
}
|
|
51
|
+
export interface AgentDeclaration<TContext extends object, TServices, TModels extends IModels, TFields extends AnalyticsFieldDefinitions, TPlatform extends ComposedPlatform<TContext, TModels> = Platform<TContext, TModels>> extends AgentDefinition<TFields> {
|
|
52
|
+
create: (platform: AgentPlatform<TPlatform, TFields>, services: TServices) => VoiceAgent;
|
|
53
|
+
}
|
|
54
|
+
export interface AgentCreator<TContext extends object, TServices, TModels extends IModels, TFields extends AnalyticsFieldDefinitions, TPlatform extends ComposedPlatform<TContext, TModels> = Platform<TContext, TModels>> {
|
|
55
|
+
(platform: TPlatform, services: TServices): VoiceAgent;
|
|
56
|
+
readonly definition: AgentDefinition<TFields>;
|
|
57
|
+
}
|
|
58
|
+
export declare function createAgent<TContext extends object, TServices, TModels extends IModels, const TFields extends AnalyticsFieldDefinitions, TPlatform extends ComposedPlatform<TContext, TModels> = Platform<TContext, TModels>>(declaration: AgentDeclaration<TContext, TServices, TModels, TFields, TPlatform>): AgentCreator<TContext, TServices, TModels, TFields, TPlatform>;
|
|
59
|
+
export {};
|
|
41
60
|
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/interfaces/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEhD,OAAO,EACH,QAAQ,EACR,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,MAAM,EACN,OAAO,EACP,QAAQ,EACR,aAAa,EAChB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/interfaces/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAgent = createAgent;
|
|
4
|
+
const analytics_1 = require("../analytics");
|
|
5
|
+
function createAgent(declaration) {
|
|
6
|
+
const { agentId, create } = declaration;
|
|
7
|
+
const analytics = Object.freeze({ ...declaration.analytics });
|
|
8
|
+
(0, analytics_1.validateAgentAnalytics)(agentId, analytics);
|
|
9
|
+
const creator = (platform, services) => {
|
|
10
|
+
const agentPlatform = {
|
|
11
|
+
...platform,
|
|
12
|
+
analytics: (0, analytics_1.createAgentAnalytics)(platform.analytics, agentId, analytics),
|
|
13
|
+
};
|
|
14
|
+
return create(agentPlatform, services);
|
|
15
|
+
};
|
|
16
|
+
const definition = Object.freeze({ agentId, analytics });
|
|
17
|
+
return Object.defineProperty(creator, 'definition', {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
value: definition,
|
|
20
|
+
});
|
|
3
21
|
}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { PoolConfig, QueryResult } from 'pg';
|
|
2
|
+
import { AnalyticsScalar } from './analytics';
|
|
3
|
+
export type AnalyticsFilterScalar = boolean | number | string;
|
|
4
|
+
export type AnalyticsFilterValueType = 'boolean' | 'number' | 'string';
|
|
5
|
+
export type AnalyticsFilterOperator = 'eq' | 'exists' | 'gt' | 'gte' | 'in' | 'lt' | 'lte';
|
|
6
|
+
export interface AnalyticsFilter {
|
|
7
|
+
key: string;
|
|
8
|
+
type: AnalyticsFilterValueType;
|
|
9
|
+
operator: AnalyticsFilterOperator;
|
|
10
|
+
value?: AnalyticsFilterScalar;
|
|
11
|
+
values?: AnalyticsFilterScalar[];
|
|
12
|
+
}
|
|
13
|
+
export type AnalyticsMetric = {
|
|
14
|
+
operation: 'count';
|
|
15
|
+
} | {
|
|
16
|
+
operation: 'rate';
|
|
17
|
+
filter: AnalyticsFilter;
|
|
18
|
+
} | {
|
|
19
|
+
operation: 'average' | 'sum';
|
|
20
|
+
key: string;
|
|
21
|
+
};
|
|
22
|
+
export type AnalyticsTimeGranularity = 'hour' | 'day' | 'week' | 'month';
|
|
23
|
+
export type AnalyticsQueryParameters = Readonly<Record<string, unknown>>;
|
|
24
|
+
export interface TelescopeConversation {
|
|
25
|
+
conversationId: string;
|
|
26
|
+
medium: string;
|
|
27
|
+
agentId: string;
|
|
28
|
+
region?: string;
|
|
29
|
+
phoneNumber?: string;
|
|
30
|
+
duration?: number;
|
|
31
|
+
audioUrl?: string;
|
|
32
|
+
createdAt: number;
|
|
33
|
+
endedAt?: number;
|
|
34
|
+
analytics: Record<string, AnalyticsScalar>;
|
|
35
|
+
}
|
|
36
|
+
export interface TelescopeConversationPage {
|
|
37
|
+
limit: number;
|
|
38
|
+
items: TelescopeConversation[];
|
|
39
|
+
lastConversationId?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface AnalyticsFieldValue {
|
|
42
|
+
value: AnalyticsFilterScalar;
|
|
43
|
+
count: number;
|
|
44
|
+
}
|
|
45
|
+
export interface AnalyticsFieldMetadata {
|
|
46
|
+
key: string;
|
|
47
|
+
type: AnalyticsFilterValueType;
|
|
48
|
+
variantCount: number;
|
|
49
|
+
values: AnalyticsFieldValue[];
|
|
50
|
+
}
|
|
51
|
+
export interface AnalyticsFields {
|
|
52
|
+
items: AnalyticsFieldMetadata[];
|
|
53
|
+
}
|
|
54
|
+
export interface AnalyticsTimeSeriesItem {
|
|
55
|
+
startAt: string;
|
|
56
|
+
value: number | null;
|
|
57
|
+
numerator?: number;
|
|
58
|
+
denominator?: number;
|
|
59
|
+
}
|
|
60
|
+
export interface AnalyticsTimeSeries {
|
|
61
|
+
metric: AnalyticsMetric;
|
|
62
|
+
granularity: AnalyticsTimeGranularity;
|
|
63
|
+
from: string;
|
|
64
|
+
to: string;
|
|
65
|
+
items: AnalyticsTimeSeriesItem[];
|
|
66
|
+
}
|
|
67
|
+
interface Queryable {
|
|
68
|
+
query<TResult extends Record<string, unknown> = Record<string, unknown>>(text: string, values?: unknown[]): Promise<QueryResult<TResult>>;
|
|
69
|
+
}
|
|
70
|
+
export declare class AnalyticsQueryError extends Error {
|
|
71
|
+
name: string;
|
|
72
|
+
}
|
|
73
|
+
export declare class PostgresAnalyticsQueryService {
|
|
74
|
+
private readonly database;
|
|
75
|
+
constructor(database: Queryable);
|
|
76
|
+
getConversation(conversationId: string): Promise<TelescopeConversation | undefined>;
|
|
77
|
+
getConversations(query: AnalyticsQueryParameters): Promise<TelescopeConversationPage>;
|
|
78
|
+
getAnalyticsFields(query: AnalyticsQueryParameters): Promise<AnalyticsFields>;
|
|
79
|
+
getTimeSeries(query: AnalyticsQueryParameters): Promise<AnalyticsTimeSeries>;
|
|
80
|
+
}
|
|
81
|
+
export interface PostgresAnalyticsQueryServices {
|
|
82
|
+
queries: PostgresAnalyticsQueryService;
|
|
83
|
+
close(): Promise<void>;
|
|
84
|
+
}
|
|
85
|
+
export declare function createPostgresAnalyticsQueryServices(config: PoolConfig): PostgresAnalyticsQueryServices;
|
|
86
|
+
export {};
|
|
87
|
+
//# sourceMappingURL=postgres-analytics-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-analytics-query.d.ts","sourceRoot":"","sources":["../src/postgres-analytics-query.ts"],"names":[],"mappings":"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"}
|