@cogitator-ai/core 0.1.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 (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +76 -0
  3. package/dist/__tests__/agent.test.d.ts +2 -0
  4. package/dist/__tests__/agent.test.d.ts.map +1 -0
  5. package/dist/__tests__/agent.test.js +91 -0
  6. package/dist/__tests__/agent.test.js.map +1 -0
  7. package/dist/__tests__/base64.test.d.ts +2 -0
  8. package/dist/__tests__/base64.test.d.ts.map +1 -0
  9. package/dist/__tests__/base64.test.js +62 -0
  10. package/dist/__tests__/base64.test.js.map +1 -0
  11. package/dist/__tests__/calculator.test.d.ts +2 -0
  12. package/dist/__tests__/calculator.test.d.ts.map +1 -0
  13. package/dist/__tests__/calculator.test.js +146 -0
  14. package/dist/__tests__/calculator.test.js.map +1 -0
  15. package/dist/__tests__/cogitator-memory.test.d.ts +2 -0
  16. package/dist/__tests__/cogitator-memory.test.d.ts.map +1 -0
  17. package/dist/__tests__/cogitator-memory.test.js +176 -0
  18. package/dist/__tests__/cogitator-memory.test.js.map +1 -0
  19. package/dist/__tests__/datetime.test.d.ts +2 -0
  20. package/dist/__tests__/datetime.test.d.ts.map +1 -0
  21. package/dist/__tests__/datetime.test.js +87 -0
  22. package/dist/__tests__/datetime.test.js.map +1 -0
  23. package/dist/__tests__/exec.test.d.ts +2 -0
  24. package/dist/__tests__/exec.test.d.ts.map +1 -0
  25. package/dist/__tests__/exec.test.js +59 -0
  26. package/dist/__tests__/exec.test.js.map +1 -0
  27. package/dist/__tests__/filesystem.test.d.ts +2 -0
  28. package/dist/__tests__/filesystem.test.d.ts.map +1 -0
  29. package/dist/__tests__/filesystem.test.js +148 -0
  30. package/dist/__tests__/filesystem.test.js.map +1 -0
  31. package/dist/__tests__/google-backend.test.d.ts +5 -0
  32. package/dist/__tests__/google-backend.test.d.ts.map +1 -0
  33. package/dist/__tests__/google-backend.test.js +429 -0
  34. package/dist/__tests__/google-backend.test.js.map +1 -0
  35. package/dist/__tests__/hash.test.d.ts +2 -0
  36. package/dist/__tests__/hash.test.d.ts.map +1 -0
  37. package/dist/__tests__/hash.test.js +50 -0
  38. package/dist/__tests__/hash.test.js.map +1 -0
  39. package/dist/__tests__/http.test.d.ts +2 -0
  40. package/dist/__tests__/http.test.d.ts.map +1 -0
  41. package/dist/__tests__/http.test.js +64 -0
  42. package/dist/__tests__/http.test.js.map +1 -0
  43. package/dist/__tests__/json.test.d.ts +2 -0
  44. package/dist/__tests__/json.test.d.ts.map +1 -0
  45. package/dist/__tests__/json.test.js +65 -0
  46. package/dist/__tests__/json.test.js.map +1 -0
  47. package/dist/__tests__/logger.test.d.ts +2 -0
  48. package/dist/__tests__/logger.test.d.ts.map +1 -0
  49. package/dist/__tests__/logger.test.js +186 -0
  50. package/dist/__tests__/logger.test.js.map +1 -0
  51. package/dist/__tests__/random.test.d.ts +2 -0
  52. package/dist/__tests__/random.test.d.ts.map +1 -0
  53. package/dist/__tests__/random.test.js +81 -0
  54. package/dist/__tests__/random.test.js.map +1 -0
  55. package/dist/__tests__/regex.test.d.ts +2 -0
  56. package/dist/__tests__/regex.test.d.ts.map +1 -0
  57. package/dist/__tests__/regex.test.js +75 -0
  58. package/dist/__tests__/regex.test.js.map +1 -0
  59. package/dist/__tests__/registry.test.d.ts +2 -0
  60. package/dist/__tests__/registry.test.d.ts.map +1 -0
  61. package/dist/__tests__/registry.test.js +102 -0
  62. package/dist/__tests__/registry.test.js.map +1 -0
  63. package/dist/__tests__/sleep.test.d.ts +2 -0
  64. package/dist/__tests__/sleep.test.d.ts.map +1 -0
  65. package/dist/__tests__/sleep.test.js +29 -0
  66. package/dist/__tests__/sleep.test.js.map +1 -0
  67. package/dist/__tests__/tool.test.d.ts +2 -0
  68. package/dist/__tests__/tool.test.d.ts.map +1 -0
  69. package/dist/__tests__/tool.test.js +103 -0
  70. package/dist/__tests__/tool.test.js.map +1 -0
  71. package/dist/__tests__/uuid.test.d.ts +2 -0
  72. package/dist/__tests__/uuid.test.d.ts.map +1 -0
  73. package/dist/__tests__/uuid.test.js +37 -0
  74. package/dist/__tests__/uuid.test.js.map +1 -0
  75. package/dist/agent.d.ts +15 -0
  76. package/dist/agent.d.ts.map +1 -0
  77. package/dist/agent.js +35 -0
  78. package/dist/agent.js.map +1 -0
  79. package/dist/cogitator.d.ts +66 -0
  80. package/dist/cogitator.d.ts.map +1 -0
  81. package/dist/cogitator.js +538 -0
  82. package/dist/cogitator.js.map +1 -0
  83. package/dist/index.d.ts +19 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +15 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/llm/anthropic.d.ts +19 -0
  88. package/dist/llm/anthropic.d.ts.map +1 -0
  89. package/dist/llm/anthropic.js +188 -0
  90. package/dist/llm/anthropic.js.map +1 -0
  91. package/dist/llm/base.d.ts +11 -0
  92. package/dist/llm/base.d.ts.map +1 -0
  93. package/dist/llm/base.js +9 -0
  94. package/dist/llm/base.js.map +1 -0
  95. package/dist/llm/google.d.ts +32 -0
  96. package/dist/llm/google.d.ts.map +1 -0
  97. package/dist/llm/google.js +282 -0
  98. package/dist/llm/google.js.map +1 -0
  99. package/dist/llm/index.d.ts +22 -0
  100. package/dist/llm/index.d.ts.map +1 -0
  101. package/dist/llm/index.js +67 -0
  102. package/dist/llm/index.js.map +1 -0
  103. package/dist/llm/ollama.d.ts +20 -0
  104. package/dist/llm/ollama.d.ts.map +1 -0
  105. package/dist/llm/ollama.js +134 -0
  106. package/dist/llm/ollama.js.map +1 -0
  107. package/dist/llm/openai.d.ts +21 -0
  108. package/dist/llm/openai.d.ts.map +1 -0
  109. package/dist/llm/openai.js +154 -0
  110. package/dist/llm/openai.js.map +1 -0
  111. package/dist/logger.d.ts +48 -0
  112. package/dist/logger.d.ts.map +1 -0
  113. package/dist/logger.js +118 -0
  114. package/dist/logger.js.map +1 -0
  115. package/dist/registry.d.ts +15 -0
  116. package/dist/registry.d.ts.map +1 -0
  117. package/dist/registry.js +31 -0
  118. package/dist/registry.js.map +1 -0
  119. package/dist/tool.d.ts +13 -0
  120. package/dist/tool.d.ts.map +1 -0
  121. package/dist/tool.js +44 -0
  122. package/dist/tool.js.map +1 -0
  123. package/dist/tools/base64.d.ts +23 -0
  124. package/dist/tools/base64.d.ts.map +1 -0
  125. package/dist/tools/base64.js +53 -0
  126. package/dist/tools/base64.js.map +1 -0
  127. package/dist/tools/calculator.d.ts +15 -0
  128. package/dist/tools/calculator.d.ts.map +1 -0
  129. package/dist/tools/calculator.js +193 -0
  130. package/dist/tools/calculator.js.map +1 -0
  131. package/dist/tools/datetime.d.ts +23 -0
  132. package/dist/tools/datetime.d.ts.map +1 -0
  133. package/dist/tools/datetime.js +95 -0
  134. package/dist/tools/datetime.js.map +1 -0
  135. package/dist/tools/exec.d.ts +46 -0
  136. package/dist/tools/exec.d.ts.map +1 -0
  137. package/dist/tools/exec.js +87 -0
  138. package/dist/tools/exec.js.map +1 -0
  139. package/dist/tools/filesystem.d.ts +100 -0
  140. package/dist/tools/filesystem.d.ts.map +1 -0
  141. package/dist/tools/filesystem.js +186 -0
  142. package/dist/tools/filesystem.js.map +1 -0
  143. package/dist/tools/hash.d.ts +19 -0
  144. package/dist/tools/hash.d.ts.map +1 -0
  145. package/dist/tools/hash.js +32 -0
  146. package/dist/tools/hash.js.map +1 -0
  147. package/dist/tools/http.d.ts +29 -0
  148. package/dist/tools/http.d.ts.map +1 -0
  149. package/dist/tools/http.js +82 -0
  150. package/dist/tools/http.js.map +1 -0
  151. package/dist/tools/index.d.ts +323 -0
  152. package/dist/tools/index.d.ts.map +1 -0
  153. package/dist/tools/index.js +50 -0
  154. package/dist/tools/index.js.map +1 -0
  155. package/dist/tools/json.d.ts +28 -0
  156. package/dist/tools/json.d.ts.map +1 -0
  157. package/dist/tools/json.js +42 -0
  158. package/dist/tools/json.js.map +1 -0
  159. package/dist/tools/random.d.ts +29 -0
  160. package/dist/tools/random.d.ts.map +1 -0
  161. package/dist/tools/random.js +56 -0
  162. package/dist/tools/random.js.map +1 -0
  163. package/dist/tools/regex.d.ts +43 -0
  164. package/dist/tools/regex.d.ts.map +1 -0
  165. package/dist/tools/regex.js +68 -0
  166. package/dist/tools/regex.js.map +1 -0
  167. package/dist/tools/sleep.d.ts +10 -0
  168. package/dist/tools/sleep.d.ts.map +1 -0
  169. package/dist/tools/sleep.js +25 -0
  170. package/dist/tools/sleep.js.map +1 -0
  171. package/dist/tools/uuid.d.ts +15 -0
  172. package/dist/tools/uuid.d.ts.map +1 -0
  173. package/dist/tools/uuid.js +25 -0
  174. package/dist/tools/uuid.js.map +1 -0
  175. package/dist/utils/circuit-breaker.d.ts +127 -0
  176. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  177. package/dist/utils/circuit-breaker.js +235 -0
  178. package/dist/utils/circuit-breaker.js.map +1 -0
  179. package/dist/utils/fallback.d.ts +66 -0
  180. package/dist/utils/fallback.d.ts.map +1 -0
  181. package/dist/utils/fallback.js +99 -0
  182. package/dist/utils/fallback.js.map +1 -0
  183. package/dist/utils/index.d.ts +4 -0
  184. package/dist/utils/index.d.ts.map +1 -0
  185. package/dist/utils/index.js +4 -0
  186. package/dist/utils/index.js.map +1 -0
  187. package/dist/utils/retry.d.ts +51 -0
  188. package/dist/utils/retry.d.ts.map +1 -0
  189. package/dist/utils/retry.js +115 -0
  190. package/dist/utils/retry.js.map +1 -0
  191. package/package.json +56 -0
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Ollama LLM Backend
3
+ */
4
+ import type { ChatRequest, ChatResponse, ChatStreamChunk } from '@cogitator-ai/types';
5
+ import { BaseLLMBackend } from './base';
6
+ interface OllamaConfig {
7
+ baseUrl: string;
8
+ }
9
+ export declare class OllamaBackend extends BaseLLMBackend {
10
+ readonly provider: "ollama";
11
+ private baseUrl;
12
+ constructor(config: OllamaConfig);
13
+ chat(request: ChatRequest): Promise<ChatResponse>;
14
+ chatStream(request: ChatRequest): AsyncGenerator<ChatStreamChunk>;
15
+ private convertMessages;
16
+ private convertTools;
17
+ private convertResponse;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/llm/ollama.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EAGhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAsCD,qBAAa,aAAc,SAAQ,cAAc;IAC/C,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IACtC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,YAAY;IAK1B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA2BhD,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,eAAe,CAAC;IAoExE,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,eAAe;CAmBxB"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Ollama LLM Backend
3
+ */
4
+ import { BaseLLMBackend } from './base';
5
+ export class OllamaBackend extends BaseLLMBackend {
6
+ provider = 'ollama';
7
+ baseUrl;
8
+ constructor(config) {
9
+ super();
10
+ this.baseUrl = config.baseUrl.replace(/\/$/, '');
11
+ }
12
+ async chat(request) {
13
+ const response = await fetch(`${this.baseUrl}/api/chat`, {
14
+ method: 'POST',
15
+ headers: { 'Content-Type': 'application/json' },
16
+ body: JSON.stringify({
17
+ model: request.model,
18
+ messages: this.convertMessages(request.messages),
19
+ tools: request.tools ? this.convertTools(request.tools) : undefined,
20
+ stream: false,
21
+ options: {
22
+ temperature: request.temperature,
23
+ top_p: request.topP,
24
+ num_predict: request.maxTokens,
25
+ stop: request.stop,
26
+ },
27
+ }),
28
+ });
29
+ if (!response.ok) {
30
+ const error = await response.text();
31
+ throw new Error(`Ollama API error: ${response.status.toString()} - ${error}`);
32
+ }
33
+ const data = (await response.json());
34
+ return this.convertResponse(data);
35
+ }
36
+ async *chatStream(request) {
37
+ const response = await fetch(`${this.baseUrl}/api/chat`, {
38
+ method: 'POST',
39
+ headers: { 'Content-Type': 'application/json' },
40
+ body: JSON.stringify({
41
+ model: request.model,
42
+ messages: this.convertMessages(request.messages),
43
+ tools: request.tools ? this.convertTools(request.tools) : undefined,
44
+ stream: true,
45
+ options: {
46
+ temperature: request.temperature,
47
+ top_p: request.topP,
48
+ num_predict: request.maxTokens,
49
+ stop: request.stop,
50
+ },
51
+ }),
52
+ });
53
+ if (!response.ok) {
54
+ const error = await response.text();
55
+ throw new Error(`Ollama API error: ${response.status.toString()} - ${error}`);
56
+ }
57
+ const reader = response.body?.getReader();
58
+ if (!reader)
59
+ throw new Error('No response body');
60
+ const decoder = new TextDecoder();
61
+ let buffer = '';
62
+ const id = this.generateId();
63
+ for (;;) {
64
+ const { done, value } = await reader.read();
65
+ if (done)
66
+ break;
67
+ buffer += decoder.decode(value, { stream: true });
68
+ const lines = buffer.split('\n');
69
+ buffer = lines.pop() ?? '';
70
+ for (const line of lines) {
71
+ if (!line.trim())
72
+ continue;
73
+ const data = JSON.parse(line);
74
+ const chunk = {
75
+ id,
76
+ delta: {
77
+ content: data.message.content,
78
+ toolCalls: data.message.tool_calls?.map((tc, i) => ({
79
+ id: `call_${i.toString()}`,
80
+ name: tc.function.name,
81
+ arguments: tc.function.arguments,
82
+ })),
83
+ },
84
+ finishReason: data.done ? (data.message.tool_calls ? 'tool_calls' : 'stop') : undefined,
85
+ };
86
+ if (data.done && (data.prompt_eval_count || data.eval_count)) {
87
+ chunk.usage = {
88
+ inputTokens: data.prompt_eval_count ?? 0,
89
+ outputTokens: data.eval_count ?? 0,
90
+ totalTokens: (data.prompt_eval_count ?? 0) + (data.eval_count ?? 0),
91
+ };
92
+ }
93
+ yield chunk;
94
+ }
95
+ }
96
+ }
97
+ convertMessages(messages) {
98
+ return messages.map((m) => ({
99
+ role: m.role,
100
+ content: m.content,
101
+ }));
102
+ }
103
+ convertTools(tools) {
104
+ if (!tools)
105
+ return undefined;
106
+ return tools.map((t) => ({
107
+ type: 'function',
108
+ function: {
109
+ name: t.name,
110
+ description: t.description,
111
+ parameters: t.parameters,
112
+ },
113
+ }));
114
+ }
115
+ convertResponse(data) {
116
+ const toolCalls = data.message.tool_calls?.map((tc, i) => ({
117
+ id: `call_${i.toString()}`,
118
+ name: tc.function.name,
119
+ arguments: tc.function.arguments,
120
+ }));
121
+ return {
122
+ id: this.generateId(),
123
+ content: data.message.content,
124
+ toolCalls,
125
+ finishReason: toolCalls ? 'tool_calls' : 'stop',
126
+ usage: {
127
+ inputTokens: data.prompt_eval_count ?? 0,
128
+ outputTokens: data.eval_count ?? 0,
129
+ totalTokens: (data.prompt_eval_count ?? 0) + (data.eval_count ?? 0),
130
+ },
131
+ };
132
+ }
133
+ }
134
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/llm/ollama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * OpenAI LLM Backend
3
+ */
4
+ import type { ChatRequest, ChatResponse, ChatStreamChunk } from '@cogitator-ai/types';
5
+ import { BaseLLMBackend } from './base';
6
+ interface OpenAIConfig {
7
+ apiKey: string;
8
+ baseUrl?: string;
9
+ }
10
+ export declare class OpenAIBackend extends BaseLLMBackend {
11
+ readonly provider: "openai";
12
+ private client;
13
+ constructor(config: OpenAIConfig);
14
+ chat(request: ChatRequest): Promise<ChatResponse>;
15
+ chatStream(request: ChatRequest): AsyncGenerator<ChatStreamChunk>;
16
+ private convertMessages;
17
+ private mapFinishReason;
18
+ private tryParseJson;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EAGhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAc,SAAQ,cAAc;IAC/C,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IACtC,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,YAAY;IAQ1B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA0ChD,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,eAAe,CAAC;IAwExE,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,YAAY;CAOrB"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * OpenAI LLM Backend
3
+ */
4
+ import OpenAI from 'openai';
5
+ import { BaseLLMBackend } from './base';
6
+ export class OpenAIBackend extends BaseLLMBackend {
7
+ provider = 'openai';
8
+ client;
9
+ constructor(config) {
10
+ super();
11
+ this.client = new OpenAI({
12
+ apiKey: config.apiKey,
13
+ baseURL: config.baseUrl,
14
+ });
15
+ }
16
+ async chat(request) {
17
+ const response = await this.client.chat.completions.create({
18
+ model: request.model,
19
+ messages: this.convertMessages(request.messages),
20
+ tools: request.tools
21
+ ? request.tools.map((t) => ({
22
+ type: 'function',
23
+ function: {
24
+ name: t.name,
25
+ description: t.description,
26
+ parameters: t.parameters,
27
+ },
28
+ }))
29
+ : undefined,
30
+ temperature: request.temperature,
31
+ top_p: request.topP,
32
+ max_tokens: request.maxTokens,
33
+ stop: request.stop,
34
+ });
35
+ const choice = response.choices[0];
36
+ const message = choice.message;
37
+ const toolCalls = message.tool_calls?.map((tc) => ({
38
+ id: tc.id,
39
+ name: tc.function.name,
40
+ arguments: JSON.parse(tc.function.arguments),
41
+ }));
42
+ return {
43
+ id: response.id,
44
+ content: message.content ?? '',
45
+ toolCalls,
46
+ finishReason: this.mapFinishReason(choice.finish_reason),
47
+ usage: {
48
+ inputTokens: response.usage?.prompt_tokens ?? 0,
49
+ outputTokens: response.usage?.completion_tokens ?? 0,
50
+ totalTokens: response.usage?.total_tokens ?? 0,
51
+ },
52
+ };
53
+ }
54
+ async *chatStream(request) {
55
+ const stream = await this.client.chat.completions.create({
56
+ model: request.model,
57
+ messages: this.convertMessages(request.messages),
58
+ tools: request.tools
59
+ ? request.tools.map((t) => ({
60
+ type: 'function',
61
+ function: {
62
+ name: t.name,
63
+ description: t.description,
64
+ parameters: t.parameters,
65
+ },
66
+ }))
67
+ : undefined,
68
+ temperature: request.temperature,
69
+ top_p: request.topP,
70
+ max_tokens: request.maxTokens,
71
+ stop: request.stop,
72
+ stream: true,
73
+ stream_options: { include_usage: true },
74
+ });
75
+ const toolCallsAccum = new Map();
76
+ for await (const chunk of stream) {
77
+ const choice = chunk.choices[0];
78
+ if (!choice && chunk.usage) {
79
+ yield {
80
+ id: chunk.id,
81
+ delta: {},
82
+ usage: {
83
+ inputTokens: chunk.usage.prompt_tokens,
84
+ outputTokens: chunk.usage.completion_tokens,
85
+ totalTokens: chunk.usage.total_tokens,
86
+ },
87
+ };
88
+ continue;
89
+ }
90
+ if (!choice)
91
+ continue;
92
+ const delta = choice.delta;
93
+ if (delta.tool_calls) {
94
+ for (const tc of delta.tool_calls) {
95
+ const existing = toolCallsAccum.get(tc.index) ?? {};
96
+ toolCallsAccum.set(tc.index, {
97
+ id: tc.id ?? existing.id,
98
+ name: tc.function?.name ?? existing.name,
99
+ arguments: {
100
+ ...existing.arguments,
101
+ ...this.tryParseJson(tc.function?.arguments ?? ''),
102
+ },
103
+ });
104
+ }
105
+ }
106
+ yield {
107
+ id: chunk.id,
108
+ delta: {
109
+ content: delta.content ?? undefined,
110
+ toolCalls: choice.finish_reason === 'tool_calls'
111
+ ? Array.from(toolCallsAccum.values())
112
+ : undefined,
113
+ },
114
+ finishReason: choice.finish_reason ? this.mapFinishReason(choice.finish_reason) : undefined,
115
+ };
116
+ }
117
+ }
118
+ convertMessages(messages) {
119
+ return messages.map((m) => {
120
+ if (m.role === 'tool') {
121
+ return {
122
+ role: 'tool',
123
+ content: m.content,
124
+ tool_call_id: m.toolCallId ?? '',
125
+ };
126
+ }
127
+ return {
128
+ role: m.role,
129
+ content: m.content,
130
+ };
131
+ });
132
+ }
133
+ mapFinishReason(reason) {
134
+ switch (reason) {
135
+ case 'stop':
136
+ return 'stop';
137
+ case 'tool_calls':
138
+ return 'tool_calls';
139
+ case 'length':
140
+ return 'length';
141
+ default:
142
+ return 'stop';
143
+ }
144
+ }
145
+ tryParseJson(str) {
146
+ try {
147
+ return JSON.parse(str);
148
+ }
149
+ catch {
150
+ return {};
151
+ }
152
+ }
153
+ }
154
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Structured logging for Cogitator
3
+ */
4
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
5
+ export type LogContext = Record<string, unknown>;
6
+ export interface LogEntry {
7
+ level: LogLevel;
8
+ message: string;
9
+ timestamp: string;
10
+ context?: LogContext;
11
+ }
12
+ export interface LoggerOptions {
13
+ /** Minimum log level to output. Default: 'info' */
14
+ level?: LogLevel;
15
+ /** Output format: 'json' for production, 'pretty' for development. Default: 'pretty' */
16
+ format?: 'json' | 'pretty';
17
+ /** Custom output function. Default: console.log/warn/error */
18
+ output?: (entry: LogEntry, formatted: string) => void;
19
+ }
20
+ export declare class Logger {
21
+ private level;
22
+ private format;
23
+ private output?;
24
+ private context;
25
+ constructor(options?: LoggerOptions, context?: LogContext);
26
+ private log;
27
+ debug(message: string, context?: LogContext): void;
28
+ info(message: string, context?: LogContext): void;
29
+ warn(message: string, context?: LogContext): void;
30
+ error(message: string, context?: LogContext): void;
31
+ /**
32
+ * Create a child logger with additional context
33
+ */
34
+ child(context: LogContext): Logger;
35
+ }
36
+ /**
37
+ * Get or create the default logger
38
+ */
39
+ export declare function getLogger(): Logger;
40
+ /**
41
+ * Set the default logger
42
+ */
43
+ export declare function setLogger(logger: Logger): void;
44
+ /**
45
+ * Create a new logger instance
46
+ */
47
+ export declare function createLogger(options?: LoggerOptions): Logger;
48
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC3B,8DAA8D;IAC9D,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAuCD,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAAC,CAA+C;IAC9D,OAAO,CAAC,OAAO,CAAa;gBAEhB,OAAO,GAAE,aAAkB,EAAE,OAAO,GAAE,UAAe;IAOjE,OAAO,CAAC,GAAG;IA2BX,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIlD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIlD;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM;CAYnC;AAID;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAMlC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAE5D"}
package/dist/logger.js ADDED
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Structured logging for Cogitator
3
+ */
4
+ const LOG_LEVELS = {
5
+ debug: 0,
6
+ info: 1,
7
+ warn: 2,
8
+ error: 3,
9
+ };
10
+ const LEVEL_COLORS = {
11
+ debug: '\x1b[90m',
12
+ info: '\x1b[36m',
13
+ warn: '\x1b[33m',
14
+ error: '\x1b[31m',
15
+ };
16
+ const RESET = '\x1b[0m';
17
+ function formatPretty(entry) {
18
+ const color = LEVEL_COLORS[entry.level];
19
+ const levelPad = entry.level.toUpperCase().padEnd(5);
20
+ const time = entry.timestamp.split('T')[1]?.split('.')[0] ?? entry.timestamp;
21
+ let output = `${color}${levelPad}${RESET} ${time} ${entry.message}`;
22
+ if (entry.context && Object.keys(entry.context).length > 0) {
23
+ const contextStr = Object.entries(entry.context)
24
+ .map(([k, v]) => `${k}=${JSON.stringify(v)}`)
25
+ .join(' ');
26
+ output += ` ${LEVEL_COLORS.debug}${contextStr}${RESET}`;
27
+ }
28
+ return output;
29
+ }
30
+ function formatJson(entry) {
31
+ return JSON.stringify(entry);
32
+ }
33
+ export class Logger {
34
+ level;
35
+ format;
36
+ output;
37
+ context;
38
+ constructor(options = {}, context = {}) {
39
+ this.level = LOG_LEVELS[options.level ?? 'info'];
40
+ this.format = options.format ?? 'pretty';
41
+ this.output = options.output;
42
+ this.context = context;
43
+ }
44
+ log(level, message, context) {
45
+ if (LOG_LEVELS[level] < this.level)
46
+ return;
47
+ const entry = {
48
+ level,
49
+ message,
50
+ timestamp: new Date().toISOString(),
51
+ context: { ...this.context, ...context },
52
+ };
53
+ if (entry.context && Object.keys(entry.context).length === 0) {
54
+ entry.context = undefined;
55
+ }
56
+ const formatted = this.format === 'json' ? formatJson(entry) : formatPretty(entry);
57
+ if (this.output) {
58
+ this.output(entry, formatted);
59
+ }
60
+ else if (level === 'error') {
61
+ console.error(formatted);
62
+ }
63
+ else if (level === 'warn') {
64
+ console.warn(formatted);
65
+ }
66
+ else {
67
+ console.log(formatted);
68
+ }
69
+ }
70
+ debug(message, context) {
71
+ this.log('debug', message, context);
72
+ }
73
+ info(message, context) {
74
+ this.log('info', message, context);
75
+ }
76
+ warn(message, context) {
77
+ this.log('warn', message, context);
78
+ }
79
+ error(message, context) {
80
+ this.log('error', message, context);
81
+ }
82
+ /**
83
+ * Create a child logger with additional context
84
+ */
85
+ child(context) {
86
+ const levelEntry = Object.entries(LOG_LEVELS).find(([, v]) => v === this.level);
87
+ const level = levelEntry ? levelEntry[0] : 'info';
88
+ return new Logger({
89
+ level,
90
+ format: this.format,
91
+ output: this.output,
92
+ }, { ...this.context, ...context });
93
+ }
94
+ }
95
+ let defaultLogger = null;
96
+ /**
97
+ * Get or create the default logger
98
+ */
99
+ export function getLogger() {
100
+ defaultLogger ??= new Logger({
101
+ level: process.env.LOG_LEVEL ?? 'info',
102
+ format: process.env.NODE_ENV === 'production' ? 'json' : 'pretty',
103
+ });
104
+ return defaultLogger;
105
+ }
106
+ /**
107
+ * Set the default logger
108
+ */
109
+ export function setLogger(logger) {
110
+ defaultLogger = logger;
111
+ }
112
+ /**
113
+ * Create a new logger instance
114
+ */
115
+ export function createLogger(options) {
116
+ return new Logger(options);
117
+ }
118
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Tool Registry for managing tools
3
+ */
4
+ import type { Tool, ToolSchema } from '@cogitator-ai/types';
5
+ export declare class ToolRegistry {
6
+ private tools;
7
+ register(tool: Tool): void;
8
+ registerMany(tools: Tool[]): void;
9
+ get(name: string): Tool | undefined;
10
+ has(name: string): boolean;
11
+ getAll(): Tool[];
12
+ getSchemas(): ToolSchema[];
13
+ clear(): void;
14
+ }
15
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAG5D,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA2B;IAExC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAI1B,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAMjC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAInC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,MAAM,IAAI,IAAI,EAAE;IAIhB,UAAU,IAAI,UAAU,EAAE;IAI1B,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Tool Registry for managing tools
3
+ */
4
+ import { toolToSchema } from './tool';
5
+ export class ToolRegistry {
6
+ tools = new Map();
7
+ register(tool) {
8
+ this.tools.set(tool.name, tool);
9
+ }
10
+ registerMany(tools) {
11
+ for (const tool of tools) {
12
+ this.register(tool);
13
+ }
14
+ }
15
+ get(name) {
16
+ return this.tools.get(name);
17
+ }
18
+ has(name) {
19
+ return this.tools.has(name);
20
+ }
21
+ getAll() {
22
+ return Array.from(this.tools.values());
23
+ }
24
+ getSchemas() {
25
+ return this.getAll().map(toolToSchema);
26
+ }
27
+ clear() {
28
+ this.tools.clear();
29
+ }
30
+ }
31
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,OAAO,YAAY;IACf,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAExC,QAAQ,CAAC,IAAU;QACjB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,YAAY,CAAC,KAAa;QACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
package/dist/tool.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Tool factory and implementation
3
+ */
4
+ import type { Tool, ToolConfig, ToolSchema } from '@cogitator-ai/types';
5
+ /**
6
+ * Create a type-safe tool
7
+ */
8
+ export declare function tool<TParams, TResult>(config: ToolConfig<TParams, TResult>): Tool<TParams, TResult>;
9
+ /**
10
+ * Convert a tool to JSON Schema format for LLM
11
+ */
12
+ export declare function toolToSchema<TParams, TResult>(t: Tool<TParams, TResult>): ToolSchema;
13
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAIxE;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,OAAO,EACnC,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,GACnC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAcxB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,UAAU,CAmBpF"}
package/dist/tool.js ADDED
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Tool factory and implementation
3
+ */
4
+ import { zodToJsonSchema } from 'zod-to-json-schema';
5
+ /**
6
+ * Create a type-safe tool
7
+ */
8
+ export function tool(config) {
9
+ return {
10
+ name: config.name,
11
+ description: config.description,
12
+ parameters: config.parameters,
13
+ execute: config.execute,
14
+ sideEffects: config.sideEffects,
15
+ requiresApproval: config.requiresApproval,
16
+ timeout: config.timeout,
17
+ sandbox: config.sandbox,
18
+ toJSON() {
19
+ return toolToSchema(this);
20
+ },
21
+ };
22
+ }
23
+ /**
24
+ * Convert a tool to JSON Schema format for LLM
25
+ */
26
+ export function toolToSchema(t) {
27
+ const jsonSchema = zodToJsonSchema(t.parameters, {
28
+ target: 'openApi3',
29
+ $refStrategy: 'none',
30
+ });
31
+ const schema = jsonSchema;
32
+ const properties = (schema.properties ?? {});
33
+ const required = schema.required;
34
+ return {
35
+ name: t.name,
36
+ description: t.description,
37
+ parameters: {
38
+ type: 'object',
39
+ properties,
40
+ required,
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD;;GAEG;AACH,MAAM,UAAU,IAAI,CAClB,MAAoC;IAEpC,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM;YACJ,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAmB,CAAyB;IACtE,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,UAAqB,EAAE;QAC1D,MAAM,EAAE,UAAU;QAClB,YAAY,EAAE,MAAM;KACrB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,UAAqC,CAAC;IACrD,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAA4B,CAAC;IACxE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAgC,CAAC;IAEzD,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,QAAQ;SACT;KACF,CAAC;AACJ,CAAC"}