@chatcops/core 0.2.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.
Files changed (117) hide show
  1. package/dist/analytics/collector.d.ts +17 -0
  2. package/dist/analytics/collector.d.ts.map +1 -0
  3. package/dist/analytics/collector.js +40 -0
  4. package/dist/analytics/collector.js.map +1 -0
  5. package/dist/analytics/index.d.ts +3 -0
  6. package/dist/analytics/index.d.ts.map +1 -0
  7. package/dist/analytics/index.js +2 -0
  8. package/dist/analytics/index.js.map +1 -0
  9. package/dist/conversation/index.d.ts +4 -0
  10. package/dist/conversation/index.d.ts.map +1 -0
  11. package/dist/conversation/index.js +3 -0
  12. package/dist/conversation/index.js.map +1 -0
  13. package/dist/conversation/manager.d.ts +15 -0
  14. package/dist/conversation/manager.d.ts.map +1 -0
  15. package/dist/conversation/manager.js +44 -0
  16. package/dist/conversation/manager.js.map +1 -0
  17. package/dist/conversation/store.d.ts +13 -0
  18. package/dist/conversation/store.d.ts.map +1 -0
  19. package/dist/conversation/store.js +13 -0
  20. package/dist/conversation/store.js.map +1 -0
  21. package/dist/i18n/ar.d.ts +3 -0
  22. package/dist/i18n/ar.d.ts.map +1 -0
  23. package/dist/i18n/ar.js +14 -0
  24. package/dist/i18n/ar.js.map +1 -0
  25. package/dist/i18n/de.d.ts +3 -0
  26. package/dist/i18n/de.d.ts.map +1 -0
  27. package/dist/i18n/de.js +14 -0
  28. package/dist/i18n/de.js.map +1 -0
  29. package/dist/i18n/en.d.ts +3 -0
  30. package/dist/i18n/en.d.ts.map +1 -0
  31. package/dist/i18n/en.js +14 -0
  32. package/dist/i18n/en.js.map +1 -0
  33. package/dist/i18n/es.d.ts +3 -0
  34. package/dist/i18n/es.d.ts.map +1 -0
  35. package/dist/i18n/es.js +14 -0
  36. package/dist/i18n/es.js.map +1 -0
  37. package/dist/i18n/fr.d.ts +3 -0
  38. package/dist/i18n/fr.d.ts.map +1 -0
  39. package/dist/i18n/fr.js +14 -0
  40. package/dist/i18n/fr.js.map +1 -0
  41. package/dist/i18n/hi.d.ts +3 -0
  42. package/dist/i18n/hi.d.ts.map +1 -0
  43. package/dist/i18n/hi.js +14 -0
  44. package/dist/i18n/hi.js.map +1 -0
  45. package/dist/i18n/index.d.ts +13 -0
  46. package/dist/i18n/index.d.ts.map +1 -0
  47. package/dist/i18n/index.js +24 -0
  48. package/dist/i18n/index.js.map +1 -0
  49. package/dist/i18n/ja.d.ts +3 -0
  50. package/dist/i18n/ja.d.ts.map +1 -0
  51. package/dist/i18n/ja.js +14 -0
  52. package/dist/i18n/ja.js.map +1 -0
  53. package/dist/i18n/types.d.ts +14 -0
  54. package/dist/i18n/types.d.ts.map +1 -0
  55. package/dist/i18n/types.js +2 -0
  56. package/dist/i18n/types.js.map +1 -0
  57. package/dist/i18n/zh.d.ts +3 -0
  58. package/dist/i18n/zh.d.ts.map +1 -0
  59. package/dist/i18n/zh.js +14 -0
  60. package/dist/i18n/zh.js.map +1 -0
  61. package/dist/index.d.ts +14 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +10 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/knowledge/base.d.ts +5 -0
  66. package/dist/knowledge/base.d.ts.map +1 -0
  67. package/dist/knowledge/base.js +2 -0
  68. package/dist/knowledge/base.js.map +1 -0
  69. package/dist/knowledge/faq.d.ts +13 -0
  70. package/dist/knowledge/faq.d.ts.map +1 -0
  71. package/dist/knowledge/faq.js +33 -0
  72. package/dist/knowledge/faq.js.map +1 -0
  73. package/dist/knowledge/index.d.ts +5 -0
  74. package/dist/knowledge/index.d.ts.map +1 -0
  75. package/dist/knowledge/index.js +3 -0
  76. package/dist/knowledge/index.js.map +1 -0
  77. package/dist/knowledge/text.d.ts +8 -0
  78. package/dist/knowledge/text.d.ts.map +1 -0
  79. package/dist/knowledge/text.js +28 -0
  80. package/dist/knowledge/text.js.map +1 -0
  81. package/dist/providers/base.d.ts +35 -0
  82. package/dist/providers/base.d.ts.map +1 -0
  83. package/dist/providers/base.js +72 -0
  84. package/dist/providers/base.js.map +1 -0
  85. package/dist/providers/claude.d.ts +11 -0
  86. package/dist/providers/claude.d.ts.map +1 -0
  87. package/dist/providers/claude.js +48 -0
  88. package/dist/providers/claude.js.map +1 -0
  89. package/dist/providers/gemini.d.ts +11 -0
  90. package/dist/providers/gemini.d.ts.map +1 -0
  91. package/dist/providers/gemini.js +66 -0
  92. package/dist/providers/gemini.js.map +1 -0
  93. package/dist/providers/index.d.ts +6 -0
  94. package/dist/providers/index.d.ts.map +1 -0
  95. package/dist/providers/index.js +5 -0
  96. package/dist/providers/index.js.map +1 -0
  97. package/dist/providers/openai.d.ts +11 -0
  98. package/dist/providers/openai.d.ts.map +1 -0
  99. package/dist/providers/openai.js +53 -0
  100. package/dist/providers/openai.js.map +1 -0
  101. package/dist/tools/base.d.ts +10 -0
  102. package/dist/tools/base.d.ts.map +1 -0
  103. package/dist/tools/base.js +9 -0
  104. package/dist/tools/base.js.map +1 -0
  105. package/dist/tools/index.d.ts +5 -0
  106. package/dist/tools/index.d.ts.map +1 -0
  107. package/dist/tools/index.js +3 -0
  108. package/dist/tools/index.js.map +1 -0
  109. package/dist/tools/lead-capture.d.ts +34 -0
  110. package/dist/tools/lead-capture.d.ts.map +1 -0
  111. package/dist/tools/lead-capture.js +58 -0
  112. package/dist/tools/lead-capture.js.map +1 -0
  113. package/dist/types.d.ts +80 -0
  114. package/dist/types.d.ts.map +1 -0
  115. package/dist/types.js +2 -0
  116. package/dist/types.js.map +1 -0
  117. package/package.json +38 -0
@@ -0,0 +1,33 @@
1
+ export class FAQKnowledgeSource {
2
+ type = 'faq';
3
+ pairs;
4
+ constructor(pairs) {
5
+ this.pairs = pairs;
6
+ }
7
+ async getContext(query) {
8
+ const queryWords = query.toLowerCase().split(/\s+/).filter((w) => w.length > 2);
9
+ if (queryWords.length === 0 && this.pairs.length > 0) {
10
+ return this.formatPairs(this.pairs.slice(0, 3));
11
+ }
12
+ const scored = this.pairs.map((pair) => {
13
+ const text = (pair.question + ' ' + pair.answer).toLowerCase();
14
+ const score = queryWords.reduce((sum, word) => {
15
+ const matches = text.split(word).length - 1;
16
+ return sum + matches;
17
+ }, 0);
18
+ return { pair, score };
19
+ });
20
+ const relevant = scored
21
+ .filter((s) => s.score > 0)
22
+ .sort((a, b) => b.score - a.score)
23
+ .slice(0, 5);
24
+ if (relevant.length === 0)
25
+ return '';
26
+ return this.formatPairs(relevant.map((r) => r.pair));
27
+ }
28
+ formatPairs(pairs) {
29
+ return 'Frequently Asked Questions:\n' +
30
+ pairs.map((p) => `Q: ${p.question}\nA: ${p.answer}`).join('\n\n');
31
+ }
32
+ }
33
+ //# sourceMappingURL=faq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faq.js","sourceRoot":"","sources":["../../src/knowledge/faq.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,kBAAkB;IAC7B,IAAI,GAAG,KAAK,CAAC;IACL,KAAK,CAAY;IAEzB,YAAY,KAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;gBAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC5C,OAAO,GAAG,GAAG,OAAO,CAAC;YACvB,CAAC,EAAE,CAAC,CAAC,CAAC;YACN,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;aAC1B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAErC,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;IAEO,WAAW,CAAC,KAAgB;QAClC,OAAO,+BAA+B;YACpC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export type { KnowledgeSource } from './base.js';
2
+ export { TextKnowledgeSource } from './text.js';
3
+ export { FAQKnowledgeSource } from './faq.js';
4
+ export type { FAQPair } from './faq.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/knowledge/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,YAAY,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { TextKnowledgeSource } from './text.js';
2
+ export { FAQKnowledgeSource } from './faq.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/knowledge/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { KnowledgeSource } from './base.js';
2
+ export declare class TextKnowledgeSource implements KnowledgeSource {
3
+ type: string;
4
+ private chunks;
5
+ constructor(chunks: string[]);
6
+ getContext(query: string): Promise<string>;
7
+ }
8
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/knowledge/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,qBAAa,mBAAoB,YAAW,eAAe;IACzD,IAAI,SAAU;IACd,OAAO,CAAC,MAAM,CAAW;gBAEb,MAAM,EAAE,MAAM,EAAE;IAItB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAsBjD"}
@@ -0,0 +1,28 @@
1
+ export class TextKnowledgeSource {
2
+ type = 'text';
3
+ chunks;
4
+ constructor(chunks) {
5
+ this.chunks = chunks;
6
+ }
7
+ async getContext(query) {
8
+ const queryWords = query.toLowerCase().split(/\s+/).filter((w) => w.length > 2);
9
+ if (queryWords.length === 0)
10
+ return '';
11
+ const scored = this.chunks.map((chunk) => {
12
+ const lower = chunk.toLowerCase();
13
+ const score = queryWords.reduce((sum, word) => {
14
+ const matches = lower.split(word).length - 1;
15
+ return sum + matches;
16
+ }, 0);
17
+ return { chunk, score };
18
+ });
19
+ const relevant = scored
20
+ .filter((s) => s.score > 0)
21
+ .sort((a, b) => b.score - a.score)
22
+ .slice(0, 3);
23
+ if (relevant.length === 0)
24
+ return '';
25
+ return 'Relevant context:\n' + relevant.map((r) => r.chunk).join('\n\n');
26
+ }
27
+ }
28
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/knowledge/text.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,mBAAmB;IAC9B,IAAI,GAAG,MAAM,CAAC;IACN,MAAM,CAAW;IAEzB,YAAY,MAAgB;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACvC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;gBAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC7C,OAAO,GAAG,GAAG,OAAO,CAAC;YACvB,CAAC,EAAE,CAAC,CAAC,CAAC;YACN,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;aAC1B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAErC,OAAO,qBAAqB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3E,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ import { type Tool } from '@google/generative-ai';
2
+ import type { ChatMessage, ProviderChatParams, ProviderConfig, ToolDefinition } from '../types.js';
3
+ export interface AIProvider {
4
+ name: string;
5
+ chat(params: ProviderChatParams): AsyncGenerator<string>;
6
+ chatSync(params: ProviderChatParams): Promise<string>;
7
+ }
8
+ export declare function createProvider(config: ProviderConfig): Promise<AIProvider>;
9
+ export declare function toProviderMessages(messages: ChatMessage[]): Array<{
10
+ role: string;
11
+ content: string;
12
+ }>;
13
+ export declare function toClaudeTools(tools: ToolDefinition[]): {
14
+ name: string;
15
+ description: string;
16
+ input_schema: {
17
+ type: "object";
18
+ properties: Record<string, import("../types.js").ToolParameter>;
19
+ required: string[];
20
+ };
21
+ }[];
22
+ export declare function toOpenAITools(tools: ToolDefinition[]): {
23
+ type: "function";
24
+ function: {
25
+ name: string;
26
+ description: string;
27
+ parameters: {
28
+ type: "object";
29
+ properties: Record<string, import("../types.js").ToolParameter>;
30
+ required: string[];
31
+ };
32
+ };
33
+ }[];
34
+ export declare function toGeminiTools(tools: ToolDefinition[]): Tool[];
35
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,IAAI,EAA4B,MAAM,uBAAuB,CAAC;AACxF,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEnG,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACzD,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACvD;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAiBhF;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAIpG;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE;;;;;;;;IAUpD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE;;;;;;;;;;;IAapD;AAQD,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,CAkB7D"}
@@ -0,0 +1,72 @@
1
+ import { SchemaType } from '@google/generative-ai';
2
+ export async function createProvider(config) {
3
+ switch (config.type) {
4
+ case 'claude': {
5
+ const { ClaudeProvider } = await import('./claude.js');
6
+ return new ClaudeProvider(config);
7
+ }
8
+ case 'openai': {
9
+ const { OpenAIProvider } = await import('./openai.js');
10
+ return new OpenAIProvider(config);
11
+ }
12
+ case 'gemini': {
13
+ const { GeminiProvider } = await import('./gemini.js');
14
+ return new GeminiProvider(config);
15
+ }
16
+ default:
17
+ throw new Error(`Unknown provider type: ${config.type}`);
18
+ }
19
+ }
20
+ export function toProviderMessages(messages) {
21
+ return messages
22
+ .filter((m) => m.role !== 'system')
23
+ .map((m) => ({ role: m.role, content: m.content }));
24
+ }
25
+ export function toClaudeTools(tools) {
26
+ return tools.map((t) => ({
27
+ name: t.name,
28
+ description: t.description,
29
+ input_schema: {
30
+ type: 'object',
31
+ properties: t.parameters,
32
+ required: t.required,
33
+ },
34
+ }));
35
+ }
36
+ export function toOpenAITools(tools) {
37
+ return tools.map((t) => ({
38
+ type: 'function',
39
+ function: {
40
+ name: t.name,
41
+ description: t.description,
42
+ parameters: {
43
+ type: 'object',
44
+ properties: t.parameters,
45
+ required: t.required,
46
+ },
47
+ },
48
+ }));
49
+ }
50
+ const SCHEMA_TYPE_MAP = {
51
+ string: SchemaType.STRING,
52
+ number: SchemaType.NUMBER,
53
+ boolean: SchemaType.BOOLEAN,
54
+ };
55
+ export function toGeminiTools(tools) {
56
+ return [{
57
+ functionDeclarations: tools.map((t) => ({
58
+ name: t.name,
59
+ description: t.description,
60
+ parameters: {
61
+ type: SchemaType.OBJECT,
62
+ properties: Object.fromEntries(Object.entries(t.parameters).map(([k, v]) => [k, {
63
+ type: SCHEMA_TYPE_MAP[v.type] ?? SchemaType.STRING,
64
+ description: v.description,
65
+ ...(v.enum ? { enum: v.enum } : {}),
66
+ }])),
67
+ required: t.required,
68
+ },
69
+ })),
70
+ }];
71
+ }
72
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ProviderConfig, ProviderChatParams } from '../types.js';
2
+ import type { AIProvider } from './base.js';
3
+ export declare class ClaudeProvider implements AIProvider {
4
+ name: string;
5
+ private client;
6
+ private model;
7
+ constructor(config: ProviderConfig);
8
+ chat(params: ProviderChatParams): AsyncGenerator<string>;
9
+ chatSync(params: ProviderChatParams): Promise<string>;
10
+ }
11
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/providers/claude.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAK5C,qBAAa,cAAe,YAAW,UAAU;IAC/C,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,cAAc;IAK3B,IAAI,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC;IAsBzD,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;CAkB5D"}
@@ -0,0 +1,48 @@
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ import { toProviderMessages, toClaudeTools } from './base.js';
3
+ const DEFAULT_MODEL = 'claude-haiku-4-5-20251001';
4
+ export class ClaudeProvider {
5
+ name = 'claude';
6
+ client;
7
+ model;
8
+ constructor(config) {
9
+ this.client = new Anthropic({ apiKey: config.apiKey });
10
+ this.model = config.model ?? DEFAULT_MODEL;
11
+ }
12
+ async *chat(params) {
13
+ const messages = toProviderMessages(params.messages).map((m) => ({
14
+ role: m.role,
15
+ content: m.content,
16
+ }));
17
+ const stream = this.client.messages.stream({
18
+ model: this.model,
19
+ max_tokens: params.maxTokens ?? 1024,
20
+ system: params.systemPrompt,
21
+ messages,
22
+ ...(params.tools?.length ? { tools: toClaudeTools(params.tools) } : {}),
23
+ ...(params.temperature != null ? { temperature: params.temperature } : {}),
24
+ });
25
+ for await (const event of stream) {
26
+ if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
27
+ yield event.delta.text;
28
+ }
29
+ }
30
+ }
31
+ async chatSync(params) {
32
+ const messages = toProviderMessages(params.messages).map((m) => ({
33
+ role: m.role,
34
+ content: m.content,
35
+ }));
36
+ const response = await this.client.messages.create({
37
+ model: this.model,
38
+ max_tokens: params.maxTokens ?? 1024,
39
+ system: params.systemPrompt,
40
+ messages,
41
+ ...(params.tools?.length ? { tools: toClaudeTools(params.tools) } : {}),
42
+ ...(params.temperature != null ? { temperature: params.temperature } : {}),
43
+ });
44
+ const textBlock = response.content.find((b) => b.type === 'text');
45
+ return textBlock?.type === 'text' ? textBlock.text : '';
46
+ }
47
+ }
48
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/providers/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ProviderConfig, ProviderChatParams } from '../types.js';
2
+ import type { AIProvider } from './base.js';
3
+ export declare class GeminiProvider implements AIProvider {
4
+ name: string;
5
+ private genAI;
6
+ private model;
7
+ constructor(config: ProviderConfig);
8
+ chat(params: ProviderChatParams): AsyncGenerator<string>;
9
+ chatSync(params: ProviderChatParams): Promise<string>;
10
+ }
11
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAK5C,qBAAa,cAAe,YAAW,UAAU;IAC/C,IAAI,SAAY;IAChB,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,cAAc;IAK3B,IAAI,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC;IAiCzD,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;CA0B5D"}
@@ -0,0 +1,66 @@
1
+ import { GoogleGenerativeAI } from '@google/generative-ai';
2
+ import { toProviderMessages, toGeminiTools } from './base.js';
3
+ const DEFAULT_MODEL = 'gemini-2.0-flash';
4
+ export class GeminiProvider {
5
+ name = 'gemini';
6
+ genAI;
7
+ model;
8
+ constructor(config) {
9
+ this.genAI = new GoogleGenerativeAI(config.apiKey);
10
+ this.model = config.model ?? DEFAULT_MODEL;
11
+ }
12
+ async *chat(params) {
13
+ const model = this.genAI.getGenerativeModel({
14
+ model: this.model,
15
+ systemInstruction: params.systemPrompt,
16
+ ...(params.tools?.length ? { tools: toGeminiTools(params.tools) } : {}),
17
+ });
18
+ const messages = toProviderMessages(params.messages);
19
+ const history = messages.slice(0, -1).map((m) => ({
20
+ role: m.role === 'assistant' ? 'model' : 'user',
21
+ parts: [{ text: m.content }],
22
+ }));
23
+ const chat = model.startChat({
24
+ history,
25
+ generationConfig: {
26
+ maxOutputTokens: params.maxTokens ?? 1024,
27
+ ...(params.temperature != null ? { temperature: params.temperature } : {}),
28
+ },
29
+ });
30
+ const lastMessage = messages[messages.length - 1]?.content ?? '';
31
+ if (!lastMessage)
32
+ throw new Error('Cannot send empty message');
33
+ const result = await chat.sendMessageStream(lastMessage);
34
+ for await (const chunk of result.stream) {
35
+ const text = chunk.text();
36
+ if (text) {
37
+ yield text;
38
+ }
39
+ }
40
+ }
41
+ async chatSync(params) {
42
+ const model = this.genAI.getGenerativeModel({
43
+ model: this.model,
44
+ systemInstruction: params.systemPrompt,
45
+ ...(params.tools?.length ? { tools: toGeminiTools(params.tools) } : {}),
46
+ });
47
+ const messages = toProviderMessages(params.messages);
48
+ const history = messages.slice(0, -1).map((m) => ({
49
+ role: m.role === 'assistant' ? 'model' : 'user',
50
+ parts: [{ text: m.content }],
51
+ }));
52
+ const chat = model.startChat({
53
+ history,
54
+ generationConfig: {
55
+ maxOutputTokens: params.maxTokens ?? 1024,
56
+ ...(params.temperature != null ? { temperature: params.temperature } : {}),
57
+ },
58
+ });
59
+ const lastMessage = messages[messages.length - 1]?.content ?? '';
60
+ if (!lastMessage)
61
+ throw new Error('Cannot send empty message');
62
+ const result = await chat.sendMessage(lastMessage);
63
+ return result.response.text();
64
+ }
65
+ }
66
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type { AIProvider } from './base.js';
2
+ export { createProvider, toProviderMessages, toClaudeTools, toOpenAITools, toGeminiTools } from './base.js';
3
+ export { ClaudeProvider } from './claude.js';
4
+ export { OpenAIProvider } from './openai.js';
5
+ export { GeminiProvider } from './gemini.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { createProvider, toProviderMessages, toClaudeTools, toOpenAITools, toGeminiTools } from './base.js';
2
+ export { ClaudeProvider } from './claude.js';
3
+ export { OpenAIProvider } from './openai.js';
4
+ export { GeminiProvider } from './gemini.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ProviderConfig, ProviderChatParams } from '../types.js';
2
+ import type { AIProvider } from './base.js';
3
+ export declare class OpenAIProvider implements AIProvider {
4
+ name: string;
5
+ private client;
6
+ private model;
7
+ constructor(config: ProviderConfig);
8
+ chat(params: ProviderChatParams): AsyncGenerator<string>;
9
+ chatSync(params: ProviderChatParams): Promise<string>;
10
+ }
11
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAK5C,qBAAa,cAAe,YAAW,UAAU;IAC/C,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,cAAc;IAK3B,IAAI,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC;IA0BzD,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;CAmB5D"}
@@ -0,0 +1,53 @@
1
+ import OpenAI from 'openai';
2
+ import { toProviderMessages, toOpenAITools } from './base.js';
3
+ const DEFAULT_MODEL = 'gpt-4o-mini';
4
+ export class OpenAIProvider {
5
+ name = 'openai';
6
+ client;
7
+ model;
8
+ constructor(config) {
9
+ this.client = new OpenAI({ apiKey: config.apiKey });
10
+ this.model = config.model ?? DEFAULT_MODEL;
11
+ }
12
+ async *chat(params) {
13
+ const messages = [
14
+ { role: 'system', content: params.systemPrompt },
15
+ ...toProviderMessages(params.messages).map((m) => ({
16
+ role: m.role,
17
+ content: m.content,
18
+ })),
19
+ ];
20
+ const stream = await this.client.chat.completions.create({
21
+ model: this.model,
22
+ messages,
23
+ stream: true,
24
+ max_tokens: params.maxTokens ?? 1024,
25
+ ...(params.tools?.length ? { tools: toOpenAITools(params.tools) } : {}),
26
+ ...(params.temperature != null ? { temperature: params.temperature } : {}),
27
+ });
28
+ for await (const chunk of stream) {
29
+ const delta = chunk.choices[0]?.delta?.content;
30
+ if (delta) {
31
+ yield delta;
32
+ }
33
+ }
34
+ }
35
+ async chatSync(params) {
36
+ const messages = [
37
+ { role: 'system', content: params.systemPrompt },
38
+ ...toProviderMessages(params.messages).map((m) => ({
39
+ role: m.role,
40
+ content: m.content,
41
+ })),
42
+ ];
43
+ const response = await this.client.chat.completions.create({
44
+ model: this.model,
45
+ messages,
46
+ max_tokens: params.maxTokens ?? 1024,
47
+ ...(params.tools?.length ? { tools: toOpenAITools(params.tools) } : {}),
48
+ ...(params.temperature != null ? { temperature: params.temperature } : {}),
49
+ });
50
+ return response.choices[0]?.message?.content ?? '';
51
+ }
52
+ }
53
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ToolParameter, ToolResult, ToolDefinition } from '../types.js';
2
+ export interface ChatTool {
3
+ name: string;
4
+ description: string;
5
+ parameters: Record<string, ToolParameter>;
6
+ required: string[];
7
+ execute(input: Record<string, unknown>): Promise<ToolResult>;
8
+ }
9
+ export declare function toolToDefinition(tool: ChatTool): ToolDefinition;
10
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/tools/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7E,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC9D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,cAAc,CAO/D"}
@@ -0,0 +1,9 @@
1
+ export function toolToDefinition(tool) {
2
+ return {
3
+ name: tool.name,
4
+ description: tool.description,
5
+ parameters: tool.parameters,
6
+ required: tool.required,
7
+ };
8
+ }
9
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/tools/base.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type { ChatTool } from './base.js';
2
+ export { toolToDefinition } from './base.js';
3
+ export { LeadCaptureTool } from './lead-capture.js';
4
+ export type { LeadCaptureCallback } from './lead-capture.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { toolToDefinition } from './base.js';
2
+ export { LeadCaptureTool } from './lead-capture.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { ToolResult, LeadData } from '../types.js';
2
+ import type { ChatTool } from './base.js';
3
+ export type LeadCaptureCallback = (lead: LeadData) => void | Promise<void>;
4
+ export declare class LeadCaptureTool implements ChatTool {
5
+ name: string;
6
+ description: string;
7
+ parameters: {
8
+ name: {
9
+ type: "string";
10
+ description: string;
11
+ };
12
+ email: {
13
+ type: "string";
14
+ description: string;
15
+ };
16
+ company: {
17
+ type: "string";
18
+ description: string;
19
+ };
20
+ phone: {
21
+ type: "string";
22
+ description: string;
23
+ };
24
+ projectDetails: {
25
+ type: "string";
26
+ description: string;
27
+ };
28
+ };
29
+ required: string[];
30
+ private onCapture?;
31
+ constructor(onCapture?: LeadCaptureCallback);
32
+ execute(input: Record<string, unknown>): Promise<ToolResult>;
33
+ }
34
+ //# sourceMappingURL=lead-capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lead-capture.d.ts","sourceRoot":"","sources":["../../src/tools/lead-capture.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAU3E,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,IAAI,SAAkB;IACtB,WAAW,SAA6I;IACxJ,UAAU;;;;;;;;;;;;;;;;;;;;;MAMR;IACF,QAAQ,WAAuC;IAE/C,OAAO,CAAC,SAAS,CAAC,CAAsB;gBAE5B,SAAS,CAAC,EAAE,mBAAmB;IAIrC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;CAmCnE"}