@push.rocks/smartagent 1.8.0 → 3.0.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 (87) hide show
  1. package/dist_ts/00_commitinfo_data.js +3 -3
  2. package/dist_ts/index.d.ts +8 -14
  3. package/dist_ts/index.js +8 -24
  4. package/dist_ts/plugins.d.ts +8 -9
  5. package/dist_ts/plugins.js +10 -12
  6. package/dist_ts/smartagent.classes.agent.d.ts +2 -0
  7. package/dist_ts/smartagent.classes.agent.js +173 -0
  8. package/dist_ts/smartagent.classes.toolregistry.d.ts +7 -70
  9. package/dist_ts/smartagent.classes.toolregistry.js +11 -155
  10. package/dist_ts/smartagent.interfaces.d.ts +47 -283
  11. package/dist_ts/smartagent.interfaces.js +6 -7
  12. package/dist_ts/smartagent.utils.truncation.d.ts +10 -0
  13. package/dist_ts/smartagent.utils.truncation.js +26 -0
  14. package/dist_ts_compaction/index.d.ts +1 -0
  15. package/dist_ts_compaction/index.js +2 -0
  16. package/dist_ts_compaction/plugins.d.ts +4 -0
  17. package/dist_ts_compaction/plugins.js +3 -0
  18. package/dist_ts_compaction/smartagent.compaction.d.ts +10 -0
  19. package/dist_ts_compaction/smartagent.compaction.js +46 -0
  20. package/dist_ts_tools/index.d.ts +8 -0
  21. package/dist_ts_tools/index.js +6 -0
  22. package/dist_ts_tools/plugins.d.ts +15 -0
  23. package/dist_ts_tools/plugins.js +19 -0
  24. package/dist_ts_tools/tool.filesystem.d.ts +6 -0
  25. package/dist_ts_tools/tool.filesystem.js +102 -0
  26. package/dist_ts_tools/tool.http.d.ts +2 -0
  27. package/dist_ts_tools/tool.http.js +65 -0
  28. package/dist_ts_tools/tool.json.d.ts +2 -0
  29. package/dist_ts_tools/tool.json.js +47 -0
  30. package/dist_ts_tools/tool.shell.d.ts +8 -0
  31. package/dist_ts_tools/tool.shell.js +40 -0
  32. package/npmextra.json +1 -1
  33. package/package.json +30 -18
  34. package/readme.hints.md +38 -84
  35. package/readme.md +254 -682
  36. package/ts/00_commitinfo_data.ts +2 -2
  37. package/ts/index.ts +10 -37
  38. package/ts/plugins.ts +22 -21
  39. package/ts/smartagent.classes.agent.ts +198 -0
  40. package/ts/smartagent.classes.toolregistry.ts +11 -179
  41. package/ts/smartagent.interfaces.ts +51 -363
  42. package/ts/smartagent.utils.truncation.ts +39 -0
  43. package/ts_compaction/index.ts +1 -0
  44. package/ts_compaction/plugins.ts +6 -0
  45. package/ts_compaction/smartagent.compaction.ts +51 -0
  46. package/ts_tools/index.ts +8 -0
  47. package/ts_tools/plugins.ts +30 -0
  48. package/ts_tools/tool.filesystem.ts +131 -0
  49. package/ts_tools/tool.http.ts +78 -0
  50. package/ts_tools/tool.json.ts +53 -0
  51. package/ts_tools/tool.shell.ts +62 -0
  52. package/dist_ts/smartagent.classes.driveragent.d.ts +0 -134
  53. package/dist_ts/smartagent.classes.driveragent.js +0 -671
  54. package/dist_ts/smartagent.classes.dualagent.d.ts +0 -93
  55. package/dist_ts/smartagent.classes.dualagent.js +0 -614
  56. package/dist_ts/smartagent.classes.guardianagent.d.ts +0 -46
  57. package/dist_ts/smartagent.classes.guardianagent.js +0 -201
  58. package/dist_ts/smartagent.tools.base.d.ts +0 -52
  59. package/dist_ts/smartagent.tools.base.js +0 -42
  60. package/dist_ts/smartagent.tools.browser.d.ts +0 -17
  61. package/dist_ts/smartagent.tools.browser.js +0 -229
  62. package/dist_ts/smartagent.tools.deno.d.ts +0 -21
  63. package/dist_ts/smartagent.tools.deno.js +0 -191
  64. package/dist_ts/smartagent.tools.expert.d.ts +0 -27
  65. package/dist_ts/smartagent.tools.expert.js +0 -126
  66. package/dist_ts/smartagent.tools.filesystem.d.ts +0 -40
  67. package/dist_ts/smartagent.tools.filesystem.js +0 -801
  68. package/dist_ts/smartagent.tools.http.d.ts +0 -16
  69. package/dist_ts/smartagent.tools.http.js +0 -264
  70. package/dist_ts/smartagent.tools.json.d.ts +0 -24
  71. package/dist_ts/smartagent.tools.json.js +0 -202
  72. package/dist_ts/smartagent.tools.search.d.ts +0 -29
  73. package/dist_ts/smartagent.tools.search.js +0 -215
  74. package/dist_ts/smartagent.tools.shell.d.ts +0 -17
  75. package/dist_ts/smartagent.tools.shell.js +0 -202
  76. package/ts/smartagent.classes.driveragent.ts +0 -775
  77. package/ts/smartagent.classes.dualagent.ts +0 -692
  78. package/ts/smartagent.classes.guardianagent.ts +0 -241
  79. package/ts/smartagent.tools.base.ts +0 -83
  80. package/ts/smartagent.tools.browser.ts +0 -253
  81. package/ts/smartagent.tools.deno.ts +0 -230
  82. package/ts/smartagent.tools.expert.ts +0 -144
  83. package/ts/smartagent.tools.filesystem.ts +0 -885
  84. package/ts/smartagent.tools.http.ts +0 -283
  85. package/ts/smartagent.tools.json.ts +0 -224
  86. package/ts/smartagent.tools.search.ts +0 -237
  87. 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: '1.8.0',
7
- description: 'an agentic framework built on top of @push.rocks/smartai'
6
+ version: '3.0.0',
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDBEQUEwRDtDQUN4RSxDQUFBIn0=
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLCtJQUErSTtDQUM3SixDQUFBIn0=
@@ -1,15 +1,9 @@
1
- export { DualAgentOrchestrator } from './smartagent.classes.dualagent.js';
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 { BaseToolWrapper } from './smartagent.tools.base.js';
6
- export { FilesystemTool, type IFilesystemToolOptions } from './smartagent.tools.filesystem.js';
7
- export { HttpTool } from './smartagent.tools.http.js';
8
- export { ShellTool } from './smartagent.tools.shell.js';
9
- export { BrowserTool } from './smartagent.tools.browser.js';
10
- export { DenoTool, type TDenoPermission } from './smartagent.tools.deno.js';
11
- export { JsonValidatorTool } from './smartagent.tools.json.js';
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
- import * as plugins from './plugins.js';
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
- // Export base tool class for custom tool creation
10
- export { BaseToolWrapper } from './smartagent.tools.base.js';
11
- // Export standard tools
12
- export { FilesystemTool } from './smartagent.tools.filesystem.js';
13
- export { HttpTool } from './smartagent.tools.http.js';
14
- export { ShellTool } from './smartagent.tools.shell.js';
15
- export { BrowserTool } from './smartagent.tools.browser.js';
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==
@@ -1,11 +1,10 @@
1
1
  import * as path from 'path';
2
2
  export { path };
3
- import { minimatch } from 'minimatch';
4
- export { minimatch };
5
- import * as smartai from '@push.rocks/smartai';
6
- import * as smartdeno from '@push.rocks/smartdeno';
7
- import * as smartfs from '@push.rocks/smartfs';
8
- import * as smartrequest from '@push.rocks/smartrequest';
9
- import * as smartbrowser from '@push.rocks/smartbrowser';
10
- import * as smartshell from '@push.rocks/smartshell';
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 };
@@ -1,15 +1,13 @@
1
1
  // node native
2
2
  import * as path from 'path';
3
3
  export { path };
4
- // third party
5
- import { minimatch } from 'minimatch';
6
- export { minimatch };
7
- // @push.rocks scope
8
- import * as smartai from '@push.rocks/smartai';
9
- import * as smartdeno from '@push.rocks/smartdeno';
10
- import * as smartfs from '@push.rocks/smartfs';
11
- import * as smartrequest from '@push.rocks/smartrequest';
12
- import * as smartbrowser from '@push.rocks/smartbrowser';
13
- import * as smartshell from '@push.rocks/smartshell';
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,2 @@
1
+ import type { IAgentRunOptions, IAgentRunResult } from './smartagent.interfaces.js';
2
+ export declare function runAgent(options: IAgentRunOptions): Promise<IAgentRunResult>;
@@ -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 * 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
- */
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 with optional visibility settings
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(tool: BaseToolWrapper, options?: interfaces.IToolRegistrationOptions): void;
20
- /**
21
- * Get tools visible to the Driver (initial + activated on-demand)
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 = new Map();
14
- metadata = new Map();
15
- activated = new Set();
2
+ tools = {};
16
3
  /**
17
- * Register a tool with optional visibility settings
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(tool, options = {}) {
20
- const visibility = options.visibility ?? 'initial';
21
- this.tools.set(tool.name, tool);
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
- * Get tools visible to the Driver (initial + activated on-demand)
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLnRvb2xyZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0YWdlbnQuY2xhc3Nlcy50b29scmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLFVBQVUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNmLEtBQUssR0FBaUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNoRCxRQUFRLEdBQTBDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDNUQsU0FBUyxHQUFnQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTNDOztPQUVHO0lBQ0gsUUFBUSxDQUFDLElBQXFCLEVBQUUsVUFBK0MsRUFBRTtRQUMvRSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLFNBQVMsQ0FBQztRQUVuRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDM0IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixVQUFVO1lBQ1YsV0FBVyxFQUFFLFVBQVUsS0FBSyxTQUFTO1lBQ3JDLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7U0FDM0IsQ0FBQyxDQUFDO1FBRUgsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxH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
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLnRvb2xyZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0YWdlbnQuY2xhc3Nlcy50b29scmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLFlBQVk7SUFDZixLQUFLLEdBQVksRUFBRSxDQUFDO0lBRTVCOzs7O09BSUc7SUFDSSxRQUFRLENBQUMsSUFBWSxFQUFFLEdBQW9CO1FBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG1EQUFtRDtJQUM1QyxRQUFRO1FBQ2IsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FDRiJ9