@kooka/agent-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +293 -0
  3. package/dist/abort.d.ts +2 -0
  4. package/dist/abort.d.ts.map +1 -0
  5. package/dist/abort.js +19 -0
  6. package/dist/abort.js.map +1 -0
  7. package/dist/agent/agent.d.ts +67 -0
  8. package/dist/agent/agent.d.ts.map +1 -0
  9. package/dist/agent/agent.js +1061 -0
  10. package/dist/agent/agent.js.map +1 -0
  11. package/dist/agent/constants.d.ts +6 -0
  12. package/dist/agent/constants.d.ts.map +1 -0
  13. package/dist/agent/constants.js +40 -0
  14. package/dist/agent/constants.js.map +1 -0
  15. package/dist/agent/prompts.d.ts +4 -0
  16. package/dist/agent/prompts.d.ts.map +1 -0
  17. package/dist/agent/prompts.js +31 -0
  18. package/dist/agent/prompts.js.map +1 -0
  19. package/dist/agent/reminders.d.ts +3 -0
  20. package/dist/agent/reminders.d.ts.map +1 -0
  21. package/dist/agent/reminders.js +31 -0
  22. package/dist/agent/reminders.js.map +1 -0
  23. package/dist/agent/retry.d.ts +12 -0
  24. package/dist/agent/retry.d.ts.map +1 -0
  25. package/dist/agent/retry.js +200 -0
  26. package/dist/agent/retry.js.map +1 -0
  27. package/dist/index.d.ts +49 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +50 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/llm/openaiCompatible.d.ts +23 -0
  32. package/dist/llm/openaiCompatible.d.ts.map +1 -0
  33. package/dist/llm/openaiCompatible.js +91 -0
  34. package/dist/llm/openaiCompatible.js.map +1 -0
  35. package/dist/plugins/pluginManager.d.ts +22 -0
  36. package/dist/plugins/pluginManager.d.ts.map +1 -0
  37. package/dist/plugins/pluginManager.js +171 -0
  38. package/dist/plugins/pluginManager.js.map +1 -0
  39. package/dist/plugins/types.d.ts +97 -0
  40. package/dist/plugins/types.d.ts.map +1 -0
  41. package/dist/plugins/types.js +2 -0
  42. package/dist/plugins/types.js.map +1 -0
  43. package/dist/skills.d.ts +28 -0
  44. package/dist/skills.d.ts.map +1 -0
  45. package/dist/skills.js +188 -0
  46. package/dist/skills.js.map +1 -0
  47. package/dist/tools/builtin/bash.d.ts +4 -0
  48. package/dist/tools/builtin/bash.d.ts.map +1 -0
  49. package/dist/tools/builtin/bash.js +364 -0
  50. package/dist/tools/builtin/bash.js.map +1 -0
  51. package/dist/tools/builtin/glob.d.ts +4 -0
  52. package/dist/tools/builtin/glob.d.ts.map +1 -0
  53. package/dist/tools/builtin/glob.js +87 -0
  54. package/dist/tools/builtin/glob.js.map +1 -0
  55. package/dist/tools/builtin/grep.d.ts +4 -0
  56. package/dist/tools/builtin/grep.d.ts.map +1 -0
  57. package/dist/tools/builtin/grep.js +190 -0
  58. package/dist/tools/builtin/grep.js.map +1 -0
  59. package/dist/tools/builtin/index.d.ts +15 -0
  60. package/dist/tools/builtin/index.d.ts.map +1 -0
  61. package/dist/tools/builtin/index.js +37 -0
  62. package/dist/tools/builtin/index.js.map +1 -0
  63. package/dist/tools/builtin/list.d.ts +4 -0
  64. package/dist/tools/builtin/list.d.ts.map +1 -0
  65. package/dist/tools/builtin/list.js +162 -0
  66. package/dist/tools/builtin/list.js.map +1 -0
  67. package/dist/tools/builtin/read.d.ts +4 -0
  68. package/dist/tools/builtin/read.d.ts.map +1 -0
  69. package/dist/tools/builtin/read.js +92 -0
  70. package/dist/tools/builtin/read.js.map +1 -0
  71. package/dist/tools/builtin/skill.d.ts +9 -0
  72. package/dist/tools/builtin/skill.d.ts.map +1 -0
  73. package/dist/tools/builtin/skill.js +126 -0
  74. package/dist/tools/builtin/skill.js.map +1 -0
  75. package/dist/tools/builtin/workspace.d.ts +13 -0
  76. package/dist/tools/builtin/workspace.d.ts.map +1 -0
  77. package/dist/tools/builtin/workspace.js +74 -0
  78. package/dist/tools/builtin/workspace.js.map +1 -0
  79. package/dist/tools/builtin/write.d.ts +4 -0
  80. package/dist/tools/builtin/write.d.ts.map +1 -0
  81. package/dist/tools/builtin/write.js +73 -0
  82. package/dist/tools/builtin/write.js.map +1 -0
  83. package/dist/tools/registry.d.ts +21 -0
  84. package/dist/tools/registry.d.ts.map +1 -0
  85. package/dist/tools/registry.js +150 -0
  86. package/dist/tools/registry.js.map +1 -0
  87. package/dist/types.d.ts +251 -0
  88. package/dist/types.d.ts.map +1 -0
  89. package/dist/types.js +2 -0
  90. package/dist/types.js.map +1 -0
  91. package/package.json +46 -0
@@ -0,0 +1,126 @@
1
+ import * as path from 'path';
2
+ import { optionalString } from '@kooka/core';
3
+ import { getSkillIndex, loadSkillFile } from '../../skills.js';
4
+ function formatAvailableSkills(skills) {
5
+ if (skills.length === 0)
6
+ return '<available_skills></available_skills>';
7
+ return [
8
+ '<available_skills>',
9
+ ...skills.flatMap((s) => [
10
+ ' <skill>',
11
+ ` <name>${s.name}</name>`,
12
+ ` <description>${s.description}</description>`,
13
+ ' </skill>',
14
+ ]),
15
+ '</available_skills>',
16
+ ].join('\n');
17
+ }
18
+ export function createSkillTool(options) {
19
+ const tool = {
20
+ id: 'skill',
21
+ name: 'Skills',
22
+ description: 'List and load reusable task instructions ("skills"). ' +
23
+ 'Call with no args to list available skills. Call with {"name": "..."} to load a skill into the conversation.',
24
+ parameters: {
25
+ type: 'object',
26
+ properties: {
27
+ name: {
28
+ type: 'string',
29
+ description: 'Skill identifier from the available skills list (omit to list skills)',
30
+ },
31
+ },
32
+ },
33
+ execution: { type: 'function', handler: 'builtin.skill' },
34
+ metadata: {
35
+ category: 'help',
36
+ icon: 'book',
37
+ requiresApproval: false,
38
+ permission: 'read',
39
+ readOnly: true,
40
+ },
41
+ };
42
+ const handler = async (args, context) => {
43
+ const enabled = options.enabled !== false;
44
+ if (!enabled) {
45
+ return { success: false, error: 'Skills are disabled.' };
46
+ }
47
+ const allowExternalPaths = !!context.allowExternalPaths;
48
+ const name = optionalString(args, 'name');
49
+ const workspaceRoot = context.workspaceRoot;
50
+ const index = await getSkillIndex({
51
+ workspaceRoot,
52
+ searchPaths: options.searchPaths,
53
+ allowExternalPaths,
54
+ signal: context.signal,
55
+ });
56
+ if (!name || !name.trim()) {
57
+ const skipped = index.scannedDirs.filter((d) => d.status === 'skipped_external');
58
+ const missing = index.scannedDirs.filter((d) => d.status === 'missing');
59
+ const notDir = index.scannedDirs.filter((d) => d.status === 'error');
60
+ const lines = [];
61
+ if (index.skills.length === 0) {
62
+ lines.push('No skills are currently available.');
63
+ lines.push('');
64
+ }
65
+ else {
66
+ lines.push('Load a skill to get detailed instructions for a specific task.');
67
+ lines.push('Call: skill { "name": "..." }');
68
+ lines.push('');
69
+ lines.push(formatAvailableSkills(index.skills));
70
+ lines.push('');
71
+ }
72
+ if (index.truncated) {
73
+ lines.push('Note: Skill list was truncated.');
74
+ lines.push('');
75
+ }
76
+ if (skipped.length > 0) {
77
+ lines.push('Note: Some skill directories were skipped because external paths are disabled.');
78
+ lines.push('');
79
+ }
80
+ const showDirs = [...missing, ...notDir];
81
+ if (showDirs.length > 0) {
82
+ lines.push('Searched directories:');
83
+ for (const d of index.scannedDirs) {
84
+ const label = workspaceRoot && d.absPath.startsWith(workspaceRoot + path.sep)
85
+ ? path.relative(workspaceRoot, d.absPath) || '.'
86
+ : d.absPath;
87
+ lines.push(`- ${label} (${d.status}${d.reason ? `: ${d.reason}` : ''})`);
88
+ }
89
+ }
90
+ return { success: true, data: lines.join('\n').trimEnd() };
91
+ }
92
+ const skill = index.byName.get(name.trim());
93
+ if (!skill) {
94
+ const available = index.skills
95
+ .map((s) => s.name)
96
+ .slice(0, 50)
97
+ .join(', ');
98
+ const suffix = available ? ` Available skills: ${available}${index.skills.length > 50 ? ', ...' : ''}` : '';
99
+ return { success: false, error: `Skill "${name.trim()}" not found.${suffix}` };
100
+ }
101
+ if (skill.source === 'external' && !allowExternalPaths) {
102
+ return {
103
+ success: false,
104
+ error: 'External paths are disabled. Enable allowExternalPaths to load skills outside the current workspace.',
105
+ metadata: {
106
+ errorType: 'external_paths_disabled',
107
+ blockedSettingKey: 'allowExternalPaths',
108
+ isOutsideWorkspace: true,
109
+ },
110
+ };
111
+ }
112
+ const { content } = await loadSkillFile(skill);
113
+ const output = [`## Skill: ${skill.name}`, '', `**Base directory**: ${skill.dir}`, '', content].join('\n');
114
+ return {
115
+ success: true,
116
+ data: output.trimEnd(),
117
+ metadata: {
118
+ name: skill.name,
119
+ dir: skill.dir,
120
+ source: skill.source,
121
+ },
122
+ };
123
+ };
124
+ return { tool, handler };
125
+ }
126
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/tools/builtin/skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ToolContext } from '../../types.js';
2
+ export declare const BINARY_EXTENSIONS: Set<string>;
3
+ export declare function getWorkspaceRoot(context?: {
4
+ workspaceRoot?: string;
5
+ }): string;
6
+ export declare function resolveToolPath(inputPath: string, context?: Pick<ToolContext, 'workspaceRoot' | 'allowExternalPaths'>): {
7
+ absPath: string;
8
+ relPath: string;
9
+ isExternal: boolean;
10
+ };
11
+ export declare function containsBinaryData(buffer: Uint8Array): boolean;
12
+ export declare function toPosixPath(p: string): string;
13
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/tools/builtin/workspace.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,eAAO,MAAM,iBAAiB,aAyC5B,CAAC;AAEH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAI7E;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,eAAe,GAAG,oBAAoB,CAAC,GAClE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAiB3D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAM9D;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C"}
@@ -0,0 +1,74 @@
1
+ import * as path from 'path';
2
+ import { normalizeFsPath } from '@kooka/core';
3
+ export const BINARY_EXTENSIONS = new Set([
4
+ '.png',
5
+ '.jpg',
6
+ '.jpeg',
7
+ '.gif',
8
+ '.bmp',
9
+ '.ico',
10
+ '.webp',
11
+ '.svg',
12
+ '.pdf',
13
+ '.doc',
14
+ '.docx',
15
+ '.xls',
16
+ '.xlsx',
17
+ '.ppt',
18
+ '.pptx',
19
+ '.zip',
20
+ '.tar',
21
+ '.gz',
22
+ '.rar',
23
+ '.7z',
24
+ '.exe',
25
+ '.dll',
26
+ '.so',
27
+ '.dylib',
28
+ '.mp3',
29
+ '.mp4',
30
+ '.avi',
31
+ '.mov',
32
+ '.wav',
33
+ '.flac',
34
+ '.ttf',
35
+ '.otf',
36
+ '.woff',
37
+ '.woff2',
38
+ '.pyc',
39
+ '.class',
40
+ '.o',
41
+ '.obj',
42
+ '.sqlite',
43
+ '.db',
44
+ ]);
45
+ export function getWorkspaceRoot(context) {
46
+ const root = context?.workspaceRoot;
47
+ if (!root)
48
+ throw new Error('No workspaceRoot configured');
49
+ return root;
50
+ }
51
+ export function resolveToolPath(inputPath, context) {
52
+ const rootPath = getWorkspaceRoot(context);
53
+ const normalizedRoot = normalizeFsPath(rootPath);
54
+ const absPath = path.isAbsolute(inputPath) ? path.resolve(inputPath) : path.resolve(rootPath, inputPath);
55
+ const normalizedAbs = normalizeFsPath(absPath);
56
+ const isExternal = normalizedAbs !== normalizedRoot && !normalizedAbs.startsWith(normalizedRoot + path.sep);
57
+ const relPath = isExternal ? absPath : path.relative(rootPath, absPath) || '.';
58
+ if (isExternal && !context?.allowExternalPaths) {
59
+ throw new Error('External paths are disabled. Enable allowExternalPaths to allow access outside the current workspace.');
60
+ }
61
+ return { absPath, relPath, isExternal };
62
+ }
63
+ export function containsBinaryData(buffer) {
64
+ const checkLength = Math.min(buffer.length, 8192);
65
+ for (let i = 0; i < checkLength; i++) {
66
+ if (buffer[i] === 0)
67
+ return true;
68
+ }
69
+ return false;
70
+ }
71
+ export function toPosixPath(p) {
72
+ return p.replace(/\\/g, '/');
73
+ }
74
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/tools/builtin/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IACvC,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,IAAI;IACJ,MAAM;IACN,SAAS;IACT,KAAK;CACN,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,OAAoC;IACnE,MAAM,IAAI,GAAG,OAAO,EAAE,aAAa,CAAC;IACpC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,OAAmE;IAEnE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAEjD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACzG,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE/C,MAAM,UAAU,GAAG,aAAa,KAAK,cAAc,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5G,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,GAAG,CAAC;IAE/E,IAAI,UAAU,IAAI,CAAC,OAAO,EAAE,kBAAkB,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CACb,uGAAuG,CACxG,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAkB;IACnD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IACnC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ToolDefinition, ToolHandler } from '../../types.js';
2
+ export declare const writeTool: ToolDefinition;
3
+ export declare const writeHandler: ToolHandler;
4
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/tools/builtin/write.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAIlE,eAAO,MAAM,SAAS,EAAE,cA8BvB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,WAyC1B,CAAC"}
@@ -0,0 +1,73 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { optionalBoolean, requireString } from '@kooka/core';
4
+ import { resolveToolPath } from './workspace.js';
5
+ export const writeTool = {
6
+ id: 'write',
7
+ name: 'Write File',
8
+ description: `Write content to a file in the workspace.
9
+
10
+ Usage:
11
+ - Use this tool primarily for creating NEW files.
12
+ - If the file already exists, this tool refuses to overwrite by default.
13
+ - Set overwrite=true only if you intentionally want to replace the entire file.`,
14
+ parameters: {
15
+ type: 'object',
16
+ properties: {
17
+ fileId: { type: 'string', description: 'File handle from glob output (e.g. "F1"). Prefer this over spelling file paths.' },
18
+ filePath: { type: 'string', description: 'Absolute path or path relative to workspace root' },
19
+ content: { type: 'string', description: 'Content to write' },
20
+ overwrite: { type: 'boolean', description: 'Allow overwriting an existing file (default false)' },
21
+ },
22
+ required: ['content'],
23
+ },
24
+ execution: { type: 'function', handler: 'builtin.write' },
25
+ metadata: {
26
+ category: 'file',
27
+ icon: 'file-add',
28
+ requiresApproval: true,
29
+ permission: 'edit',
30
+ supportsExternalPaths: true,
31
+ readOnly: false,
32
+ permissionPatterns: [{ arg: 'filePath', kind: 'path' }],
33
+ },
34
+ };
35
+ export const writeHandler = async (args, context) => {
36
+ const filePathResult = requireString(args, 'filePath');
37
+ if ('error' in filePathResult)
38
+ return { success: false, error: filePathResult.error };
39
+ const contentResult = requireString(args, 'content');
40
+ if ('error' in contentResult)
41
+ return { success: false, error: contentResult.error };
42
+ let absPath;
43
+ try {
44
+ absPath = resolveToolPath(filePathResult.value, context).absPath;
45
+ }
46
+ catch (error) {
47
+ return { success: false, error: error instanceof Error ? error.message : String(error) };
48
+ }
49
+ const overwrite = !!optionalBoolean(args, 'overwrite', false);
50
+ let exists = true;
51
+ try {
52
+ const stat = await fs.stat(absPath);
53
+ exists = stat.isFile() || stat.isFIFO() || stat.isSocket() || stat.isCharacterDevice() || stat.isBlockDevice();
54
+ }
55
+ catch {
56
+ exists = false;
57
+ }
58
+ if (exists && !overwrite) {
59
+ return {
60
+ success: false,
61
+ error: `Refusing to overwrite an existing file with Write: ${absPath}\n\n` +
62
+ `If you intentionally want to replace the entire file, set overwrite=true.`,
63
+ metadata: {
64
+ errorType: 'write_overwrite_blocked',
65
+ fileExists: true,
66
+ },
67
+ };
68
+ }
69
+ await fs.mkdir(path.dirname(absPath), { recursive: true });
70
+ await fs.writeFile(absPath, Buffer.from(contentResult.value));
71
+ return { success: true, data: `Wrote ${contentResult.value.length} bytes to ${absPath}` };
72
+ };
73
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/tools/builtin/write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ToolDefinition, ToolHandler, ToolProvider, ToolContext, ToolResult } from '../types.js';
2
+ export type Disposable = {
3
+ dispose: () => void;
4
+ };
5
+ export declare class ToolRegistry {
6
+ private readonly options?;
7
+ private providers;
8
+ private toolToProvider;
9
+ private simpleProvider;
10
+ constructor(options?: {
11
+ defaultTimeoutMs?: number;
12
+ } | undefined);
13
+ registerProvider(provider: ToolProvider): Disposable;
14
+ unregisterProvider(providerId: string): void;
15
+ private indexProviderTools;
16
+ registerTool(definition: ToolDefinition, handler: ToolHandler): Disposable;
17
+ getTools(): Promise<ToolDefinition[]>;
18
+ getTool(toolId: string): Promise<ToolDefinition | undefined>;
19
+ executeTool(toolId: string, args: Record<string, unknown>, context: ToolContext): Promise<ToolResult>;
20
+ }
21
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGtG,MAAM,MAAM,UAAU,GAAG;IAAE,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC;AAkCjD,qBAAa,YAAY;IAKX,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAJrC,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,cAAc,CAAqB;gBAEd,OAAO,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,YAAA;IAKpE,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,UAAU;IAmBpD,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAmB5C,OAAO,CAAC,kBAAkB;IAM1B,YAAY,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,GAAG,UAAU;IAWpE,QAAQ,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IASrC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAU5D,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAiD5G"}
@@ -0,0 +1,150 @@
1
+ import { combineAbortSignals } from '../abort.js';
2
+ class SimpleToolProvider {
3
+ id;
4
+ name;
5
+ tools = new Map();
6
+ constructor(id, name) {
7
+ this.id = id;
8
+ this.name = name;
9
+ }
10
+ addTool(definition, handler) {
11
+ this.tools.set(definition.id, { definition, handler });
12
+ }
13
+ removeTool(toolId) {
14
+ return this.tools.delete(toolId);
15
+ }
16
+ getTools() {
17
+ return Array.from(this.tools.values()).map((t) => t.definition);
18
+ }
19
+ async executeTool(toolId, args, context) {
20
+ const tool = this.tools.get(toolId);
21
+ if (!tool) {
22
+ return { success: false, error: `Tool not found: ${toolId}` };
23
+ }
24
+ return tool.handler(args, context);
25
+ }
26
+ }
27
+ export class ToolRegistry {
28
+ options;
29
+ providers = new Map();
30
+ toolToProvider = new Map();
31
+ simpleProvider;
32
+ constructor(options) {
33
+ this.options = options;
34
+ this.simpleProvider = new SimpleToolProvider('builtin', 'Built-in Tools');
35
+ this.providers.set('builtin', this.simpleProvider);
36
+ }
37
+ registerProvider(provider) {
38
+ if (this.providers.has(provider.id)) {
39
+ throw new Error(`Provider already registered: ${provider.id}`);
40
+ }
41
+ this.providers.set(provider.id, provider);
42
+ Promise.resolve(provider.getTools())
43
+ .then((tools) => this.indexProviderTools(provider.id, tools))
44
+ .catch(() => {
45
+ // ignore provider listing errors; host can observe via tool execution failures
46
+ });
47
+ return {
48
+ dispose: () => {
49
+ this.unregisterProvider(provider.id);
50
+ },
51
+ };
52
+ }
53
+ unregisterProvider(providerId) {
54
+ const provider = this.providers.get(providerId);
55
+ if (!provider)
56
+ return;
57
+ for (const [toolId, pId] of this.toolToProvider) {
58
+ if (pId === providerId) {
59
+ this.toolToProvider.delete(toolId);
60
+ }
61
+ }
62
+ try {
63
+ provider.dispose?.();
64
+ }
65
+ catch {
66
+ // ignore
67
+ }
68
+ this.providers.delete(providerId);
69
+ }
70
+ indexProviderTools(providerId, tools) {
71
+ for (const tool of tools) {
72
+ this.toolToProvider.set(tool.id, providerId);
73
+ }
74
+ }
75
+ registerTool(definition, handler) {
76
+ this.simpleProvider.addTool(definition, handler);
77
+ this.toolToProvider.set(definition.id, 'builtin');
78
+ return {
79
+ dispose: () => {
80
+ this.simpleProvider.removeTool(definition.id);
81
+ this.toolToProvider.delete(definition.id);
82
+ },
83
+ };
84
+ }
85
+ async getTools() {
86
+ const all = [];
87
+ for (const provider of this.providers.values()) {
88
+ const tools = await Promise.resolve(provider.getTools());
89
+ all.push(...tools);
90
+ }
91
+ return all;
92
+ }
93
+ async getTool(toolId) {
94
+ const providerId = this.toolToProvider.get(toolId);
95
+ if (!providerId)
96
+ return undefined;
97
+ const provider = this.providers.get(providerId);
98
+ if (!provider)
99
+ return undefined;
100
+ const tools = await Promise.resolve(provider.getTools());
101
+ return tools.find((t) => t.id === toolId);
102
+ }
103
+ async executeTool(toolId, args, context) {
104
+ const startTime = Date.now();
105
+ const providerId = this.toolToProvider.get(toolId);
106
+ if (!providerId) {
107
+ return { success: false, error: `Unknown tool: ${toolId}` };
108
+ }
109
+ const provider = this.providers.get(providerId);
110
+ if (!provider) {
111
+ return { success: false, error: `Provider not found: ${providerId}` };
112
+ }
113
+ try {
114
+ const tool = await this.getTool(toolId);
115
+ const defaultTimeout = this.options?.defaultTimeoutMs;
116
+ const timeout = Math.max(0, Math.floor((tool?.metadata?.timeout ?? defaultTimeout) || 0));
117
+ let result;
118
+ if (timeout > 0) {
119
+ const timeoutSignal = AbortSignal?.timeout;
120
+ const signal = timeoutSignal
121
+ ? combineAbortSignals([context.signal, timeoutSignal(timeout)])
122
+ : context.signal;
123
+ result = await provider.executeTool(toolId, args, { ...context, signal });
124
+ }
125
+ else {
126
+ result = await provider.executeTool(toolId, args, context);
127
+ }
128
+ return {
129
+ ...result,
130
+ metadata: {
131
+ ...(result.metadata || {}),
132
+ duration: Date.now() - startTime,
133
+ },
134
+ };
135
+ }
136
+ catch (error) {
137
+ const errorMessage = error instanceof Error ? error.message : String(error);
138
+ const errorType = error instanceof Error ? error.constructor.name : 'UnknownError';
139
+ return {
140
+ success: false,
141
+ error: errorMessage,
142
+ metadata: {
143
+ duration: Date.now() - startTime,
144
+ errorType,
145
+ },
146
+ };
147
+ }
148
+ }
149
+ }
150
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}