@push.rocks/smartagent 1.7.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 (81) hide show
  1. package/dist_ts/00_commitinfo_data.js +3 -3
  2. package/dist_ts/index.d.ts +9 -12
  3. package/dist_ts/index.js +9 -20
  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 +12 -0
  9. package/dist_ts/smartagent.classes.toolregistry.js +17 -0
  10. package/dist_ts/smartagent.interfaces.d.ts +47 -231
  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 +43 -42
  35. package/readme.md +257 -526
  36. package/ts/00_commitinfo_data.ts +2 -2
  37. package/ts/index.ts +11 -31
  38. package/ts/plugins.ts +22 -21
  39. package/ts/smartagent.classes.agent.ts +198 -0
  40. package/ts/smartagent.classes.toolregistry.ts +20 -0
  41. package/ts/smartagent.interfaces.ts +51 -303
  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 -79
  55. package/dist_ts/smartagent.classes.dualagent.js +0 -583
  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.filesystem.d.ts +0 -40
  65. package/dist_ts/smartagent.tools.filesystem.js +0 -801
  66. package/dist_ts/smartagent.tools.http.d.ts +0 -16
  67. package/dist_ts/smartagent.tools.http.js +0 -264
  68. package/dist_ts/smartagent.tools.json.d.ts +0 -24
  69. package/dist_ts/smartagent.tools.json.js +0 -202
  70. package/dist_ts/smartagent.tools.shell.d.ts +0 -17
  71. package/dist_ts/smartagent.tools.shell.js +0 -202
  72. package/ts/smartagent.classes.driveragent.ts +0 -775
  73. package/ts/smartagent.classes.dualagent.ts +0 -657
  74. package/ts/smartagent.classes.guardianagent.ts +0 -241
  75. package/ts/smartagent.tools.base.ts +0 -83
  76. package/ts/smartagent.tools.browser.ts +0 -253
  77. package/ts/smartagent.tools.deno.ts +0 -230
  78. package/ts/smartagent.tools.filesystem.ts +0 -885
  79. package/ts/smartagent.tools.http.ts +0 -283
  80. package/ts/smartagent.tools.json.ts +0 -224
  81. 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.7.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,12 +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';
4
- export { BaseToolWrapper } from './smartagent.tools.base.js';
5
- export { FilesystemTool, type IFilesystemToolOptions } from './smartagent.tools.filesystem.js';
6
- export { HttpTool } from './smartagent.tools.http.js';
7
- export { ShellTool } from './smartagent.tools.shell.js';
8
- export { BrowserTool } from './smartagent.tools.browser.js';
9
- export { DenoTool, type TDenoPermission } from './smartagent.tools.deno.js';
10
- export { JsonValidatorTool } from './smartagent.tools.json.js';
11
- export * from './smartagent.interfaces.js';
12
- export { type ISmartAiOptions, type TProvider, type ChatMessage, type ChatOptions, type ChatResponse, } from '@push.rocks/smartai';
1
+ export { runAgent } from './smartagent.classes.agent.js';
2
+ export { ToolRegistry } from './smartagent.classes.toolregistry.js';
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,20 +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 base tool class for custom tool creation
8
- export { BaseToolWrapper } from './smartagent.tools.base.js';
9
- // Export standard tools
10
- export { FilesystemTool } from './smartagent.tools.filesystem.js';
11
- export { HttpTool } from './smartagent.tools.http.js';
12
- export { ShellTool } from './smartagent.tools.shell.js';
13
- export { BrowserTool } from './smartagent.tools.browser.js';
14
- export { DenoTool } from './smartagent.tools.deno.js';
15
- export { JsonValidatorTool } from './smartagent.tools.json.js';
16
- // Export all interfaces
17
- export * from './smartagent.interfaces.js';
18
- // Re-export useful types from smartai
19
- export {} from '@push.rocks/smartai';
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4Qyx3REFBd0Q7QUFDeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFMUUsMkJBQTJCO0FBQzNCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdEUsa0RBQWtEO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU3RCx3QkFBd0I7QUFDeEIsT0FBTyxFQUFFLGNBQWMsRUFBK0IsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUF3QixNQUFNLDRCQUE0QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRS9ELHdCQUF3QjtBQUN4QixjQUFjLDRCQUE0QixDQUFDO0FBRTNDLHNDQUFzQztBQUN0QyxPQUFPLEVBTU4sTUFBTSxxQkFBcUIsQ0FBQyJ9
1
+ export { runAgent } from './smartagent.classes.agent.js';
2
+ export { ToolRegistry } from './smartagent.classes.toolregistry.js';
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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
@@ -0,0 +1,12 @@
1
+ import type { ToolSet } from './plugins.js';
2
+ export declare class ToolRegistry {
3
+ private tools;
4
+ /**
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
8
+ */
9
+ register(name: string, def: ToolSet[string]): this;
10
+ /** Get the full ToolSet for passing to runAgent */
11
+ getTools(): ToolSet;
12
+ }
@@ -0,0 +1,17 @@
1
+ export class ToolRegistry {
2
+ tools = {};
3
+ /**
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
7
+ */
8
+ register(name, def) {
9
+ this.tools[name] = def;
10
+ return this;
11
+ }
12
+ /** Get the full ToolSet for passing to runAgent */
13
+ getTools() {
14
+ return { ...this.tools };
15
+ }
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLnRvb2xyZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0YWdlbnQuY2xhc3Nlcy50b29scmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLFlBQVk7SUFDZixLQUFLLEdBQVksRUFBRSxDQUFDO0lBRTVCOzs7O09BSUc7SUFDSSxRQUFRLENBQUMsSUFBWSxFQUFFLEdBQW9CO1FBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG1EQUFtRDtJQUM1QyxRQUFRO1FBQ2IsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FDRiJ9
@@ -1,236 +1,52 @@
1
- import * as plugins from './plugins.js';
2
- /**
3
- * Options for running a task with the DualAgentOrchestrator
4
- */
5
- export interface ITaskRunOptions {
6
- /** Base64-encoded images to include with the task (for vision-capable models) */
7
- images?: string[];
8
- }
9
- /**
10
- * Configuration options for the DualAgentOrchestrator
11
- */
12
- export interface IDualAgentOptions extends plugins.smartai.ISmartAiOptions {
13
- /** Existing SmartAi instance to reuse (avoids creating duplicate providers) */
14
- smartAiInstance?: plugins.smartai.SmartAi;
15
- /** Name of the agent system */
16
- name?: string;
17
- /** Default AI provider for both Driver and Guardian */
18
- defaultProvider?: plugins.smartai.TProvider;
19
- /** Optional separate provider for Guardian (for cost optimization) */
20
- guardianProvider?: plugins.smartai.TProvider;
21
- /** System message for the Driver agent */
22
- driverSystemMessage?: string;
23
- /** Policy prompt for the Guardian agent - REQUIRED */
24
- guardianPolicyPrompt: string;
25
- /** Maximum iterations for task completion (default: 20) */
26
- maxIterations?: number;
27
- /** Maximum consecutive rejections before aborting (default: 3) */
28
- maxConsecutiveRejections?: number;
29
- /** Enable verbose logging */
30
- verbose?: boolean;
31
- /** Maximum characters for tool result output before truncation (default: 15000). Set to 0 to disable. */
32
- maxResultChars?: number;
33
- /** Maximum history messages to pass to API (default: 20). Set to 0 for unlimited. */
34
- maxHistoryMessages?: number;
35
- /** Optional callback for live progress updates during execution */
36
- onProgress?: (event: IProgressEvent) => void;
37
- /** Prefix for log messages (e.g., "[README]", "[Commit]"). Default: empty */
38
- logPrefix?: string;
39
- /** Callback fired for each token during LLM generation (streaming mode) */
40
- onToken?: (token: string, source: 'driver' | 'guardian') => void;
1
+ import type { ToolSet, ModelMessage, LanguageModelV3 } from './plugins.js';
2
+ export interface IAgentRunOptions {
3
+ /** The LanguageModelV3 to use from smartai.getModel() */
4
+ model: LanguageModelV3;
5
+ /** Initial user message or task description */
6
+ prompt: string;
7
+ /** System prompt override */
8
+ system?: string;
9
+ /** Tools available to the agent */
10
+ tools?: ToolSet;
41
11
  /**
42
- * Enable native tool calling mode (default: false)
43
- * When enabled, uses Ollama's native tool calling API instead of XML parsing
44
- * This is more efficient for models that support it (e.g., GPT-OSS with Harmony format)
12
+ * Maximum number of LLM↔tool round trips.
13
+ * Each step may execute multiple tools in parallel.
14
+ * Default: 20
45
15
  */
46
- useNativeToolCalling?: boolean;
47
- }
48
- /**
49
- * Represents a message in the agent's conversation history
50
- */
51
- export interface IAgentMessage {
52
- role: 'system' | 'user' | 'assistant' | 'tool' | 'guardian';
53
- content: string;
54
- toolName?: string;
55
- toolResult?: unknown;
56
- toolCall?: IToolCallProposal;
57
- guardianDecision?: IGuardianDecision;
58
- timestamp?: Date;
59
- }
60
- /**
61
- * Represents an action that a tool can perform
62
- */
63
- export interface IToolAction {
64
- /** Action name (e.g., 'read', 'write', 'delete') */
65
- name: string;
66
- /** Description of what this action does */
67
- description: string;
68
- /** JSON schema for action parameters */
69
- parameters: Record<string, unknown>;
70
- }
71
- /**
72
- * Native tool call from provider (matches Ollama's tool calling format)
73
- * Format: function name is "toolName_actionName" (e.g., "json_validate")
74
- */
75
- export interface INativeToolCall {
76
- function: {
77
- name: string;
78
- arguments: Record<string, unknown>;
79
- index?: number;
16
+ maxSteps?: number;
17
+ /** Prior conversation messages to include */
18
+ messages?: ModelMessage[];
19
+ /** Called for each streamed text delta */
20
+ onToken?: (delta: string) => void;
21
+ /** Called when a tool call starts */
22
+ onToolCall?: (toolName: string, input: unknown) => void;
23
+ /** Called when a tool call completes */
24
+ onToolResult?: (toolName: string, result: unknown) => void;
25
+ /**
26
+ * Called when total token usage approaches the model's context limit.
27
+ * Receives the full message history and must return a compacted replacement.
28
+ * If not provided, runAgent throws a ContextOverflowError instead.
29
+ */
30
+ onContextOverflow?: (messages: ModelMessage[]) => Promise<ModelMessage[]>;
31
+ /** AbortSignal to cancel the run mid-flight */
32
+ abort?: AbortSignal;
33
+ }
34
+ export interface IAgentRunResult {
35
+ /** Final text output from the model */
36
+ text: string;
37
+ /** All messages in the completed conversation */
38
+ messages: ModelMessage[];
39
+ /** Total steps taken */
40
+ steps: number;
41
+ /** Finish reason from the final step */
42
+ finishReason: string;
43
+ /** Accumulated token usage across all steps */
44
+ usage: {
45
+ inputTokens: number;
46
+ outputTokens: number;
47
+ totalTokens: number;
80
48
  };
81
49
  }
82
- /**
83
- * Proposed tool call from the Driver
84
- */
85
- export interface IToolCallProposal {
86
- /** Unique ID for this proposal */
87
- proposalId: string;
88
- /** Name of the tool */
89
- toolName: string;
90
- /** Specific action to perform */
91
- action: string;
92
- /** Parameters for the action */
93
- params: Record<string, unknown>;
94
- /** Driver's reasoning for this call */
95
- reasoning?: string;
96
- }
97
- /**
98
- * Result of tool execution
99
- */
100
- export interface IToolExecutionResult {
101
- success: boolean;
102
- result?: unknown;
103
- error?: string;
104
- /** Optional human-readable summary for history (if provided, used instead of full result) */
105
- summary?: string;
106
- }
107
- /**
108
- * Base interface for wrapped tools
109
- */
110
- export interface IAgentToolWrapper {
111
- /** Tool name */
112
- name: string;
113
- /** Tool description */
114
- description: string;
115
- /** Available actions */
116
- actions: IToolAction[];
117
- /** Initialize the tool */
118
- initialize(): Promise<void>;
119
- /** Cleanup resources */
120
- cleanup(): Promise<void>;
121
- /** Execute an action */
122
- execute(action: string, params: Record<string, unknown>): Promise<IToolExecutionResult>;
123
- /** Get a summary for Guardian review */
124
- getCallSummary(action: string, params: Record<string, unknown>): string;
125
- }
126
- /**
127
- * Request for Guardian evaluation
128
- */
129
- export interface IGuardianEvaluationRequest {
130
- /** The proposed tool call */
131
- proposal: IToolCallProposal;
132
- /** Current task context */
133
- taskContext: string;
134
- /** Recent conversation history (last N messages) */
135
- recentHistory: IAgentMessage[];
136
- /** Summary of what the tool call will do */
137
- callSummary: string;
138
- }
139
- /**
140
- * Guardian's decision
141
- */
142
- export interface IGuardianDecision {
143
- /** Approve or reject */
144
- decision: 'approve' | 'reject';
145
- /** Explanation of the decision */
146
- reason: string;
147
- /** Specific concerns if rejected */
148
- concerns?: string[];
149
- /** Suggestions for the Driver if rejected */
150
- suggestions?: string;
151
- /** Confidence level (0-1) */
152
- confidence?: number;
153
- }
154
- /**
155
- * Log entry for tool executions
156
- */
157
- export interface IToolExecutionLog {
158
- timestamp: Date;
159
- toolName: string;
160
- action: string;
161
- params: Record<string, unknown>;
162
- guardianDecision: 'approved' | 'rejected';
163
- guardianReason: string;
164
- executionResult?: unknown;
165
- executionError?: string;
166
- }
167
- /**
168
- * Status of a dual-agent run
169
- */
170
- export type TDualAgentRunStatus = 'completed' | 'in_progress' | 'max_iterations_reached' | 'max_rejections_reached' | 'clarification_needed' | 'error';
171
- /**
172
- * Result of a dual-agent run
173
- */
174
- export interface IDualAgentRunResult {
175
- /** Whether the task was successful */
176
- success: boolean;
177
- /** Whether the task is completed */
178
- completed: boolean;
179
- /** Final result or response */
180
- result: string;
181
- /** Total iterations taken */
182
- iterations: number;
183
- /** Full conversation history */
184
- history: IAgentMessage[];
185
- /** Current status */
186
- status: TDualAgentRunStatus;
187
- /** Number of tool calls made */
188
- toolCallCount?: number;
189
- /** Number of Guardian rejections */
190
- rejectionCount?: number;
191
- /** Tool execution log */
192
- toolLog?: IToolExecutionLog[];
193
- /** Error message if status is 'error' */
194
- error?: string;
195
- }
196
- /**
197
- * Progress event types for live feedback during agent execution
198
- */
199
- export type TProgressEventType = 'task_started' | 'iteration_started' | 'tool_proposed' | 'guardian_evaluating' | 'tool_approved' | 'tool_rejected' | 'tool_executing' | 'tool_completed' | 'task_completed' | 'clarification_needed' | 'max_iterations' | 'max_rejections';
200
- /**
201
- * Log level for progress events
202
- */
203
- export type TLogLevel = 'info' | 'warn' | 'error' | 'success';
204
- /**
205
- * Progress event for live feedback during agent execution
206
- */
207
- export interface IProgressEvent {
208
- /** Type of progress event */
209
- type: TProgressEventType;
210
- /** Current iteration number */
211
- iteration?: number;
212
- /** Maximum iterations configured */
213
- maxIterations?: number;
214
- /** Name of the tool being used */
215
- toolName?: string;
216
- /** Action being performed */
217
- action?: string;
218
- /** Reason for rejection or other explanation */
219
- reason?: string;
220
- /** Human-readable message about the event */
221
- message?: string;
222
- /** Timestamp of the event */
223
- timestamp: Date;
224
- /** Log level for this event (info, warn, error, success) */
225
- logLevel: TLogLevel;
226
- /** Pre-formatted log message ready for output */
227
- logMessage: string;
50
+ export declare class ContextOverflowError extends Error {
51
+ constructor(message?: string);
228
52
  }
229
- /**
230
- * Available tool names
231
- */
232
- export type TToolName = 'filesystem' | 'http' | 'browser' | 'shell';
233
- /**
234
- * Generate a unique proposal ID
235
- */
236
- export declare function generateProposalId(): string;
@@ -1,8 +1,7 @@
1
- import * as plugins from './plugins.js';
2
- /**
3
- * Generate a unique proposal ID
4
- */
5
- export function generateProposalId() {
6
- return `proposal_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
1
+ export class ContextOverflowError extends Error {
2
+ constructor(message = 'Agent context limit reached and no onContextOverflow handler provided') {
3
+ super(message);
4
+ this.name = 'ContextOverflowError';
5
+ }
7
6
  }
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5pbnRlcmZhY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhZ2VudC5pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBNFN4Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsT0FBTyxZQUFZLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNoRixDQUFDIn0=
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5pbnRlcmZhY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhZ2VudC5pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWdEQSxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsS0FBSztJQUM3QyxZQUFZLE9BQU8sR0FBRyx1RUFBdUU7UUFDM0YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxzQkFBc0IsQ0FBQztJQUNyQyxDQUFDO0NBQ0YifQ==