@vinhnt-sdk/tools 1.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 (146) hide show
  1. package/LICENSE +21 -0
  2. package/dist/arity.d.ts +22 -0
  3. package/dist/arity.d.ts.map +1 -0
  4. package/dist/arity.js +96 -0
  5. package/dist/arity.js.map +1 -0
  6. package/dist/context.d.ts +43 -0
  7. package/dist/context.d.ts.map +1 -0
  8. package/dist/context.js +2 -0
  9. package/dist/context.js.map +1 -0
  10. package/dist/define-tool.d.ts +45 -0
  11. package/dist/define-tool.d.ts.map +1 -0
  12. package/dist/define-tool.js +120 -0
  13. package/dist/define-tool.js.map +1 -0
  14. package/dist/definitions.d.ts +24 -0
  15. package/dist/definitions.d.ts.map +1 -0
  16. package/dist/definitions.js +2 -0
  17. package/dist/definitions.js.map +1 -0
  18. package/dist/description-lint.d.ts +25 -0
  19. package/dist/description-lint.d.ts.map +1 -0
  20. package/dist/description-lint.js +90 -0
  21. package/dist/description-lint.js.map +1 -0
  22. package/dist/diff.d.ts +7 -0
  23. package/dist/diff.d.ts.map +1 -0
  24. package/dist/diff.js +26 -0
  25. package/dist/diff.js.map +1 -0
  26. package/dist/domain.d.ts +39 -0
  27. package/dist/domain.d.ts.map +1 -0
  28. package/dist/domain.js +20 -0
  29. package/dist/domain.js.map +1 -0
  30. package/dist/file-history.d.ts +43 -0
  31. package/dist/file-history.d.ts.map +1 -0
  32. package/dist/file-history.js +55 -0
  33. package/dist/file-history.js.map +1 -0
  34. package/dist/file-tools.d.ts +56 -0
  35. package/dist/file-tools.d.ts.map +1 -0
  36. package/dist/file-tools.js +542 -0
  37. package/dist/file-tools.js.map +1 -0
  38. package/dist/git-tools.d.ts +8 -0
  39. package/dist/git-tools.d.ts.map +1 -0
  40. package/dist/git-tools.js +114 -0
  41. package/dist/git-tools.js.map +1 -0
  42. package/dist/history-hook.d.ts +4 -0
  43. package/dist/history-hook.d.ts.map +1 -0
  44. package/dist/history-hook.js +62 -0
  45. package/dist/history-hook.js.map +1 -0
  46. package/dist/image-tools.d.ts +11 -0
  47. package/dist/image-tools.d.ts.map +1 -0
  48. package/dist/image-tools.js +55 -0
  49. package/dist/image-tools.js.map +1 -0
  50. package/dist/index.d.ts +57 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +36 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/json-schema.d.ts +22 -0
  55. package/dist/json-schema.d.ts.map +1 -0
  56. package/dist/json-schema.js +2 -0
  57. package/dist/json-schema.js.map +1 -0
  58. package/dist/lazy-registry.d.ts +23 -0
  59. package/dist/lazy-registry.d.ts.map +1 -0
  60. package/dist/lazy-registry.js +64 -0
  61. package/dist/lazy-registry.js.map +1 -0
  62. package/dist/policy.d.ts +5 -0
  63. package/dist/policy.d.ts.map +1 -0
  64. package/dist/policy.js +2 -0
  65. package/dist/policy.js.map +1 -0
  66. package/dist/provider-helpers.d.ts +26 -0
  67. package/dist/provider-helpers.d.ts.map +1 -0
  68. package/dist/provider-helpers.js +46 -0
  69. package/dist/provider-helpers.js.map +1 -0
  70. package/dist/provider.d.ts +80 -0
  71. package/dist/provider.d.ts.map +1 -0
  72. package/dist/provider.js +96 -0
  73. package/dist/provider.js.map +1 -0
  74. package/dist/providers/agent-provider.d.ts +32 -0
  75. package/dist/providers/agent-provider.d.ts.map +1 -0
  76. package/dist/providers/agent-provider.js +35 -0
  77. package/dist/providers/agent-provider.js.map +1 -0
  78. package/dist/providers/builtin-provider.d.ts +36 -0
  79. package/dist/providers/builtin-provider.d.ts.map +1 -0
  80. package/dist/providers/builtin-provider.js +86 -0
  81. package/dist/providers/builtin-provider.js.map +1 -0
  82. package/dist/providers/file-loader.d.ts +47 -0
  83. package/dist/providers/file-loader.d.ts.map +1 -0
  84. package/dist/providers/file-loader.js +120 -0
  85. package/dist/providers/file-loader.js.map +1 -0
  86. package/dist/providers/index.d.ts +6 -0
  87. package/dist/providers/index.d.ts.map +1 -0
  88. package/dist/providers/index.js +5 -0
  89. package/dist/providers/index.js.map +1 -0
  90. package/dist/providers/skill-provider.d.ts +23 -0
  91. package/dist/providers/skill-provider.d.ts.map +1 -0
  92. package/dist/providers/skill-provider.js +28 -0
  93. package/dist/providers/skill-provider.js.map +1 -0
  94. package/dist/question-tool.d.ts +15 -0
  95. package/dist/question-tool.d.ts.map +1 -0
  96. package/dist/question-tool.js +51 -0
  97. package/dist/question-tool.js.map +1 -0
  98. package/dist/read-tracker.d.ts +8 -0
  99. package/dist/read-tracker.d.ts.map +1 -0
  100. package/dist/read-tracker.js +33 -0
  101. package/dist/read-tracker.js.map +1 -0
  102. package/dist/registry.d.ts +58 -0
  103. package/dist/registry.d.ts.map +1 -0
  104. package/dist/registry.js +128 -0
  105. package/dist/registry.js.map +1 -0
  106. package/dist/sandbox.d.ts +85 -0
  107. package/dist/sandbox.d.ts.map +1 -0
  108. package/dist/sandbox.js +409 -0
  109. package/dist/sandbox.js.map +1 -0
  110. package/dist/search-tools.d.ts +11 -0
  111. package/dist/search-tools.d.ts.map +1 -0
  112. package/dist/search-tools.js +124 -0
  113. package/dist/search-tools.js.map +1 -0
  114. package/dist/shell-parser.d.ts +9 -0
  115. package/dist/shell-parser.d.ts.map +1 -0
  116. package/dist/shell-parser.js +68 -0
  117. package/dist/shell-parser.js.map +1 -0
  118. package/dist/shell-tool.d.ts +22 -0
  119. package/dist/shell-tool.d.ts.map +1 -0
  120. package/dist/shell-tool.js +100 -0
  121. package/dist/shell-tool.js.map +1 -0
  122. package/dist/todo-tool.d.ts +2 -0
  123. package/dist/todo-tool.d.ts.map +1 -0
  124. package/dist/todo-tool.js +121 -0
  125. package/dist/todo-tool.js.map +1 -0
  126. package/dist/tool-search.d.ts +14 -0
  127. package/dist/tool-search.d.ts.map +1 -0
  128. package/dist/tool-search.js +46 -0
  129. package/dist/tool-search.js.map +1 -0
  130. package/dist/types.d.ts +30 -0
  131. package/dist/types.d.ts.map +1 -0
  132. package/dist/types.js +2 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/validate.d.ts +9 -0
  135. package/dist/validate.d.ts.map +1 -0
  136. package/dist/validate.js +26 -0
  137. package/dist/validate.js.map +1 -0
  138. package/dist/web-search-tool.d.ts +84 -0
  139. package/dist/web-search-tool.d.ts.map +1 -0
  140. package/dist/web-search-tool.js +134 -0
  141. package/dist/web-search-tool.js.map +1 -0
  142. package/dist/web-tools.d.ts +10 -0
  143. package/dist/web-tools.d.ts.map +1 -0
  144. package/dist/web-tools.js +62 -0
  145. package/dist/web-tools.js.map +1 -0
  146. package/package.json +58 -0
@@ -0,0 +1,22 @@
1
+ import { type SandboxScope } from "./sandbox.js";
2
+ export interface ShellToolConfig {
3
+ workspaceRoot: string | (() => string);
4
+ defaultTimeoutMs: number;
5
+ /** Hard cap on shell command timeout in ms (default: 300000) */
6
+ maxTimeoutMs?: number;
7
+ /** If true, prompts for permission before executing shell commands (default: true) */
8
+ askPermission?: boolean;
9
+ /** Sandbox scope for command execution (default: "host") */
10
+ sandboxScope?: SandboxScope;
11
+ }
12
+ interface ExecResult {
13
+ stdout: string;
14
+ stderr: string;
15
+ exitCode: number;
16
+ }
17
+ export declare function createShellTool(config: ShellToolConfig): import("./definitions.js").ToolDefinition<{
18
+ command: string;
19
+ timeoutMs?: number;
20
+ }, ExecResult>;
21
+ export {};
22
+ //# sourceMappingURL=shell-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-tool.d.ts","sourceRoot":"","sources":["../src/shell-tool.ts"],"names":[],"mappings":"AAMA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAQhE,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgDD,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe;aAMxB,MAAM;gBAAc,MAAM;eAoDxD"}
@@ -0,0 +1,100 @@
1
+ import { execFile } from "node:child_process";
2
+ import { commandPattern } from "./arity.js";
3
+ import { z } from "zod";
4
+ import { defineTool } from "./define-tool.js";
5
+ import { detectInjectionPatterns } from "@vinhnt-sdk/security";
6
+ import { createSandbox } from "./sandbox.js";
7
+ import { parseCommand } from "./shell-parser.js";
8
+ const ExecuteCommandSchema = z.object({
9
+ command: z.string().min(1),
10
+ timeoutMs: z.number().positive().optional(),
11
+ });
12
+ function execAsync(command, cwd, timeoutMs, signal, env) {
13
+ return new Promise((resolve, reject) => {
14
+ const parsed = parseCommand(command);
15
+ const child = execFile(parsed.file, parsed.args, {
16
+ cwd,
17
+ timeout: timeoutMs,
18
+ maxBuffer: 10 * 1024 * 1024,
19
+ encoding: "utf-8",
20
+ windowsHide: true,
21
+ env: env && Object.keys(env).length > 0
22
+ ? { ...process.env, ...env }
23
+ : undefined,
24
+ }, (err, stdout, stderr) => {
25
+ if (err) {
26
+ const exitCode = typeof err.code === "number" ? err.code : 1;
27
+ resolve({ stdout: stdout ?? "", stderr: stderr ?? "", exitCode });
28
+ }
29
+ else {
30
+ resolve({ stdout: stdout ?? "", stderr: stderr ?? "", exitCode: 0 });
31
+ }
32
+ });
33
+ if (signal) {
34
+ if (signal.aborted) {
35
+ child.kill();
36
+ reject(new DOMException(signal.reason ?? "Aborted", "AbortError"));
37
+ return;
38
+ }
39
+ signal.addEventListener("abort", () => {
40
+ child.kill();
41
+ reject(new DOMException(signal.reason ?? "Aborted", "AbortError"));
42
+ }, { once: true });
43
+ }
44
+ });
45
+ }
46
+ export function createShellTool(config) {
47
+ const sandbox = createSandbox({
48
+ defaultTimeoutMs: config.defaultTimeoutMs,
49
+ scope: config.sandboxScope ?? "host",
50
+ });
51
+ return defineTool({
52
+ name: "execute_command",
53
+ description: "Execute a shell command in the workspace directory. Returns stdout and stderr.",
54
+ risk: "write",
55
+ timeoutMs: 120_000,
56
+ input: ExecuteCommandSchema,
57
+ jsonSchema: {
58
+ type: "object",
59
+ properties: {
60
+ command: { type: "string", description: "Shell command to run" },
61
+ timeoutMs: { type: "number", description: "Timeout in ms (default 30_000)", default: 30_000 },
62
+ },
63
+ required: ["command"],
64
+ },
65
+ async execute(v, ctx) {
66
+ const root = typeof config.workspaceRoot === "function" ? config.workspaceRoot() : config.workspaceRoot;
67
+ const timeout = Math.min(v.timeoutMs ?? config.defaultTimeoutMs, config.maxTimeoutMs ?? 300_000);
68
+ // Check for prompt injection patterns in command
69
+ const injections = detectInjectionPatterns(v.command);
70
+ if (injections.length > 0) {
71
+ return {
72
+ stdout: "",
73
+ stderr: `Blocked: command contains suspected injection patterns: ${injections.join(", ")}`,
74
+ exitCode: 1,
75
+ };
76
+ }
77
+ if (config.askPermission !== false) {
78
+ const reply = await ctx.ask({
79
+ permission: "shell",
80
+ resource: v.command,
81
+ reason: `Run shell command: ${v.command}`,
82
+ savePatterns: [commandPattern(v.command)],
83
+ });
84
+ if (reply === "reject") {
85
+ return { stdout: "", stderr: "", exitCode: 1 };
86
+ }
87
+ }
88
+ // Use sandbox for execution
89
+ const result = await sandbox.execute({
90
+ command: v.command,
91
+ cwd: root,
92
+ timeoutMs: timeout,
93
+ env: ctx.env,
94
+ signal: ctx.signal,
95
+ });
96
+ return result.result;
97
+ },
98
+ }).toDefinition();
99
+ }
100
+ //# sourceMappingURL=shell-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-tool.js","sourceRoot":"","sources":["../src/shell-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function createTodoWriteTool(): import("./definitions.js").ToolDefinition<unknown, unknown>;
2
+ //# sourceMappingURL=todo-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todo-tool.d.ts","sourceRoot":"","sources":["../src/todo-tool.ts"],"names":[],"mappings":"AAeA,wBAAgB,mBAAmB,gEAmHlC"}
@@ -0,0 +1,121 @@
1
+ import { z } from "zod";
2
+ import { defineTool } from "./define-tool.js";
3
+ const store = new Map();
4
+ let nextId = 1;
5
+ export function createTodoWriteTool() {
6
+ // The todo tool intentionally keeps loose runtime validation (returns
7
+ // `{ error }` results instead of throwing), so its schema is untyped and
8
+ // validation happens inside execute below.
9
+ return defineTool({
10
+ name: "todowrite",
11
+ description: "Manage a structured task list with priorities and status. Use this to track progress, organize multi-step work, and surface status to the user. Actions: create, list, update, complete, delete.",
12
+ risk: "read",
13
+ input: z.unknown(),
14
+ jsonSchema: {
15
+ type: "object",
16
+ properties: {
17
+ action: {
18
+ type: "string",
19
+ enum: ["create", "list", "update", "complete", "delete"],
20
+ description: "Action to perform on the task list",
21
+ },
22
+ id: {
23
+ type: "string",
24
+ description: "Task ID (required for update, complete, delete)",
25
+ },
26
+ content: {
27
+ type: "string",
28
+ description: "Task description (required for create, optional for update)",
29
+ },
30
+ priority: {
31
+ type: "string",
32
+ enum: ["high", "medium", "low"],
33
+ description: "Task priority (default: medium)",
34
+ },
35
+ status: {
36
+ type: "string",
37
+ enum: ["pending", "in_progress", "completed", "cancelled"],
38
+ description: "Task status (used with update action)",
39
+ },
40
+ },
41
+ required: ["action"],
42
+ },
43
+ async execute(raw) {
44
+ const v = raw;
45
+ const action = v.action;
46
+ switch (action) {
47
+ case "create": {
48
+ const content = v.content;
49
+ if (!content || typeof content !== "string") {
50
+ return { error: "content is required for create action" };
51
+ }
52
+ const id = String(nextId++);
53
+ const item = {
54
+ id,
55
+ content,
56
+ status: "pending",
57
+ priority: v.priority ?? "medium",
58
+ createdAt: Date.now(),
59
+ updatedAt: Date.now(),
60
+ };
61
+ store.set(id, item);
62
+ return { todo: item, message: `Task #${id} created` };
63
+ }
64
+ case "list": {
65
+ const items = [...store.values()].sort((a, b) => b.createdAt - a.createdAt);
66
+ return {
67
+ todos: items,
68
+ summary: {
69
+ total: items.length,
70
+ pending: items.filter((t) => t.status === "pending").length,
71
+ inProgress: items.filter((t) => t.status === "in_progress").length,
72
+ completed: items.filter((t) => t.status === "completed").length,
73
+ },
74
+ };
75
+ }
76
+ case "update": {
77
+ const id = v.id;
78
+ if (!id)
79
+ return { error: "id is required for update action" };
80
+ const item = store.get(id);
81
+ if (!item)
82
+ return { error: `Task #${id} not found` };
83
+ if (v.content !== undefined && typeof v.content === "string") {
84
+ item.content = v.content;
85
+ }
86
+ if (v.priority !== undefined && typeof v.priority === "string") {
87
+ item.priority = v.priority;
88
+ }
89
+ if (v.status !== undefined && typeof v.status === "string") {
90
+ item.status = v.status;
91
+ }
92
+ item.updatedAt = Date.now();
93
+ return { todo: item, message: `Task #${id} updated` };
94
+ }
95
+ case "complete": {
96
+ const id = v.id;
97
+ if (!id)
98
+ return { error: "id is required for complete action" };
99
+ const item = store.get(id);
100
+ if (!item)
101
+ return { error: `Task #${id} not found` };
102
+ item.status = "completed";
103
+ item.updatedAt = Date.now();
104
+ return { todo: item, message: `Task #${id} completed` };
105
+ }
106
+ case "delete": {
107
+ const id = v.id;
108
+ if (!id)
109
+ return { error: "id is required for delete action" };
110
+ if (!store.has(id))
111
+ return { error: `Task #${id} not found` };
112
+ store.delete(id);
113
+ return { message: `Task #${id} deleted` };
114
+ }
115
+ default:
116
+ return { error: `Unknown action: ${action}` };
117
+ }
118
+ },
119
+ }).toDefinition();
120
+ }
121
+ //# sourceMappingURL=todo-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todo-tool.js","sourceRoot":"","sources":["../src/todo-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ToolRegistry } from "./registry.js";
2
+ export interface ToolSearchInput {
3
+ query: string;
4
+ tags?: string[];
5
+ }
6
+ export interface ToolSearchResult {
7
+ id: string;
8
+ description: string;
9
+ tags: readonly string[];
10
+ }
11
+ export declare function createToolSearchTool(registry: ToolRegistry): import("./definitions.js").ToolDefinition<ToolSearchInput, {
12
+ results: ToolSearchResult[];
13
+ }>;
14
+ //# sourceMappingURL=tool-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-search.d.ts","sourceRoot":"","sources":["../src/tool-search.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAOlD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY;aACX,gBAAgB,EAAE;GAuCjE"}
@@ -0,0 +1,46 @@
1
+ import { z } from "zod";
2
+ import { defineTool } from "./define-tool.js";
3
+ const ToolSearchSchema = z.object({
4
+ query: z.string().min(1),
5
+ tags: z.array(z.string()).optional(),
6
+ });
7
+ export function createToolSearchTool(registry) {
8
+ return defineTool({
9
+ name: "search_tools",
10
+ description: "Search for available tools by query or tags. Returns matching tool definitions.",
11
+ risk: "read",
12
+ input: ToolSearchSchema,
13
+ jsonSchema: {
14
+ type: "object",
15
+ properties: {
16
+ query: { type: "string", description: "Search query to match against tool names and descriptions" },
17
+ tags: { type: "array", items: { type: "string" }, description: "Filter by tags" },
18
+ },
19
+ required: ["query"],
20
+ },
21
+ async execute(input) {
22
+ const allTools = registry.list();
23
+ const query = input.query.toLowerCase();
24
+ const results = allTools
25
+ .filter((tool) => {
26
+ const matchesQuery = tool.id.toLowerCase().includes(query) ||
27
+ tool.description.toLowerCase().includes(query);
28
+ if (!matchesQuery)
29
+ return false;
30
+ if (input.tags && input.tags.length > 0) {
31
+ const toolTags = tool.tags ?? [];
32
+ return input.tags.some((tag) => toolTags.includes(tag));
33
+ }
34
+ return true;
35
+ })
36
+ .slice(0, 20)
37
+ .map((tool) => ({
38
+ id: tool.id,
39
+ description: tool.description,
40
+ tags: tool.tags ?? [],
41
+ }));
42
+ return { results };
43
+ },
44
+ }).toDefinition();
45
+ }
46
+ //# sourceMappingURL=tool-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-search.js","sourceRoot":"","sources":["../src/tool-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAaH,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,OAAO,UAAU,CAAmD;QAClE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,iFAAiF;QAC9F,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,gBAAgB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2DAA2D,EAAE;gBACnG,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE;aAClF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;QACD,KAAK,CAAC,OAAO,CAAC,KAAK;YACjB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YAExC,MAAM,OAAO,GAAG,QAAQ;iBACrB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBACf,MAAM,YAAY,GAChB,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;oBACrC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACjD,IAAI,CAAC,YAAY;oBAAE,OAAO,KAAK,CAAC;gBAChC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;oBACjC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1D,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;iBACZ,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACd,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;aACtB,CAAC,CAAC,CAAC;YAEN,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,CAAC;KACF,CAAC,CAAC,YAAY,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { ToolDefinition } from "./definitions.js";
2
+ export type ToolExecutionResult = {
3
+ status: "success";
4
+ output: unknown;
5
+ } | {
6
+ status: "denied";
7
+ reason: string;
8
+ } | {
9
+ status: "error";
10
+ error: string;
11
+ };
12
+ export interface ToolHook {
13
+ readonly id: string;
14
+ pre?(params: {
15
+ toolId: string;
16
+ tool: ToolDefinition;
17
+ input: unknown;
18
+ }): Promise<{
19
+ input: unknown;
20
+ } | {
21
+ denied: string;
22
+ } | null>;
23
+ post?(params: {
24
+ toolId: string;
25
+ tool: ToolDefinition;
26
+ input: unknown;
27
+ result: ToolExecutionResult;
28
+ }): Promise<ToolExecutionResult | null>;
29
+ }
30
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,MAAM,mBAAmB,GAC3B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,cAAc,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,GACnE,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC1D,IAAI,CAAC,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,cAAc,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,mBAAmB,CAAA;KAAE,GACjG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;CACvC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { z } from "zod";
2
+ import { VntError } from "@vinhnt-sdk/schema";
3
+ export declare class ToolInputError extends VntError {
4
+ readonly toolId: string;
5
+ constructor(toolId: string, issues: z.ZodIssue[]);
6
+ }
7
+ export declare function validateInput<T>(toolId: string, schema: z.ZodSchema<T>, input: unknown): T;
8
+ export declare function createValidator<T>(toolId: string, schema: z.ZodSchema<T>): (input: unknown) => T;
9
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAY,MAAM,KAAK,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,qBAAa,cAAe,SAAQ,QAAQ;aAExB,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EAC9B,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAMvB;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,CAS1F;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,CAEhG"}
@@ -0,0 +1,26 @@
1
+ import { ZodError } from "zod";
2
+ import { VntError } from "@vinhnt-sdk/schema";
3
+ export class ToolInputError extends VntError {
4
+ toolId;
5
+ constructor(toolId, issues) {
6
+ const details = issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
7
+ super(`Validation failed for tool "${toolId}": ${details}`);
8
+ this.toolId = toolId;
9
+ this.name = "ToolInputError";
10
+ }
11
+ }
12
+ export function validateInput(toolId, schema, input) {
13
+ try {
14
+ return schema.parse(input);
15
+ }
16
+ catch (err) {
17
+ if (err instanceof ZodError) {
18
+ throw new ToolInputError(toolId, err.issues);
19
+ }
20
+ throw err;
21
+ }
22
+ }
23
+ export function createValidator(toolId, schema) {
24
+ return (input) => validateInput(toolId, schema, input);
25
+ }
26
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,OAAO,cAAe,SAAQ,QAAQ;IAExB;IADlB,YACkB,MAAc,EAC9B,MAAoB;QAEpB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,KAAK,CAAC,+BAA+B,MAAM,MAAM,OAAO,EAAE,CAAC,CAAC;QAJ5C,WAAM,GAAN,MAAM,CAAQ;QAK9B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAI,MAAc,EAAE,MAAsB,EAAE,KAAc;IACrF,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAI,MAAc,EAAE,MAAsB;IACvE,OAAO,CAAC,KAAc,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,84 @@
1
+ export interface SearchResult {
2
+ title: string;
3
+ url: string;
4
+ content: string;
5
+ score: number;
6
+ }
7
+ export interface WebSearchResponse {
8
+ results: SearchResult[];
9
+ answer?: string;
10
+ }
11
+ /**
12
+ * Web search provider interface — user tự implement.
13
+ * Ví dụ: Tavily, Serper, Bing, Google Custom Search, DuckDuckGo...
14
+ */
15
+ export interface WebSearchProvider {
16
+ name: string;
17
+ search(query: string, options?: {
18
+ numResults?: number;
19
+ searchDepth?: "basic" | "advanced";
20
+ }): Promise<WebSearchResponse>;
21
+ }
22
+ export interface WebSearchToolConfig {
23
+ /**
24
+ * Web search provider — injectable dependency.
25
+ * User tự implement provider hoặc dùng built-in adapters.
26
+ */
27
+ provider: WebSearchProvider;
28
+ /** Default number of search results (default: 5) */
29
+ defaultNumResults?: number;
30
+ /** Search timeout in ms (default: 15000) */
31
+ timeout?: number;
32
+ }
33
+ /**
34
+ * Default API URLs — exported for convenience.
35
+ * User override được qua baseUrl option.
36
+ */
37
+ export declare const DEFAULT_TAVILY_URL = "https://api.tavily.com/search";
38
+ export declare const DEFAULT_SERPER_URL = "https://google.serper.dev/search";
39
+ /**
40
+ * Tavily search provider adapter — convenience only.
41
+ * User có thể tự implement provider khác: Serper, Bing, Google...
42
+ */
43
+ export declare class TavilySearchProvider implements WebSearchProvider {
44
+ name: string;
45
+ private apiKey;
46
+ private defaultNumResults;
47
+ private baseUrl;
48
+ constructor(config: {
49
+ apiKey: string;
50
+ defaultNumResults?: number;
51
+ baseUrl?: string;
52
+ });
53
+ search(query: string, options?: {
54
+ numResults?: number;
55
+ searchDepth?: "basic" | "advanced";
56
+ }): Promise<WebSearchResponse>;
57
+ }
58
+ /**
59
+ * Serper (Google Search) provider adapter — convenience only.
60
+ */
61
+ export declare class SerperSearchProvider implements WebSearchProvider {
62
+ name: string;
63
+ private apiKey;
64
+ private defaultNumResults;
65
+ private baseUrl;
66
+ constructor(config: {
67
+ apiKey: string;
68
+ defaultNumResults?: number;
69
+ baseUrl?: string;
70
+ });
71
+ search(query: string, options?: {
72
+ numResults?: number;
73
+ }): Promise<WebSearchResponse>;
74
+ }
75
+ export declare function createWebSearchTool(config: WebSearchToolConfig): import("./definitions.js").ToolDefinition<{
76
+ query: string;
77
+ numResults?: number;
78
+ searchDepth?: "basic" | "advanced";
79
+ }, {
80
+ results: SearchResult[];
81
+ answer?: string;
82
+ error?: string;
83
+ }>;
84
+ //# sourceMappingURL=web-search-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-search-tool.d.ts","sourceRoot":"","sources":["../src/web-search-tool.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;KACpC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,oDAAoD;IACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,kCAAkC,CAAC;AAClE,eAAO,MAAM,kBAAkB,qCAAqC,CAAC;AAErE;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,iBAAiB;IAC5D,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAM9E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QACpC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;KACpC,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAmB/B;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,iBAAiB;IAC5D,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAM9E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QACpC,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA4B/B;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB;WAClC,MAAM;iBAAe,MAAM;kBAAgB,OAAO,GAAG,UAAU;;aAC/E,YAAY,EAAE;aACd,MAAM;YACP,MAAM;GA4CjB"}