@push.rocks/smartagent 1.1.0 → 1.1.1

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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartagent',
6
- version: '1.1.0',
6
+ version: '1.1.1',
7
7
  description: 'an agentic framework built on top of @push.rocks/smartai'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDBEQUEwRDtDQUN4RSxDQUFBIn0=
package/npmextra.json CHANGED
@@ -14,5 +14,14 @@
14
14
  "npmci": {
15
15
  "npmGlobalTools": [],
16
16
  "npmAccessLevel": "public"
17
+ },
18
+ "@git.zone/cli": {
19
+ "release": {
20
+ "registries": [
21
+ "https://verdaccio.lossless.digital",
22
+ "https://registry.npmjs.org"
23
+ ],
24
+ "accessLevel": "public"
25
+ }
17
26
  }
18
- }
27
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartagent",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "private": false,
5
5
  "description": "an agentic framework built on top of @push.rocks/smartai",
6
6
  "main": "dist_ts/index.js",
@@ -8,12 +8,17 @@
8
8
  "type": "module",
9
9
  "author": "Task Venture Capital GmbH",
10
10
  "license": "MIT",
11
+ "scripts": {
12
+ "test": "(tstest test/ --verbose)",
13
+ "build": "(tsbuild --web --allowimplicitany)",
14
+ "buildDocs": "(tsdoc)"
15
+ },
11
16
  "devDependencies": {
12
- "@git.zone/tsbuild": "^3.1.2",
13
- "@git.zone/tsbundle": "^2.6.2",
14
- "@git.zone/tsrun": "^2.0.0",
17
+ "@git.zone/tsbuild": "^4.0.2",
18
+ "@git.zone/tsbundle": "^2.6.3",
19
+ "@git.zone/tsrun": "^2.0.1",
15
20
  "@git.zone/tstest": "^3.1.3",
16
- "@types/node": "^24.10.1"
21
+ "@types/node": "^25.0.2"
17
22
  },
18
23
  "dependencies": {
19
24
  "@push.rocks/smartai": "^0.8.0",
@@ -23,6 +28,7 @@
23
28
  "@push.rocks/smartrequest": "^5.0.1",
24
29
  "@push.rocks/smartshell": "^3.3.0"
25
30
  },
31
+ "packageManager": "pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34",
26
32
  "repository": {
27
33
  "type": "git",
28
34
  "url": "https://code.foss.global/push.rocks/smartagent.git"
@@ -43,9 +49,7 @@
43
49
  "npmextra.json",
44
50
  "readme.md"
45
51
  ],
46
- "scripts": {
47
- "test": "(tstest test/ --web)",
48
- "build": "(tsbuild --web --allowimplicitany)",
49
- "buildDocs": "(tsdoc)"
52
+ "pnpm": {
53
+ "overrides": {}
50
54
  }
51
- }
55
+ }
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartagent',
6
- version: '1.1.0',
6
+ version: '1.1.1',
7
7
  description: 'an agentic framework built on top of @push.rocks/smartai'
8
8
  }
@@ -1,123 +0,0 @@
1
- import * as plugins from './plugins.js';
2
- /**
3
- * Configuration options for SmartAgent
4
- */
5
- export interface ISmartAgentOptions extends plugins.smartai.ISmartAiOptions {
6
- /** Name of the agent for identification */
7
- name?: string;
8
- /** Default provider to use for agent operations */
9
- defaultProvider?: plugins.smartai.TProvider;
10
- /** System message that defines the agent's behavior */
11
- systemMessage?: string;
12
- /** Maximum number of reasoning steps before forcing completion */
13
- maxIterations?: number;
14
- }
15
- /**
16
- * Represents a tool that an agent can use
17
- */
18
- export interface IAgentTool {
19
- /** Unique name for the tool */
20
- name: string;
21
- /** Description of what the tool does (used by the AI to decide when to use it) */
22
- description: string;
23
- /** JSON schema defining the tool's parameters */
24
- parameters: Record<string, unknown>;
25
- /** The function to execute when the tool is called */
26
- execute: (params: Record<string, unknown>) => Promise<unknown>;
27
- }
28
- /**
29
- * Represents a message in the agent's conversation history
30
- */
31
- export interface IAgentMessage {
32
- role: 'system' | 'user' | 'assistant' | 'tool';
33
- content: string;
34
- toolName?: string;
35
- toolResult?: unknown;
36
- }
37
- /**
38
- * Result of an agent run
39
- */
40
- export interface IAgentRunResult {
41
- /** The final response from the agent */
42
- response: string;
43
- /** Number of iterations the agent took */
44
- iterations: number;
45
- /** Full message history from this run */
46
- messages: IAgentMessage[];
47
- /** Whether the agent completed successfully or hit max iterations */
48
- completed: boolean;
49
- }
50
- /**
51
- * SmartAgent - An agentic framework built on top of @push.rocks/smartai
52
- *
53
- * Provides autonomous agent capabilities including:
54
- * - Tool use and function calling
55
- * - Multi-step reasoning
56
- * - Conversation memory
57
- * - Multiple AI provider support
58
- */
59
- export declare class SmartAgent {
60
- options: ISmartAgentOptions;
61
- smartai: plugins.smartai.SmartAi;
62
- tools: Map<string, IAgentTool>;
63
- messageHistory: IAgentMessage[];
64
- private isStarted;
65
- constructor(optionsArg: ISmartAgentOptions);
66
- /**
67
- * Starts the agent and initializes the underlying SmartAi instance
68
- */
69
- start(): Promise<void>;
70
- /**
71
- * Stops the agent and cleans up resources
72
- */
73
- stop(): Promise<void>;
74
- /**
75
- * Registers a tool that the agent can use
76
- */
77
- registerTool(tool: IAgentTool): void;
78
- /**
79
- * Removes a tool from the agent
80
- */
81
- unregisterTool(toolName: string): void;
82
- /**
83
- * Gets all registered tools
84
- */
85
- getTools(): IAgentTool[];
86
- /**
87
- * Sets or updates the system message
88
- */
89
- setSystemMessage(message: string): void;
90
- /**
91
- * Clears the conversation history (except system message)
92
- */
93
- clearHistory(): void;
94
- /**
95
- * Runs the agent with a user message
96
- * The agent will reason, use tools, and respond autonomously
97
- */
98
- run(userMessage: string): Promise<IAgentRunResult>;
99
- /**
100
- * Simple chat without tool use
101
- */
102
- chat(message: string): Promise<string>;
103
- /**
104
- * Gets the AI provider based on configuration
105
- */
106
- private getProvider;
107
- /**
108
- * Builds tool descriptions for the system prompt
109
- */
110
- private buildToolDescriptions;
111
- /**
112
- * Builds the system prompt including tool descriptions
113
- */
114
- private buildSystemPrompt;
115
- /**
116
- * Builds the contextual prompt from message history
117
- */
118
- private buildContextualPrompt;
119
- /**
120
- * Parses a tool call from the AI response
121
- */
122
- private parseToolCall;
123
- }
@@ -1,274 +0,0 @@
1
- import * as plugins from './plugins.js';
2
- /**
3
- * SmartAgent - An agentic framework built on top of @push.rocks/smartai
4
- *
5
- * Provides autonomous agent capabilities including:
6
- * - Tool use and function calling
7
- * - Multi-step reasoning
8
- * - Conversation memory
9
- * - Multiple AI provider support
10
- */
11
- export class SmartAgent {
12
- options;
13
- smartai;
14
- tools = new Map();
15
- messageHistory = [];
16
- isStarted = false;
17
- constructor(optionsArg) {
18
- this.options = {
19
- name: 'SmartAgent',
20
- defaultProvider: 'openai',
21
- maxIterations: 10,
22
- ...optionsArg,
23
- };
24
- this.smartai = new plugins.smartai.SmartAi(this.options);
25
- if (this.options.systemMessage) {
26
- this.messageHistory.push({
27
- role: 'system',
28
- content: this.options.systemMessage,
29
- });
30
- }
31
- }
32
- /**
33
- * Starts the agent and initializes the underlying SmartAi instance
34
- */
35
- async start() {
36
- if (this.isStarted)
37
- return;
38
- await this.smartai.start();
39
- this.isStarted = true;
40
- }
41
- /**
42
- * Stops the agent and cleans up resources
43
- */
44
- async stop() {
45
- if (!this.isStarted)
46
- return;
47
- await this.smartai.stop();
48
- this.isStarted = false;
49
- }
50
- /**
51
- * Registers a tool that the agent can use
52
- */
53
- registerTool(tool) {
54
- this.tools.set(tool.name, tool);
55
- }
56
- /**
57
- * Removes a tool from the agent
58
- */
59
- unregisterTool(toolName) {
60
- this.tools.delete(toolName);
61
- }
62
- /**
63
- * Gets all registered tools
64
- */
65
- getTools() {
66
- return Array.from(this.tools.values());
67
- }
68
- /**
69
- * Sets or updates the system message
70
- */
71
- setSystemMessage(message) {
72
- const existingIndex = this.messageHistory.findIndex(m => m.role === 'system');
73
- if (existingIndex >= 0) {
74
- this.messageHistory[existingIndex].content = message;
75
- }
76
- else {
77
- this.messageHistory.unshift({
78
- role: 'system',
79
- content: message,
80
- });
81
- }
82
- }
83
- /**
84
- * Clears the conversation history (except system message)
85
- */
86
- clearHistory() {
87
- this.messageHistory = this.messageHistory.filter(m => m.role === 'system');
88
- }
89
- /**
90
- * Runs the agent with a user message
91
- * The agent will reason, use tools, and respond autonomously
92
- */
93
- async run(userMessage) {
94
- if (!this.isStarted) {
95
- await this.start();
96
- }
97
- // Add user message to history
98
- this.messageHistory.push({
99
- role: 'user',
100
- content: userMessage,
101
- });
102
- let iterations = 0;
103
- let completed = false;
104
- let response = '';
105
- while (iterations < (this.options.maxIterations || 10) && !completed) {
106
- iterations++;
107
- // Build the prompt with tool descriptions if tools are available
108
- const toolDescriptions = this.buildToolDescriptions();
109
- const systemPrompt = this.buildSystemPrompt(toolDescriptions);
110
- // Get response from AI
111
- const provider = this.getProvider();
112
- const chatResponse = await provider.chat({
113
- systemMessage: systemPrompt,
114
- userMessage: this.buildContextualPrompt(),
115
- messageHistory: [],
116
- });
117
- response = chatResponse.message;
118
- // Check if the response contains a tool call
119
- const toolCall = this.parseToolCall(response);
120
- if (toolCall) {
121
- // Execute the tool
122
- const tool = this.tools.get(toolCall.name);
123
- if (tool) {
124
- try {
125
- const toolResult = await tool.execute(toolCall.params);
126
- // Add tool interaction to history
127
- this.messageHistory.push({
128
- role: 'assistant',
129
- content: response,
130
- });
131
- this.messageHistory.push({
132
- role: 'tool',
133
- content: JSON.stringify(toolResult),
134
- toolName: toolCall.name,
135
- toolResult,
136
- });
137
- }
138
- catch (error) {
139
- // Add error to history
140
- this.messageHistory.push({
141
- role: 'tool',
142
- content: `Error executing tool ${toolCall.name}: ${error}`,
143
- toolName: toolCall.name,
144
- });
145
- }
146
- }
147
- else {
148
- // Unknown tool
149
- this.messageHistory.push({
150
- role: 'tool',
151
- content: `Unknown tool: ${toolCall.name}`,
152
- toolName: toolCall.name,
153
- });
154
- }
155
- }
156
- else {
157
- // No tool call, this is the final response
158
- this.messageHistory.push({
159
- role: 'assistant',
160
- content: response,
161
- });
162
- completed = true;
163
- }
164
- }
165
- return {
166
- response,
167
- iterations,
168
- messages: [...this.messageHistory],
169
- completed,
170
- };
171
- }
172
- /**
173
- * Simple chat without tool use
174
- */
175
- async chat(message) {
176
- if (!this.isStarted) {
177
- await this.start();
178
- }
179
- const systemMessage = this.messageHistory.find(m => m.role === 'system')?.content || 'You are a helpful assistant.';
180
- const provider = this.getProvider();
181
- const response = await provider.chat({
182
- systemMessage,
183
- userMessage: message,
184
- messageHistory: this.messageHistory
185
- .filter(m => m.role !== 'system')
186
- .map(m => ({
187
- role: m.role === 'tool' ? 'user' : m.role,
188
- content: m.content,
189
- })),
190
- });
191
- this.messageHistory.push({ role: 'user', content: message });
192
- this.messageHistory.push({ role: 'assistant', content: response.message });
193
- return response.message;
194
- }
195
- /**
196
- * Gets the AI provider based on configuration
197
- */
198
- getProvider() {
199
- const providerName = this.options.defaultProvider || 'openai';
200
- switch (providerName) {
201
- case 'openai':
202
- return this.smartai.openaiProvider;
203
- case 'anthropic':
204
- return this.smartai.anthropicProvider;
205
- case 'perplexity':
206
- return this.smartai.perplexityProvider;
207
- case 'groq':
208
- return this.smartai.groqProvider;
209
- case 'ollama':
210
- return this.smartai.ollamaProvider;
211
- case 'xai':
212
- return this.smartai.xaiProvider;
213
- case 'exo':
214
- return this.smartai.exoProvider;
215
- default:
216
- return this.smartai.openaiProvider;
217
- }
218
- }
219
- /**
220
- * Builds tool descriptions for the system prompt
221
- */
222
- buildToolDescriptions() {
223
- if (this.tools.size === 0)
224
- return '';
225
- const toolList = Array.from(this.tools.values())
226
- .map(tool => `- ${tool.name}: ${tool.description}\n Parameters: ${JSON.stringify(tool.parameters)}`)
227
- .join('\n');
228
- return `\nYou have access to the following tools:\n${toolList}\n\nTo use a tool, respond with:\n<tool_call>\n{"name": "tool_name", "params": {...}}\n</tool_call>\n\nAfter receiving the tool result, continue your reasoning or provide a final response.`;
229
- }
230
- /**
231
- * Builds the system prompt including tool descriptions
232
- */
233
- buildSystemPrompt(toolDescriptions) {
234
- const baseSystemMessage = this.messageHistory.find(m => m.role === 'system')?.content ||
235
- 'You are a helpful AI assistant.';
236
- return baseSystemMessage + toolDescriptions;
237
- }
238
- /**
239
- * Builds the contextual prompt from message history
240
- */
241
- buildContextualPrompt() {
242
- return this.messageHistory
243
- .filter(m => m.role !== 'system')
244
- .map(m => {
245
- if (m.role === 'tool') {
246
- return `[Tool Result from ${m.toolName}]: ${m.content}`;
247
- }
248
- return `[${m.role}]: ${m.content}`;
249
- })
250
- .join('\n\n');
251
- }
252
- /**
253
- * Parses a tool call from the AI response
254
- */
255
- parseToolCall(response) {
256
- const toolCallMatch = response.match(/<tool_call>\s*(\{[\s\S]*?\})\s*<\/tool_call>/);
257
- if (!toolCallMatch)
258
- return null;
259
- try {
260
- const parsed = JSON.parse(toolCallMatch[1]);
261
- if (parsed.name && typeof parsed.name === 'string') {
262
- return {
263
- name: parsed.name,
264
- params: parsed.params || {},
265
- };
266
- }
267
- }
268
- catch {
269
- return null;
270
- }
271
- return null;
272
- }
273
- }
274
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLnNtYXJ0YWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFnZW50LmNsYXNzZXMuc21hcnRhZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQXNEeEM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQUNkLE9BQU8sQ0FBcUI7SUFDNUIsT0FBTyxDQUEwQjtJQUNqQyxLQUFLLEdBQTRCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDM0MsY0FBYyxHQUFvQixFQUFFLENBQUM7SUFFcEMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUUxQixZQUFZLFVBQThCO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixJQUFJLEVBQUUsWUFBWTtZQUNsQixlQUFlLEVBQUUsUUFBUTtZQUN6QixhQUFhLEVBQUUsRUFBRTtZQUNqQixHQUFHLFVBQVU7U0FDZCxDQUFDO1FBRUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6RCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxRQUFRO2dCQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWE7YUFDcEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzNCLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFD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