@chatcops/core 0.4.0 → 0.6.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/chat.d.ts +13 -0
- package/dist/agent/chat.d.ts.map +1 -0
- package/dist/agent/chat.js +42 -0
- package/dist/agent/chat.js.map +1 -0
- package/dist/agent/errors.d.ts +14 -0
- package/dist/agent/errors.d.ts.map +1 -0
- package/dist/agent/errors.js +24 -0
- package/dist/agent/errors.js.map +1 -0
- package/dist/agent/index.d.ts +5 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +5 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/run-turn.d.ts +79 -0
- package/dist/agent/run-turn.d.ts.map +1 -0
- package/dist/agent/run-turn.js +400 -0
- package/dist/agent/run-turn.js.map +1 -0
- package/dist/agent/tool-registry.d.ts +30 -0
- package/dist/agent/tool-registry.d.ts.map +1 -0
- package/dist/agent/tool-registry.js +66 -0
- package/dist/agent/tool-registry.js.map +1 -0
- package/dist/analytics/collector.d.ts +2 -0
- package/dist/analytics/collector.d.ts.map +1 -1
- package/dist/analytics/collector.js +16 -10
- package/dist/analytics/collector.js.map +1 -1
- package/dist/analytics/index.d.ts +2 -0
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics/index.js +2 -0
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/names.d.ts +21 -0
- package/dist/analytics/names.d.ts.map +1 -0
- package/dist/analytics/names.js +41 -0
- package/dist/analytics/names.js.map +1 -0
- package/dist/analytics/sink.d.ts +27 -0
- package/dist/analytics/sink.d.ts.map +1 -0
- package/dist/analytics/sink.js +109 -0
- package/dist/analytics/sink.js.map +1 -0
- package/dist/conversation/index.d.ts +1 -0
- package/dist/conversation/index.d.ts.map +1 -1
- package/dist/conversation/index.js.map +1 -1
- package/dist/conversation/manager.d.ts +65 -6
- package/dist/conversation/manager.d.ts.map +1 -1
- package/dist/conversation/manager.js +110 -34
- package/dist/conversation/manager.js.map +1 -1
- package/dist/conversation/store.d.ts +6 -5
- package/dist/conversation/store.d.ts.map +1 -1
- package/dist/conversation/store.js +4 -0
- package/dist/conversation/store.js.map +1 -1
- package/dist/index.d.ts +21 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/knowledge/base.d.ts +8 -0
- package/dist/knowledge/base.d.ts.map +1 -1
- package/dist/knowledge/tokenize.d.ts.map +1 -1
- package/dist/knowledge/tokenize.js +4 -4
- package/dist/knowledge/tokenize.js.map +1 -1
- package/dist/limits/budget.d.ts +84 -0
- package/dist/limits/budget.d.ts.map +1 -0
- package/dist/limits/budget.js +114 -0
- package/dist/limits/budget.js.map +1 -0
- package/dist/limits/rate-limit.d.ts +53 -0
- package/dist/limits/rate-limit.d.ts.map +1 -0
- package/dist/limits/rate-limit.js +68 -0
- package/dist/limits/rate-limit.js.map +1 -0
- package/dist/logger.d.ts +36 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +40 -0
- package/dist/logger.js.map +1 -0
- package/dist/parts.d.ts +9 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +17 -0
- package/dist/parts.js.map +1 -0
- package/dist/protocol/ai-sdk.d.ts +27 -0
- package/dist/protocol/ai-sdk.d.ts.map +1 -0
- package/dist/protocol/ai-sdk.js +127 -0
- package/dist/protocol/ai-sdk.js.map +1 -0
- package/dist/protocol/errors.d.ts +10 -0
- package/dist/protocol/errors.d.ts.map +1 -0
- package/dist/protocol/errors.js +42 -0
- package/dist/protocol/errors.js.map +1 -0
- package/dist/protocol/index.d.ts +9 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +6 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/legacy.d.ts +18 -0
- package/dist/protocol/legacy.d.ts.map +1 -0
- package/dist/protocol/legacy.js +41 -0
- package/dist/protocol/legacy.js.map +1 -0
- package/dist/protocol/sse.d.ts +10 -0
- package/dist/protocol/sse.d.ts.map +1 -0
- package/dist/protocol/sse.js +15 -0
- package/dist/protocol/sse.js.map +1 -0
- package/dist/protocol/v1.d.ts +140 -0
- package/dist/protocol/v1.d.ts.map +1 -0
- package/dist/protocol/v1.js +15 -0
- package/dist/protocol/v1.js.map +1 -0
- package/dist/providers/base.d.ts +13 -28
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +36 -47
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/claude.d.ts +41 -6
- package/dist/providers/claude.d.ts.map +1 -1
- package/dist/providers/claude.js +223 -96
- package/dist/providers/claude.js.map +1 -1
- package/dist/providers/gemini.d.ts +18 -3
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +208 -91
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/history.d.ts +52 -0
- package/dist/providers/history.d.ts.map +1 -0
- package/dist/providers/history.js +212 -0
- package/dist/providers/history.js.map +1 -0
- package/dist/providers/index.d.ts +5 -5
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +5 -4
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts +28 -6
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +213 -113
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/registry.d.ts +7 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +12 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/schema.d.ts +16 -0
- package/dist/providers/schema.d.ts.map +1 -0
- package/dist/providers/schema.js +80 -0
- package/dist/providers/schema.js.map +1 -0
- package/dist/providers/tool-execution.d.ts +13 -0
- package/dist/providers/tool-execution.d.ts.map +1 -1
- package/dist/providers/tool-execution.js +49 -13
- package/dist/providers/tool-execution.js.map +1 -1
- package/dist/providers/types.d.ts +89 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/retrieval/citations.d.ts +44 -0
- package/dist/retrieval/citations.d.ts.map +1 -0
- package/dist/retrieval/citations.js +97 -0
- package/dist/retrieval/citations.js.map +1 -0
- package/dist/retrieval/cohere-reranker.d.ts +13 -0
- package/dist/retrieval/cohere-reranker.d.ts.map +1 -0
- package/dist/retrieval/cohere-reranker.js +33 -0
- package/dist/retrieval/cohere-reranker.js.map +1 -0
- package/dist/retrieval/gemini-embedder.d.ts +26 -0
- package/dist/retrieval/gemini-embedder.d.ts.map +1 -0
- package/dist/retrieval/gemini-embedder.js +36 -0
- package/dist/retrieval/gemini-embedder.js.map +1 -0
- package/dist/retrieval/http.d.ts +20 -0
- package/dist/retrieval/http.d.ts.map +1 -0
- package/dist/retrieval/http.js +68 -0
- package/dist/retrieval/http.js.map +1 -0
- package/dist/retrieval/index.d.ts +14 -0
- package/dist/retrieval/index.d.ts.map +1 -0
- package/dist/retrieval/index.js +13 -0
- package/dist/retrieval/index.js.map +1 -0
- package/dist/retrieval/knowledge.d.ts +16 -0
- package/dist/retrieval/knowledge.d.ts.map +1 -0
- package/dist/retrieval/knowledge.js +21 -0
- package/dist/retrieval/knowledge.js.map +1 -0
- package/dist/retrieval/openai-embedder.d.ts +25 -0
- package/dist/retrieval/openai-embedder.d.ts.map +1 -0
- package/dist/retrieval/openai-embedder.js +30 -0
- package/dist/retrieval/openai-embedder.js.map +1 -0
- package/dist/retrieval/query.d.ts +8 -0
- package/dist/retrieval/query.d.ts.map +1 -0
- package/dist/retrieval/query.js +19 -0
- package/dist/retrieval/query.js.map +1 -0
- package/dist/retrieval/retrievers.d.ts +30 -0
- package/dist/retrieval/retrievers.d.ts.map +1 -0
- package/dist/retrieval/retrievers.js +89 -0
- package/dist/retrieval/retrievers.js.map +1 -0
- package/dist/retrieval/sources.d.ts +16 -0
- package/dist/retrieval/sources.d.ts.map +1 -0
- package/dist/retrieval/sources.js +37 -0
- package/dist/retrieval/sources.js.map +1 -0
- package/dist/retrieval/types.d.ts +50 -0
- package/dist/retrieval/types.d.ts.map +1 -0
- package/dist/retrieval/types.js +2 -0
- package/dist/retrieval/types.js.map +1 -0
- package/dist/retrieval/voyage-embedder.d.ts +33 -0
- package/dist/retrieval/voyage-embedder.d.ts.map +1 -0
- package/dist/retrieval/voyage-embedder.js +33 -0
- package/dist/retrieval/voyage-embedder.js.map +1 -0
- package/dist/retrieval/voyage-reranker.d.ts +13 -0
- package/dist/retrieval/voyage-reranker.d.ts.map +1 -0
- package/dist/retrieval/voyage-reranker.js +38 -0
- package/dist/retrieval/voyage-reranker.js.map +1 -0
- package/dist/retrieval/workers-ai-embedder.d.ts +21 -0
- package/dist/retrieval/workers-ai-embedder.d.ts.map +1 -0
- package/dist/retrieval/workers-ai-embedder.js +42 -0
- package/dist/retrieval/workers-ai-embedder.js.map +1 -0
- package/dist/retrieval/workers-ai-reranker.d.ts +11 -0
- package/dist/retrieval/workers-ai-reranker.d.ts.map +1 -0
- package/dist/retrieval/workers-ai-reranker.js +54 -0
- package/dist/retrieval/workers-ai-reranker.js.map +1 -0
- package/dist/storage/adapt.d.ts +15 -0
- package/dist/storage/adapt.d.ts.map +1 -0
- package/dist/storage/adapt.js +83 -0
- package/dist/storage/adapt.js.map +1 -0
- package/dist/storage/errors.d.ts +18 -0
- package/dist/storage/errors.d.ts.map +1 -0
- package/dist/storage/errors.js +28 -0
- package/dist/storage/errors.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/memory-vectors.d.ts +22 -0
- package/dist/storage/memory-vectors.d.ts.map +1 -0
- package/dist/storage/memory-vectors.js +140 -0
- package/dist/storage/memory-vectors.js.map +1 -0
- package/dist/storage/memory.d.ts +24 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +265 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/storage/types.d.ts +188 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/testing/conformance.d.ts +30 -0
- package/dist/testing/conformance.d.ts.map +1 -0
- package/dist/testing/conformance.js +505 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/provider.d.ts +47 -0
- package/dist/testing/provider.d.ts.map +1 -0
- package/dist/testing/provider.js +83 -0
- package/dist/testing/provider.js.map +1 -0
- package/dist/tools/base.d.ts +14 -4
- package/dist/tools/base.d.ts.map +1 -1
- package/dist/tools/base.js +4 -2
- package/dist/tools/base.js.map +1 -1
- package/dist/tools/lead-capture.d.ts +4 -2
- package/dist/tools/lead-capture.d.ts.map +1 -1
- package/dist/tools/lead-capture.js +7 -2
- package/dist/tools/lead-capture.js.map +1 -1
- package/dist/types.d.ts +146 -7
- package/dist/types.d.ts.map +1 -1
- package/package.json +51 -3
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Logger } from '../logger.js';
|
|
2
|
+
import { type ChatTool } from '../tools/base.js';
|
|
3
|
+
import type { MessagePart, ProviderToolCall, ProviderToolExecutor, ToolDefinition, ToolResult } from '../types.js';
|
|
4
|
+
export interface ToolRunContext {
|
|
5
|
+
conversationId: string;
|
|
6
|
+
signal: AbortSignal;
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
logger?: Logger;
|
|
9
|
+
}
|
|
10
|
+
/** The tools a turn can call, and how to run them. */
|
|
11
|
+
export interface ToolRegistry {
|
|
12
|
+
/** What the model is told about. */
|
|
13
|
+
definitions: ToolDefinition[];
|
|
14
|
+
/** Runs a call. Never throws: failures come back as `{ success: false }`. */
|
|
15
|
+
run(call: ProviderToolCall, context: ToolRunContext): Promise<ToolResult>;
|
|
16
|
+
/** Parts to add after a call, like a captured lead. */
|
|
17
|
+
emits(call: ProviderToolCall, result: ToolResult): MessagePart[];
|
|
18
|
+
}
|
|
19
|
+
/** A registry over `ChatTool` objects, as the server configures them. */
|
|
20
|
+
export declare function toolRegistry(tools?: ChatTool[]): ToolRegistry;
|
|
21
|
+
/**
|
|
22
|
+
* A registry over tool definitions and one executor function, the 0.4
|
|
23
|
+
* `toolExecutor` shape. The executor gets the call and nothing else.
|
|
24
|
+
*/
|
|
25
|
+
export declare function executorRegistry(definitions?: ToolDefinition[], executor?: ProviderToolExecutor): ToolRegistry;
|
|
26
|
+
/** Tool output is stored with the conversation, so it's kept to JSON and a size. */
|
|
27
|
+
export declare const MAX_TOOL_OUTPUT_CHARS = 64000;
|
|
28
|
+
/** The stored output of a call: what the model saw, as plain JSON. */
|
|
29
|
+
export declare function toolOutput(result: ToolResult): unknown;
|
|
30
|
+
//# sourceMappingURL=tool-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../src/agent/tool-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,6EAA6E;IAC7E,GAAG,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1E,uDAAuD;IACvD,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,GAAG,WAAW,EAAE,CAAC;CAClE;AAYD,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,KAAK,GAAE,QAAQ,EAAO,GAAG,YAAY,CAiBjE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,GAAE,cAAc,EAAO,EAAE,QAAQ,CAAC,EAAE,oBAAoB,GAAG,YAAY,CAWlH;AAED,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CActD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { runToolWithTimeout, serializeToolResult } from '../providers/tool-execution.js';
|
|
2
|
+
import { toolToDefinition } from '../tools/base.js';
|
|
3
|
+
/**
|
|
4
|
+
* Lead capture before tools could emit parts: a successful `capture_lead`
|
|
5
|
+
* call adds a `lead-captured` part with the result's data. Kept for custom
|
|
6
|
+
* lead tools written for 0.4.
|
|
7
|
+
*/
|
|
8
|
+
function legacyLeadPart(name, result) {
|
|
9
|
+
if (name !== 'capture_lead' || !result.success || !result.data)
|
|
10
|
+
return [];
|
|
11
|
+
return [{ type: 'lead-captured', lead: result.data }];
|
|
12
|
+
}
|
|
13
|
+
/** A registry over `ChatTool` objects, as the server configures them. */
|
|
14
|
+
export function toolRegistry(tools = []) {
|
|
15
|
+
const byName = new Map(tools.map((tool) => [tool.name, tool]));
|
|
16
|
+
return {
|
|
17
|
+
definitions: tools.map(toolToDefinition),
|
|
18
|
+
run(call, { conversationId, signal, timeoutMs, logger }) {
|
|
19
|
+
const tool = byName.get(call.name);
|
|
20
|
+
if (!tool)
|
|
21
|
+
return Promise.resolve({ success: false, message: `Unknown tool: ${call.name}` });
|
|
22
|
+
return runToolWithTimeout((toolSignal) => tool.execute(call.input, { conversationId, signal: toolSignal, ...(logger ? { logger } : {}) }), { timeoutMs, signal, name: call.name, ...(logger ? { logger } : {}) });
|
|
23
|
+
},
|
|
24
|
+
emits(call, result) {
|
|
25
|
+
const tool = byName.get(call.name);
|
|
26
|
+
return tool?.emits ? tool.emits(result) : legacyLeadPart(call.name, result);
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A registry over tool definitions and one executor function, the 0.4
|
|
32
|
+
* `toolExecutor` shape. The executor gets the call and nothing else.
|
|
33
|
+
*/
|
|
34
|
+
export function executorRegistry(definitions = [], executor) {
|
|
35
|
+
return {
|
|
36
|
+
definitions,
|
|
37
|
+
run(call, { signal, timeoutMs, logger }) {
|
|
38
|
+
if (!executor) {
|
|
39
|
+
return Promise.resolve({ success: false, message: `No tool executor is configured for "${call.name}".` });
|
|
40
|
+
}
|
|
41
|
+
return runToolWithTimeout(() => executor(call), { timeoutMs, signal, name: call.name, ...(logger ? { logger } : {}) });
|
|
42
|
+
},
|
|
43
|
+
emits: (call, result) => legacyLeadPart(call.name, result),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** Tool output is stored with the conversation, so it's kept to JSON and a size. */
|
|
47
|
+
export const MAX_TOOL_OUTPUT_CHARS = 64_000;
|
|
48
|
+
/** The stored output of a call: what the model saw, as plain JSON. */
|
|
49
|
+
export function toolOutput(result) {
|
|
50
|
+
const output = serializeToolResult(result);
|
|
51
|
+
let json;
|
|
52
|
+
try {
|
|
53
|
+
json = JSON.stringify(output);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return { success: false, message: "The tool returned something that isn't JSON." };
|
|
57
|
+
}
|
|
58
|
+
if (json.length <= MAX_TOOL_OUTPUT_CHARS)
|
|
59
|
+
return JSON.parse(json);
|
|
60
|
+
return {
|
|
61
|
+
success: result.success,
|
|
62
|
+
data: `${JSON.stringify(output.data).slice(0, MAX_TOOL_OUTPUT_CHARS)}... (cut off: the tool returned more than ${MAX_TOOL_OUTPUT_CHARS} characters)`,
|
|
63
|
+
...(result.message ? { message: result.message } : {}),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=tool-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/agent/tool-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,8 @@ import type { AnalyticsEvent } from '../types.js';
|
|
|
2
2
|
export interface AnalyticsStats {
|
|
3
3
|
totalConversations: number;
|
|
4
4
|
totalMessages: number;
|
|
5
|
+
leadsCaptured: number;
|
|
6
|
+
/** @deprecated Use `leadsCaptured`, the same number. Removed in 1.0. */
|
|
5
7
|
leadsCapture: number;
|
|
6
8
|
averageMessagesPerConversation: number;
|
|
7
9
|
eventCounts: Record<string, number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/analytics/collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/analytics/collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD,MAAM,WAAW,cAAc;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC;IACrB,8BAA8B,EAAE,MAAM,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,eAAe,CAAqB;IAE5C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAazD,QAAQ,IAAI,cAAc;IAoB1B,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE;IAQ1C,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -1,35 +1,41 @@
|
|
|
1
|
+
import { ANALYTICS_EVENTS, countsWithAliases, eventName } from './names.js';
|
|
1
2
|
const MAX_EVENTS = 1000;
|
|
2
3
|
export class AnalyticsCollector {
|
|
3
4
|
events = [];
|
|
4
5
|
conversationIds = new Set();
|
|
5
6
|
track(type, data) {
|
|
6
|
-
const event = { type, data, timestamp: Date.now() };
|
|
7
|
+
const event = { type: eventName(type), data, timestamp: Date.now() };
|
|
7
8
|
this.events.push(event);
|
|
8
9
|
if (this.events.length > MAX_EVENTS) {
|
|
9
10
|
this.events = this.events.slice(-MAX_EVENTS);
|
|
10
11
|
}
|
|
11
|
-
if (type ===
|
|
12
|
+
if (event.type === ANALYTICS_EVENTS.conversationStarted && data?.conversationId) {
|
|
12
13
|
this.conversationIds.add(data.conversationId);
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
16
|
getStats() {
|
|
16
|
-
const
|
|
17
|
-
for (const event of this.events)
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
const raw = new Map();
|
|
18
|
+
for (const event of this.events)
|
|
19
|
+
raw.set(event.type, (raw.get(event.type) ?? 0) + 1);
|
|
20
|
+
const counts = countsWithAliases(raw);
|
|
21
|
+
const eventCounts = Object.fromEntries(counts);
|
|
20
22
|
const totalConversations = this.conversationIds.size;
|
|
21
|
-
const totalMessages = (
|
|
23
|
+
const totalMessages = (counts.get(ANALYTICS_EVENTS.messageSent) ?? 0) + (counts.get(ANALYTICS_EVENTS.messageReceived) ?? 0);
|
|
24
|
+
const leadsCaptured = counts.get(ANALYTICS_EVENTS.leadCaptured) ?? 0;
|
|
22
25
|
return {
|
|
23
26
|
totalConversations,
|
|
24
27
|
totalMessages,
|
|
25
|
-
|
|
28
|
+
leadsCaptured,
|
|
29
|
+
leadsCapture: leadsCaptured,
|
|
26
30
|
averageMessagesPerConversation: totalConversations > 0 ? totalMessages / totalConversations : 0,
|
|
27
31
|
eventCounts,
|
|
28
32
|
};
|
|
29
33
|
}
|
|
30
34
|
getEvents(type) {
|
|
31
|
-
if (type)
|
|
32
|
-
|
|
35
|
+
if (type) {
|
|
36
|
+
const name = eventName(type);
|
|
37
|
+
return this.events.filter((e) => e.type === name);
|
|
38
|
+
}
|
|
33
39
|
return [...this.events];
|
|
34
40
|
}
|
|
35
41
|
clear() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/analytics/collector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/analytics/collector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5E,MAAM,UAAU,GAAG,IAAI,CAAC;AAYxB,MAAM,OAAO,kBAAkB;IACrB,MAAM,GAAqB,EAAE,CAAC;IAC9B,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE5C,KAAK,CAAC,IAAY,EAAE,IAA8B;QAChD,MAAM,KAAK,GAAmB,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACrF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAExB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,mBAAmB,IAAI,IAAI,EAAE,cAAc,EAAE,CAAC;YAChF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,cAAwB,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,QAAQ;QACN,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM;YAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE/C,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QACrD,MAAM,aAAa,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5H,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAErE,OAAO;YACL,kBAAkB;YAClB,aAAa;YACb,aAAa;YACb,YAAY,EAAE,aAAa;YAC3B,8BAA8B,EAAE,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YAC/F,WAAW;SACZ,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,IAAa;QACrB,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/analytics/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The analytics events ChatCops tracks, named `noun.verb`. Before 0.8 they
|
|
3
|
+
* were `noun:verb`; those names still work until 1.0: `track()` reads them
|
|
4
|
+
* as the new ones, stats count events stored under either, and
|
|
5
|
+
* `eventCounts` has both keys.
|
|
6
|
+
*/
|
|
7
|
+
export declare const ANALYTICS_EVENTS: {
|
|
8
|
+
readonly conversationStarted: "conversation.started";
|
|
9
|
+
readonly messageSent: "message.sent";
|
|
10
|
+
readonly messageReceived: "message.received";
|
|
11
|
+
readonly leadCaptured: "lead.captured";
|
|
12
|
+
};
|
|
13
|
+
/** The current name for an event type: an old `noun:verb` name becomes its `noun.verb` one. */
|
|
14
|
+
export declare function eventName(type: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Counts by type with events under an old name added to the new one, and
|
|
17
|
+
* the old key kept with the same total, so code that reads
|
|
18
|
+
* `eventCounts['message:sent']` keeps working until 1.0.
|
|
19
|
+
*/
|
|
20
|
+
export declare function countsWithAliases(counts: Iterable<[string, number]>): Map<string, number>;
|
|
21
|
+
//# sourceMappingURL=names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../../src/analytics/names.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB;;;;;CAKnB,CAAC;AASX,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAWzF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The analytics events ChatCops tracks, named `noun.verb`. Before 0.8 they
|
|
3
|
+
* were `noun:verb`; those names still work until 1.0: `track()` reads them
|
|
4
|
+
* as the new ones, stats count events stored under either, and
|
|
5
|
+
* `eventCounts` has both keys.
|
|
6
|
+
*/
|
|
7
|
+
export const ANALYTICS_EVENTS = {
|
|
8
|
+
conversationStarted: 'conversation.started',
|
|
9
|
+
messageSent: 'message.sent',
|
|
10
|
+
messageReceived: 'message.received',
|
|
11
|
+
leadCaptured: 'lead.captured',
|
|
12
|
+
};
|
|
13
|
+
const LEGACY = {
|
|
14
|
+
'conversation:started': ANALYTICS_EVENTS.conversationStarted,
|
|
15
|
+
'message:sent': ANALYTICS_EVENTS.messageSent,
|
|
16
|
+
'message:received': ANALYTICS_EVENTS.messageReceived,
|
|
17
|
+
'lead:captured': ANALYTICS_EVENTS.leadCaptured,
|
|
18
|
+
};
|
|
19
|
+
/** The current name for an event type: an old `noun:verb` name becomes its `noun.verb` one. */
|
|
20
|
+
export function eventName(type) {
|
|
21
|
+
return LEGACY[type] ?? type;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Counts by type with events under an old name added to the new one, and
|
|
25
|
+
* the old key kept with the same total, so code that reads
|
|
26
|
+
* `eventCounts['message:sent']` keeps working until 1.0.
|
|
27
|
+
*/
|
|
28
|
+
export function countsWithAliases(counts) {
|
|
29
|
+
const merged = new Map();
|
|
30
|
+
for (const [type, count] of counts) {
|
|
31
|
+
const name = eventName(type);
|
|
32
|
+
merged.set(name, (merged.get(name) ?? 0) + count);
|
|
33
|
+
}
|
|
34
|
+
for (const [old, name] of Object.entries(LEGACY)) {
|
|
35
|
+
const total = merged.get(name);
|
|
36
|
+
if (total !== undefined)
|
|
37
|
+
merged.set(old, total);
|
|
38
|
+
}
|
|
39
|
+
return merged;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/analytics/names.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,mBAAmB,EAAE,sBAAsB;IAC3C,WAAW,EAAE,cAAc;IAC3B,eAAe,EAAE,kBAAkB;IACnC,YAAY,EAAE,eAAe;CACrB,CAAC;AAEX,MAAM,MAAM,GAA2B;IACrC,sBAAsB,EAAE,gBAAgB,CAAC,mBAAmB;IAC5D,cAAc,EAAE,gBAAgB,CAAC,WAAW;IAC5C,kBAAkB,EAAE,gBAAgB,CAAC,eAAe;IACpD,eAAe,EAAE,gBAAgB,CAAC,YAAY;CAC/C,CAAC;AAEF,+FAA+F;AAC/F,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAkC;IAClE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IACpD,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Logger } from '../logger.js';
|
|
2
|
+
import type { EventSink } from '../storage/types.js';
|
|
3
|
+
import type { AnalyticsStats } from './collector.js';
|
|
4
|
+
export declare class BufferedEventSink {
|
|
5
|
+
private readonly sink;
|
|
6
|
+
private readonly events;
|
|
7
|
+
private readonly maxBatch;
|
|
8
|
+
private readonly flushMs;
|
|
9
|
+
private timer;
|
|
10
|
+
private flushPromise;
|
|
11
|
+
private readonly logger;
|
|
12
|
+
constructor(sink: EventSink, options?: {
|
|
13
|
+
maxBatch?: number;
|
|
14
|
+
flushMs?: number;
|
|
15
|
+
logger?: Logger;
|
|
16
|
+
});
|
|
17
|
+
track(type: string, data?: Record<string, unknown>): void;
|
|
18
|
+
flush(): Promise<void>;
|
|
19
|
+
private scheduleFlush;
|
|
20
|
+
private clearTimer;
|
|
21
|
+
private startAutomaticFlush;
|
|
22
|
+
}
|
|
23
|
+
export declare function statsFromSink(sink: EventSink, range: {
|
|
24
|
+
from: number;
|
|
25
|
+
to: number;
|
|
26
|
+
}): Promise<AnalyticsStats>;
|
|
27
|
+
//# sourceMappingURL=sink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sink.d.ts","sourceRoot":"","sources":["../../src/analytics/sink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMrD,qBAAa,iBAAiB;IAS1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IARvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAGb,IAAI,EAAE,SAAS,EAChC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAcpE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAQzD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBtB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,mBAAmB;CAK5B;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,SAAS,EACf,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAClC,OAAO,CAAC,cAAc,CAAC,CAqBzB"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { consoleLogger } from '../logger.js';
|
|
2
|
+
import { ANALYTICS_EVENTS, countsWithAliases, eventName } from './names.js';
|
|
3
|
+
const DEFAULT_MAX_BATCH = 50;
|
|
4
|
+
const DEFAULT_FLUSH_MS = 2000;
|
|
5
|
+
export class BufferedEventSink {
|
|
6
|
+
sink;
|
|
7
|
+
events = [];
|
|
8
|
+
maxBatch;
|
|
9
|
+
flushMs;
|
|
10
|
+
timer;
|
|
11
|
+
flushPromise;
|
|
12
|
+
logger;
|
|
13
|
+
constructor(sink, options) {
|
|
14
|
+
this.sink = sink;
|
|
15
|
+
this.logger = options?.logger ?? consoleLogger();
|
|
16
|
+
this.maxBatch = options?.maxBatch ?? DEFAULT_MAX_BATCH;
|
|
17
|
+
this.flushMs = options?.flushMs ?? DEFAULT_FLUSH_MS;
|
|
18
|
+
if (!Number.isInteger(this.maxBatch) || this.maxBatch < 1) {
|
|
19
|
+
throw new RangeError('maxBatch must be a positive integer.');
|
|
20
|
+
}
|
|
21
|
+
if (!Number.isFinite(this.flushMs) || this.flushMs < 0) {
|
|
22
|
+
throw new RangeError('flushMs must be a non-negative finite number.');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
track(type, data) {
|
|
26
|
+
const wasEmpty = this.events.length === 0;
|
|
27
|
+
this.events.push({ type: eventName(type), data, timestamp: Date.now() });
|
|
28
|
+
if (wasEmpty)
|
|
29
|
+
this.scheduleFlush();
|
|
30
|
+
if (this.events.length >= this.maxBatch)
|
|
31
|
+
this.startAutomaticFlush();
|
|
32
|
+
}
|
|
33
|
+
flush() {
|
|
34
|
+
if (this.flushPromise)
|
|
35
|
+
return this.flushPromise;
|
|
36
|
+
this.clearTimer();
|
|
37
|
+
const drain = Promise.resolve().then(async () => {
|
|
38
|
+
while (this.events.length > 0) {
|
|
39
|
+
this.clearTimer();
|
|
40
|
+
const batch = this.events.splice(0, this.maxBatch);
|
|
41
|
+
try {
|
|
42
|
+
await this.sink.write(batch);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
this.logger.error('analytics_write_failed', `analytics write failed: ${errorMessage(error)}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
const flushPromise = drain.finally(() => {
|
|
50
|
+
if (this.flushPromise === flushPromise)
|
|
51
|
+
this.flushPromise = undefined;
|
|
52
|
+
if (this.events.length > 0)
|
|
53
|
+
this.startAutomaticFlush();
|
|
54
|
+
});
|
|
55
|
+
this.flushPromise = flushPromise;
|
|
56
|
+
return flushPromise;
|
|
57
|
+
}
|
|
58
|
+
scheduleFlush() {
|
|
59
|
+
try {
|
|
60
|
+
const timer = setTimeout(() => {
|
|
61
|
+
this.timer = undefined;
|
|
62
|
+
this.startAutomaticFlush();
|
|
63
|
+
}, this.flushMs);
|
|
64
|
+
this.timer = timer;
|
|
65
|
+
if (typeof timer === 'object' && timer !== null && 'unref' in timer && typeof timer.unref === 'function') {
|
|
66
|
+
timer.unref();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
this.clearTimer();
|
|
71
|
+
this.logger.error('analytics_flush_failed', `analytics timer failed: ${errorMessage(error)}`);
|
|
72
|
+
this.startAutomaticFlush();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
clearTimer() {
|
|
76
|
+
if (this.timer === undefined)
|
|
77
|
+
return;
|
|
78
|
+
clearTimeout(this.timer);
|
|
79
|
+
this.timer = undefined;
|
|
80
|
+
}
|
|
81
|
+
startAutomaticFlush() {
|
|
82
|
+
void this.flush().catch((error) => {
|
|
83
|
+
this.logger.error('analytics_flush_failed', `analytics flush failed: ${errorMessage(error)}`);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export async function statsFromSink(sink, range) {
|
|
88
|
+
if (!sink.query) {
|
|
89
|
+
throw new Error('Event sink does not support querying; implement EventSink.query to calculate analytics statistics.');
|
|
90
|
+
}
|
|
91
|
+
// Events stored under the old names (before 0.8) still count.
|
|
92
|
+
const eventCounts = countsWithAliases((await sink.query(range)).map(({ type, count }) => [type, count]));
|
|
93
|
+
const totalConversations = eventCounts.get(ANALYTICS_EVENTS.conversationStarted) ?? 0;
|
|
94
|
+
const totalMessages = (eventCounts.get(ANALYTICS_EVENTS.messageSent) ?? 0) + (eventCounts.get(ANALYTICS_EVENTS.messageReceived) ?? 0);
|
|
95
|
+
const leadsCaptured = eventCounts.get(ANALYTICS_EVENTS.leadCaptured) ?? 0;
|
|
96
|
+
return {
|
|
97
|
+
totalConversations,
|
|
98
|
+
totalMessages,
|
|
99
|
+
leadsCaptured,
|
|
100
|
+
leadsCapture: leadsCaptured,
|
|
101
|
+
averageMessagesPerConversation: totalConversations > 0 ? totalMessages / totalConversations : 0,
|
|
102
|
+
eventCounts: Object.fromEntries(eventCounts),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function errorMessage(error) {
|
|
106
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
107
|
+
return message.replace(/[\r\n]+/g, ' ');
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=sink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sink.js","sourceRoot":"","sources":["../../src/analytics/sink.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC5E,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1,16 +1,75 @@
|
|
|
1
|
+
import { type Logger } from '../logger.js';
|
|
2
|
+
import type { AppendOptions, ChatCopsStorage } from '../storage/types.js';
|
|
1
3
|
import type { ChatMessage, Conversation } from '../types.js';
|
|
2
4
|
import type { ConversationStore } from './store.js';
|
|
5
|
+
export interface ConversationManagerOptions {
|
|
6
|
+
/** Where everything is stored. Takes precedence over `store`. */
|
|
7
|
+
storage?: ChatCopsStorage;
|
|
8
|
+
/** A conversation store on its own, as in 0.4. */
|
|
9
|
+
store?: ConversationStore;
|
|
10
|
+
/**
|
|
11
|
+
* Most messages kept per conversation. Older ones are removed after each
|
|
12
|
+
* write; system messages stay. Default 100.
|
|
13
|
+
*/
|
|
14
|
+
maxMessages?: number;
|
|
15
|
+
/** Token budget for the history sent to the model. Default 32,000. */
|
|
16
|
+
maxHistoryTokens?: number;
|
|
17
|
+
/** Where warnings go. Default `consoleLogger()`. */
|
|
18
|
+
logger?: Logger;
|
|
19
|
+
}
|
|
20
|
+
/** Releases a turn lock. Safe to call more than once. */
|
|
21
|
+
export type ReleaseTurn = () => Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Reads and writes conversations through a store. Writes are appends, so two
|
|
24
|
+
* server instances answering the same conversation don't overwrite each
|
|
25
|
+
* other's messages, as long as the store implements `append`.
|
|
26
|
+
*/
|
|
3
27
|
export declare class ConversationManager {
|
|
4
|
-
private store;
|
|
5
|
-
private
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
28
|
+
private readonly store;
|
|
29
|
+
private readonly kv;
|
|
30
|
+
private readonly maxMessages;
|
|
31
|
+
private readonly maxHistoryTokens;
|
|
32
|
+
private readonly localTurns;
|
|
33
|
+
constructor(options?: ConversationManagerOptions);
|
|
34
|
+
/**
|
|
35
|
+
* The stored conversation, or a new empty one. A new conversation isn't
|
|
36
|
+
* saved until its first message is added.
|
|
37
|
+
*/
|
|
10
38
|
getOrCreate(id: string): Promise<Conversation>;
|
|
39
|
+
/** Adds one message and returns the conversation as stored afterwards. */
|
|
11
40
|
addMessage(conversationId: string, message: ChatMessage): Promise<Conversation>;
|
|
41
|
+
/**
|
|
42
|
+
* Adds messages atomically and returns the new version. Pass
|
|
43
|
+
* `expectedVersion` to fail with a `ConflictError` when another request
|
|
44
|
+
* wrote first.
|
|
45
|
+
*/
|
|
46
|
+
appendMessages(conversationId: string, messages: ChatMessage[], options?: AppendOptions): Promise<{
|
|
47
|
+
version: number;
|
|
48
|
+
}>;
|
|
49
|
+
/** Replaces a stored message with the same id. Resolves `false` when there's none. */
|
|
50
|
+
updateMessage(conversationId: string, message: ChatMessage): Promise<boolean>;
|
|
12
51
|
getMessages(conversationId: string): Promise<ChatMessage[]>;
|
|
52
|
+
/**
|
|
53
|
+
* The messages to send to the model: user and assistant turns within the
|
|
54
|
+
* token budget, keeping the first user message and the newest ones.
|
|
55
|
+
*/
|
|
56
|
+
getHistory(conversationId: string): Promise<ChatMessage[]>;
|
|
13
57
|
removeMessage(conversationId: string, messageId: string): Promise<void>;
|
|
14
58
|
deleteConversation(id: string): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Makes sure only one reply is generated for a conversation at a time.
|
|
61
|
+
* Resolves a release function, or `null` when another turn holds the lock.
|
|
62
|
+
* The lock expires after `ttlMs` in case a server dies mid-turn.
|
|
63
|
+
*
|
|
64
|
+
* With `storage.kv` (and `setIfAbsent`) the lock holds across instances;
|
|
65
|
+
* otherwise only within this process.
|
|
66
|
+
*/
|
|
67
|
+
acquireTurn(conversationId: string, ttlMs?: number): Promise<ReleaseTurn | null>;
|
|
68
|
+
/**
|
|
69
|
+
* Removes the oldest non-system messages past `maxMessages`, one atomic
|
|
70
|
+
* remove each, then any assistant turns left at the front, so the stored
|
|
71
|
+
* history still opens with the visitor (Gemini rejects one that doesn't).
|
|
72
|
+
*/
|
|
73
|
+
private enforceMaxMessages;
|
|
15
74
|
}
|
|
16
75
|
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/conversation/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/conversation/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAK1D,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAiB,MAAM,qBAAqB,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,0BAA0B;IACzC,iEAAiE;IACjE,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,kDAAkD;IAClD,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,yDAAyD;AACzD,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9C;;;;GAIG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA4B;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;gBAEpC,OAAO,GAAE,0BAA+B;IAepD;;;OAGG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAOpD,0EAA0E;IACpE,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAKrF;;;;OAIG;IACG,cAAc,CAClB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAM/B,sFAAsF;IACtF,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvE,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAKjE;;;OAGG;IACG,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI1D,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD;;;;;;;OAOG;IACG,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,SAAU,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IA8BvF;;;;OAIG;YACW,kBAAkB;CAWjC"}
|