veto-sdk 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/README.md +209 -0
  2. package/dist/benchmark/cli.d.ts +22 -0
  3. package/dist/benchmark/cli.d.ts.map +1 -0
  4. package/dist/benchmark/cli.js +238 -0
  5. package/dist/benchmark/cli.js.map +1 -0
  6. package/dist/benchmark/index.d.ts +10 -0
  7. package/dist/benchmark/index.d.ts.map +1 -0
  8. package/dist/benchmark/index.js +10 -0
  9. package/dist/benchmark/index.js.map +1 -0
  10. package/dist/benchmark/loader.d.ts +19 -0
  11. package/dist/benchmark/loader.d.ts.map +1 -0
  12. package/dist/benchmark/loader.js +321 -0
  13. package/dist/benchmark/loader.js.map +1 -0
  14. package/dist/benchmark/metrics.d.ts +35 -0
  15. package/dist/benchmark/metrics.d.ts.map +1 -0
  16. package/dist/benchmark/metrics.js +195 -0
  17. package/dist/benchmark/metrics.js.map +1 -0
  18. package/dist/benchmark/runner.d.ts +39 -0
  19. package/dist/benchmark/runner.d.ts.map +1 -0
  20. package/dist/benchmark/runner.js +279 -0
  21. package/dist/benchmark/runner.js.map +1 -0
  22. package/dist/benchmark/types.d.ts +188 -0
  23. package/dist/benchmark/types.d.ts.map +1 -0
  24. package/dist/benchmark/types.js +24 -0
  25. package/dist/benchmark/types.js.map +1 -0
  26. package/dist/cli/bin.d.ts +8 -0
  27. package/dist/cli/bin.d.ts.map +1 -0
  28. package/dist/cli/bin.js +120 -0
  29. package/dist/cli/bin.js.map +1 -0
  30. package/dist/cli/config.d.ts +126 -0
  31. package/dist/cli/config.d.ts.map +1 -0
  32. package/dist/cli/config.js +137 -0
  33. package/dist/cli/config.js.map +1 -0
  34. package/dist/cli/index.d.ts +9 -0
  35. package/dist/cli/index.d.ts.map +1 -0
  36. package/dist/cli/index.js +9 -0
  37. package/dist/cli/index.js.map +1 -0
  38. package/dist/cli/init.d.ts +64 -0
  39. package/dist/cli/init.d.ts.map +1 -0
  40. package/dist/cli/init.js +160 -0
  41. package/dist/cli/init.js.map +1 -0
  42. package/dist/cli/templates.d.ts +22 -0
  43. package/dist/cli/templates.d.ts.map +1 -0
  44. package/dist/cli/templates.js +132 -0
  45. package/dist/cli/templates.js.map +1 -0
  46. package/dist/core/history.d.ts +104 -0
  47. package/dist/core/history.d.ts.map +1 -0
  48. package/dist/core/history.js +148 -0
  49. package/dist/core/history.js.map +1 -0
  50. package/dist/core/index.d.ts +10 -0
  51. package/dist/core/index.d.ts.map +1 -0
  52. package/dist/core/index.js +10 -0
  53. package/dist/core/index.js.map +1 -0
  54. package/dist/core/interceptor.d.ts +96 -0
  55. package/dist/core/interceptor.d.ts.map +1 -0
  56. package/dist/core/interceptor.js +227 -0
  57. package/dist/core/interceptor.js.map +1 -0
  58. package/dist/core/validator.d.ts +107 -0
  59. package/dist/core/validator.d.ts.map +1 -0
  60. package/dist/core/validator.js +263 -0
  61. package/dist/core/validator.js.map +1 -0
  62. package/dist/core/veto.d.ts +265 -0
  63. package/dist/core/veto.d.ts.map +1 -0
  64. package/dist/core/veto.js +681 -0
  65. package/dist/core/veto.js.map +1 -0
  66. package/dist/index.d.ts +43 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +40 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/kernel/client.d.ts +82 -0
  71. package/dist/kernel/client.d.ts.map +1 -0
  72. package/dist/kernel/client.js +162 -0
  73. package/dist/kernel/client.js.map +1 -0
  74. package/dist/kernel/index.d.ts +9 -0
  75. package/dist/kernel/index.d.ts.map +1 -0
  76. package/dist/kernel/index.js +9 -0
  77. package/dist/kernel/index.js.map +1 -0
  78. package/dist/kernel/prompt.d.ts +27 -0
  79. package/dist/kernel/prompt.d.ts.map +1 -0
  80. package/dist/kernel/prompt.js +127 -0
  81. package/dist/kernel/prompt.js.map +1 -0
  82. package/dist/kernel/types.d.ts +85 -0
  83. package/dist/kernel/types.d.ts.map +1 -0
  84. package/dist/kernel/types.js +52 -0
  85. package/dist/kernel/types.js.map +1 -0
  86. package/dist/providers/adapters.d.ts +167 -0
  87. package/dist/providers/adapters.d.ts.map +1 -0
  88. package/dist/providers/adapters.js +244 -0
  89. package/dist/providers/adapters.js.map +1 -0
  90. package/dist/providers/index.d.ts +11 -0
  91. package/dist/providers/index.d.ts.map +1 -0
  92. package/dist/providers/index.js +11 -0
  93. package/dist/providers/index.js.map +1 -0
  94. package/dist/providers/types.d.ts +92 -0
  95. package/dist/providers/types.d.ts.map +1 -0
  96. package/dist/providers/types.js +10 -0
  97. package/dist/providers/types.js.map +1 -0
  98. package/dist/rules/api-client.d.ts +103 -0
  99. package/dist/rules/api-client.d.ts.map +1 -0
  100. package/dist/rules/api-client.js +241 -0
  101. package/dist/rules/api-client.js.map +1 -0
  102. package/dist/rules/index.d.ts +10 -0
  103. package/dist/rules/index.d.ts.map +1 -0
  104. package/dist/rules/index.js +10 -0
  105. package/dist/rules/index.js.map +1 -0
  106. package/dist/rules/loader.d.ts +116 -0
  107. package/dist/rules/loader.d.ts.map +1 -0
  108. package/dist/rules/loader.js +300 -0
  109. package/dist/rules/loader.js.map +1 -0
  110. package/dist/rules/rule-validator.d.ts +135 -0
  111. package/dist/rules/rule-validator.d.ts.map +1 -0
  112. package/dist/rules/rule-validator.js +239 -0
  113. package/dist/rules/rule-validator.js.map +1 -0
  114. package/dist/rules/types.d.ts +162 -0
  115. package/dist/rules/types.d.ts.map +1 -0
  116. package/dist/rules/types.js +16 -0
  117. package/dist/rules/types.js.map +1 -0
  118. package/dist/types/config.d.ts +171 -0
  119. package/dist/types/config.d.ts.map +1 -0
  120. package/dist/types/config.js +31 -0
  121. package/dist/types/config.js.map +1 -0
  122. package/dist/types/index.d.ts +8 -0
  123. package/dist/types/index.d.ts.map +1 -0
  124. package/dist/types/index.js +8 -0
  125. package/dist/types/index.js.map +1 -0
  126. package/dist/types/tool.d.ts +156 -0
  127. package/dist/types/tool.d.ts.map +1 -0
  128. package/dist/types/tool.js +27 -0
  129. package/dist/types/tool.js.map +1 -0
  130. package/dist/utils/glob.d.ts +21 -0
  131. package/dist/utils/glob.d.ts.map +1 -0
  132. package/dist/utils/glob.js +147 -0
  133. package/dist/utils/glob.js.map +1 -0
  134. package/dist/utils/id.d.ts +28 -0
  135. package/dist/utils/id.d.ts.map +1 -0
  136. package/dist/utils/id.js +43 -0
  137. package/dist/utils/id.js.map +1 -0
  138. package/dist/utils/index.d.ts +9 -0
  139. package/dist/utils/index.d.ts.map +1 -0
  140. package/dist/utils/index.js +9 -0
  141. package/dist/utils/index.js.map +1 -0
  142. package/dist/utils/logger.d.ts +97 -0
  143. package/dist/utils/logger.d.ts.map +1 -0
  144. package/dist/utils/logger.js +153 -0
  145. package/dist/utils/logger.js.map +1 -0
  146. package/package.json +90 -0
@@ -0,0 +1,265 @@
1
+ /**
2
+ * Main Veto guardrail class.
3
+ *
4
+ * This is the primary entry point for using Veto. It automatically loads
5
+ * configuration and rules from the veto/ directory and validates tool calls.
6
+ *
7
+ * @module core/veto
8
+ */
9
+ import type { ToolDefinition, ToolCall } from '../types/tool.js';
10
+ import type { Validator, NamedValidator, LogLevel } from '../types/config.js';
11
+ import { type HistoryStats } from './history.js';
12
+ import { ToolCallDeniedError, type InterceptionResult } from './interceptor.js';
13
+ import type { Rule } from '../rules/types.js';
14
+ import { KernelClient } from '../kernel/client.js';
15
+ /**
16
+ * Veto operating mode.
17
+ * - "strict": Block tool calls when validation fails
18
+ * - "log": Only log validation failures, allow tool calls to proceed
19
+ */
20
+ export type VetoMode = 'strict' | 'log';
21
+ /**
22
+ * Validation mode - how tool calls are validated.
23
+ * - "api": Use external HTTP API for validation
24
+ * - "kernel": Use local kernel model via Ollama
25
+ */
26
+ export type ValidationMode = 'api' | 'kernel';
27
+ /**
28
+ * Wrapped handler function type.
29
+ */
30
+ export type WrappedHandler = (args: Record<string, unknown>) => Promise<unknown>;
31
+ /**
32
+ * Result of wrapping tools with Veto.
33
+ */
34
+ export interface WrappedTools {
35
+ /** Tool definitions (schemas) to pass to AI models */
36
+ definitions: ToolDefinition[];
37
+ /** Wrapped handler functions keyed by tool name */
38
+ implementations: Record<string, WrappedHandler>;
39
+ }
40
+ /**
41
+ * Options for creating a Veto instance.
42
+ */
43
+ export interface VetoOptions {
44
+ /**
45
+ * Path to the veto directory containing config and rules.
46
+ * Defaults to './veto' relative to current working directory.
47
+ */
48
+ configDir?: string;
49
+ /**
50
+ * Override the operating mode.
51
+ * - "strict": Block tool calls when validation fails
52
+ * - "log": Only log validation failures, allow tool calls to proceed
53
+ */
54
+ mode?: VetoMode;
55
+ /**
56
+ * Override log level.
57
+ * Can also be set via VETO_LOG_LEVEL environment variable.
58
+ */
59
+ logLevel?: LogLevel;
60
+ /**
61
+ * Session ID for tracking.
62
+ * Can also be set via VETO_SESSION_ID environment variable.
63
+ */
64
+ sessionId?: string;
65
+ /**
66
+ * Agent ID for tracking.
67
+ * Can also be set via VETO_AGENT_ID environment variable.
68
+ */
69
+ agentId?: string;
70
+ /**
71
+ * Additional validators to run alongside rule-based validation.
72
+ */
73
+ validators?: (Validator | NamedValidator)[];
74
+ /**
75
+ * Injected kernel client for testing or custom configurations.
76
+ */
77
+ kernelClient?: KernelClient;
78
+ }
79
+ /**
80
+ * Veto - A guardrail system for AI agent tool calls.
81
+ *
82
+ * Veto automatically loads configuration from the veto/ directory and
83
+ * validates tool calls against defined rules via an external API.
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * import { Veto } from 'veto';
88
+ *
89
+ * // Initialize Veto (loads config from ./veto automatically)
90
+ * const veto = await Veto.init();
91
+ *
92
+ * // Wrap your tools
93
+ * const wrappedTools = veto.wrapTools(myTools);
94
+ *
95
+ * // Pass to AI provider, then validate calls
96
+ * const result = await veto.validateToolCall(toolCall);
97
+ * ```
98
+ */
99
+ export declare class Veto {
100
+ private readonly logger;
101
+ private readonly validationEngine;
102
+ private readonly historyTracker;
103
+ private readonly interceptor;
104
+ private readonly registeredTools;
105
+ private readonly configDir;
106
+ private readonly mode;
107
+ private readonly validationMode;
108
+ private readonly apiBaseUrl;
109
+ private readonly apiEndpoint;
110
+ private readonly apiTimeout;
111
+ private readonly apiRetries;
112
+ private readonly apiRetryDelay;
113
+ private readonly sessionId?;
114
+ private readonly agentId?;
115
+ private kernelClient;
116
+ private readonly kernelConfig;
117
+ private readonly rules;
118
+ private constructor();
119
+ /**
120
+ * Initialize Veto by loading configuration and rules.
121
+ *
122
+ * @param options - Initialization options
123
+ * @returns Initialized Veto instance
124
+ *
125
+ * @example
126
+ * ```typescript
127
+ * // Use defaults (loads from ./veto)
128
+ * const veto = await Veto.init();
129
+ *
130
+ * // Custom config directory
131
+ * const veto = await Veto.init({ configDir: './my-veto-config' });
132
+ *
133
+ * // Override API URL
134
+ * const veto = await Veto.init({ apiBaseUrl: 'https://api.example.com' });
135
+ * ```
136
+ */
137
+ static init(options?: VetoOptions): Promise<Veto>;
138
+ /**
139
+ * Load rules from YAML files.
140
+ */
141
+ private static loadRules;
142
+ /**
143
+ * Find YAML files in a directory.
144
+ */
145
+ private static findYamlFiles;
146
+ /**
147
+ * Get rules applicable to a tool.
148
+ */
149
+ private getRulesForTool;
150
+ /**
151
+ * Validate a tool call with the external API.
152
+ */
153
+ private validateWithAPI;
154
+ /**
155
+ * Make the API request.
156
+ */
157
+ private makeAPIRequest;
158
+ /**
159
+ * Handle successful API response.
160
+ */
161
+ private handleAPIResponse;
162
+ /**
163
+ * Handle API failure. In log mode, always allow. In strict mode, block.
164
+ */
165
+ private handleAPIFailure;
166
+ /**
167
+ * Get or create the kernel client.
168
+ */
169
+ private getKernelClient;
170
+ /**
171
+ * Validate a tool call with the local kernel model.
172
+ */
173
+ private validateWithKernel;
174
+ /**
175
+ * Handle successful kernel response.
176
+ */
177
+ private handleKernelResponse;
178
+ /**
179
+ * Handle kernel failure. In log mode, always allow. In strict mode, block.
180
+ */
181
+ private handleKernelFailure;
182
+ /**
183
+ * Build history summary for API.
184
+ */
185
+ private buildHistorySummary;
186
+ /**
187
+ * Delay helper.
188
+ */
189
+ private delay;
190
+ /**
191
+ * Wrap tools for use with an AI provider.
192
+ *
193
+ * Returns an object containing:
194
+ * - `definitions`: Tool schemas to pass to the AI model
195
+ * - `implementations`: Object with wrapped handler functions keyed by tool name
196
+ *
197
+ * @param tools - Tools to wrap (must have handlers)
198
+ * @returns Object with toolDefinitions and toolImplementations
199
+ *
200
+ * @example
201
+ * ```typescript
202
+ * const tools = [
203
+ * {
204
+ * name: 'read_file',
205
+ * inputSchema: { type: 'object', properties: { path: { type: 'string' } } },
206
+ * handler: async (args) => fs.readFileSync(args.path, 'utf-8')
207
+ * }
208
+ * ];
209
+ *
210
+ * const veto = await Veto.init();
211
+ * const { definitions, implementations } = veto.wrapTools(tools);
212
+ *
213
+ * // Pass definitions to AI model
214
+ * const response = await openai.chat.completions.create({
215
+ * tools: toOpenAITools(definitions),
216
+ * ...
217
+ * });
218
+ *
219
+ * // Execute tool calls using implementations
220
+ * const result = await implementations.read_file({ path: '/home/user/file.txt' });
221
+ * ```
222
+ */
223
+ wrapTools(tools: readonly ToolDefinition[]): WrappedTools;
224
+ /**
225
+ * Validate a tool call.
226
+ *
227
+ * @param call - The tool call to validate
228
+ * @returns Validation result
229
+ */
230
+ validateToolCall(call: ToolCall): Promise<InterceptionResult>;
231
+ /**
232
+ * Validate a tool call and throw if denied.
233
+ *
234
+ * @param call - The tool call to validate
235
+ * @returns Validation result (only if allowed)
236
+ * @throws {ToolCallDeniedError} If the call is denied
237
+ */
238
+ validateToolCallOrThrow(call: ToolCall): Promise<InterceptionResult>;
239
+ /**
240
+ * Get registered tools.
241
+ */
242
+ getRegisteredTools(): readonly ToolDefinition[];
243
+ /**
244
+ * Get loaded rules.
245
+ */
246
+ getLoadedRules(): readonly Rule[];
247
+ /**
248
+ * Get current operating mode.
249
+ */
250
+ getMode(): VetoMode;
251
+ /**
252
+ * Get current validation mode (api or kernel).
253
+ */
254
+ getValidationMode(): ValidationMode;
255
+ /**
256
+ * Get history statistics.
257
+ */
258
+ getHistoryStats(): HistoryStats;
259
+ /**
260
+ * Clear call history.
261
+ */
262
+ clearHistory(): void;
263
+ }
264
+ export { ToolCallDeniedError };
265
+ //# sourceMappingURL=veto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"veto.d.ts","sourceRoot":"","sources":["../../src/core/veto.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EACV,cAAc,EACd,QAAQ,EACT,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EAGd,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAe,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC7F,OAAO,KAAK,EACV,IAAI,EAKL,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;AAExC;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEjF;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sDAAsD;IACtD,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACjD;AA2CD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAEhB;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,SAAS,GAAG,cAAc,CAAC,EAAE,CAAC;IAE5C;;OAEG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,IAAI;IACf,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0C;IAG1E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;IAGlC,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IAGnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IAEzC,OAAO;IA8FP;;;;;;;;;;;;;;;;;OAiBG;WACU,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC3D;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAyExB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IA0B5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;YACW,eAAe;IA+C7B;;OAEG;YACW,cAAc;IAwC5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqDzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;YACW,kBAAkB;IAyBhC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqD5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACH,SAAS,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,GAAG,YAAY;IAgDzD;;;;;OAKG;IACG,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC;IASnE;;;;;;OAMG;IACG,uBAAuB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAS1E;;OAEG;IACH,kBAAkB,IAAI,SAAS,cAAc,EAAE;IAI/C;;OAEG;IACH,cAAc,IAAI,SAAS,IAAI,EAAE;IAIjC;;OAEG;IACH,OAAO,IAAI,QAAQ;IAInB;;OAEG;IACH,iBAAiB,IAAI,cAAc;IAInC;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;OAEG;IACH,YAAY,IAAI,IAAI;CAGrB;AAGD,OAAO,EAAE,mBAAmB,EAAE,CAAC"}