@agentbouncr/core 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 (95) hide show
  1. package/LICENSE +93 -0
  2. package/README.md +47 -0
  3. package/dist/audit/hash-chain.d.ts +39 -0
  4. package/dist/audit/hash-chain.d.ts.map +1 -0
  5. package/dist/audit/hash-chain.js +63 -0
  6. package/dist/audit/hash-chain.js.map +1 -0
  7. package/dist/audit/index.d.ts +2 -0
  8. package/dist/audit/index.d.ts.map +1 -0
  9. package/dist/audit/index.js +2 -0
  10. package/dist/audit/index.js.map +1 -0
  11. package/dist/core/condition-evaluator.d.ts +20 -0
  12. package/dist/core/condition-evaluator.d.ts.map +1 -0
  13. package/dist/core/condition-evaluator.js +85 -0
  14. package/dist/core/condition-evaluator.js.map +1 -0
  15. package/dist/core/permission-layer.d.ts +24 -0
  16. package/dist/core/permission-layer.d.ts.map +1 -0
  17. package/dist/core/permission-layer.js +58 -0
  18. package/dist/core/permission-layer.js.map +1 -0
  19. package/dist/core/policy-engine.d.ts +35 -0
  20. package/dist/core/policy-engine.d.ts.map +1 -0
  21. package/dist/core/policy-engine.js +131 -0
  22. package/dist/core/policy-engine.js.map +1 -0
  23. package/dist/core/policy-schema.d.ts +50 -0
  24. package/dist/core/policy-schema.d.ts.map +1 -0
  25. package/dist/core/policy-schema.js +59 -0
  26. package/dist/core/policy-schema.js.map +1 -0
  27. package/dist/core/tool-registry.d.ts +31 -0
  28. package/dist/core/tool-registry.d.ts.map +1 -0
  29. package/dist/core/tool-registry.js +53 -0
  30. package/dist/core/tool-registry.js.map +1 -0
  31. package/dist/detection/injection-detector.d.ts +21 -0
  32. package/dist/detection/injection-detector.d.ts.map +1 -0
  33. package/dist/detection/injection-detector.js +61 -0
  34. package/dist/detection/injection-detector.js.map +1 -0
  35. package/dist/events/event-emitter.d.ts +44 -0
  36. package/dist/events/event-emitter.d.ts.map +1 -0
  37. package/dist/events/event-emitter.js +119 -0
  38. package/dist/events/event-emitter.js.map +1 -0
  39. package/dist/importers/json-schema-converter.d.ts +16 -0
  40. package/dist/importers/json-schema-converter.d.ts.map +1 -0
  41. package/dist/importers/json-schema-converter.js +95 -0
  42. package/dist/importers/json-schema-converter.js.map +1 -0
  43. package/dist/importers/mcp-importer.d.ts +30 -0
  44. package/dist/importers/mcp-importer.d.ts.map +1 -0
  45. package/dist/importers/mcp-importer.js +45 -0
  46. package/dist/importers/mcp-importer.js.map +1 -0
  47. package/dist/index.d.ts +27 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +43 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/lifecycle/governance-middleware.d.ts +105 -0
  52. package/dist/lifecycle/governance-middleware.d.ts.map +1 -0
  53. package/dist/lifecycle/governance-middleware.js +610 -0
  54. package/dist/lifecycle/governance-middleware.js.map +1 -0
  55. package/dist/lifecycle/kill-switch.d.ts +46 -0
  56. package/dist/lifecycle/kill-switch.d.ts.map +1 -0
  57. package/dist/lifecycle/kill-switch.js +119 -0
  58. package/dist/lifecycle/kill-switch.js.map +1 -0
  59. package/dist/lifecycle/middleware-schemas.d.ts +49 -0
  60. package/dist/lifecycle/middleware-schemas.d.ts.map +1 -0
  61. package/dist/lifecycle/middleware-schemas.js +33 -0
  62. package/dist/lifecycle/middleware-schemas.js.map +1 -0
  63. package/dist/providers/vercel-ai-adapter.d.ts +42 -0
  64. package/dist/providers/vercel-ai-adapter.d.ts.map +1 -0
  65. package/dist/providers/vercel-ai-adapter.js +96 -0
  66. package/dist/providers/vercel-ai-adapter.js.map +1 -0
  67. package/dist/schema/tool-schema.d.ts +62 -0
  68. package/dist/schema/tool-schema.d.ts.map +1 -0
  69. package/dist/schema/tool-schema.js +88 -0
  70. package/dist/schema/tool-schema.js.map +1 -0
  71. package/dist/tracing/index.d.ts +6 -0
  72. package/dist/tracing/index.d.ts.map +1 -0
  73. package/dist/tracing/index.js +6 -0
  74. package/dist/tracing/index.js.map +1 -0
  75. package/dist/tracing/trace-context.d.ts +37 -0
  76. package/dist/tracing/trace-context.d.ts.map +1 -0
  77. package/dist/tracing/trace-context.js +76 -0
  78. package/dist/tracing/trace-context.js.map +1 -0
  79. package/dist/tracing/trace-provider.d.ts +43 -0
  80. package/dist/tracing/trace-provider.d.ts.map +1 -0
  81. package/dist/tracing/trace-provider.js +89 -0
  82. package/dist/tracing/trace-provider.js.map +1 -0
  83. package/dist/types/index.d.ts +248 -0
  84. package/dist/types/index.d.ts.map +1 -0
  85. package/dist/types/index.js +20 -0
  86. package/dist/types/index.js.map +1 -0
  87. package/dist/utils/external-content.d.ts +9 -0
  88. package/dist/utils/external-content.d.ts.map +1 -0
  89. package/dist/utils/external-content.js +11 -0
  90. package/dist/utils/external-content.js.map +1 -0
  91. package/dist/utils/logger.d.ts +4 -0
  92. package/dist/utils/logger.d.ts.map +1 -0
  93. package/dist/utils/logger.js +13 -0
  94. package/dist/utils/logger.js.map +1 -0
  95. package/package.json +45 -0
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @agentbouncr/core — Policy Validation Schema
3
+ *
4
+ * Zod schemas for runtime validation of Policy JSON.
5
+ * validatePolicy() calls process.exit(1) on invalid input (Fail-Secure).
6
+ */
7
+ import { z } from 'zod/v4';
8
+ import type pino from 'pino';
9
+ export declare const policyConditionSchema: z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>>>;
10
+ export declare const policyRuleSchema: z.ZodObject<{
11
+ name: z.ZodOptional<z.ZodString>;
12
+ tool: z.ZodString;
13
+ effect: z.ZodEnum<{
14
+ allow: "allow";
15
+ deny: "deny";
16
+ }>;
17
+ condition: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>>>>;
18
+ reason: z.ZodOptional<z.ZodString>;
19
+ rateLimit: z.ZodOptional<z.ZodObject<{
20
+ maxPerMinute: z.ZodNumber;
21
+ }, z.core.$strip>>;
22
+ requireApproval: z.ZodOptional<z.ZodBoolean>;
23
+ }, z.core.$strip>;
24
+ export declare const policySchema: z.ZodObject<{
25
+ name: z.ZodString;
26
+ version: z.ZodString;
27
+ agentId: z.ZodOptional<z.ZodString>;
28
+ rules: z.ZodArray<z.ZodObject<{
29
+ name: z.ZodOptional<z.ZodString>;
30
+ tool: z.ZodString;
31
+ effect: z.ZodEnum<{
32
+ allow: "allow";
33
+ deny: "deny";
34
+ }>;
35
+ condition: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>>>>;
36
+ reason: z.ZodOptional<z.ZodString>;
37
+ rateLimit: z.ZodOptional<z.ZodObject<{
38
+ maxPerMinute: z.ZodNumber;
39
+ }, z.core.$strip>>;
40
+ requireApproval: z.ZodOptional<z.ZodBoolean>;
41
+ }, z.core.$strip>>;
42
+ createdAt: z.ZodString;
43
+ updatedAt: z.ZodString;
44
+ }, z.core.$strip>;
45
+ /**
46
+ * Validate a policy object. Returns the validated Policy on success.
47
+ * Calls process.exit(1) on failure — invalid policy = agent MUST NOT start.
48
+ */
49
+ export declare function validatePolicy(input: unknown, logger: pino.Logger): z.infer<typeof policySchema>;
50
+ //# sourceMappingURL=policy-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-schema.d.ts","sourceRoot":"","sources":["../../src/core/policy-schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AA0B7B,eAAO,MAAM,qBAAqB,gLAGjC,CAAC;AAUF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;iBAQ3B,CAAC;AAIH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;iBAOvB,CAAC;AAIH;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,IAAI,CAAC,MAAM,GAClB,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAU9B"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * @agentbouncr/core — Policy Validation Schema
3
+ *
4
+ * Zod schemas for runtime validation of Policy JSON.
5
+ * validatePolicy() calls process.exit(1) on invalid input (Fail-Secure).
6
+ */
7
+ import { z } from 'zod/v4';
8
+ // --- Condition Schema ---
9
+ const conditionOperandSchema = z.union([
10
+ z.string(),
11
+ z.number(),
12
+ z.boolean(),
13
+ z.array(z.union([z.string(), z.number()])),
14
+ ]);
15
+ const VALID_OPERATORS = new Set([
16
+ 'equals', 'notEquals',
17
+ 'startsWith', 'endsWith', 'contains',
18
+ 'gt', 'lt', 'gte', 'lte',
19
+ 'in', 'matches',
20
+ ]);
21
+ const conditionEntrySchema = z.record(z.string(), conditionOperandSchema).refine((obj) => Object.keys(obj).every((key) => VALID_OPERATORS.has(key)), { message: 'Invalid condition operator. Valid: equals, notEquals, startsWith, endsWith, contains, gt, lt, gte, lte, in, matches' });
22
+ export const policyConditionSchema = z.record(z.string(), conditionEntrySchema);
23
+ // --- Rate Limit Schema (Stub for Stufe 2) ---
24
+ const rateLimitSchema = z.object({
25
+ maxPerMinute: z.number().positive(),
26
+ });
27
+ // --- Policy Rule Schema ---
28
+ export const policyRuleSchema = z.object({
29
+ name: z.string().optional(),
30
+ tool: z.string().min(1),
31
+ effect: z.enum(['allow', 'deny']),
32
+ condition: policyConditionSchema.optional(),
33
+ reason: z.string().optional(),
34
+ rateLimit: rateLimitSchema.optional(),
35
+ requireApproval: z.boolean().optional(),
36
+ });
37
+ // --- Policy Schema ---
38
+ export const policySchema = z.object({
39
+ name: z.string().min(1),
40
+ version: z.string().min(1),
41
+ agentId: z.string().optional(),
42
+ rules: z.array(policyRuleSchema).min(1).max(1000),
43
+ createdAt: z.string(),
44
+ updatedAt: z.string(),
45
+ });
46
+ // --- Validate-or-exit function (Fail-Secure) ---
47
+ /**
48
+ * Validate a policy object. Returns the validated Policy on success.
49
+ * Calls process.exit(1) on failure — invalid policy = agent MUST NOT start.
50
+ */
51
+ export function validatePolicy(input, logger) {
52
+ const result = policySchema.safeParse(input);
53
+ if (!result.success) {
54
+ logger.error({ errors: result.error.issues }, 'Invalid policy — agent cannot start (Fail-Secure)');
55
+ process.exit(1);
56
+ }
57
+ return result.data;
58
+ }
59
+ //# sourceMappingURL=policy-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-schema.js","sourceRoot":"","sources":["../../src/core/policy-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @agentbouncr/core — Tool Registry
3
+ *
4
+ * Manages tool registrations and provides vendor-agnostic tool definitions.
5
+ * Uses dependency injection (no singletons).
6
+ */
7
+ import type pino from 'pino';
8
+ import type { GovernanceTool } from '../schema/tool-schema.js';
9
+ export interface ProviderToolDefinition {
10
+ name: string;
11
+ description: string;
12
+ input_schema: Record<string, unknown>;
13
+ }
14
+ export declare class ToolRegistry {
15
+ private readonly logger;
16
+ private readonly tools;
17
+ constructor(logger: pino.Logger);
18
+ register(tool: GovernanceTool): void;
19
+ get(name: string): GovernanceTool | undefined;
20
+ has(name: string): boolean;
21
+ getAll(): GovernanceTool[];
22
+ getToolsForAgent(allowedTools: string[]): GovernanceTool[];
23
+ /**
24
+ * Convert tools to provider-agnostic JSON Schema format.
25
+ * Adapters (Vercel AI SDK, OpenAI, etc.) consume this format.
26
+ */
27
+ toProviderTools(allowedTools: string[]): ProviderToolDefinition[];
28
+ count(): number;
29
+ clear(): void;
30
+ }
31
+ //# sourceMappingURL=tool-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../src/core/tool-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;gBAE9B,MAAM,EAAE,IAAI,CAAC,MAAM;IAEhD,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAQpC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI7C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,MAAM,IAAI,cAAc,EAAE;IAI1B,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE;IAM1D;;;OAGG;IACH,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,sBAAsB,EAAE;IAQjE,KAAK,IAAI,MAAM;IAIf,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @agentbouncr/core — Tool Registry
3
+ *
4
+ * Manages tool registrations and provides vendor-agnostic tool definitions.
5
+ * Uses dependency injection (no singletons).
6
+ */
7
+ import { parametersToJsonSchema } from '../schema/tool-schema.js';
8
+ export class ToolRegistry {
9
+ logger;
10
+ tools = new Map();
11
+ constructor(logger) {
12
+ this.logger = logger;
13
+ }
14
+ register(tool) {
15
+ if (this.tools.has(tool.name)) {
16
+ this.logger.warn({ tool: tool.name }, 'Tool already registered, overwriting');
17
+ }
18
+ this.tools.set(tool.name, tool);
19
+ this.logger.info({ tool: tool.name, riskLevel: tool.riskLevel }, 'Tool registered');
20
+ }
21
+ get(name) {
22
+ return this.tools.get(name);
23
+ }
24
+ has(name) {
25
+ return this.tools.has(name);
26
+ }
27
+ getAll() {
28
+ return Array.from(this.tools.values());
29
+ }
30
+ getToolsForAgent(allowedTools) {
31
+ return allowedTools
32
+ .map((name) => this.tools.get(name))
33
+ .filter((tool) => tool !== undefined);
34
+ }
35
+ /**
36
+ * Convert tools to provider-agnostic JSON Schema format.
37
+ * Adapters (Vercel AI SDK, OpenAI, etc.) consume this format.
38
+ */
39
+ toProviderTools(allowedTools) {
40
+ return this.getToolsForAgent(allowedTools).map((tool) => ({
41
+ name: tool.name,
42
+ description: tool.description ?? '',
43
+ input_schema: parametersToJsonSchema(tool.parameters),
44
+ }));
45
+ }
46
+ count() {
47
+ return this.tools.size;
48
+ }
49
+ clear() {
50
+ this.tools.clear();
51
+ }
52
+ }
53
+ //# sourceMappingURL=tool-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/core/tool-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAQlE,MAAM,OAAO,YAAY;IAGM;IAFZ,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE3D,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD,QAAQ,CAAC,IAAoB;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,sCAAsC,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,iBAAiB,CAAC,CAAC;IACtF,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,gBAAgB,CAAC,YAAsB;QACrC,OAAO,YAAY;aAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;aACnC,MAAM,CAAC,CAAC,IAAI,EAA0B,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAClE,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,YAAsB;QACpC,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxD,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,YAAY,EAAE,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC;SACtD,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @agentbouncr/core — Injection Detection
3
+ *
4
+ * Detects prompt injection patterns in incoming messages.
5
+ * IMPORTANT: Injection is NEVER auto-blocked — only logged as warning.
6
+ * Reason: False-positive risk. Blocking decisions are left to the policy layer.
7
+ */
8
+ import type { InjectionDetectionResult } from '../types/index.js';
9
+ export interface InjectionPattern {
10
+ name: string;
11
+ pattern: RegExp;
12
+ }
13
+ export interface InjectionDetectionOptions {
14
+ /** Pattern names to skip during detection */
15
+ disabledPatterns?: string[];
16
+ /** Optional logger for DI (defaults to securityLogger) */
17
+ logger?: import('pino').Logger;
18
+ }
19
+ export declare const DEFAULT_INJECTION_PATTERNS: InjectionPattern[];
20
+ export declare function detectInjection(text: string, options?: InjectionDetectionOptions): InjectionDetectionResult;
21
+ //# sourceMappingURL=injection-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection-detector.d.ts","sourceRoot":"","sources":["../../src/detection/injection-detector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,0BAA0B,EAAE,gBAAgB,EA8BxD,CAAC;AAEF,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,yBAAyB,GAClC,wBAAwB,CA2B1B"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @agentbouncr/core — Injection Detection
3
+ *
4
+ * Detects prompt injection patterns in incoming messages.
5
+ * IMPORTANT: Injection is NEVER auto-blocked — only logged as warning.
6
+ * Reason: False-positive risk. Blocking decisions are left to the policy layer.
7
+ */
8
+ import { securityLogger } from '../utils/logger.js';
9
+ export const DEFAULT_INJECTION_PATTERNS = [
10
+ {
11
+ name: 'ignore_previous_instructions',
12
+ pattern: /ignor(e|ier).*?(previous|vorherige|bisherige|alle).*?(instruction|anweisung|regeln)/i,
13
+ },
14
+ {
15
+ name: 'system_prompt_override',
16
+ pattern: /```system\b/i,
17
+ },
18
+ {
19
+ name: 'admin_mode',
20
+ pattern: /(admin[- ]?mod(e|us)|developer[- ]?mod(e|us)|debug[- ]?mod(e|us))/i,
21
+ },
22
+ {
23
+ name: 'reveal_instructions',
24
+ pattern: /(show|reveal|display|zeig|gib).*?(system[- ]?prompt|instruction|api[- ]?key|secret|password|passwort)/i,
25
+ },
26
+ {
27
+ name: 'role_hijack',
28
+ pattern: /(you are now|du bist jetzt|ab jetzt bist du|from now on you are)/i,
29
+ },
30
+ {
31
+ name: 'instruction_delimiter',
32
+ pattern: /(\[INST\]|\[\/INST\]|<\|im_start\|>|<\|im_end\|>|<\/?system>)/i,
33
+ },
34
+ {
35
+ name: 'execute_command',
36
+ pattern: /(execute_shell|run_command|exec\(|eval\(|child_process)/i,
37
+ },
38
+ ];
39
+ export function detectInjection(text, options) {
40
+ const log = options?.logger ?? securityLogger;
41
+ const matched = [];
42
+ const disabled = new Set(options?.disabledPatterns ?? []);
43
+ for (const { name, pattern } of DEFAULT_INJECTION_PATTERNS) {
44
+ if (disabled.has(name))
45
+ continue;
46
+ if (pattern.test(text)) {
47
+ matched.push(name);
48
+ }
49
+ }
50
+ const result = {
51
+ detected: matched.length > 0,
52
+ patterns: matched,
53
+ text,
54
+ };
55
+ if (result.detected) {
56
+ // Log WARNING only — NEVER block (Fail-Open for injection, event emitted separately)
57
+ log.warn({ patterns: matched, event: 'injection_detected' }, 'Injection pattern detected in incoming message');
58
+ }
59
+ return result;
60
+ }
61
+ //# sourceMappingURL=injection-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection-detector.js","sourceRoot":"","sources":["../../src/detection/injection-detector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAepD,MAAM,CAAC,MAAM,0BAA0B,GAAuB;IAC5D;QACE,IAAI,EAAE,8BAA8B;QACpC,OAAO,EAAE,sFAAsF;KAChG;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,cAAc;KACxB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,oEAAoE;KAC9E;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EACL,wGAAwG;KAC3G;IACD;QACE,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,mEAAmE;KAC7E;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,gEAAgE;KAC1E;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,0DAA0D;KACpE;CACF,CAAC;AAEF,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,OAAmC;IAEnC,MAAM,GAAG,GAAG,OAAO,EAAE,MAAM,IAAI,cAAc,CAAC;IAC9C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAE1D,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,0BAA0B,EAAE,CAAC;QAC3D,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QACjC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAA6B;QACvC,QAAQ,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;QAC5B,QAAQ,EAAE,OAAO;QACjB,IAAI;KACL,CAAC;IAEF,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,qFAAqF;QACrF,GAAG,CAAC,IAAI,CACN,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAClD,gDAAgD,CACjD,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @agentbouncr/core — Event System
3
+ *
4
+ * Async in-process event dispatch via process.nextTick.
5
+ * 20 event types, 100ms timeout per listener.
6
+ * Listeners must NEVER block the governance check.
7
+ */
8
+ import type pino from 'pino';
9
+ export type GovernanceEventType = 'tool_call.allowed' | 'tool_call.denied' | 'tool_call.error' | 'approval.requested' | 'approval.granted' | 'approval.rejected' | 'approval.timeout' | 'agent.started' | 'agent.stopped' | 'agent.error' | 'agent.config_changed' | 'injection.detected' | 'killswitch.activated' | 'killswitch.deactivated' | 'audit.integrity_violation' | 'audit.write_failure' | 'policy.created' | 'policy.updated' | 'policy.deleted' | 'rate_limit.exceeded';
10
+ export interface GovernanceEvent<T = Record<string, unknown>> {
11
+ type: GovernanceEventType;
12
+ timestamp: string;
13
+ traceId?: string;
14
+ agentId?: string;
15
+ tenantId?: string;
16
+ data: T;
17
+ }
18
+ export type GovernanceEventListener<T = Record<string, unknown>> = (event: GovernanceEvent<T>) => void | Promise<void>;
19
+ export declare class GovernanceEventEmitter {
20
+ private readonly logger;
21
+ private readonly traceIdResolver?;
22
+ private readonly listeners;
23
+ constructor(logger: pino.Logger, traceIdResolver?: (() => string | undefined) | undefined);
24
+ on(type: GovernanceEventType, listener: GovernanceEventListener): void;
25
+ off(type: GovernanceEventType, listener: GovernanceEventListener): void;
26
+ /**
27
+ * Emit event asynchronously via process.nextTick.
28
+ * Listeners are fire-and-forget — they NEVER block the caller.
29
+ * Each listener gets max 100ms before timeout warning.
30
+ *
31
+ * Defensive: Invalid input is logged and silently ignored (JS callers without TS).
32
+ */
33
+ emit(type: GovernanceEventType, data?: Record<string, unknown>): void;
34
+ /**
35
+ * Emit with full event object (when traceId/agentId are known).
36
+ *
37
+ * Defensive: Missing fields are filled with defaults (JS callers without TS).
38
+ */
39
+ emitEvent(event: GovernanceEvent): void;
40
+ listenerCount(type: GovernanceEventType): number;
41
+ removeAllListeners(type?: GovernanceEventType): void;
42
+ private executeListener;
43
+ }
44
+ //# sourceMappingURL=event-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../src/events/event-emitter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAI7B,MAAM,MAAM,mBAAmB,GAC3B,mBAAmB,GACnB,kBAAkB,GAClB,iBAAiB,GACjB,oBAAoB,GACpB,kBAAkB,GAClB,mBAAmB,GACnB,kBAAkB,GAClB,eAAe,GACf,eAAe,GACf,aAAa,GACb,sBAAsB,GACtB,oBAAoB,GACpB,sBAAsB,GACtB,wBAAwB,GACxB,2BAA2B,GAC3B,qBAAqB,GACrB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,qBAAqB,CAAC;AAI1B,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1D,IAAI,EAAE,mBAAmB,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,CAAC,CAAC;CACT;AAID,MAAM,MAAM,uBAAuB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CACjE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KACtB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAM1B,qBAAa,sBAAsB;IAI/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAJnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6D;gBAGpE,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,eAAe,CAAC,GAAE,MAAM,MAAM,GAAG,SAAS,aAAA;IAG7D,EAAE,CAAC,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,uBAAuB,GAAG,IAAI;IAMtE,GAAG,CAAC,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,uBAAuB,GAAG,IAAI;IAUvE;;;;;;OAMG;IACH,IAAI,CAAC,IAAI,EAAE,mBAAmB,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI;IA8BzE;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAyBvC,aAAa,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM;IAIhD,kBAAkB,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,IAAI;IAQpD,OAAO,CAAC,eAAe;CA8BxB"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * @agentbouncr/core — Event System
3
+ *
4
+ * Async in-process event dispatch via process.nextTick.
5
+ * 20 event types, 100ms timeout per listener.
6
+ * Listeners must NEVER block the governance check.
7
+ */
8
+ // --- Event Emitter ---
9
+ const LISTENER_TIMEOUT_MS = 100;
10
+ export class GovernanceEventEmitter {
11
+ logger;
12
+ traceIdResolver;
13
+ listeners = new Map();
14
+ constructor(logger, traceIdResolver) {
15
+ this.logger = logger;
16
+ this.traceIdResolver = traceIdResolver;
17
+ }
18
+ on(type, listener) {
19
+ const existing = this.listeners.get(type) ?? [];
20
+ existing.push(listener);
21
+ this.listeners.set(type, existing);
22
+ }
23
+ off(type, listener) {
24
+ const existing = this.listeners.get(type);
25
+ if (!existing)
26
+ return;
27
+ const index = existing.indexOf(listener);
28
+ if (index !== -1) {
29
+ existing.splice(index, 1);
30
+ }
31
+ }
32
+ /**
33
+ * Emit event asynchronously via process.nextTick.
34
+ * Listeners are fire-and-forget — they NEVER block the caller.
35
+ * Each listener gets max 100ms before timeout warning.
36
+ *
37
+ * Defensive: Invalid input is logged and silently ignored (JS callers without TS).
38
+ */
39
+ emit(type, data = {}) {
40
+ if (!type || typeof type !== 'string') {
41
+ this.logger.warn({ type }, 'emit() called with invalid event type — ignored');
42
+ return;
43
+ }
44
+ const listeners = this.listeners.get(type);
45
+ if (!listeners?.length)
46
+ return;
47
+ let traceId;
48
+ try {
49
+ traceId = this.traceIdResolver?.();
50
+ }
51
+ catch (err) {
52
+ this.logger.warn({ error: String(err) }, 'traceIdResolver threw — ignored');
53
+ }
54
+ const event = {
55
+ type,
56
+ timestamp: new Date().toISOString(),
57
+ traceId,
58
+ data: data && typeof data === 'object' ? data : {},
59
+ };
60
+ for (const listener of listeners) {
61
+ process.nextTick(() => {
62
+ this.executeListener(type, listener, event);
63
+ });
64
+ }
65
+ }
66
+ /**
67
+ * Emit with full event object (when traceId/agentId are known).
68
+ *
69
+ * Defensive: Missing fields are filled with defaults (JS callers without TS).
70
+ */
71
+ emitEvent(event) {
72
+ if (!event || typeof event !== 'object' || !event.type) {
73
+ this.logger.warn({ event }, 'emitEvent() called with invalid event — ignored');
74
+ return;
75
+ }
76
+ const safeEvent = {
77
+ type: event.type,
78
+ timestamp: event.timestamp || new Date().toISOString(),
79
+ traceId: event.traceId,
80
+ agentId: event.agentId,
81
+ tenantId: event.tenantId,
82
+ data: event.data && typeof event.data === 'object' ? event.data : {},
83
+ };
84
+ const listeners = this.listeners.get(safeEvent.type);
85
+ if (!listeners?.length)
86
+ return;
87
+ for (const listener of listeners) {
88
+ process.nextTick(() => {
89
+ this.executeListener(safeEvent.type, listener, safeEvent);
90
+ });
91
+ }
92
+ }
93
+ listenerCount(type) {
94
+ return this.listeners.get(type)?.length ?? 0;
95
+ }
96
+ removeAllListeners(type) {
97
+ if (type) {
98
+ this.listeners.delete(type);
99
+ }
100
+ else {
101
+ this.listeners.clear();
102
+ }
103
+ }
104
+ executeListener(type, listener, event) {
105
+ try {
106
+ const result = listener(event);
107
+ if (result instanceof Promise) {
108
+ const timeout = new Promise((_, reject) => setTimeout(() => reject(new Error(`Event listener timeout (${LISTENER_TIMEOUT_MS}ms)`)), LISTENER_TIMEOUT_MS));
109
+ void Promise.race([result, timeout]).catch((err) => {
110
+ this.logger.warn({ eventType: type, error: String(err) }, 'Event listener failed or timed out');
111
+ });
112
+ }
113
+ }
114
+ catch (err) {
115
+ this.logger.warn({ eventType: type, error: String(err) }, 'Event listener threw synchronously');
116
+ }
117
+ }
118
+ }
119
+ //# sourceMappingURL=event-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../../src/events/event-emitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @agentbouncr/core — JSON Schema → GovernanceToolParameter Converter
3
+ *
4
+ * Reverse of parametersToJsonSchema() (tool-schema.ts).
5
+ * Converts standard JSON Schema objects to the canonical GovernanceToolParameter[] format.
6
+ * Used by all import adapters (MCP, OpenAI, LangChain).
7
+ */
8
+ import type { GovernanceToolParameter } from '../schema/tool-schema.js';
9
+ /**
10
+ * Convert a JSON Schema object to GovernanceToolParameter[].
11
+ *
12
+ * Expects a top-level `{ type: "object", properties: {...}, required: [...] }` schema.
13
+ * Returns empty array for non-object schemas or missing properties.
14
+ */
15
+ export declare function jsonSchemaToParameters(schema: Record<string, unknown>): GovernanceToolParameter[];
16
+ //# sourceMappingURL=json-schema-converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-converter.d.ts","sourceRoot":"","sources":["../../src/importers/json-schema-converter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAA4B,MAAM,0BAA0B,CAAC;AAiBlG;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,uBAAuB,EAAE,CAc3B"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * @agentbouncr/core — JSON Schema → GovernanceToolParameter Converter
3
+ *
4
+ * Reverse of parametersToJsonSchema() (tool-schema.ts).
5
+ * Converts standard JSON Schema objects to the canonical GovernanceToolParameter[] format.
6
+ * Used by all import adapters (MCP, OpenAI, LangChain).
7
+ */
8
+ // --- Prototype pollution protection ---
9
+ const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
10
+ // --- Type mapping ---
11
+ const JSON_SCHEMA_TYPE_MAP = {
12
+ string: 'string',
13
+ number: 'number',
14
+ integer: 'number',
15
+ boolean: 'boolean',
16
+ object: 'object',
17
+ array: 'array',
18
+ };
19
+ /**
20
+ * Convert a JSON Schema object to GovernanceToolParameter[].
21
+ *
22
+ * Expects a top-level `{ type: "object", properties: {...}, required: [...] }` schema.
23
+ * Returns empty array for non-object schemas or missing properties.
24
+ */
25
+ export function jsonSchemaToParameters(schema) {
26
+ if (!schema || typeof schema !== 'object')
27
+ return [];
28
+ const schemaType = schema.type;
29
+ if (schemaType !== 'object' && schemaType !== undefined)
30
+ return [];
31
+ const properties = schema.properties;
32
+ if (!properties || typeof properties !== 'object')
33
+ return [];
34
+ const requiredFields = Array.isArray(schema.required) ? schema.required : [];
35
+ return Object.entries(properties)
36
+ .filter(([name]) => !RESERVED_KEYS.has(name))
37
+ .map(([name, prop]) => convertProperty(name, prop, requiredFields.includes(name)));
38
+ }
39
+ function convertProperty(name, prop, required) {
40
+ const rawType = prop.type;
41
+ const type = JSON_SCHEMA_TYPE_MAP[rawType ?? ''] ?? 'string';
42
+ const param = { name, type, required };
43
+ if (typeof prop.description === 'string') {
44
+ param.description = prop.description;
45
+ }
46
+ if (prop.default !== undefined) {
47
+ param.default = prop.default;
48
+ }
49
+ const constraints = extractConstraints(prop);
50
+ if (constraints) {
51
+ param.constraints = constraints;
52
+ }
53
+ // Nested object → recursive children
54
+ if (type === 'object' && prop.properties) {
55
+ param.children = jsonSchemaToParameters(prop);
56
+ }
57
+ // Array → items as single child
58
+ if (type === 'array' && prop.items && typeof prop.items === 'object') {
59
+ const items = prop.items;
60
+ const itemType = JSON_SCHEMA_TYPE_MAP[items.type ?? ''] ?? 'string';
61
+ param.children = [{
62
+ name: 'items',
63
+ type: itemType,
64
+ required: false,
65
+ ...(typeof items.description === 'string' ? { description: items.description } : {}),
66
+ }];
67
+ }
68
+ return param;
69
+ }
70
+ function extractConstraints(prop) {
71
+ const constraints = {};
72
+ let hasConstraints = false;
73
+ if (Array.isArray(prop.enum)) {
74
+ constraints.enum = prop.enum;
75
+ hasConstraints = true;
76
+ }
77
+ if (typeof prop.minimum === 'number') {
78
+ constraints.min = prop.minimum;
79
+ hasConstraints = true;
80
+ }
81
+ if (typeof prop.maximum === 'number') {
82
+ constraints.max = prop.maximum;
83
+ hasConstraints = true;
84
+ }
85
+ if (typeof prop.maxLength === 'number') {
86
+ constraints.maxLength = prop.maxLength;
87
+ hasConstraints = true;
88
+ }
89
+ if (typeof prop.pattern === 'string') {
90
+ constraints.pattern = prop.pattern;
91
+ hasConstraints = true;
92
+ }
93
+ return hasConstraints ? constraints : undefined;
94
+ }
95
+ //# sourceMappingURL=json-schema-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-converter.js","sourceRoot":"","sources":["../../src/importers/json-schema-converter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @agentbouncr/core — MCP Import Adapter
3
+ *
4
+ * Converts MCP tool definitions (from tools/list response) to GovernanceTool[].
5
+ * MCP = Model Context Protocol — emerging standard for agent tool definitions.
6
+ *
7
+ * Import priority: MCP first.
8
+ */
9
+ import type pino from 'pino';
10
+ import type { GovernanceTool } from '../schema/tool-schema.js';
11
+ import type { RiskLevel } from '../schema/tool-schema.js';
12
+ export interface MCPToolDefinition {
13
+ name: string;
14
+ description?: string;
15
+ inputSchema?: Record<string, unknown>;
16
+ }
17
+ export interface MCPImportOptions {
18
+ /** Default risk level for imported tools. Default: 'medium' */
19
+ defaultRiskLevel?: RiskLevel;
20
+ /** Logger for skip-warnings on invalid tools */
21
+ logger?: pino.Logger;
22
+ }
23
+ /**
24
+ * Convert MCP tool definitions to GovernanceTool[].
25
+ *
26
+ * Invalid tools (missing/empty name) are skipped with a warning.
27
+ * Empty input returns empty array.
28
+ */
29
+ export declare function importMCPTools(toolList: MCPToolDefinition[], options?: MCPImportOptions): GovernanceTool[];
30
+ //# sourceMappingURL=mcp-importer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-importer.d.ts","sourceRoot":"","sources":["../../src/importers/mcp-importer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAK1D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,gDAAgD;IAChD,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,OAAO,CAAC,EAAE,gBAAgB,GACzB,cAAc,EAAE,CAkClB"}