@amtp/protocol 1.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 (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +386 -0
  3. package/USAGE_GUIDE.md +722 -0
  4. package/bin/amtp.ts +387 -0
  5. package/dist/client/amtp-client.d.ts +164 -0
  6. package/dist/client/amtp-client.js +460 -0
  7. package/dist/client/amtp-client.js.map +1 -0
  8. package/dist/client/examples/basic-client.d.ts +6 -0
  9. package/dist/client/examples/basic-client.js +35 -0
  10. package/dist/client/examples/basic-client.js.map +1 -0
  11. package/dist/crawler/amtp-crawler.d.ts +125 -0
  12. package/dist/crawler/amtp-crawler.js +359 -0
  13. package/dist/crawler/amtp-crawler.js.map +1 -0
  14. package/dist/crawler/examples/basic-crawler.d.ts +6 -0
  15. package/dist/crawler/examples/basic-crawler.js +28 -0
  16. package/dist/crawler/examples/basic-crawler.js.map +1 -0
  17. package/dist/index.d.ts +15 -0
  18. package/dist/index.js +70 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/server/adapters/fastify-adapter.d.ts +86 -0
  21. package/dist/server/adapters/fastify-adapter.js +169 -0
  22. package/dist/server/adapters/fastify-adapter.js.map +1 -0
  23. package/dist/server/amtp-ql-executor.d.ts +24 -0
  24. package/dist/server/amtp-ql-executor.js +198 -0
  25. package/dist/server/amtp-ql-executor.js.map +1 -0
  26. package/dist/server/amtp-ql-parser.d.ts +30 -0
  27. package/dist/server/amtp-ql-parser.js +212 -0
  28. package/dist/server/amtp-ql-parser.js.map +1 -0
  29. package/dist/server/amtp-server.d.ts +183 -0
  30. package/dist/server/amtp-server.js +650 -0
  31. package/dist/server/amtp-server.js.map +1 -0
  32. package/dist/server/examples/basic-server.d.ts +6 -0
  33. package/dist/server/examples/basic-server.js +215 -0
  34. package/dist/server/examples/basic-server.js.map +1 -0
  35. package/dist/server/examples/saas-dashboard-server.d.ts +44 -0
  36. package/dist/server/examples/saas-dashboard-server.js +387 -0
  37. package/dist/server/examples/saas-dashboard-server.js.map +1 -0
  38. package/dist/server/markdown-parser.d.ts +31 -0
  39. package/dist/server/markdown-parser.js +463 -0
  40. package/dist/server/markdown-parser.js.map +1 -0
  41. package/dist/server/notifications.d.ts +40 -0
  42. package/dist/server/notifications.js +134 -0
  43. package/dist/server/notifications.js.map +1 -0
  44. package/dist/server/permissions.d.ts +40 -0
  45. package/dist/server/permissions.js +156 -0
  46. package/dist/server/permissions.js.map +1 -0
  47. package/dist/server/security.d.ts +127 -0
  48. package/dist/server/security.js +368 -0
  49. package/dist/server/security.js.map +1 -0
  50. package/dist/types/amtp.types.d.ts +720 -0
  51. package/dist/types/amtp.types.js +224 -0
  52. package/dist/types/amtp.types.js.map +1 -0
  53. package/package.json +89 -0
@@ -0,0 +1,368 @@
1
+ "use strict";
2
+ /**
3
+ * AMTP Security Utilities
4
+ * Centralized security utilities for the AMTP protocol
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.sanitizeFreeText = exports.sanitizeHttpMethod = exports.sanitizeEndpoint = exports.sanitizeActionId = exports.isValidCsrfToken = exports.generateCsrfToken = exports.csrfHeaderName = exports.isValidSessionId = exports.readBodyWithLimit = exports.DEFAULT_MAX_BODY_SIZE = exports.SecurityError = exports.MAX_SESSION_LIFETIME_MS = exports.DEFAULT_SESSION_TIMEOUT_MS = exports.InMemoryRateLimiter = exports.AMTP_SECURITY_HEADERS = exports.validateTextField = exports.sanitizeHtml = exports.validateUrl = exports.XSS_PATTERNS = exports.ALLOWED_URL_SCHEMES = exports.generateSecureRequestId = exports.AMTP_REQUEST_ID_PREFIX = exports.generateSecureSessionId = exports.AMTP_SESSION_ID_PREFIX = exports.secureRandomString = void 0;
8
+ const stream_1 = require("stream");
9
+ // ---- CRYPTO-HARDENED RANDOM GENERATION ----
10
+ /**
11
+ * Generate a cryptographically secure random string
12
+ * Replaces Math.random()-based session and request IDs
13
+ */
14
+ function secureRandomString(length = 24) {
15
+ return crypto.getRandomValues(new Uint8Array(length))
16
+ .reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), "");
17
+ }
18
+ exports.secureRandomString = secureRandomString;
19
+ /** Session ID prefix for AMTP */
20
+ exports.AMTP_SESSION_ID_PREFIX = "sess_";
21
+ /** Generate a secure AMTP session ID */
22
+ function generateSecureSessionId() {
23
+ return `${exports.AMTP_SESSION_ID_PREFIX}${secureRandomString(20)}`;
24
+ }
25
+ exports.generateSecureSessionId = generateSecureSessionId;
26
+ /** Request ID prefix for AMTP */
27
+ exports.AMTP_REQUEST_ID_PREFIX = "req_";
28
+ /** Generate a secure AMTP request ID */
29
+ function generateSecureRequestId() {
30
+ return `${exports.AMTP_REQUEST_ID_PREFIX}${Date.now()}_${secureRandomString(8)}`;
31
+ }
32
+ exports.generateSecureRequestId = generateSecureRequestId;
33
+ // ---- ALLOWLIST / BLOCKLIST ----
34
+ /** Allowed redirect schemes — block javascript:, data:, file:, vbscript: */
35
+ exports.ALLOWED_URL_SCHEMES = new Set(["http", "https"]);
36
+ /** Dangerous HTML/script patterns in markdown content */
37
+ exports.XSS_PATTERNS = [
38
+ /<script[\s\S]*?>/gi,
39
+ /javascript:/gi,
40
+ /on\w+\s*=\s*["'][^"']*["']/gi,
41
+ /<iframe[\s\S]*?>/gi,
42
+ /<object[\s\S]*?>/gi,
43
+ /<embed[\s\S]*?>/gi,
44
+ /<svg[\s\S]*?onload/gi,
45
+ /eval\s*\(/gi,
46
+ /document\.cookie/gi,
47
+ ];
48
+ // ---- URL VALIDATION & SANITIZATION ----
49
+ /**
50
+ * Parse and validate a URL against SSRF / open-redirect patterns.
51
+ * Returns the validated URL string or throws.
52
+ */
53
+ function validateUrl(value, baseUrl) {
54
+ const trimmed = value.trim();
55
+ if (!trimmed) {
56
+ throw new SecurityError("URL must not be empty", "INVALID_URL", 400);
57
+ }
58
+ let parsed;
59
+ try {
60
+ // Resolve relative URLs against baseUrl if provided
61
+ if (baseUrl && !/^https?:\/\//i.test(trimmed)) {
62
+ // Guard against path-traversal within the origin
63
+ parsed = new URL(trimmed, baseUrl);
64
+ }
65
+ else {
66
+ parsed = new URL(trimmed);
67
+ }
68
+ }
69
+ catch {
70
+ throw new SecurityError(`Unparseable URL: ${trimmed}`, "INVALID_URL", 400);
71
+ }
72
+ if (!exports.ALLOWED_URL_SCHEMES.has(parsed.protocol.replace(":", ""))) {
73
+ throw new SecurityError(`Disallowed URL scheme: ${parsed.protocol}`, "DISALLOWED_SCHEME", 400);
74
+ }
75
+ return parsed.toString();
76
+ }
77
+ exports.validateUrl = validateUrl;
78
+ // ---- INPUT SANITIZATION ----
79
+ /**
80
+ * Strip potentially dangerous HTML/script content from a string
81
+ * Returns the sanitized string and a boolean indicating whether
82
+ * anything was removed.
83
+ */
84
+ function sanitizeHtml(input) {
85
+ let cleaned = input;
86
+ for (const pattern of exports.XSS_PATTERNS) {
87
+ if (pattern.test(cleaned)) {
88
+ cleaned = cleaned.replace(pattern, "");
89
+ }
90
+ }
91
+ return cleaned;
92
+ }
93
+ exports.sanitizeHtml = sanitizeHtml;
94
+ /**
95
+ * Validate a string field (non-empty, no control characters, max length)
96
+ */
97
+ function validateTextField(value, options = {}) {
98
+ const { minLength = 1, maxLength = 10000, fieldName = "field" } = options;
99
+ if (value.length < minLength) {
100
+ throw new SecurityError(`${fieldName} too short (min ${minLength})`, "INPUT_TOO_SHORT", 400);
101
+ }
102
+ if (value.length > maxLength) {
103
+ throw new SecurityError(`${fieldName} too long (max ${maxLength})`, "INPUT_TOO_LONG", 413);
104
+ }
105
+ return value;
106
+ }
107
+ exports.validateTextField = validateTextField;
108
+ // ---- SECURITY HEADERS ----
109
+ /** Common security response headers for AMTP endpoints */
110
+ exports.AMTP_SECURITY_HEADERS = {
111
+ "X-Content-Type-Options": "nosniff",
112
+ "X-Frame-Options": "DENY",
113
+ "X-XSS-Protection": "1; mode=block",
114
+ "Referrer-Policy": "strict-origin-when-cross-origin",
115
+ };
116
+ // ---- SCOPE / RATE-LIMIT GUARD ----
117
+ /**
118
+ * Map of IP -> { count, resetAt } used in in-memory rate limiting.
119
+ * Callers should reset expired entries periodically.
120
+ */
121
+ class InMemoryRateLimiter {
122
+ constructor(windowMs, maxRequests) {
123
+ this.windowMs = windowMs;
124
+ this.maxRequests = maxRequests;
125
+ this.map = new Map();
126
+ }
127
+ /**
128
+ * Returns true if the request is within the allowed rate limit,
129
+ * false if it should be rejected with 429.
130
+ */
131
+ check(ip) {
132
+ const now = Date.now();
133
+ const entry = this.map.get(ip);
134
+ if (!entry || now >= entry.resetAt) {
135
+ this.map.set(ip, { count: 1, resetAt: now + this.windowMs });
136
+ return true;
137
+ }
138
+ if (entry.count >= this.maxRequests) {
139
+ return false;
140
+ }
141
+ entry.count++;
142
+ return true;
143
+ }
144
+ /**
145
+ * Compute Retry-After (seconds) for a rejected IP.
146
+ */
147
+ retryAfterSeconds(ip) {
148
+ const entry = this.map.get(ip);
149
+ if (!entry)
150
+ return 0;
151
+ return Math.max(0, Math.ceil((entry.resetAt - Date.now()) / 1000));
152
+ }
153
+ /**
154
+ * Prune stale entries from the store.
155
+ */
156
+ prune() {
157
+ const now = Date.now();
158
+ for (const [key, entry] of this.map) {
159
+ if (now >= entry.resetAt) {
160
+ this.map.delete(key);
161
+ }
162
+ }
163
+ }
164
+ }
165
+ exports.InMemoryRateLimiter = InMemoryRateLimiter;
166
+ // ---- SESSION SECURITY ----
167
+ /** Default session timeout: 24 hours */
168
+ exports.DEFAULT_SESSION_TIMEOUT_MS = 24 * 60 * 60 * 1000;
169
+ /** Absolute cap for any session lifetime regardless of extensions */
170
+ exports.MAX_SESSION_LIFETIME_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
171
+ // ---- CUSTOM SECURITY ERROR CLASS ----
172
+ class SecurityError extends Error {
173
+ constructor(message, code, statusCode) {
174
+ super(`[${code}] ${message}`);
175
+ this.code = code;
176
+ this.statusCode = statusCode;
177
+ this.name = "SecurityError";
178
+ }
179
+ }
180
+ exports.SecurityError = SecurityError;
181
+ // ---- BODY/PAYLOAD GUARD ----
182
+ /** Default maximum request body size: 1 MB */
183
+ exports.DEFAULT_MAX_BODY_SIZE = 1024 * 1024;
184
+ /**
185
+ * Wrap a request/stream body consumer so it stops after maxBytes.
186
+ * Returns the accumulated string (truncated) and a flag indicating truncation.
187
+ * Supports: string, browser ReadableStream, Node.js Readable.
188
+ */
189
+ async function readBodyWithLimit(body, maxBytes = exports.DEFAULT_MAX_BODY_SIZE) {
190
+ const chunks = [];
191
+ let total = 0;
192
+ let truncated = false;
193
+ if (body instanceof ReadableStream) {
194
+ const reader = body.getReader();
195
+ // eslint-disable-next-line no-constant-condition
196
+ while (true) {
197
+ const { value, done } = await reader.read();
198
+ if (done)
199
+ break;
200
+ if (value) {
201
+ total += value.byteLength;
202
+ if (total <= maxBytes) {
203
+ chunks.push(Buffer.from(value));
204
+ }
205
+ else {
206
+ truncated = true;
207
+ break;
208
+ }
209
+ }
210
+ }
211
+ }
212
+ else if (body instanceof stream_1.Readable) {
213
+ for await (const chunk of body) {
214
+ const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
215
+ total += buf.length;
216
+ if (total <= maxBytes) {
217
+ chunks.push(buf);
218
+ }
219
+ else {
220
+ truncated = true;
221
+ body.destroy();
222
+ break;
223
+ }
224
+ }
225
+ }
226
+ else if (typeof body === "string") {
227
+ total = Buffer.byteLength(body);
228
+ if (total <= maxBytes) {
229
+ return { body, truncated: false };
230
+ }
231
+ return { body: Buffer.from(body, "utf8").slice(0, maxBytes).toString(), truncated: true };
232
+ }
233
+ return { body: Buffer.concat(chunks).toString("utf8"), truncated };
234
+ }
235
+ exports.readBodyWithLimit = readBodyWithLimit;
236
+ // ---- ID VALIDATION ----
237
+ const SESSION_ID_REGEX = /^sess_[a-f0-9]+$/;
238
+ /**
239
+ * Returns true if the string looks like a valid AMTP session ID.
240
+ */
241
+ function isValidSessionId(sessionId) {
242
+ if (!sessionId)
243
+ return false;
244
+ return SESSION_ID_REGEX.test(sessionId);
245
+ }
246
+ exports.isValidSessionId = isValidSessionId;
247
+ // ---- CSRF ----
248
+ const CSRF_HEADER = "x-amtp-csrf-token";
249
+ /**
250
+ * Returns the CSRF token header name.
251
+ */
252
+ function csrfHeaderName() {
253
+ return CSRF_HEADER;
254
+ }
255
+ exports.csrfHeaderName = csrfHeaderName;
256
+ /**
257
+ * Returns the value for a new CSRF token.
258
+ * Note: The actual token-to-session binding is managed externally (see SessionManager).
259
+ * This generates the token value only.
260
+ */
261
+ function generateCsrfToken(_sessionId) {
262
+ return `csrf_${secureRandomString(16)}`;
263
+ }
264
+ exports.generateCsrfToken = generateCsrfToken;
265
+ /**
266
+ * Validate that a CSRF token is non-empty and properly formatted.
267
+ */
268
+ function isValidCsrfToken(token) {
269
+ if (!token)
270
+ return false;
271
+ return /^csrf_[a-f0-9]{32}$/.test(token);
272
+ }
273
+ exports.isValidCsrfToken = isValidCsrfToken;
274
+ // ============================================================
275
+ // PROMPT INJECTION RESISTANCE — STRICT ACTION / FORM PARSING
276
+ // ============================================================
277
+ /**
278
+ * Strictly sanitize an action identifier.
279
+ * Only [A-Z0-9_] allowed, must start with letter, max 64 chars.
280
+ * This prevents injection of new actions, newlines, or control chars
281
+ * into the machine-readable action contract.
282
+ */
283
+ function sanitizeActionId(raw) {
284
+ const trimmed = raw.trim();
285
+ // Fast path: already clean
286
+ if (/^[A-Z][A-Z0-9_]{0,63}$/i.test(trimmed)) {
287
+ return trimmed.toUpperCase();
288
+ }
289
+ // Relaxed path for common copy-paste (brackets + spaces only)
290
+ const relaxed = trimmed.replace(/[[\]\s]/g, "").toUpperCase();
291
+ if (/^[A-Z][A-Z0-9_]{0,63}$/.test(relaxed)) {
292
+ return relaxed;
293
+ }
294
+ throw new SecurityError("Invalid action identifier — must match [A-Z][A-Z0-9_]+ (no injection allowed)", "INVALID_ACTION_ID", 400);
295
+ }
296
+ exports.sanitizeActionId = sanitizeActionId;
297
+ /**
298
+ * Strictly sanitize an endpoint path for actions/forms.
299
+ * Only safe path characters. No query strings, fragments, or protocol.
300
+ */
301
+ function sanitizeEndpoint(raw) {
302
+ const trimmed = raw.trim();
303
+ // Reject anything containing query strings, fragments, or obvious bad chars
304
+ if (/[?#]/.test(trimmed) || /[<>"'\s]/.test(trimmed)) {
305
+ throw new SecurityError("Invalid endpoint — query strings, fragments or special chars not allowed", "INVALID_ENDPOINT", 400);
306
+ }
307
+ // Remove any protocol or host if accidentally present
308
+ let cleaned = trimmed.replace(/^[a-zA-Z]+:\/\/[^/]+/, "");
309
+ // Keep only path-safe characters
310
+ cleaned = cleaned.replace(/[^a-zA-Z0-9/_-]/g, "").slice(0, 256);
311
+ if (!/^\/[a-zA-Z0-9/_-]*$/.test(cleaned) || cleaned.length < 1) {
312
+ throw new SecurityError("Invalid endpoint — must be a clean path starting with /", "INVALID_ENDPOINT", 400);
313
+ }
314
+ return cleaned;
315
+ }
316
+ exports.sanitizeEndpoint = sanitizeEndpoint;
317
+ /**
318
+ * Strictly validate and normalize HTTP method.
319
+ */
320
+ function sanitizeHttpMethod(raw) {
321
+ const method = raw.trim().toUpperCase();
322
+ const allowed = ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"];
323
+ if (!allowed.includes(method)) {
324
+ throw new SecurityError(`Invalid HTTP method: ${raw}`, "INVALID_METHOD", 400);
325
+ }
326
+ return method;
327
+ }
328
+ exports.sanitizeHttpMethod = sanitizeHttpMethod;
329
+ /**
330
+ * Sanitize free-text fields (descriptions, labels, help text) that will be
331
+ * shown to or used in prompts for LLMs/agents.
332
+ *
333
+ * This is the key defense against prompt injection via action descriptions.
334
+ * We aggressively strip common jailbreak patterns while preserving useful hints.
335
+ */
336
+ function sanitizeFreeText(text, maxLength = 280) {
337
+ if (!text)
338
+ return "";
339
+ let s = text;
340
+ // Remove injected action patterns (bracket-enclosed, 4+ uppercase chars) from descriptions
341
+ s = s.replace(/\[[A-Z][A-Z0-9_]{3,}\]/g, "");
342
+ // Avoid sanitizing common safe uppercase words but catch suspicious injected IDs (5+ chars)
343
+ const commonUppercaseWords = new Set(["HTTP", "HTTPS", "JSON", "HTML", "AMTP", "SPEC", "UUID", "USER", "PASS", "TOKEN", "EMAIL", "PHONE", "PRICE", "COUNT", "TOTAL", "VALUE", "LIMIT", "ADMIN", "ERROR", "TIMEOUT", "SECRET", "PUBLIC", "PRIVATE", "HEADER", "BODY", "QUERY", "PARAMS", "ROUTE", "LOGIN", "SIGNUP", "REGEX", "FETCH", "ASYNC", "AWAIT", "CACHE", "INDEX", "BUILD", "DEPLOY", "LOCAL", "GLOBAL", "STATIC", "DYNAMIC", "STREAM", "BENCH", "BATCH", "QUEUE", "RETRY", "HEALTH"]);
344
+ s = s.replace(/\b[A-Z][A-Z0-9_]{4,}\b/g, (m) => {
345
+ return commonUppercaseWords.has(m) ? m : "[sanitized]";
346
+ });
347
+ // Additional protection for action description context
348
+ s = s.replace(/redefine|override action|new action id/gi, "[sanitized]");
349
+ // Strip common prompt injection / jailbreak phrases (case-insensitive)
350
+ const jailbreaks = [
351
+ /ignore (?:all )?previous instructions?/gi,
352
+ /disregard (?:all )?prior (?:rules|instructions?)/gi,
353
+ /you (?:are|must|should) (?:now |instead )?(?:act as|behave as|become)/gi,
354
+ /new (?:system|developer|admin) (?:prompt|instruction)/gi,
355
+ /override (?:safety|security|rules)/gi,
356
+ /execute the following|do the following instead/gi,
357
+ /```[\s\S]*?```/g,
358
+ /<\|im_start\|>|<\|im_end\|>/gi, // common chat template tokens
359
+ ];
360
+ for (const pattern of jailbreaks) {
361
+ s = s.replace(pattern, "[sanitized]");
362
+ }
363
+ // Collapse whitespace, limit length
364
+ s = s.replace(/\s+/g, " ").trim().slice(0, maxLength);
365
+ return s;
366
+ }
367
+ exports.sanitizeFreeText = sanitizeFreeText;
368
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/server/security.ts"],"names":[],"mappings":"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"}