@ninelives/agent-governance-sdk 5.0.1

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 (126) hide show
  1. package/README.md +363 -0
  2. package/dist/audit.d.ts +26 -0
  3. package/dist/audit.d.ts.map +1 -0
  4. package/dist/audit.js +107 -0
  5. package/dist/audit.js.map +1 -0
  6. package/dist/cascade-containment.d.ts +84 -0
  7. package/dist/cascade-containment.d.ts.map +1 -0
  8. package/dist/cascade-containment.js +387 -0
  9. package/dist/cascade-containment.js.map +1 -0
  10. package/dist/client.d.ts +34 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +112 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/context-poisoning.d.ts +58 -0
  15. package/dist/context-poisoning.d.ts.map +1 -0
  16. package/dist/context-poisoning.js +410 -0
  17. package/dist/context-poisoning.js.map +1 -0
  18. package/dist/credential-vault.d.ts +213 -0
  19. package/dist/credential-vault.d.ts.map +1 -0
  20. package/dist/credential-vault.js +567 -0
  21. package/dist/credential-vault.js.map +1 -0
  22. package/dist/discovery.d.ts +80 -0
  23. package/dist/discovery.d.ts.map +1 -0
  24. package/dist/discovery.js +404 -0
  25. package/dist/discovery.js.map +1 -0
  26. package/dist/encryption/channel.d.ts +29 -0
  27. package/dist/encryption/channel.d.ts.map +1 -0
  28. package/dist/encryption/channel.js +78 -0
  29. package/dist/encryption/channel.js.map +1 -0
  30. package/dist/encryption/index.d.ts +9 -0
  31. package/dist/encryption/index.d.ts.map +1 -0
  32. package/dist/encryption/index.js +23 -0
  33. package/dist/encryption/index.js.map +1 -0
  34. package/dist/encryption/mesh-client.d.ts +281 -0
  35. package/dist/encryption/mesh-client.d.ts.map +1 -0
  36. package/dist/encryption/mesh-client.js +1110 -0
  37. package/dist/encryption/mesh-client.js.map +1 -0
  38. package/dist/encryption/ratchet.d.ts +38 -0
  39. package/dist/encryption/ratchet.d.ts.map +1 -0
  40. package/dist/encryption/ratchet.js +223 -0
  41. package/dist/encryption/ratchet.js.map +1 -0
  42. package/dist/encryption/registry-client.d.ts +136 -0
  43. package/dist/encryption/registry-client.d.ts.map +1 -0
  44. package/dist/encryption/registry-client.js +369 -0
  45. package/dist/encryption/registry-client.js.map +1 -0
  46. package/dist/encryption/x3dh.d.ts +80 -0
  47. package/dist/encryption/x3dh.d.ts.map +1 -0
  48. package/dist/encryption/x3dh.js +238 -0
  49. package/dist/encryption/x3dh.js.map +1 -0
  50. package/dist/framework-adapter.d.ts +63 -0
  51. package/dist/framework-adapter.d.ts.map +1 -0
  52. package/dist/framework-adapter.js +253 -0
  53. package/dist/framework-adapter.js.map +1 -0
  54. package/dist/identity.d.ts +124 -0
  55. package/dist/identity.d.ts.map +1 -0
  56. package/dist/identity.js +446 -0
  57. package/dist/identity.js.map +1 -0
  58. package/dist/index.d.ts +39 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +95 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/kill-switch.d.ts +22 -0
  63. package/dist/kill-switch.d.ts.map +1 -0
  64. package/dist/kill-switch.js +60 -0
  65. package/dist/kill-switch.js.map +1 -0
  66. package/dist/lifecycle.d.ts +50 -0
  67. package/dist/lifecycle.d.ts.map +1 -0
  68. package/dist/lifecycle.js +113 -0
  69. package/dist/lifecycle.js.map +1 -0
  70. package/dist/mcp.d.ts +41 -0
  71. package/dist/mcp.d.ts.map +1 -0
  72. package/dist/mcp.js +233 -0
  73. package/dist/mcp.js.map +1 -0
  74. package/dist/metrics.d.ts +123 -0
  75. package/dist/metrics.d.ts.map +1 -0
  76. package/dist/metrics.js +289 -0
  77. package/dist/metrics.js.map +1 -0
  78. package/dist/oci-manifest.d.ts +49 -0
  79. package/dist/oci-manifest.d.ts.map +1 -0
  80. package/dist/oci-manifest.js +182 -0
  81. package/dist/oci-manifest.js.map +1 -0
  82. package/dist/policy-backends/cedar.d.ts +15 -0
  83. package/dist/policy-backends/cedar.d.ts.map +1 -0
  84. package/dist/policy-backends/cedar.js +88 -0
  85. package/dist/policy-backends/cedar.js.map +1 -0
  86. package/dist/policy-backends/opa.d.ts +17 -0
  87. package/dist/policy-backends/opa.d.ts.map +1 -0
  88. package/dist/policy-backends/opa.js +74 -0
  89. package/dist/policy-backends/opa.js.map +1 -0
  90. package/dist/policy.d.ts +77 -0
  91. package/dist/policy.d.ts.map +1 -0
  92. package/dist/policy.js +760 -0
  93. package/dist/policy.js.map +1 -0
  94. package/dist/prompt-defense.d.ts +37 -0
  95. package/dist/prompt-defense.d.ts.map +1 -0
  96. package/dist/prompt-defense.js +229 -0
  97. package/dist/prompt-defense.js.map +1 -0
  98. package/dist/protocol-facets.d.ts +87 -0
  99. package/dist/protocol-facets.d.ts.map +1 -0
  100. package/dist/protocol-facets.js +728 -0
  101. package/dist/protocol-facets.js.map +1 -0
  102. package/dist/rings.d.ts +17 -0
  103. package/dist/rings.d.ts.map +1 -0
  104. package/dist/rings.js +61 -0
  105. package/dist/rings.js.map +1 -0
  106. package/dist/sandbox.d.ts +61 -0
  107. package/dist/sandbox.d.ts.map +1 -0
  108. package/dist/sandbox.js +199 -0
  109. package/dist/sandbox.js.map +1 -0
  110. package/dist/surface-parity.d.ts +45 -0
  111. package/dist/surface-parity.d.ts.map +1 -0
  112. package/dist/surface-parity.js +216 -0
  113. package/dist/surface-parity.js.map +1 -0
  114. package/dist/trust.d.ts +28 -0
  115. package/dist/trust.d.ts.map +1 -0
  116. package/dist/trust.js +209 -0
  117. package/dist/trust.js.map +1 -0
  118. package/dist/types.d.ts +422 -0
  119. package/dist/types.d.ts.map +1 -0
  120. package/dist/types.js +29 -0
  121. package/dist/types.js.map +1 -0
  122. package/dist/verify.d.ts +135 -0
  123. package/dist/verify.d.ts.map +1 -0
  124. package/dist/verify.js +356 -0
  125. package/dist/verify.js.map +1 -0
  126. package/package.json +66 -0
package/dist/index.js ADDED
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DockerSandboxProvider = exports.defaultSandboxConfig = exports.ExecutionStatus = exports.SessionStatus = exports.OciManifestAdapter = exports.ContextPoisoningDetector = exports.CascadeContainmentManager = exports.SurfaceParityChecker = exports.GovernanceVerifier = exports.RingBreachError = exports.RingEnforcer = exports.DENY_REASON = exports.PLACEHOLDER_RE = exports.auditDigest = exports.DenyReceipt = exports.CredentialError = exports.CredentialProfile = exports.CredentialHandle = exports.CredentialInjector = exports.CredentialVault = exports.PromptDefenseEvaluator = exports.OPABackend = exports.CedarBackend = exports.ShadowDiscovery = exports.LifecycleState = exports.LifecycleManager = exports.McpThreatType = exports.McpSecurityScanner = exports.TraceCapture = exports.SLOTracker = exports.GovernanceMetrics = exports.ErrorBudgetTracker = exports.CircuitBreaker = exports.KillSwitch = exports.FrameworkInvocationHandle = exports.GenericFrameworkAdapter = exports.AgentMeshClient = exports.AuditLogger = exports.extractK8sFacets = exports.extractSqlFacets = exports.extractProtocolFacets = exports.defaultRegistry = exports.FacetRegistry = exports.PolicyConflictResolver = exports.PolicyEngine = exports.TrustManager = exports.safeBase64Decode = exports.stripKeyPrefix = exports.IdentityRegistry = exports.AgentIdentity = void 0;
4
+ exports.PolicyScope = exports.ExecutionRing = exports.ConflictResolutionStrategy = exports.RegistryError = exports.RegistryClient = exports.MeshClient = exports.SecureChannel = exports.DoubleRatchet = exports.ed25519ToX25519 = exports.generateX25519KeyPair = exports.X3DHKeyManager = void 0;
5
+ // Copyright (c) Microsoft Corporation.
6
+ // Licensed under the MIT License.
7
+ var identity_1 = require("./identity");
8
+ Object.defineProperty(exports, "AgentIdentity", { enumerable: true, get: function () { return identity_1.AgentIdentity; } });
9
+ Object.defineProperty(exports, "IdentityRegistry", { enumerable: true, get: function () { return identity_1.IdentityRegistry; } });
10
+ Object.defineProperty(exports, "stripKeyPrefix", { enumerable: true, get: function () { return identity_1.stripKeyPrefix; } });
11
+ Object.defineProperty(exports, "safeBase64Decode", { enumerable: true, get: function () { return identity_1.safeBase64Decode; } });
12
+ var trust_1 = require("./trust");
13
+ Object.defineProperty(exports, "TrustManager", { enumerable: true, get: function () { return trust_1.TrustManager; } });
14
+ var policy_1 = require("./policy");
15
+ Object.defineProperty(exports, "PolicyEngine", { enumerable: true, get: function () { return policy_1.PolicyEngine; } });
16
+ Object.defineProperty(exports, "PolicyConflictResolver", { enumerable: true, get: function () { return policy_1.PolicyConflictResolver; } });
17
+ var protocol_facets_1 = require("./protocol-facets");
18
+ Object.defineProperty(exports, "FacetRegistry", { enumerable: true, get: function () { return protocol_facets_1.FacetRegistry; } });
19
+ Object.defineProperty(exports, "defaultRegistry", { enumerable: true, get: function () { return protocol_facets_1.defaultRegistry; } });
20
+ Object.defineProperty(exports, "extractProtocolFacets", { enumerable: true, get: function () { return protocol_facets_1.extractProtocolFacets; } });
21
+ Object.defineProperty(exports, "extractSqlFacets", { enumerable: true, get: function () { return protocol_facets_1.extractSqlFacets; } });
22
+ Object.defineProperty(exports, "extractK8sFacets", { enumerable: true, get: function () { return protocol_facets_1.extractK8sFacets; } });
23
+ var audit_1 = require("./audit");
24
+ Object.defineProperty(exports, "AuditLogger", { enumerable: true, get: function () { return audit_1.AuditLogger; } });
25
+ var client_1 = require("./client");
26
+ Object.defineProperty(exports, "AgentMeshClient", { enumerable: true, get: function () { return client_1.AgentMeshClient; } });
27
+ var framework_adapter_1 = require("./framework-adapter");
28
+ Object.defineProperty(exports, "GenericFrameworkAdapter", { enumerable: true, get: function () { return framework_adapter_1.GenericFrameworkAdapter; } });
29
+ Object.defineProperty(exports, "FrameworkInvocationHandle", { enumerable: true, get: function () { return framework_adapter_1.FrameworkInvocationHandle; } });
30
+ var kill_switch_1 = require("./kill-switch");
31
+ Object.defineProperty(exports, "KillSwitch", { enumerable: true, get: function () { return kill_switch_1.KillSwitch; } });
32
+ var metrics_1 = require("./metrics");
33
+ Object.defineProperty(exports, "CircuitBreaker", { enumerable: true, get: function () { return metrics_1.CircuitBreaker; } });
34
+ Object.defineProperty(exports, "ErrorBudgetTracker", { enumerable: true, get: function () { return metrics_1.ErrorBudgetTracker; } });
35
+ Object.defineProperty(exports, "GovernanceMetrics", { enumerable: true, get: function () { return metrics_1.GovernanceMetrics; } });
36
+ Object.defineProperty(exports, "SLOTracker", { enumerable: true, get: function () { return metrics_1.SLOTracker; } });
37
+ Object.defineProperty(exports, "TraceCapture", { enumerable: true, get: function () { return metrics_1.TraceCapture; } });
38
+ var mcp_1 = require("./mcp");
39
+ Object.defineProperty(exports, "McpSecurityScanner", { enumerable: true, get: function () { return mcp_1.McpSecurityScanner; } });
40
+ Object.defineProperty(exports, "McpThreatType", { enumerable: true, get: function () { return mcp_1.McpThreatType; } });
41
+ var lifecycle_1 = require("./lifecycle");
42
+ Object.defineProperty(exports, "LifecycleManager", { enumerable: true, get: function () { return lifecycle_1.LifecycleManager; } });
43
+ Object.defineProperty(exports, "LifecycleState", { enumerable: true, get: function () { return lifecycle_1.LifecycleState; } });
44
+ var discovery_1 = require("./discovery");
45
+ Object.defineProperty(exports, "ShadowDiscovery", { enumerable: true, get: function () { return discovery_1.ShadowDiscovery; } });
46
+ var cedar_1 = require("./policy-backends/cedar");
47
+ Object.defineProperty(exports, "CedarBackend", { enumerable: true, get: function () { return cedar_1.CedarBackend; } });
48
+ var opa_1 = require("./policy-backends/opa");
49
+ Object.defineProperty(exports, "OPABackend", { enumerable: true, get: function () { return opa_1.OPABackend; } });
50
+ var prompt_defense_1 = require("./prompt-defense");
51
+ Object.defineProperty(exports, "PromptDefenseEvaluator", { enumerable: true, get: function () { return prompt_defense_1.PromptDefenseEvaluator; } });
52
+ // Credential Vault & Injection (issue #2535 / #2481)
53
+ var credential_vault_1 = require("./credential-vault");
54
+ Object.defineProperty(exports, "CredentialVault", { enumerable: true, get: function () { return credential_vault_1.CredentialVault; } });
55
+ Object.defineProperty(exports, "CredentialInjector", { enumerable: true, get: function () { return credential_vault_1.CredentialInjector; } });
56
+ Object.defineProperty(exports, "CredentialHandle", { enumerable: true, get: function () { return credential_vault_1.CredentialHandle; } });
57
+ Object.defineProperty(exports, "CredentialProfile", { enumerable: true, get: function () { return credential_vault_1.CredentialProfile; } });
58
+ Object.defineProperty(exports, "CredentialError", { enumerable: true, get: function () { return credential_vault_1.CredentialError; } });
59
+ Object.defineProperty(exports, "DenyReceipt", { enumerable: true, get: function () { return credential_vault_1.DenyReceipt; } });
60
+ Object.defineProperty(exports, "auditDigest", { enumerable: true, get: function () { return credential_vault_1.auditDigest; } });
61
+ Object.defineProperty(exports, "PLACEHOLDER_RE", { enumerable: true, get: function () { return credential_vault_1.PLACEHOLDER_RE; } });
62
+ Object.defineProperty(exports, "DENY_REASON", { enumerable: true, get: function () { return credential_vault_1.DENY_REASON; } });
63
+ var rings_1 = require("./rings");
64
+ Object.defineProperty(exports, "RingEnforcer", { enumerable: true, get: function () { return rings_1.RingEnforcer; } });
65
+ Object.defineProperty(exports, "RingBreachError", { enumerable: true, get: function () { return rings_1.RingBreachError; } });
66
+ var verify_1 = require("./verify");
67
+ Object.defineProperty(exports, "GovernanceVerifier", { enumerable: true, get: function () { return verify_1.GovernanceVerifier; } });
68
+ var surface_parity_1 = require("./surface-parity");
69
+ Object.defineProperty(exports, "SurfaceParityChecker", { enumerable: true, get: function () { return surface_parity_1.SurfaceParityChecker; } });
70
+ var cascade_containment_1 = require("./cascade-containment");
71
+ Object.defineProperty(exports, "CascadeContainmentManager", { enumerable: true, get: function () { return cascade_containment_1.CascadeContainmentManager; } });
72
+ var context_poisoning_1 = require("./context-poisoning");
73
+ Object.defineProperty(exports, "ContextPoisoningDetector", { enumerable: true, get: function () { return context_poisoning_1.ContextPoisoningDetector; } });
74
+ var oci_manifest_1 = require("./oci-manifest");
75
+ Object.defineProperty(exports, "OciManifestAdapter", { enumerable: true, get: function () { return oci_manifest_1.OciManifestAdapter; } });
76
+ var sandbox_1 = require("./sandbox");
77
+ Object.defineProperty(exports, "SessionStatus", { enumerable: true, get: function () { return sandbox_1.SessionStatus; } });
78
+ Object.defineProperty(exports, "ExecutionStatus", { enumerable: true, get: function () { return sandbox_1.ExecutionStatus; } });
79
+ Object.defineProperty(exports, "defaultSandboxConfig", { enumerable: true, get: function () { return sandbox_1.defaultSandboxConfig; } });
80
+ Object.defineProperty(exports, "DockerSandboxProvider", { enumerable: true, get: function () { return sandbox_1.DockerSandboxProvider; } });
81
+ // E2E Encryption (AgentMesh Wire Protocol v1.0)
82
+ var encryption_1 = require("./encryption");
83
+ Object.defineProperty(exports, "X3DHKeyManager", { enumerable: true, get: function () { return encryption_1.X3DHKeyManager; } });
84
+ Object.defineProperty(exports, "generateX25519KeyPair", { enumerable: true, get: function () { return encryption_1.generateX25519KeyPair; } });
85
+ Object.defineProperty(exports, "ed25519ToX25519", { enumerable: true, get: function () { return encryption_1.ed25519ToX25519; } });
86
+ Object.defineProperty(exports, "DoubleRatchet", { enumerable: true, get: function () { return encryption_1.DoubleRatchet; } });
87
+ Object.defineProperty(exports, "SecureChannel", { enumerable: true, get: function () { return encryption_1.SecureChannel; } });
88
+ Object.defineProperty(exports, "MeshClient", { enumerable: true, get: function () { return encryption_1.MeshClient; } });
89
+ Object.defineProperty(exports, "RegistryClient", { enumerable: true, get: function () { return encryption_1.RegistryClient; } });
90
+ Object.defineProperty(exports, "RegistryError", { enumerable: true, get: function () { return encryption_1.RegistryError; } });
91
+ var types_1 = require("./types");
92
+ Object.defineProperty(exports, "ConflictResolutionStrategy", { enumerable: true, get: function () { return types_1.ConflictResolutionStrategy; } });
93
+ Object.defineProperty(exports, "ExecutionRing", { enumerable: true, get: function () { return types_1.ExecutionRing; } });
94
+ Object.defineProperty(exports, "PolicyScope", { enumerable: true, get: function () { return types_1.PolicyScope; } });
95
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,uCAAuC;AACvC,kCAAkC;AAClC,uCAA+F;AAAtF,yGAAA,aAAa,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AAAE,0GAAA,cAAc,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AAC1E,iCAAuC;AAA9B,qGAAA,YAAY,OAAA;AACrB,mCAAgE;AAAvD,sGAAA,YAAY,OAAA;AAAE,gHAAA,sBAAsB,OAAA;AAE7C,qDAM2B;AALzB,gHAAA,aAAa,OAAA;AACb,kHAAA,eAAe,OAAA;AACf,wHAAA,qBAAqB,OAAA;AACrB,mHAAA,gBAAgB,OAAA;AAChB,mHAAA,gBAAgB,OAAA;AAGlB,iCAAsC;AAA7B,oGAAA,WAAW,OAAA;AACpB,mCAA2C;AAAlC,yGAAA,eAAe,OAAA;AACxB,yDAAyF;AAAhF,4HAAA,uBAAuB,OAAA;AAAE,8HAAA,yBAAyB,OAAA;AAC3D,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,qCAMmB;AALjB,yGAAA,cAAc,OAAA;AACd,6GAAA,kBAAkB,OAAA;AAClB,4GAAA,iBAAiB,OAAA;AACjB,qGAAA,UAAU,OAAA;AACV,uGAAA,YAAY,OAAA;AAEd,6BAA0D;AAAjD,yGAAA,kBAAkB,OAAA;AAAE,oGAAA,aAAa,OAAA;AAE1C,yCAA+D;AAAtD,6GAAA,gBAAgB,OAAA;AAAE,2GAAA,cAAc,OAAA;AAEzC,yCAA8C;AAArC,4GAAA,eAAe,OAAA;AACxB,iDAAuD;AAA9C,qGAAA,YAAY,OAAA;AACrB,6CAAmD;AAA1C,iGAAA,UAAU,OAAA;AACnB,mDAA0D;AAAjD,wHAAA,sBAAsB,OAAA;AAC/B,qDAAqD;AACrD,uDAU4B;AAT1B,mHAAA,eAAe,OAAA;AACf,sHAAA,kBAAkB,OAAA;AAClB,oHAAA,gBAAgB,OAAA;AAChB,qHAAA,iBAAiB,OAAA;AACjB,mHAAA,eAAe,OAAA;AACf,+GAAA,WAAW,OAAA;AACX,+GAAA,WAAW,OAAA;AACX,kHAAA,cAAc,OAAA;AACd,+GAAA,WAAW,OAAA;AAab,iCAAwD;AAA/C,qGAAA,YAAY,OAAA;AAAE,wGAAA,eAAe,OAAA;AACtC,mCAA8C;AAArC,4GAAA,kBAAkB,OAAA;AAC3B,mDAAwD;AAA/C,sHAAA,oBAAoB,OAAA;AAC7B,6DAAkE;AAAzD,gIAAA,yBAAyB,OAAA;AAClC,yDAA+D;AAAtD,6HAAA,wBAAwB,OAAA;AACjC,+CAAoD;AAA3C,kHAAA,kBAAkB,OAAA;AAC3B,qCAKmB;AAJjB,wGAAA,aAAa,OAAA;AACb,0GAAA,eAAe,OAAA;AACf,+GAAA,oBAAoB,OAAA;AACpB,gHAAA,qBAAqB,OAAA;AAUvB,gDAAgD;AAChD,2CAOsB;AANpB,4GAAA,cAAc,OAAA;AAAE,mHAAA,qBAAqB,OAAA;AAAE,6GAAA,eAAe,OAAA;AACtD,2GAAA,aAAa,OAAA;AACb,2GAAA,aAAa,OAAA;AACb,wGAAA,UAAU,OAAA;AACV,4GAAA,cAAc,OAAA;AACd,2GAAA,aAAa,OAAA;AAUf,iCAIiB;AAHf,mHAAA,0BAA0B,OAAA;AAC1B,sGAAA,aAAa,OAAA;AACb,oGAAA,WAAW,OAAA"}
@@ -0,0 +1,22 @@
1
+ import { KillSwitchConfig, KillSwitchResult } from './types';
2
+ export interface KillContext {
3
+ action?: string;
4
+ reason: string;
5
+ }
6
+ type KillHandler = (agentId: string, context: KillContext) => void | Promise<void>;
7
+ export declare class KillSwitch {
8
+ private readonly enabled;
9
+ private readonly defaultSubstituteAgentId?;
10
+ private readonly handlers;
11
+ private readonly compensations;
12
+ private readonly substitutes;
13
+ private readonly history;
14
+ constructor(config?: KillSwitchConfig);
15
+ registerHandler(agentId: string, handler: KillHandler): void;
16
+ registerCompensation(agentId: string, handler: KillHandler): void;
17
+ registerSubstitute(agentId: string, substituteAgentId: string): void;
18
+ getHistory(): KillSwitchResult[];
19
+ kill(agentId: string, context: KillContext): Promise<KillSwitchResult>;
20
+ }
21
+ export {};
22
+ //# sourceMappingURL=kill-switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kill-switch.d.ts","sourceRoot":"","sources":["../src/kill-switch.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,KAAK,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnF,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAS;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoC;IAClE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,MAAM,GAAE,gBAAqB;IAKzC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAM5D,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAMjE,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI;IAIpE,UAAU,IAAI,gBAAgB,EAAE;IAI1B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA8B7E"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT License.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.KillSwitch = void 0;
6
+ class KillSwitch {
7
+ enabled;
8
+ defaultSubstituteAgentId;
9
+ handlers = new Map();
10
+ compensations = new Map();
11
+ substitutes = new Map();
12
+ history = [];
13
+ constructor(config = {}) {
14
+ this.enabled = config.enabled ?? true;
15
+ this.defaultSubstituteAgentId = config.defaultSubstituteAgentId;
16
+ }
17
+ registerHandler(agentId, handler) {
18
+ const existing = this.handlers.get(agentId) ?? [];
19
+ existing.push(handler);
20
+ this.handlers.set(agentId, existing);
21
+ }
22
+ registerCompensation(agentId, handler) {
23
+ const existing = this.compensations.get(agentId) ?? [];
24
+ existing.push(handler);
25
+ this.compensations.set(agentId, existing);
26
+ }
27
+ registerSubstitute(agentId, substituteAgentId) {
28
+ this.substitutes.set(agentId, substituteAgentId);
29
+ }
30
+ getHistory() {
31
+ return [...this.history];
32
+ }
33
+ async kill(agentId, context) {
34
+ if (!this.enabled) {
35
+ throw new Error('Kill switch is disabled');
36
+ }
37
+ const handlers = this.handlers.get(agentId) ?? [];
38
+ const compensations = this.compensations.get(agentId) ?? [];
39
+ for (const handler of handlers) {
40
+ await handler(agentId, context);
41
+ }
42
+ for (const compensation of compensations) {
43
+ await compensation(agentId, context);
44
+ }
45
+ const handoffAgentId = this.substitutes.get(agentId) ?? this.defaultSubstituteAgentId;
46
+ const result = {
47
+ agentId,
48
+ action: context.action,
49
+ reason: context.reason,
50
+ killedAt: new Date().toISOString(),
51
+ callbacksExecuted: handlers.length,
52
+ compensationsExecuted: compensations.length,
53
+ handoffAgentId,
54
+ };
55
+ this.history.push(result);
56
+ return result;
57
+ }
58
+ }
59
+ exports.KillSwitch = KillSwitch;
60
+ //# sourceMappingURL=kill-switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kill-switch.js","sourceRoot":"","sources":["../src/kill-switch.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;;AAWlC,MAAa,UAAU;IACJ,OAAO,CAAU;IACjB,wBAAwB,CAAU;IAClC,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC5C,aAAa,GAAG,IAAI,GAAG,EAAyB,CAAC;IACjD,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,OAAO,GAAuB,EAAE,CAAC;IAElD,YAAY,SAA2B,EAAE;QACvC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC;QACtC,IAAI,CAAC,wBAAwB,GAAG,MAAM,CAAC,wBAAwB,CAAC;IAClE,CAAC;IAED,eAAe,CAAC,OAAe,EAAE,OAAoB;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,oBAAoB,CAAC,OAAe,EAAE,OAAoB;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACvD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,kBAAkB,CAAC,OAAe,EAAE,iBAAyB;QAC3D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IACnD,CAAC;IAED,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,OAAoB;QAC9C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAE5D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;QAED,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YACzC,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,wBAAwB,CAAC;QACtF,MAAM,MAAM,GAAqB;YAC/B,OAAO;YACP,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAClC,iBAAiB,EAAE,QAAQ,CAAC,MAAM;YAClC,qBAAqB,EAAE,aAAa,CAAC,MAAM;YAC3C,cAAc;SACf,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA/DD,gCA+DC"}
@@ -0,0 +1,50 @@
1
+ /** Valid lifecycle states for a managed agent. */
2
+ export declare enum LifecycleState {
3
+ Provisioning = "provisioning",
4
+ Active = "active",
5
+ Suspended = "suspended",
6
+ Rotating = "rotating",
7
+ Degraded = "degraded",
8
+ Quarantined = "quarantined",
9
+ Decommissioning = "decommissioning",
10
+ Decommissioned = "decommissioned"
11
+ }
12
+ /** A recorded lifecycle transition event. */
13
+ export interface LifecycleEvent {
14
+ agent_id: string;
15
+ from_state: LifecycleState;
16
+ to_state: LifecycleState;
17
+ reason: string;
18
+ timestamp: string;
19
+ initiated_by: string;
20
+ }
21
+ /**
22
+ * Manages the lifecycle of a single agent, enforcing valid state transitions
23
+ * and maintaining an ordered event log.
24
+ */
25
+ export declare class LifecycleManager {
26
+ private _state;
27
+ private readonly _events;
28
+ private readonly _agentId;
29
+ constructor(agentId: string);
30
+ /** Current lifecycle state. */
31
+ get state(): LifecycleState;
32
+ /** Ordered list of recorded lifecycle events. */
33
+ get events(): LifecycleEvent[];
34
+ /**
35
+ * Transition to `toState`. Throws if the transition is not allowed from
36
+ * the current state.
37
+ */
38
+ transition(toState: LifecycleState, reason: string, initiatedBy: string): LifecycleEvent;
39
+ /** Check whether a transition to `toState` is valid from the current state. */
40
+ canTransition(toState: LifecycleState): boolean;
41
+ /** Activate the agent (from provisioning, suspended, rotating, degraded, or quarantined). */
42
+ activate(reason?: string): LifecycleEvent;
43
+ /** Suspend the agent. */
44
+ suspend(reason: string): LifecycleEvent;
45
+ /** Quarantine the agent due to a security or trust issue. */
46
+ quarantine(reason: string): LifecycleEvent;
47
+ /** Begin decommissioning the agent. */
48
+ decommission(reason: string): LifecycleEvent;
49
+ }
50
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAOA,kDAAkD;AAClD,oBAAY,cAAc;IACxB,YAAY,iBAAiB;IAC7B,MAAM,WAAW;IACjB,SAAS,cAAc;IACvB,QAAQ,aAAa;IACrB,QAAQ,aAAa;IACrB,WAAW,gBAAgB;IAC3B,eAAe,oBAAoB;IACnC,cAAc,mBAAmB;CAClC;AAED,6CAA6C;AAC7C,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,cAAc,CAAC;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAiCD;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAA+C;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,OAAO,EAAE,MAAM;IAI3B,+BAA+B;IAC/B,IAAI,KAAK,IAAI,cAAc,CAE1B;IAED,iDAAiD;IACjD,IAAI,MAAM,IAAI,cAAc,EAAE,CAE7B;IAED;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc;IAqBxF,+EAA+E;IAC/E,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO;IAM/C,6FAA6F;IAC7F,QAAQ,CAAC,MAAM,GAAE,MAA0B,GAAG,cAAc;IAI5D,yBAAyB;IACzB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAIvC,6DAA6D;IAC7D,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAI1C,uCAAuC;IACvC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;CAG7C"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT License.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.LifecycleManager = exports.LifecycleState = void 0;
6
+ // ── Agent Lifecycle Manager ──
7
+ // State-machine that governs an agent's lifecycle from provisioning to
8
+ // decommission, enforcing valid transitions and recording an event log.
9
+ /** Valid lifecycle states for a managed agent. */
10
+ var LifecycleState;
11
+ (function (LifecycleState) {
12
+ LifecycleState["Provisioning"] = "provisioning";
13
+ LifecycleState["Active"] = "active";
14
+ LifecycleState["Suspended"] = "suspended";
15
+ LifecycleState["Rotating"] = "rotating";
16
+ LifecycleState["Degraded"] = "degraded";
17
+ LifecycleState["Quarantined"] = "quarantined";
18
+ LifecycleState["Decommissioning"] = "decommissioning";
19
+ LifecycleState["Decommissioned"] = "decommissioned";
20
+ })(LifecycleState || (exports.LifecycleState = LifecycleState = {}));
21
+ /** Allowed transitions keyed by current state. */
22
+ const VALID_TRANSITIONS = {
23
+ [LifecycleState.Provisioning]: [LifecycleState.Active],
24
+ [LifecycleState.Active]: [
25
+ LifecycleState.Suspended,
26
+ LifecycleState.Rotating,
27
+ LifecycleState.Degraded,
28
+ LifecycleState.Quarantined,
29
+ LifecycleState.Decommissioning,
30
+ ],
31
+ [LifecycleState.Suspended]: [
32
+ LifecycleState.Active,
33
+ LifecycleState.Decommissioning,
34
+ ],
35
+ [LifecycleState.Rotating]: [
36
+ LifecycleState.Active,
37
+ LifecycleState.Degraded,
38
+ ],
39
+ [LifecycleState.Degraded]: [
40
+ LifecycleState.Active,
41
+ LifecycleState.Quarantined,
42
+ LifecycleState.Decommissioning,
43
+ ],
44
+ [LifecycleState.Quarantined]: [
45
+ LifecycleState.Active,
46
+ LifecycleState.Decommissioning,
47
+ ],
48
+ [LifecycleState.Decommissioning]: [LifecycleState.Decommissioned],
49
+ [LifecycleState.Decommissioned]: [],
50
+ };
51
+ /**
52
+ * Manages the lifecycle of a single agent, enforcing valid state transitions
53
+ * and maintaining an ordered event log.
54
+ */
55
+ class LifecycleManager {
56
+ _state = LifecycleState.Provisioning;
57
+ _events = [];
58
+ _agentId;
59
+ constructor(agentId) {
60
+ this._agentId = agentId;
61
+ }
62
+ /** Current lifecycle state. */
63
+ get state() {
64
+ return this._state;
65
+ }
66
+ /** Ordered list of recorded lifecycle events. */
67
+ get events() {
68
+ return [...this._events];
69
+ }
70
+ /**
71
+ * Transition to `toState`. Throws if the transition is not allowed from
72
+ * the current state.
73
+ */
74
+ transition(toState, reason, initiatedBy) {
75
+ if (!this.canTransition(toState)) {
76
+ throw new Error(`Invalid lifecycle transition: ${this._state} → ${toState}`);
77
+ }
78
+ const event = {
79
+ agent_id: this._agentId,
80
+ from_state: this._state,
81
+ to_state: toState,
82
+ reason,
83
+ timestamp: new Date().toISOString(),
84
+ initiated_by: initiatedBy,
85
+ };
86
+ this._state = toState;
87
+ this._events.push(event);
88
+ return event;
89
+ }
90
+ /** Check whether a transition to `toState` is valid from the current state. */
91
+ canTransition(toState) {
92
+ return VALID_TRANSITIONS[this._state].includes(toState);
93
+ }
94
+ // ── Convenience methods ──
95
+ /** Activate the agent (from provisioning, suspended, rotating, degraded, or quarantined). */
96
+ activate(reason = 'Agent activated') {
97
+ return this.transition(LifecycleState.Active, reason, 'system');
98
+ }
99
+ /** Suspend the agent. */
100
+ suspend(reason) {
101
+ return this.transition(LifecycleState.Suspended, reason, 'system');
102
+ }
103
+ /** Quarantine the agent due to a security or trust issue. */
104
+ quarantine(reason) {
105
+ return this.transition(LifecycleState.Quarantined, reason, 'system');
106
+ }
107
+ /** Begin decommissioning the agent. */
108
+ decommission(reason) {
109
+ return this.transition(LifecycleState.Decommissioning, reason, 'system');
110
+ }
111
+ }
112
+ exports.LifecycleManager = LifecycleManager;
113
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;;AAElC,gCAAgC;AAChC,uEAAuE;AACvE,wEAAwE;AAExE,kDAAkD;AAClD,IAAY,cASX;AATD,WAAY,cAAc;IACxB,+CAA6B,CAAA;IAC7B,mCAAiB,CAAA;IACjB,yCAAuB,CAAA;IACvB,uCAAqB,CAAA;IACrB,uCAAqB,CAAA;IACrB,6CAA2B,CAAA;IAC3B,qDAAmC,CAAA;IACnC,mDAAiC,CAAA;AACnC,CAAC,EATW,cAAc,8BAAd,cAAc,QASzB;AAYD,kDAAkD;AAClD,MAAM,iBAAiB,GAA6C;IAClE,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC;IACtD,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;QACvB,cAAc,CAAC,SAAS;QACxB,cAAc,CAAC,QAAQ;QACvB,cAAc,CAAC,QAAQ;QACvB,cAAc,CAAC,WAAW;QAC1B,cAAc,CAAC,eAAe;KAC/B;IACD,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE;QAC1B,cAAc,CAAC,MAAM;QACrB,cAAc,CAAC,eAAe;KAC/B;IACD,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE;QACzB,cAAc,CAAC,MAAM;QACrB,cAAc,CAAC,QAAQ;KACxB;IACD,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE;QACzB,cAAc,CAAC,MAAM;QACrB,cAAc,CAAC,WAAW;QAC1B,cAAc,CAAC,eAAe;KAC/B;IACD,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE;QAC5B,cAAc,CAAC,MAAM;QACrB,cAAc,CAAC,eAAe;KAC/B;IACD,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,CAAC,cAAc,CAAC,cAAc,CAAC;IACjE,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,EAAE;CACpC,CAAC;AAEF;;;GAGG;AACH,MAAa,gBAAgB;IACnB,MAAM,GAAmB,cAAc,CAAC,YAAY,CAAC;IAC5C,OAAO,GAAqB,EAAE,CAAC;IAC/B,QAAQ,CAAS;IAElC,YAAY,OAAe;QACzB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,+BAA+B;IAC/B,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,iDAAiD;IACjD,IAAI,MAAM;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,OAAuB,EAAE,MAAc,EAAE,WAAmB;QACrE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,iCAAiC,IAAI,CAAC,MAAM,MAAM,OAAO,EAAE,CAC5D,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAmB;YAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,MAAM;YACvB,QAAQ,EAAE,OAAO;YACjB,MAAM;YACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,YAAY,EAAE,WAAW;SAC1B,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,+EAA+E;IAC/E,aAAa,CAAC,OAAuB;QACnC,OAAO,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,4BAA4B;IAE5B,6FAA6F;IAC7F,QAAQ,CAAC,SAAiB,iBAAiB;QACzC,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,yBAAyB;IACzB,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACrE,CAAC;IAED,6DAA6D;IAC7D,UAAU,CAAC,MAAc;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvE,CAAC;IAED,uCAAuC;IACvC,YAAY,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3E,CAAC;CACF;AAtED,4CAsEC"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,41 @@
1
+ /** Threat categories recognised by the scanner. */
2
+ export declare enum McpThreatType {
3
+ ToolPoisoning = "tool_poisoning",
4
+ Typosquatting = "typosquatting",
5
+ HiddenInstruction = "hidden_instruction",
6
+ RugPull = "rug_pull"
7
+ }
8
+ /** A single threat detected during a scan. */
9
+ export interface McpThreat {
10
+ type: McpThreatType;
11
+ severity: 'low' | 'medium' | 'high' | 'critical';
12
+ description: string;
13
+ evidence?: string;
14
+ }
15
+ /** Result of scanning one MCP tool definition. */
16
+ export interface McpScanResult {
17
+ tool_name: string;
18
+ threats: McpThreat[];
19
+ risk_score: number;
20
+ safe: boolean;
21
+ }
22
+ /** Minimal MCP tool definition accepted by the scanner. */
23
+ export interface McpToolDefinition {
24
+ name: string;
25
+ description: string;
26
+ parameters?: Record<string, unknown>;
27
+ }
28
+ /**
29
+ * Scans MCP tool definitions for security threats.
30
+ */
31
+ export declare class McpSecurityScanner {
32
+ /** Scan a single tool definition. */
33
+ scan(toolDefinition: McpToolDefinition): McpScanResult;
34
+ /** Scan multiple tool definitions. */
35
+ scanAll(tools: McpToolDefinition[]): McpScanResult[];
36
+ private detectToolPoisoning;
37
+ private detectTyposquatting;
38
+ private detectHiddenInstructions;
39
+ private detectRugPull;
40
+ }
41
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAOA,mDAAmD;AACnD,oBAAY,aAAa;IACvB,aAAa,mBAAmB;IAChC,aAAa,kBAAkB;IAC/B,iBAAiB,uBAAuB;IACxC,OAAO,aAAa;CACrB;AAED,8CAA8C;AAC9C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,2DAA2D;AAC3D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AA4GD;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,qCAAqC;IACrC,IAAI,CAAC,cAAc,EAAE,iBAAiB,GAAG,aAAa;IAqBtD,sCAAsC;IACtC,OAAO,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,aAAa,EAAE;IAMpD,OAAO,CAAC,mBAAmB;IAmC3B,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,wBAAwB;IA8BhC,OAAO,CAAC,aAAa;CAmBtB"}
package/dist/mcp.js ADDED
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT License.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.McpSecurityScanner = exports.McpThreatType = void 0;
6
+ // ── MCP Security Scanner ──
7
+ // Detects tool-poisoning, typosquatting, hidden-instruction, and rug-pull
8
+ // threats in MCP tool definitions.
9
+ /** Threat categories recognised by the scanner. */
10
+ var McpThreatType;
11
+ (function (McpThreatType) {
12
+ McpThreatType["ToolPoisoning"] = "tool_poisoning";
13
+ McpThreatType["Typosquatting"] = "typosquatting";
14
+ McpThreatType["HiddenInstruction"] = "hidden_instruction";
15
+ McpThreatType["RugPull"] = "rug_pull";
16
+ })(McpThreatType || (exports.McpThreatType = McpThreatType = {}));
17
+ // ── Well-known tool names for typosquatting detection ──
18
+ const KNOWN_TOOL_NAMES = [
19
+ 'read_file',
20
+ 'write_file',
21
+ 'execute_command',
22
+ 'search',
23
+ 'browse',
24
+ 'fetch',
25
+ 'list_directory',
26
+ 'create_file',
27
+ 'delete_file',
28
+ 'run_script',
29
+ 'get_weather',
30
+ 'send_email',
31
+ 'query_database',
32
+ 'http_request',
33
+ 'calculator',
34
+ ];
35
+ // ── Detection helpers ──
36
+ /** Patterns that suggest prompt-injection / tool-poisoning. */
37
+ const POISONING_PATTERNS = [
38
+ /<system>/i,
39
+ /ignore previous/i,
40
+ /you must/i,
41
+ /disregard/i,
42
+ /override/i,
43
+ /forget (all|your|previous)/i,
44
+ /new instructions/i,
45
+ /act as/i,
46
+ ];
47
+ /** Unicode zero-width and homoglyph code-points. */
48
+ const ZERO_WIDTH_CHARS = [
49
+ '\u200B', // zero-width space
50
+ '\u200C', // zero-width non-joiner
51
+ '\u200D', // zero-width joiner
52
+ '\uFEFF', // BOM / zero-width no-break space
53
+ '\u00AD', // soft hyphen
54
+ '\u2060', // word joiner
55
+ '\u180E', // Mongolian vowel separator
56
+ ];
57
+ /** Common Cyrillic / Greek homoglyphs for Latin letters. */
58
+ const HOMOGLYPH_MAP = {
59
+ '\u0430': 'a', // Cyrillic а
60
+ '\u0435': 'e', // Cyrillic е
61
+ '\u043E': 'o', // Cyrillic о
62
+ '\u0440': 'p', // Cyrillic р
63
+ '\u0441': 'c', // Cyrillic с
64
+ '\u0443': 'y', // Cyrillic у
65
+ '\u0445': 'x', // Cyrillic х
66
+ '\u0456': 'i', // Cyrillic і
67
+ '\u0458': 'j', // Cyrillic ј
68
+ '\u03B1': 'a', // Greek α
69
+ '\u03BF': 'o', // Greek ο
70
+ '\u03C1': 'p', // Greek ρ
71
+ };
72
+ /** Instruction-like patterns used for rug-pull detection. */
73
+ const INSTRUCTION_PATTERNS = [
74
+ /you (should|must|need to)/i,
75
+ /always /i,
76
+ /never /i,
77
+ /do not /i,
78
+ /important:/i,
79
+ /warning:/i,
80
+ /note:/i,
81
+ /step \d/i,
82
+ /first,/i,
83
+ /finally,/i,
84
+ ];
85
+ const RUG_PULL_DESCRIPTION_LENGTH = 500;
86
+ const RUG_PULL_MIN_INSTRUCTION_MATCHES = 2;
87
+ // ── Levenshtein distance ──
88
+ function levenshtein(a, b) {
89
+ const m = a.length;
90
+ const n = b.length;
91
+ const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
92
+ for (let i = 0; i <= m; i++)
93
+ dp[i][0] = i;
94
+ for (let j = 0; j <= n; j++)
95
+ dp[0][j] = j;
96
+ for (let i = 1; i <= m; i++) {
97
+ for (let j = 1; j <= n; j++) {
98
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
99
+ dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);
100
+ }
101
+ }
102
+ return dp[m][n];
103
+ }
104
+ // ── Severity scoring weights ──
105
+ const SEVERITY_WEIGHT = {
106
+ low: 10,
107
+ medium: 25,
108
+ high: 50,
109
+ critical: 80,
110
+ };
111
+ // ── McpSecurityScanner ──
112
+ /**
113
+ * Scans MCP tool definitions for security threats.
114
+ */
115
+ class McpSecurityScanner {
116
+ /** Scan a single tool definition. */
117
+ scan(toolDefinition) {
118
+ const threats = [];
119
+ this.detectToolPoisoning(toolDefinition, threats);
120
+ this.detectTyposquatting(toolDefinition, threats);
121
+ this.detectHiddenInstructions(toolDefinition, threats);
122
+ this.detectRugPull(toolDefinition, threats);
123
+ const risk_score = Math.min(100, threats.reduce((sum, t) => sum + SEVERITY_WEIGHT[t.severity], 0));
124
+ return {
125
+ tool_name: toolDefinition.name,
126
+ threats,
127
+ risk_score,
128
+ safe: threats.length === 0,
129
+ };
130
+ }
131
+ /** Scan multiple tool definitions. */
132
+ scanAll(tools) {
133
+ return tools.map((t) => this.scan(t));
134
+ }
135
+ // ── Private detection methods ──
136
+ detectToolPoisoning(tool, threats) {
137
+ const text = tool.description;
138
+ for (const pattern of POISONING_PATTERNS) {
139
+ const match = pattern.exec(text);
140
+ if (match) {
141
+ threats.push({
142
+ type: McpThreatType.ToolPoisoning,
143
+ severity: 'critical',
144
+ description: `Prompt-injection pattern detected in tool description: "${match[0]}"`,
145
+ evidence: match[0],
146
+ });
147
+ }
148
+ }
149
+ // Detect encoded characters (percent-encoded payloads)
150
+ if (/%[0-9A-Fa-f]{2}/.test(text)) {
151
+ try {
152
+ const decoded = decodeURIComponent(text);
153
+ for (const pattern of POISONING_PATTERNS) {
154
+ const match = pattern.exec(decoded);
155
+ if (match) {
156
+ threats.push({
157
+ type: McpThreatType.ToolPoisoning,
158
+ severity: 'critical',
159
+ description: `Encoded prompt-injection detected after URL-decoding: "${match[0]}"`,
160
+ evidence: match[0],
161
+ });
162
+ }
163
+ }
164
+ }
165
+ catch {
166
+ // malformed encoding – not a threat by itself
167
+ }
168
+ }
169
+ }
170
+ detectTyposquatting(tool, threats) {
171
+ const name = tool.name.toLowerCase();
172
+ for (const known of KNOWN_TOOL_NAMES) {
173
+ if (name === known)
174
+ continue; // exact match is fine
175
+ const dist = levenshtein(name, known);
176
+ if (dist > 0 && dist <= 2) {
177
+ threats.push({
178
+ type: McpThreatType.Typosquatting,
179
+ severity: dist === 1 ? 'high' : 'medium',
180
+ description: `Tool name "${tool.name}" is suspiciously similar to known tool "${known}" (edit distance ${dist})`,
181
+ evidence: known,
182
+ });
183
+ }
184
+ }
185
+ }
186
+ detectHiddenInstructions(tool, threats) {
187
+ const text = tool.description;
188
+ // Zero-width characters
189
+ for (const zwc of ZERO_WIDTH_CHARS) {
190
+ if (text.includes(zwc)) {
191
+ threats.push({
192
+ type: McpThreatType.HiddenInstruction,
193
+ severity: 'high',
194
+ description: `Zero-width character U+${zwc.codePointAt(0).toString(16).toUpperCase().padStart(4, '0')} found in description`,
195
+ evidence: `U+${zwc.codePointAt(0).toString(16).toUpperCase().padStart(4, '0')}`,
196
+ });
197
+ break; // one finding per category is enough
198
+ }
199
+ }
200
+ // Homoglyphs
201
+ for (const ch of text) {
202
+ if (HOMOGLYPH_MAP[ch]) {
203
+ threats.push({
204
+ type: McpThreatType.HiddenInstruction,
205
+ severity: 'high',
206
+ description: `Homoglyph character detected: "${ch}" looks like "${HOMOGLYPH_MAP[ch]}" but is a different Unicode code point`,
207
+ evidence: ch,
208
+ });
209
+ break; // one finding per category is enough
210
+ }
211
+ }
212
+ }
213
+ detectRugPull(tool, threats) {
214
+ const text = tool.description;
215
+ if (text.length <= RUG_PULL_DESCRIPTION_LENGTH)
216
+ return;
217
+ let instructionMatches = 0;
218
+ for (const pattern of INSTRUCTION_PATTERNS) {
219
+ if (pattern.test(text))
220
+ instructionMatches++;
221
+ }
222
+ if (instructionMatches >= RUG_PULL_MIN_INSTRUCTION_MATCHES) {
223
+ threats.push({
224
+ type: McpThreatType.RugPull,
225
+ severity: 'medium',
226
+ description: `Unusually long description (${text.length} chars) with ${instructionMatches} instruction-like patterns — possible rug-pull payload`,
227
+ evidence: `length=${text.length}, instruction_patterns=${instructionMatches}`,
228
+ });
229
+ }
230
+ }
231
+ }
232
+ exports.McpSecurityScanner = McpSecurityScanner;
233
+ //# sourceMappingURL=mcp.js.map