@mondaydotcomorg/atp-provenance 0.17.14

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.
package/dist/tokens.js ADDED
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Provenance Token System
3
+ *
4
+ * Cryptographically-signed tokens for multi-step provenance tracking
5
+ */
6
+ import crypto from 'crypto';
7
+ import { nanoid } from 'nanoid';
8
+ const MAX_VALUE_SIZE = 1024 * 1024; // 1MB
9
+ /**
10
+ * Deterministic JSON stringification with sorted keys
11
+ */
12
+ export function stableStringify(value) {
13
+ try {
14
+ if (value === null || value === undefined) {
15
+ return String(value);
16
+ }
17
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
18
+ return JSON.stringify(value);
19
+ }
20
+ if (typeof value === 'function' || typeof value === 'symbol') {
21
+ return null;
22
+ }
23
+ const seen = new WeakSet();
24
+ const replacer = (_key, val) => {
25
+ if (val !== null && typeof val === 'object') {
26
+ if (seen.has(val)) {
27
+ return '[Circular]';
28
+ }
29
+ seen.add(val);
30
+ if (!Array.isArray(val)) {
31
+ const sorted = {};
32
+ const keys = Object.keys(val).sort();
33
+ for (const k of keys) {
34
+ sorted[k] = val[k];
35
+ }
36
+ return sorted;
37
+ }
38
+ }
39
+ return val;
40
+ };
41
+ const result = JSON.stringify(value, replacer);
42
+ if (result.length > MAX_VALUE_SIZE) {
43
+ return null;
44
+ }
45
+ return result;
46
+ }
47
+ catch (error) {
48
+ return null;
49
+ }
50
+ }
51
+ /**
52
+ * Compute SHA-256 digest of value
53
+ */
54
+ export function computeDigest(value) {
55
+ const serialized = stableStringify(value);
56
+ if (!serialized) {
57
+ return null;
58
+ }
59
+ return crypto.createHash('sha256').update(serialized).digest('base64url');
60
+ }
61
+ /**
62
+ * Get client secret (Phase 1: single secret from env)
63
+ */
64
+ export function getClientSecret(clientId) {
65
+ const secret = process.env.PROVENANCE_SECRET;
66
+ if (!secret) {
67
+ throw new Error('PROVENANCE_SECRET environment variable is required for provenance tracking. ' +
68
+ 'Generate a strong secret with: openssl rand -base64 32');
69
+ }
70
+ // Validate secret length - must be at least 32 bytes
71
+ // Base64 encoding: 32 bytes = 44 chars, but we'll check raw byte length
72
+ const secretBytes = Buffer.from(secret, 'utf-8').length;
73
+ if (secretBytes < 32) {
74
+ throw new Error(`PROVENANCE_SECRET must be at least 32 bytes (currently ${secretBytes} bytes). ` +
75
+ 'Generate a strong secret with: openssl rand -base64 32');
76
+ }
77
+ return secret;
78
+ }
79
+ /**
80
+ * Generate HMAC signature
81
+ */
82
+ function hmacSign(data, secret) {
83
+ return crypto.createHmac('sha256', secret).update(data).digest('base64url');
84
+ }
85
+ /**
86
+ * Issue a provenance token for a value
87
+ */
88
+ export async function issueProvenanceToken(metadata, value, clientId, executionId, cacheProvider, ttl = 3600) {
89
+ const valueDigest = computeDigest(value);
90
+ if (!valueDigest) {
91
+ return null;
92
+ }
93
+ const metaId = nanoid();
94
+ const cacheKey = `prov:meta:${clientId}:${metaId}`;
95
+ try {
96
+ await cacheProvider.set(cacheKey, JSON.stringify(metadata), ttl);
97
+ if (typeof value === 'string' || typeof value === 'number') {
98
+ const valueKey = `prov:value:${clientId}:${valueDigest}`;
99
+ await cacheProvider.set(valueKey, JSON.stringify({ value: String(value), metaId }), ttl);
100
+ }
101
+ }
102
+ catch (error) {
103
+ console.error('Failed to store provenance metadata in cache:', error);
104
+ return null;
105
+ }
106
+ const payload = {
107
+ v: 1,
108
+ clientId,
109
+ executionId,
110
+ createdAt: Date.now(),
111
+ expiresAt: Date.now() + ttl * 1000,
112
+ valueDigest,
113
+ metaId,
114
+ };
115
+ const payloadStr = JSON.stringify(payload);
116
+ const payloadB64 = Buffer.from(payloadStr).toString('base64url');
117
+ const secret = getClientSecret(clientId);
118
+ const signature = hmacSign(payloadB64, secret);
119
+ return `${payloadB64}.${signature}`;
120
+ }
121
+ /**
122
+ * Verify and extract provenance from a token
123
+ */
124
+ export async function verifyProvenanceToken(token, value, clientId, executionId, cacheProvider) {
125
+ try {
126
+ const parts = token.split('.');
127
+ if (parts.length !== 2) {
128
+ return null;
129
+ }
130
+ const [payloadB64, signature] = parts;
131
+ if (!payloadB64 || !signature) {
132
+ return null;
133
+ }
134
+ const secret = getClientSecret(clientId);
135
+ const expectedSig = hmacSign(payloadB64, secret);
136
+ // Use constant-time comparison to prevent timing attacks
137
+ try {
138
+ const sigBuf = Buffer.from(signature, 'base64url');
139
+ const expectedBuf = Buffer.from(expectedSig, 'base64url');
140
+ if (sigBuf.length !== expectedBuf.length || !crypto.timingSafeEqual(sigBuf, expectedBuf)) {
141
+ console.error('Token signature verification failed');
142
+ return null;
143
+ }
144
+ }
145
+ catch (error) {
146
+ console.error('Token signature comparison error:', error);
147
+ return null;
148
+ }
149
+ const payloadStr = Buffer.from(payloadB64, 'base64url').toString();
150
+ const payload = JSON.parse(payloadStr);
151
+ if (payload.v !== 1) {
152
+ console.error('Unsupported token version:', payload.v);
153
+ return null;
154
+ }
155
+ if (payload.clientId !== clientId) {
156
+ console.error('Token clientId mismatch:', payload.clientId, 'vs', clientId);
157
+ return null;
158
+ }
159
+ if (payload.executionId !== executionId) {
160
+ console.error('Token executionId mismatch:', payload.executionId, 'vs', executionId);
161
+ return null;
162
+ }
163
+ if (Date.now() > payload.expiresAt) {
164
+ console.warn('Token expired');
165
+ return null;
166
+ }
167
+ const valueDigest = computeDigest(value);
168
+ if (!valueDigest || valueDigest !== payload.valueDigest) {
169
+ console.warn('Token value digest mismatch (value may have been modified)');
170
+ return null;
171
+ }
172
+ const cacheKey = `prov:meta:${payload.clientId}:${payload.metaId}`;
173
+ const metaStr = await cacheProvider.get(cacheKey);
174
+ if (!metaStr || typeof metaStr !== 'string') {
175
+ console.warn('Token metadata not found in cache (expired or evicted)');
176
+ return null;
177
+ }
178
+ const metadata = JSON.parse(metaStr);
179
+ return metadata;
180
+ }
181
+ catch (error) {
182
+ console.error('Token verification error:', error);
183
+ return null;
184
+ }
185
+ }
186
+ /**
187
+ * Verify multiple hints and build a digest → metadata map
188
+ * Returns map for O(1) lookup during re-attachment
189
+ * ALSO returns a value → metadata map for substring matching
190
+ */
191
+ export async function verifyProvenanceHints(hints, clientId, executionId, cacheProvider, maxHints = 1000) {
192
+ const map = new Map();
193
+ const hintsToProcess = hints.slice(0, maxHints);
194
+ if (hints.length > maxHints) {
195
+ console.warn(`Capped provenance hints from ${hints.length} to ${maxHints}`);
196
+ }
197
+ const timeout = 100;
198
+ const promises = hintsToProcess.map(async (token) => {
199
+ try {
200
+ const parts = token.split('.');
201
+ if (parts.length !== 2)
202
+ return;
203
+ const [payloadB64] = parts;
204
+ if (!payloadB64)
205
+ return;
206
+ const payloadStr = Buffer.from(payloadB64, 'base64url').toString();
207
+ const payload = JSON.parse(payloadStr);
208
+ const cacheKey = `prov:meta:${payload.clientId}:${payload.metaId}`;
209
+ const fetchPromise = cacheProvider.get(cacheKey);
210
+ const timeoutPromise = new Promise((resolve) => setTimeout(() => resolve(null), timeout));
211
+ const metaStr = await Promise.race([fetchPromise, timeoutPromise]);
212
+ if (metaStr && typeof metaStr === 'string') {
213
+ const metadata = JSON.parse(metaStr);
214
+ map.set(payload.valueDigest, metadata);
215
+ const valueKey = `prov:value:${payload.clientId}:${payload.valueDigest}`;
216
+ const valueStr = await Promise.race([
217
+ cacheProvider.get(valueKey),
218
+ new Promise((resolve) => setTimeout(() => resolve(null), timeout)),
219
+ ]);
220
+ if (valueStr && typeof valueStr === 'string') {
221
+ try {
222
+ const { value } = JSON.parse(valueStr);
223
+ map.__valueMap = map.__valueMap || new Map();
224
+ map.__valueMap.set(value, metadata);
225
+ }
226
+ catch (e) {
227
+ // Value parsing failed, skip
228
+ }
229
+ }
230
+ }
231
+ }
232
+ catch (error) {
233
+ // Skip invalid tokens silently
234
+ }
235
+ });
236
+ await Promise.all(promises);
237
+ return map;
238
+ }
239
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Provenance Tracking Types
3
+ *
4
+ * Implements CAMEL-inspired data provenance tracking for prompt injection defense.
5
+
6
+ /**
7
+ * Provenance tracking mode enum
8
+ */
9
+ export declare enum ProvenanceMode {
10
+ /** No provenance tracking - zero overhead */
11
+ NONE = "none",
12
+ /** Proxy-based tracking - runtime tracking */
13
+ PROXY = "proxy",
14
+ /** AST instrumentation - compile-time tracking */
15
+ AST = "ast"
16
+ }
17
+ /**
18
+ * Data source types
19
+ */
20
+ export declare enum ProvenanceSource {
21
+ /** Direct from user input (trusted) */
22
+ USER = "user",
23
+ /** From LLM generation */
24
+ LLM = "llm",
25
+ /** From tool execution */
26
+ TOOL = "tool",
27
+ /** Generated by runtime/system */
28
+ SYSTEM = "system"
29
+ }
30
+ /**
31
+ * Tool source metadata
32
+ */
33
+ export interface ToolSource {
34
+ type: ProvenanceSource.TOOL;
35
+ toolName: string;
36
+ apiGroup: string;
37
+ timestamp: number;
38
+ }
39
+ /**
40
+ * LLM source metadata
41
+ */
42
+ export interface LLMSource {
43
+ type: ProvenanceSource.LLM;
44
+ operation: 'call' | 'extract' | 'classify';
45
+ timestamp: number;
46
+ }
47
+ /**
48
+ * User source metadata
49
+ */
50
+ export interface UserSource {
51
+ type: ProvenanceSource.USER;
52
+ timestamp: number;
53
+ }
54
+ /**
55
+ * System source metadata
56
+ */
57
+ export interface SystemSource {
58
+ type: ProvenanceSource.SYSTEM;
59
+ operation: string;
60
+ timestamp: number;
61
+ }
62
+ /**
63
+ * Source metadata union
64
+ */
65
+ export type SourceMetadata = ToolSource | LLMSource | UserSource | SystemSource;
66
+ /**
67
+ * Reader permissions - who can access this data
68
+ */
69
+ export type ReaderPermissions = {
70
+ type: 'public';
71
+ } | {
72
+ type: 'restricted';
73
+ readers: string[];
74
+ };
75
+ /**
76
+ * Complete provenance metadata
77
+ */
78
+ export interface ProvenanceMetadata {
79
+ /** Where this data came from */
80
+ source: SourceMetadata;
81
+ /** Who can read this data */
82
+ readers: ReaderPermissions;
83
+ /** Chain of dependencies (for tracking data flow) */
84
+ dependencies?: string[];
85
+ /** Unique identifier for this provenance record */
86
+ id: string;
87
+ /** Additional context */
88
+ context?: Record<string, unknown>;
89
+ }
90
+ /**
91
+ * Serialized provenance state for pause/resume
92
+ */
93
+ export interface ProvenanceState {
94
+ registry: Array<[string, ProvenanceMetadata]>;
95
+ }
96
+ /**
97
+ * Enhanced provenance snapshot including primitive taints
98
+ * Used for cross-execution token persistence
99
+ */
100
+ export interface ProvenanceSnapshot {
101
+ /** Object provenance registry */
102
+ registry: Array<[string, ProvenanceMetadata]>;
103
+ /** Primitive taint mappings */
104
+ primitives: Array<[string, ProvenanceMetadata]>;
105
+ }
106
+ /**
107
+ * Policy action types
108
+ * - log: Allow operation but log security event for audit
109
+ * - approve: Pause and request human approval
110
+ * - block: Deny operation immediately
111
+ */
112
+ export type PolicyAction = 'log' | 'approve' | 'block';
113
+ /**
114
+ * Security policy result
115
+ */
116
+ export interface PolicyResult {
117
+ /** @deprecated Use action instead */
118
+ allowed?: boolean;
119
+ /**
120
+ * Action to take:
121
+ * - log: Allow but audit (permissive monitoring)
122
+ * - approve: Request human approval (interactive gating)
123
+ * - block: Deny immediately (maximum security)
124
+ */
125
+ action: PolicyAction;
126
+ /** Human-readable reason for the action */
127
+ reason?: string;
128
+ /** Policy name that produced this result */
129
+ policy?: string;
130
+ /** Additional context for approval UI (when action='approve') or audit log */
131
+ context?: Record<string, unknown>;
132
+ }
133
+ /**
134
+ * Security policy interface
135
+ */
136
+ export interface SecurityPolicy {
137
+ name: string;
138
+ description?: string;
139
+ check: (toolName: string, args: Record<string, unknown>, getProvenance: (value: unknown) => ProvenanceMetadata | null) => PolicyResult | Promise<PolicyResult>;
140
+ }
141
+ /**
142
+ * Provenance security policy violation error
143
+ */
144
+ export declare class ProvenanceSecurityError extends Error {
145
+ policy: string;
146
+ toolName: string;
147
+ details?: Record<string, unknown> | undefined;
148
+ constructor(message: string, policy: string, toolName: string, details?: Record<string, unknown> | undefined);
149
+ }
150
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Provenance Tracking Types
3
+ *
4
+ * Implements CAMEL-inspired data provenance tracking for prompt injection defense.
5
+
6
+ /**
7
+ * Provenance tracking mode enum
8
+ */
9
+ export var ProvenanceMode;
10
+ (function (ProvenanceMode) {
11
+ /** No provenance tracking - zero overhead */
12
+ ProvenanceMode["NONE"] = "none";
13
+ /** Proxy-based tracking - runtime tracking */
14
+ ProvenanceMode["PROXY"] = "proxy";
15
+ /** AST instrumentation - compile-time tracking */
16
+ ProvenanceMode["AST"] = "ast";
17
+ })(ProvenanceMode || (ProvenanceMode = {}));
18
+ /**
19
+ * Data source types
20
+ */
21
+ export var ProvenanceSource;
22
+ (function (ProvenanceSource) {
23
+ /** Direct from user input (trusted) */
24
+ ProvenanceSource["USER"] = "user";
25
+ /** From LLM generation */
26
+ ProvenanceSource["LLM"] = "llm";
27
+ /** From tool execution */
28
+ ProvenanceSource["TOOL"] = "tool";
29
+ /** Generated by runtime/system */
30
+ ProvenanceSource["SYSTEM"] = "system";
31
+ })(ProvenanceSource || (ProvenanceSource = {}));
32
+ /**
33
+ * Provenance security policy violation error
34
+ */
35
+ export class ProvenanceSecurityError extends Error {
36
+ policy;
37
+ toolName;
38
+ details;
39
+ constructor(message, policy, toolName, details) {
40
+ super(message);
41
+ this.policy = policy;
42
+ this.toolName = toolName;
43
+ this.details = details;
44
+ this.name = 'ProvenanceSecurityError';
45
+ }
46
+ }
47
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAN,IAAY,cAOX;AAPD,WAAY,cAAc;IACzB,6CAA6C;IAC7C,+BAAa,CAAA;IACb,8CAA8C;IAC9C,iCAAe,CAAA;IACf,kDAAkD;IAClD,6BAAW,CAAA;AACZ,CAAC,EAPW,cAAc,KAAd,cAAc,QAOzB;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,gBASX;AATD,WAAY,gBAAgB;IAC3B,uCAAuC;IACvC,iCAAa,CAAA;IACb,0BAA0B;IAC1B,+BAAW,CAAA;IACX,0BAA0B;IAC1B,iCAAa,CAAA;IACb,kCAAkC;IAClC,qCAAiB,CAAA;AAClB,CAAC,EATW,gBAAgB,KAAhB,gBAAgB,QAS3B;AAoID;;GAEG;AACH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAGzC;IACA;IACA;IAJR,YACC,OAAe,EACR,MAAc,EACd,QAAgB,EAChB,OAAiC;QAExC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJR,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAQ;QAChB,YAAO,GAAP,OAAO,CAA0B;QAGxC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACvC,CAAC;CACD"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@mondaydotcomorg/atp-provenance",
3
+ "version": "0.17.14",
4
+ "description": "CAMEL-inspired provenance security for LLM applications - track data origin and enforce security policies",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "type": "module",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "test": "jest",
21
+ "lint": "tsc --noEmit",
22
+ "clean": "rm -rf dist"
23
+ },
24
+ "keywords": [
25
+ "provenance",
26
+ "security",
27
+ "llm",
28
+ "prompt-injection",
29
+ "camel",
30
+ "agent",
31
+ "capability-based-security"
32
+ ],
33
+ "author": "Agent Tool Protocol Team",
34
+ "license": "MIT",
35
+ "dependencies": {
36
+ "acorn": "^8.11.0",
37
+ "acorn-walk": "^8.3.0",
38
+ "escodegen": "^2.1.0",
39
+ "nanoid": "^5.0.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/escodegen": "^0.0.10",
43
+ "@types/node": "^20.10.0",
44
+ "typescript": "^5.3.0"
45
+ },
46
+ "repository": {
47
+ "type": "git",
48
+ "url": "https://github.com/your-org/agent-tool-protocol.git",
49
+ "directory": "packages/provenance"
50
+ }
51
+ }