@push.rocks/smartagent 1.8.0 → 3.0.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.
- package/dist_ts/00_commitinfo_data.js +3 -3
- package/dist_ts/index.d.ts +8 -14
- package/dist_ts/index.js +8 -24
- package/dist_ts/plugins.d.ts +8 -9
- package/dist_ts/plugins.js +10 -12
- package/dist_ts/smartagent.classes.agent.d.ts +2 -0
- package/dist_ts/smartagent.classes.agent.js +173 -0
- package/dist_ts/smartagent.classes.toolregistry.d.ts +7 -70
- package/dist_ts/smartagent.classes.toolregistry.js +11 -155
- package/dist_ts/smartagent.interfaces.d.ts +47 -283
- package/dist_ts/smartagent.interfaces.js +6 -7
- package/dist_ts/smartagent.utils.truncation.d.ts +10 -0
- package/dist_ts/smartagent.utils.truncation.js +26 -0
- package/dist_ts_compaction/index.d.ts +1 -0
- package/dist_ts_compaction/index.js +2 -0
- package/dist_ts_compaction/plugins.d.ts +4 -0
- package/dist_ts_compaction/plugins.js +3 -0
- package/dist_ts_compaction/smartagent.compaction.d.ts +10 -0
- package/dist_ts_compaction/smartagent.compaction.js +46 -0
- package/dist_ts_tools/index.d.ts +8 -0
- package/dist_ts_tools/index.js +6 -0
- package/dist_ts_tools/plugins.d.ts +15 -0
- package/dist_ts_tools/plugins.js +19 -0
- package/dist_ts_tools/tool.filesystem.d.ts +6 -0
- package/dist_ts_tools/tool.filesystem.js +102 -0
- package/dist_ts_tools/tool.http.d.ts +2 -0
- package/dist_ts_tools/tool.http.js +65 -0
- package/dist_ts_tools/tool.json.d.ts +2 -0
- package/dist_ts_tools/tool.json.js +47 -0
- package/dist_ts_tools/tool.shell.d.ts +8 -0
- package/dist_ts_tools/tool.shell.js +40 -0
- package/npmextra.json +1 -1
- package/package.json +30 -18
- package/readme.hints.md +38 -84
- package/readme.md +254 -682
- package/ts/00_commitinfo_data.ts +2 -2
- package/ts/index.ts +10 -37
- package/ts/plugins.ts +22 -21
- package/ts/smartagent.classes.agent.ts +198 -0
- package/ts/smartagent.classes.toolregistry.ts +11 -179
- package/ts/smartagent.interfaces.ts +51 -363
- package/ts/smartagent.utils.truncation.ts +39 -0
- package/ts_compaction/index.ts +1 -0
- package/ts_compaction/plugins.ts +6 -0
- package/ts_compaction/smartagent.compaction.ts +51 -0
- package/ts_tools/index.ts +8 -0
- package/ts_tools/plugins.ts +30 -0
- package/ts_tools/tool.filesystem.ts +131 -0
- package/ts_tools/tool.http.ts +78 -0
- package/ts_tools/tool.json.ts +53 -0
- package/ts_tools/tool.shell.ts +62 -0
- package/dist_ts/smartagent.classes.driveragent.d.ts +0 -134
- package/dist_ts/smartagent.classes.driveragent.js +0 -671
- package/dist_ts/smartagent.classes.dualagent.d.ts +0 -93
- package/dist_ts/smartagent.classes.dualagent.js +0 -614
- package/dist_ts/smartagent.classes.guardianagent.d.ts +0 -46
- package/dist_ts/smartagent.classes.guardianagent.js +0 -201
- package/dist_ts/smartagent.tools.base.d.ts +0 -52
- package/dist_ts/smartagent.tools.base.js +0 -42
- package/dist_ts/smartagent.tools.browser.d.ts +0 -17
- package/dist_ts/smartagent.tools.browser.js +0 -229
- package/dist_ts/smartagent.tools.deno.d.ts +0 -21
- package/dist_ts/smartagent.tools.deno.js +0 -191
- package/dist_ts/smartagent.tools.expert.d.ts +0 -27
- package/dist_ts/smartagent.tools.expert.js +0 -126
- package/dist_ts/smartagent.tools.filesystem.d.ts +0 -40
- package/dist_ts/smartagent.tools.filesystem.js +0 -801
- package/dist_ts/smartagent.tools.http.d.ts +0 -16
- package/dist_ts/smartagent.tools.http.js +0 -264
- package/dist_ts/smartagent.tools.json.d.ts +0 -24
- package/dist_ts/smartagent.tools.json.js +0 -202
- package/dist_ts/smartagent.tools.search.d.ts +0 -29
- package/dist_ts/smartagent.tools.search.js +0 -215
- package/dist_ts/smartagent.tools.shell.d.ts +0 -17
- package/dist_ts/smartagent.tools.shell.js +0 -202
- package/ts/smartagent.classes.driveragent.ts +0 -775
- package/ts/smartagent.classes.dualagent.ts +0 -692
- package/ts/smartagent.classes.guardianagent.ts +0 -241
- package/ts/smartagent.tools.base.ts +0 -83
- package/ts/smartagent.tools.browser.ts +0 -253
- package/ts/smartagent.tools.deno.ts +0 -230
- package/ts/smartagent.tools.expert.ts +0 -144
- package/ts/smartagent.tools.filesystem.ts +0 -885
- package/ts/smartagent.tools.http.ts +0 -283
- package/ts/smartagent.tools.json.ts +0 -224
- package/ts/smartagent.tools.search.ts +0 -237
- package/ts/smartagent.tools.shell.ts +0 -230
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartagent',
|
|
6
|
-
version: '
|
|
7
|
-
description: '
|
|
6
|
+
version: '3.0.1',
|
|
7
|
+
description: 'Agentic loop for ai-sdk (Vercel AI SDK). Wraps streamText with stopWhen for parallel multi-step tool execution. Built on @push.rocks/smartai.'
|
|
8
8
|
};
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLCtJQUErSTtDQUM3SixDQUFBIn0=
|
package/dist_ts/index.d.ts
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export { DriverAgent } from './smartagent.classes.driveragent.js';
|
|
3
|
-
export { GuardianAgent } from './smartagent.classes.guardianagent.js';
|
|
1
|
+
export { runAgent } from './smartagent.classes.agent.js';
|
|
4
2
|
export { ToolRegistry } from './smartagent.classes.toolregistry.js';
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
9
|
-
export {
|
|
10
|
-
export {
|
|
11
|
-
export {
|
|
12
|
-
export { ToolSearchTool } from './smartagent.tools.search.js';
|
|
13
|
-
export { ExpertTool } from './smartagent.tools.expert.js';
|
|
14
|
-
export * from './smartagent.interfaces.js';
|
|
15
|
-
export { type ISmartAiOptions, type TProvider, type ChatMessage, type ChatOptions, type ChatResponse, } from '@push.rocks/smartai';
|
|
3
|
+
export { truncateOutput } from './smartagent.utils.truncation.js';
|
|
4
|
+
export type { ITruncateResult } from './smartagent.utils.truncation.js';
|
|
5
|
+
export { ContextOverflowError } from './smartagent.interfaces.js';
|
|
6
|
+
export type { IAgentRunOptions, IAgentRunResult } from './smartagent.interfaces.js';
|
|
7
|
+
export { tool, jsonSchema } from '@push.rocks/smartai';
|
|
8
|
+
export { z } from 'zod';
|
|
9
|
+
export { stepCountIs } from 'ai';
|
package/dist_ts/index.js
CHANGED
|
@@ -1,25 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
// Export the dual-agent orchestrator (main entry point)
|
|
3
|
-
export { DualAgentOrchestrator } from './smartagent.classes.dualagent.js';
|
|
4
|
-
// Export individual agents
|
|
5
|
-
export { DriverAgent } from './smartagent.classes.driveragent.js';
|
|
6
|
-
export { GuardianAgent } from './smartagent.classes.guardianagent.js';
|
|
7
|
-
// Export tool registry and related classes
|
|
1
|
+
export { runAgent } from './smartagent.classes.agent.js';
|
|
8
2
|
export { ToolRegistry } from './smartagent.classes.toolregistry.js';
|
|
9
|
-
|
|
10
|
-
export {
|
|
11
|
-
//
|
|
12
|
-
export {
|
|
13
|
-
export {
|
|
14
|
-
export {
|
|
15
|
-
|
|
16
|
-
export { DenoTool } from './smartagent.tools.deno.js';
|
|
17
|
-
export { JsonValidatorTool } from './smartagent.tools.json.js';
|
|
18
|
-
// Export tool search and expert tools
|
|
19
|
-
export { ToolSearchTool } from './smartagent.tools.search.js';
|
|
20
|
-
export { ExpertTool } from './smartagent.tools.expert.js';
|
|
21
|
-
// Export all interfaces
|
|
22
|
-
export * from './smartagent.interfaces.js';
|
|
23
|
-
// Re-export useful types from smartai
|
|
24
|
-
export {} from '@push.rocks/smartai';
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4Qyx3REFBd0Q7QUFDeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFMUUsMkJBQTJCO0FBQzNCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdEUsMkNBQTJDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVwRSxrREFBa0Q7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTdELHdCQUF3QjtBQUN4QixPQUFPLEVBQUUsY0FBYyxFQUErQixNQUFNLGtDQUFrQyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQXdCLE1BQU0sNEJBQTRCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFL0Qsc0NBQXNDO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFMUQsd0JBQXdCO0FBQ3hCLGNBQWMsNEJBQTRCLENBQUM7QUFFM0Msc0NBQXNDO0FBQ3RDLE9BQU8sRUFNTixNQUFNLHFCQUFxQixDQUFDIn0=
|
|
3
|
+
export { truncateOutput } from './smartagent.utils.truncation.js';
|
|
4
|
+
export { ContextOverflowError } from './smartagent.interfaces.js';
|
|
5
|
+
// Re-export tool() and z so consumers can define tools without extra imports
|
|
6
|
+
export { tool, jsonSchema } from '@push.rocks/smartai';
|
|
7
|
+
export { z } from 'zod';
|
|
8
|
+
export { stepCountIs } from 'ai';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUdsRSw2RUFBNkU7QUFDN0UsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxJQUFJLENBQUMifQ==
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
2
|
export { path };
|
|
3
|
-
import {
|
|
4
|
-
export {
|
|
5
|
-
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import
|
|
10
|
-
|
|
11
|
-
export { smartai, smartdeno, smartfs, smartrequest, smartbrowser, smartshell, };
|
|
3
|
+
import { streamText, generateText, stepCountIs } from 'ai';
|
|
4
|
+
export { streamText, generateText, stepCountIs };
|
|
5
|
+
export type { ModelMessage, ToolSet, StreamTextResult, } from 'ai';
|
|
6
|
+
import { tool, jsonSchema } from '@push.rocks/smartai';
|
|
7
|
+
export { tool, jsonSchema };
|
|
8
|
+
export type { LanguageModelV3 } from '@push.rocks/smartai';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
export { z };
|
package/dist_ts/plugins.js
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
// node native
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
export { path };
|
|
4
|
-
//
|
|
5
|
-
import {
|
|
6
|
-
export {
|
|
7
|
-
// @push.rocks
|
|
8
|
-
import
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
import
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
export { smartai, smartdeno, smartfs, smartrequest, smartbrowser, smartshell, };
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUVoQixjQUFjO0FBQ2QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFFckIsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssT0FBTyxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBRXJELE9BQU8sRUFDTCxPQUFPLEVBQ1AsU0FBUyxFQUNULE9BQU8sRUFDUCxZQUFZLEVBQ1osWUFBWSxFQUNaLFVBQVUsR0FDWCxDQUFDIn0=
|
|
4
|
+
// ai-sdk core
|
|
5
|
+
import { streamText, generateText, stepCountIs } from 'ai';
|
|
6
|
+
export { streamText, generateText, stepCountIs };
|
|
7
|
+
// @push.rocks/smartai
|
|
8
|
+
import { tool, jsonSchema } from '@push.rocks/smartai';
|
|
9
|
+
export { tool, jsonSchema };
|
|
10
|
+
// zod
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
export { z };
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUVoQixjQUFjO0FBQ2QsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRTNELE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDO0FBUWpELHNCQUFzQjtBQUN0QixPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZELE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFJNUIsTUFBTTtBQUNOLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDIn0=
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// Retry backoff and context overflow logic derived from opencode (MIT) — https://github.com/sst/opencode
|
|
2
|
+
import * as plugins from './plugins.js';
|
|
3
|
+
import { ContextOverflowError } from './smartagent.interfaces.js';
|
|
4
|
+
// Retry constants
|
|
5
|
+
const RETRY_INITIAL_DELAY = 2000;
|
|
6
|
+
const RETRY_BACKOFF_FACTOR = 2;
|
|
7
|
+
const RETRY_MAX_DELAY = 30_000;
|
|
8
|
+
const MAX_RETRY_ATTEMPTS = 8;
|
|
9
|
+
function retryDelay(attempt, headers) {
|
|
10
|
+
if (headers) {
|
|
11
|
+
const ms = headers['retry-after-ms'];
|
|
12
|
+
if (ms) {
|
|
13
|
+
const n = parseFloat(ms);
|
|
14
|
+
if (!isNaN(n))
|
|
15
|
+
return n;
|
|
16
|
+
}
|
|
17
|
+
const after = headers['retry-after'];
|
|
18
|
+
if (after) {
|
|
19
|
+
const secs = parseFloat(after);
|
|
20
|
+
if (!isNaN(secs))
|
|
21
|
+
return Math.ceil(secs * 1000);
|
|
22
|
+
const date = Date.parse(after) - Date.now();
|
|
23
|
+
if (!isNaN(date) && date > 0)
|
|
24
|
+
return Math.ceil(date);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return Math.min(RETRY_INITIAL_DELAY * Math.pow(RETRY_BACKOFF_FACTOR, attempt - 1), RETRY_MAX_DELAY);
|
|
28
|
+
}
|
|
29
|
+
async function sleep(ms, signal) {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
if (signal?.aborted) {
|
|
32
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const t = setTimeout(resolve, ms);
|
|
36
|
+
signal?.addEventListener('abort', () => {
|
|
37
|
+
clearTimeout(t);
|
|
38
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
39
|
+
}, { once: true });
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function isRetryableError(err) {
|
|
43
|
+
const status = err?.status ?? err?.statusCode;
|
|
44
|
+
if (status === 429 || status === 529 || status === 503)
|
|
45
|
+
return true;
|
|
46
|
+
if (err instanceof Error) {
|
|
47
|
+
const msg = err.message.toLowerCase();
|
|
48
|
+
if (msg.includes('rate limit') || msg.includes('overloaded') || msg.includes('too many requests')) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
function isContextOverflow(err) {
|
|
55
|
+
if (err instanceof Error) {
|
|
56
|
+
const msg = err.message.toLowerCase();
|
|
57
|
+
return (msg.includes('context_length_exceeded') ||
|
|
58
|
+
msg.includes('context window') ||
|
|
59
|
+
msg.includes('maximum context length') ||
|
|
60
|
+
msg.includes('too many tokens') ||
|
|
61
|
+
msg.includes('input is too long') ||
|
|
62
|
+
err?.name === 'AI_ContextWindowExceededError');
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
export async function runAgent(options) {
|
|
67
|
+
let stepCount = 0;
|
|
68
|
+
let attempt = 0;
|
|
69
|
+
let totalInput = 0;
|
|
70
|
+
let totalOutput = 0;
|
|
71
|
+
const tools = options.tools ?? {};
|
|
72
|
+
// Add a no-op sink for repaired-but-unrecognised tool calls
|
|
73
|
+
const allTools = {
|
|
74
|
+
...tools,
|
|
75
|
+
invalid: plugins.tool({
|
|
76
|
+
description: 'Sink for unrecognised tool calls — returns an error message to the model',
|
|
77
|
+
inputSchema: plugins.z.object({
|
|
78
|
+
tool: plugins.z.string(),
|
|
79
|
+
error: plugins.z.string(),
|
|
80
|
+
}),
|
|
81
|
+
execute: async ({ tool, error }) => `Unknown tool "${tool}": ${error}`,
|
|
82
|
+
}),
|
|
83
|
+
};
|
|
84
|
+
// Build messages — streamText requires either prompt OR messages, not both
|
|
85
|
+
let messages = options.messages
|
|
86
|
+
? [...options.messages, { role: 'user', content: options.prompt }]
|
|
87
|
+
: [{ role: 'user', content: options.prompt }];
|
|
88
|
+
while (true) {
|
|
89
|
+
try {
|
|
90
|
+
const result = plugins.streamText({
|
|
91
|
+
model: options.model,
|
|
92
|
+
system: options.system,
|
|
93
|
+
messages,
|
|
94
|
+
tools: allTools,
|
|
95
|
+
stopWhen: plugins.stepCountIs(options.maxSteps ?? 20),
|
|
96
|
+
maxRetries: 0, // handled manually below
|
|
97
|
+
abortSignal: options.abort,
|
|
98
|
+
experimental_repairToolCall: async ({ toolCall, tools: availableTools, error }) => {
|
|
99
|
+
const lower = toolCall.toolName.toLowerCase();
|
|
100
|
+
if (lower !== toolCall.toolName && availableTools[lower]) {
|
|
101
|
+
return { ...toolCall, toolName: lower };
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
...toolCall,
|
|
105
|
+
toolName: 'invalid',
|
|
106
|
+
args: JSON.stringify({
|
|
107
|
+
tool: toolCall.toolName,
|
|
108
|
+
error: String(error),
|
|
109
|
+
}),
|
|
110
|
+
};
|
|
111
|
+
},
|
|
112
|
+
onChunk: ({ chunk }) => {
|
|
113
|
+
if (chunk.type === 'text-delta' && options.onToken) {
|
|
114
|
+
options.onToken(chunk.textDelta ?? chunk.text ?? '');
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
experimental_onToolCallStart: options.onToolCall
|
|
118
|
+
? ({ toolCall }) => {
|
|
119
|
+
options.onToolCall(toolCall.toolName, toolCall.input ?? toolCall.args);
|
|
120
|
+
}
|
|
121
|
+
: undefined,
|
|
122
|
+
experimental_onToolCallFinish: options.onToolResult
|
|
123
|
+
? ({ toolCall }) => {
|
|
124
|
+
options.onToolResult(toolCall.toolName, toolCall.result);
|
|
125
|
+
}
|
|
126
|
+
: undefined,
|
|
127
|
+
onStepFinish: ({ usage }) => {
|
|
128
|
+
stepCount++;
|
|
129
|
+
totalInput += usage?.inputTokens ?? 0;
|
|
130
|
+
totalOutput += usage?.outputTokens ?? 0;
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
// Consume the stream and collect results
|
|
134
|
+
const text = await result.text;
|
|
135
|
+
const finishReason = await result.finishReason;
|
|
136
|
+
const responseData = await result.response;
|
|
137
|
+
attempt = 0; // reset on success
|
|
138
|
+
return {
|
|
139
|
+
text,
|
|
140
|
+
messages: responseData.messages,
|
|
141
|
+
steps: stepCount,
|
|
142
|
+
finishReason,
|
|
143
|
+
usage: {
|
|
144
|
+
inputTokens: totalInput,
|
|
145
|
+
outputTokens: totalOutput,
|
|
146
|
+
totalTokens: totalInput + totalOutput,
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
// Abort — don't retry
|
|
152
|
+
if (err instanceof DOMException && err.name === 'AbortError')
|
|
153
|
+
throw err;
|
|
154
|
+
// Rate limit / overload — retry with backoff
|
|
155
|
+
if (isRetryableError(err) && attempt < MAX_RETRY_ATTEMPTS) {
|
|
156
|
+
attempt++;
|
|
157
|
+
const headers = err?.responseHeaders ?? err?.headers;
|
|
158
|
+
const delay = retryDelay(attempt, headers);
|
|
159
|
+
await sleep(delay, options.abort);
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
// Context overflow — compact and retry if handler provided
|
|
163
|
+
if (isContextOverflow(err)) {
|
|
164
|
+
if (!options.onContextOverflow)
|
|
165
|
+
throw new ContextOverflowError();
|
|
166
|
+
messages = await options.onContextOverflow(messages);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
throw err;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLmFnZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhZ2VudC5jbGFzc2VzLmFnZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlHQUF5RztBQUV6RyxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVsRSxrQkFBa0I7QUFDbEIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDakMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFDL0IsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDO0FBQy9CLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBRTdCLFNBQVMsVUFBVSxDQUFDLE9BQWUsRUFBRSxPQUFnQztJQUNuRSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDckMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNQLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFBRSxPQUFPLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztZQUNoRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFH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
|
|
@@ -1,75 +1,12 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { BaseToolWrapper } from './smartagent.tools.base.js';
|
|
3
|
-
/**
|
|
4
|
-
* ToolRegistry - Manages tool registration, visibility, and lifecycle
|
|
5
|
-
*
|
|
6
|
-
* Responsibilities:
|
|
7
|
-
* - Track all registered tools with their metadata
|
|
8
|
-
* - Manage visibility (initial vs on-demand)
|
|
9
|
-
* - Handle activation of on-demand tools
|
|
10
|
-
* - Provide search functionality
|
|
11
|
-
*/
|
|
1
|
+
import type { ToolSet } from './plugins.js';
|
|
12
2
|
export declare class ToolRegistry {
|
|
13
3
|
private tools;
|
|
14
|
-
private metadata;
|
|
15
|
-
private activated;
|
|
16
4
|
/**
|
|
17
|
-
* Register a tool
|
|
5
|
+
* Register a tool.
|
|
6
|
+
* @param name Tool name (must be unique, snake_case recommended)
|
|
7
|
+
* @param def Tool definition created with ai-sdk's tool() helper
|
|
18
8
|
*/
|
|
19
|
-
register(
|
|
20
|
-
/**
|
|
21
|
-
|
|
22
|
-
*/
|
|
23
|
-
getVisibleTools(): BaseToolWrapper[];
|
|
24
|
-
/**
|
|
25
|
-
* Get all tools (for search results)
|
|
26
|
-
*/
|
|
27
|
-
getAllTools(): BaseToolWrapper[];
|
|
28
|
-
/**
|
|
29
|
-
* Get a specific tool by name
|
|
30
|
-
*/
|
|
31
|
-
getTool(name: string): BaseToolWrapper | undefined;
|
|
32
|
-
/**
|
|
33
|
-
* Get metadata for a tool
|
|
34
|
-
*/
|
|
35
|
-
getMetadata(name: string): interfaces.IToolMetadata | undefined;
|
|
36
|
-
/**
|
|
37
|
-
* Get all metadata
|
|
38
|
-
*/
|
|
39
|
-
getAllMetadata(): interfaces.IToolMetadata[];
|
|
40
|
-
/**
|
|
41
|
-
* Search tools by query (matches name, description, tags, action names)
|
|
42
|
-
*/
|
|
43
|
-
search(query: string): interfaces.IToolMetadata[];
|
|
44
|
-
/**
|
|
45
|
-
* Activate an on-demand tool
|
|
46
|
-
*/
|
|
47
|
-
activate(name: string): Promise<{
|
|
48
|
-
success: boolean;
|
|
49
|
-
error?: string;
|
|
50
|
-
}>;
|
|
51
|
-
/**
|
|
52
|
-
* Check if a tool is activated
|
|
53
|
-
*/
|
|
54
|
-
isActivated(name: string): boolean;
|
|
55
|
-
/**
|
|
56
|
-
* Initialize all initial (visible) tools
|
|
57
|
-
*/
|
|
58
|
-
initializeVisibleTools(): Promise<void>;
|
|
59
|
-
/**
|
|
60
|
-
* Cleanup all initialized tools
|
|
61
|
-
*/
|
|
62
|
-
cleanup(): Promise<void>;
|
|
63
|
-
/**
|
|
64
|
-
* Check if a tool exists in the registry
|
|
65
|
-
*/
|
|
66
|
-
has(name: string): boolean;
|
|
67
|
-
/**
|
|
68
|
-
* Get the number of registered tools
|
|
69
|
-
*/
|
|
70
|
-
get size(): number;
|
|
71
|
-
/**
|
|
72
|
-
* Get the number of activated tools
|
|
73
|
-
*/
|
|
74
|
-
get activatedCount(): number;
|
|
9
|
+
register(name: string, def: ToolSet[string]): this;
|
|
10
|
+
/** Get the full ToolSet for passing to runAgent */
|
|
11
|
+
getTools(): ToolSet;
|
|
75
12
|
}
|
|
@@ -1,161 +1,17 @@
|
|
|
1
|
-
import * as interfaces from './smartagent.interfaces.js';
|
|
2
|
-
import { BaseToolWrapper } from './smartagent.tools.base.js';
|
|
3
|
-
/**
|
|
4
|
-
* ToolRegistry - Manages tool registration, visibility, and lifecycle
|
|
5
|
-
*
|
|
6
|
-
* Responsibilities:
|
|
7
|
-
* - Track all registered tools with their metadata
|
|
8
|
-
* - Manage visibility (initial vs on-demand)
|
|
9
|
-
* - Handle activation of on-demand tools
|
|
10
|
-
* - Provide search functionality
|
|
11
|
-
*/
|
|
12
1
|
export class ToolRegistry {
|
|
13
|
-
tools =
|
|
14
|
-
metadata = new Map();
|
|
15
|
-
activated = new Set();
|
|
2
|
+
tools = {};
|
|
16
3
|
/**
|
|
17
|
-
* Register a tool
|
|
4
|
+
* Register a tool.
|
|
5
|
+
* @param name Tool name (must be unique, snake_case recommended)
|
|
6
|
+
* @param def Tool definition created with ai-sdk's tool() helper
|
|
18
7
|
*/
|
|
19
|
-
register(
|
|
20
|
-
|
|
21
|
-
this
|
|
22
|
-
this.metadata.set(tool.name, {
|
|
23
|
-
name: tool.name,
|
|
24
|
-
description: tool.description,
|
|
25
|
-
actions: tool.actions,
|
|
26
|
-
visibility,
|
|
27
|
-
isActivated: visibility === 'initial',
|
|
28
|
-
isInitialized: false,
|
|
29
|
-
tags: options.tags,
|
|
30
|
-
category: options.category,
|
|
31
|
-
});
|
|
32
|
-
if (visibility === 'initial') {
|
|
33
|
-
this.activated.add(tool.name);
|
|
34
|
-
}
|
|
8
|
+
register(name, def) {
|
|
9
|
+
this.tools[name] = def;
|
|
10
|
+
return this;
|
|
35
11
|
}
|
|
36
|
-
/**
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
getVisibleTools() {
|
|
40
|
-
return Array.from(this.tools.entries())
|
|
41
|
-
.filter(([name]) => this.activated.has(name))
|
|
42
|
-
.map(([, tool]) => tool);
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Get all tools (for search results)
|
|
46
|
-
*/
|
|
47
|
-
getAllTools() {
|
|
48
|
-
return Array.from(this.tools.values());
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Get a specific tool by name
|
|
52
|
-
*/
|
|
53
|
-
getTool(name) {
|
|
54
|
-
return this.tools.get(name);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Get metadata for a tool
|
|
58
|
-
*/
|
|
59
|
-
getMetadata(name) {
|
|
60
|
-
return this.metadata.get(name);
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Get all metadata
|
|
64
|
-
*/
|
|
65
|
-
getAllMetadata() {
|
|
66
|
-
return Array.from(this.metadata.values());
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Search tools by query (matches name, description, tags, action names)
|
|
70
|
-
*/
|
|
71
|
-
search(query) {
|
|
72
|
-
const q = query.toLowerCase();
|
|
73
|
-
return this.getAllMetadata().filter((meta) => {
|
|
74
|
-
if (meta.name.toLowerCase().includes(q))
|
|
75
|
-
return true;
|
|
76
|
-
if (meta.description.toLowerCase().includes(q))
|
|
77
|
-
return true;
|
|
78
|
-
if (meta.tags?.some((t) => t.toLowerCase().includes(q)))
|
|
79
|
-
return true;
|
|
80
|
-
if (meta.category?.toLowerCase().includes(q))
|
|
81
|
-
return true;
|
|
82
|
-
if (meta.actions.some((a) => a.name.toLowerCase().includes(q) || a.description.toLowerCase().includes(q)))
|
|
83
|
-
return true;
|
|
84
|
-
return false;
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Activate an on-demand tool
|
|
89
|
-
*/
|
|
90
|
-
async activate(name) {
|
|
91
|
-
const tool = this.tools.get(name);
|
|
92
|
-
const meta = this.metadata.get(name);
|
|
93
|
-
if (!tool || !meta) {
|
|
94
|
-
return { success: false, error: `Tool "${name}" not found` };
|
|
95
|
-
}
|
|
96
|
-
if (this.activated.has(name)) {
|
|
97
|
-
return { success: true }; // Already activated
|
|
98
|
-
}
|
|
99
|
-
// Initialize if not already initialized
|
|
100
|
-
if (!meta.isInitialized) {
|
|
101
|
-
await tool.initialize();
|
|
102
|
-
meta.isInitialized = true;
|
|
103
|
-
}
|
|
104
|
-
this.activated.add(name);
|
|
105
|
-
meta.isActivated = true;
|
|
106
|
-
return { success: true };
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Check if a tool is activated
|
|
110
|
-
*/
|
|
111
|
-
isActivated(name) {
|
|
112
|
-
return this.activated.has(name);
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Initialize all initial (visible) tools
|
|
116
|
-
*/
|
|
117
|
-
async initializeVisibleTools() {
|
|
118
|
-
const promises = [];
|
|
119
|
-
for (const [name, tool] of this.tools) {
|
|
120
|
-
const meta = this.metadata.get(name);
|
|
121
|
-
if (meta && this.activated.has(name) && !meta.isInitialized) {
|
|
122
|
-
promises.push(tool.initialize().then(() => {
|
|
123
|
-
meta.isInitialized = true;
|
|
124
|
-
}));
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
await Promise.all(promises);
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Cleanup all initialized tools
|
|
131
|
-
*/
|
|
132
|
-
async cleanup() {
|
|
133
|
-
const promises = [];
|
|
134
|
-
for (const [name, tool] of this.tools) {
|
|
135
|
-
const meta = this.metadata.get(name);
|
|
136
|
-
if (meta?.isInitialized) {
|
|
137
|
-
promises.push(tool.cleanup());
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
await Promise.all(promises);
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Check if a tool exists in the registry
|
|
144
|
-
*/
|
|
145
|
-
has(name) {
|
|
146
|
-
return this.tools.has(name);
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Get the number of registered tools
|
|
150
|
-
*/
|
|
151
|
-
get size() {
|
|
152
|
-
return this.tools.size;
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Get the number of activated tools
|
|
156
|
-
*/
|
|
157
|
-
get activatedCount() {
|
|
158
|
-
return this.activated.size;
|
|
12
|
+
/** Get the full ToolSet for passing to runAgent */
|
|
13
|
+
getTools() {
|
|
14
|
+
return { ...this.tools };
|
|
159
15
|
}
|
|
160
16
|
}
|
|
161
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLnRvb2xyZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0YWdlbnQuY2xhc3Nlcy50b29scmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLFlBQVk7SUFDZixLQUFLLEdBQVksRUFBRSxDQUFDO0lBRTVCOzs7O09BSUc7SUFDSSxRQUFRLENBQUMsSUFBWSxFQUFFLEdBQW9CO1FBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG1EQUFtRDtJQUM1QyxRQUFRO1FBQ2IsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FDRiJ9
|