@vorionsys/atsf-core 0.2.2 → 0.2.3

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 (326) hide show
  1. package/CHANGELOG.md +3 -3
  2. package/README.md +77 -11
  3. package/dist/api/index.d.ts +1 -1
  4. package/dist/api/index.js +1 -1
  5. package/dist/api/server.d.ts +5 -2
  6. package/dist/api/server.d.ts.map +1 -1
  7. package/dist/api/server.js +186 -149
  8. package/dist/api/server.js.map +1 -1
  9. package/dist/arbitration/index.d.ts +4 -4
  10. package/dist/arbitration/index.d.ts.map +1 -1
  11. package/dist/arbitration/index.js +46 -41
  12. package/dist/arbitration/index.js.map +1 -1
  13. package/dist/arbitration/types.d.ts +10 -10
  14. package/dist/arbitration/types.d.ts.map +1 -1
  15. package/dist/basis/evaluator.d.ts +1 -1
  16. package/dist/basis/evaluator.d.ts.map +1 -1
  17. package/dist/basis/evaluator.js +56 -54
  18. package/dist/basis/evaluator.js.map +1 -1
  19. package/dist/basis/index.d.ts +3 -3
  20. package/dist/basis/index.js +3 -3
  21. package/dist/basis/parser.d.ts +16 -16
  22. package/dist/basis/parser.d.ts.map +1 -1
  23. package/dist/basis/parser.js +32 -25
  24. package/dist/basis/parser.js.map +1 -1
  25. package/dist/basis/types.d.ts +2 -2
  26. package/dist/chain/index.d.ts.map +1 -1
  27. package/dist/chain/index.js +16 -16
  28. package/dist/chain/index.js.map +1 -1
  29. package/dist/cognigate/index.d.ts +1 -1
  30. package/dist/cognigate/index.d.ts.map +1 -1
  31. package/dist/cognigate/index.js +44 -33
  32. package/dist/cognigate/index.js.map +1 -1
  33. package/dist/common/adapters.d.ts +18 -11
  34. package/dist/common/adapters.d.ts.map +1 -1
  35. package/dist/common/adapters.js +100 -79
  36. package/dist/common/adapters.js.map +1 -1
  37. package/dist/common/config.d.ts +67 -67
  38. package/dist/common/config.js +49 -49
  39. package/dist/common/config.js.map +1 -1
  40. package/dist/common/index.d.ts +4 -4
  41. package/dist/common/index.js +4 -4
  42. package/dist/common/logger.d.ts +1 -1
  43. package/dist/common/logger.js +8 -8
  44. package/dist/common/types.d.ts +8 -8
  45. package/dist/common/types.js +5 -5
  46. package/dist/containment/index.d.ts +3 -3
  47. package/dist/containment/index.d.ts.map +1 -1
  48. package/dist/containment/index.js +119 -105
  49. package/dist/containment/index.js.map +1 -1
  50. package/dist/containment/types.d.ts +11 -11
  51. package/dist/containment/types.d.ts.map +1 -1
  52. package/dist/contracts/index.d.ts +9 -9
  53. package/dist/contracts/index.d.ts.map +1 -1
  54. package/dist/contracts/index.js +59 -54
  55. package/dist/contracts/index.js.map +1 -1
  56. package/dist/contracts/types.d.ts +12 -12
  57. package/dist/contracts/types.d.ts.map +1 -1
  58. package/dist/crewai/callback.d.ts +91 -0
  59. package/dist/crewai/callback.d.ts.map +1 -0
  60. package/dist/crewai/callback.js +271 -0
  61. package/dist/crewai/callback.js.map +1 -0
  62. package/dist/crewai/executor.d.ts +135 -0
  63. package/dist/crewai/executor.d.ts.map +1 -0
  64. package/dist/crewai/executor.js +381 -0
  65. package/dist/crewai/executor.js.map +1 -0
  66. package/dist/crewai/index.d.ts +12 -0
  67. package/dist/crewai/index.d.ts.map +1 -0
  68. package/dist/crewai/index.js +12 -0
  69. package/dist/crewai/index.js.map +1 -0
  70. package/dist/crewai/tools.d.ts +21 -0
  71. package/dist/crewai/tools.d.ts.map +1 -0
  72. package/dist/crewai/tools.js +164 -0
  73. package/dist/crewai/tools.js.map +1 -0
  74. package/dist/crewai/types.d.ts +139 -0
  75. package/dist/crewai/types.d.ts.map +1 -0
  76. package/dist/crewai/types.js +9 -0
  77. package/dist/crewai/types.js.map +1 -0
  78. package/dist/enforce/index.d.ts +48 -222
  79. package/dist/enforce/index.d.ts.map +1 -1
  80. package/dist/enforce/index.js +144 -47
  81. package/dist/enforce/index.js.map +1 -1
  82. package/dist/enforce/trust-aware-enforcement-service.d.ts +121 -0
  83. package/dist/enforce/trust-aware-enforcement-service.d.ts.map +1 -0
  84. package/dist/enforce/trust-aware-enforcement-service.js +601 -0
  85. package/dist/enforce/trust-aware-enforcement-service.js.map +1 -0
  86. package/dist/enforce/types.d.ts +234 -0
  87. package/dist/enforce/types.d.ts.map +1 -0
  88. package/dist/enforce/types.js +10 -0
  89. package/dist/enforce/types.js.map +1 -0
  90. package/dist/governance/fluid-workflow.d.ts +8 -8
  91. package/dist/governance/fluid-workflow.d.ts.map +1 -1
  92. package/dist/governance/fluid-workflow.js +114 -86
  93. package/dist/governance/fluid-workflow.js.map +1 -1
  94. package/dist/governance/index.d.ts +7 -7
  95. package/dist/governance/index.d.ts.map +1 -1
  96. package/dist/governance/index.js +81 -74
  97. package/dist/governance/index.js.map +1 -1
  98. package/dist/governance/proof-bridge.d.ts +6 -6
  99. package/dist/governance/proof-bridge.d.ts.map +1 -1
  100. package/dist/governance/proof-bridge.js +5 -5
  101. package/dist/governance/proof-bridge.js.map +1 -1
  102. package/dist/governance/types.d.ts +16 -9
  103. package/dist/governance/types.d.ts.map +1 -1
  104. package/dist/governance/types.js.map +1 -1
  105. package/dist/index.d.ts +29 -25
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +33 -23
  108. package/dist/index.js.map +1 -1
  109. package/dist/intent/index.d.ts +21 -56
  110. package/dist/intent/index.d.ts.map +1 -1
  111. package/dist/intent/index.js +58 -24
  112. package/dist/intent/index.js.map +1 -1
  113. package/dist/intent/persistent-intent-service.d.ts +68 -0
  114. package/dist/intent/persistent-intent-service.d.ts.map +1 -0
  115. package/dist/intent/persistent-intent-service.js +277 -0
  116. package/dist/intent/persistent-intent-service.js.map +1 -0
  117. package/dist/intent/types.d.ts +69 -0
  118. package/dist/intent/types.d.ts.map +1 -0
  119. package/dist/intent/types.js +10 -0
  120. package/dist/intent/types.js.map +1 -0
  121. package/dist/intent-gateway/index.d.ts +522 -0
  122. package/dist/intent-gateway/index.d.ts.map +1 -0
  123. package/dist/intent-gateway/index.js +1499 -0
  124. package/dist/intent-gateway/index.js.map +1 -0
  125. package/dist/langchain/callback.d.ts +2 -2
  126. package/dist/langchain/callback.d.ts.map +1 -1
  127. package/dist/langchain/callback.js +30 -30
  128. package/dist/langchain/callback.js.map +1 -1
  129. package/dist/langchain/executor.d.ts +4 -4
  130. package/dist/langchain/executor.d.ts.map +1 -1
  131. package/dist/langchain/executor.js +82 -80
  132. package/dist/langchain/executor.js.map +1 -1
  133. package/dist/langchain/index.d.ts +5 -5
  134. package/dist/langchain/index.js +5 -5
  135. package/dist/langchain/tools.d.ts +1 -1
  136. package/dist/langchain/tools.d.ts.map +1 -1
  137. package/dist/langchain/tools.js +33 -33
  138. package/dist/langchain/tools.js.map +1 -1
  139. package/dist/langchain/types.d.ts +3 -3
  140. package/dist/langchain/types.d.ts.map +1 -1
  141. package/dist/layers/implementations/L0-request-format.d.ts +37 -0
  142. package/dist/layers/implementations/L0-request-format.d.ts.map +1 -0
  143. package/dist/layers/implementations/L0-request-format.js +218 -0
  144. package/dist/layers/implementations/L0-request-format.js.map +1 -0
  145. package/dist/layers/implementations/L1-input-size.d.ts +36 -0
  146. package/dist/layers/implementations/L1-input-size.d.ts.map +1 -0
  147. package/dist/layers/implementations/L1-input-size.js +160 -0
  148. package/dist/layers/implementations/L1-input-size.js.map +1 -0
  149. package/dist/layers/implementations/L2-charset-sanitizer.d.ts +28 -0
  150. package/dist/layers/implementations/L2-charset-sanitizer.d.ts.map +1 -0
  151. package/dist/layers/implementations/L2-charset-sanitizer.js +230 -0
  152. package/dist/layers/implementations/L2-charset-sanitizer.js.map +1 -0
  153. package/dist/layers/implementations/L3-schema-conformance.d.ts +47 -0
  154. package/dist/layers/implementations/L3-schema-conformance.d.ts.map +1 -0
  155. package/dist/layers/implementations/L3-schema-conformance.js +267 -0
  156. package/dist/layers/implementations/L3-schema-conformance.js.map +1 -0
  157. package/dist/layers/implementations/L4-injection-detector.d.ts +47 -0
  158. package/dist/layers/implementations/L4-injection-detector.d.ts.map +1 -0
  159. package/dist/layers/implementations/L4-injection-detector.js +260 -0
  160. package/dist/layers/implementations/L4-injection-detector.js.map +1 -0
  161. package/dist/layers/implementations/L5-rate-limiter.d.ts +51 -0
  162. package/dist/layers/implementations/L5-rate-limiter.d.ts.map +1 -0
  163. package/dist/layers/implementations/L5-rate-limiter.js +183 -0
  164. package/dist/layers/implementations/L5-rate-limiter.js.map +1 -0
  165. package/dist/layers/implementations/index.d.ts +16 -0
  166. package/dist/layers/implementations/index.d.ts.map +1 -0
  167. package/dist/layers/implementations/index.js +16 -0
  168. package/dist/layers/implementations/index.js.map +1 -0
  169. package/dist/layers/index.d.ts +3 -3
  170. package/dist/layers/index.d.ts.map +1 -1
  171. package/dist/layers/index.js +99 -71
  172. package/dist/layers/index.js.map +1 -1
  173. package/dist/layers/types.d.ts +16 -16
  174. package/dist/layers/types.d.ts.map +1 -1
  175. package/dist/persistence/file.d.ts +3 -3
  176. package/dist/persistence/file.d.ts.map +1 -1
  177. package/dist/persistence/file.js +32 -28
  178. package/dist/persistence/file.js.map +1 -1
  179. package/dist/persistence/index.d.ts +7 -7
  180. package/dist/persistence/index.d.ts.map +1 -1
  181. package/dist/persistence/index.js +18 -18
  182. package/dist/persistence/index.js.map +1 -1
  183. package/dist/persistence/memory.d.ts +3 -3
  184. package/dist/persistence/memory.d.ts.map +1 -1
  185. package/dist/persistence/memory.js +10 -8
  186. package/dist/persistence/memory.js.map +1 -1
  187. package/dist/persistence/sqlite.d.ts +3 -3
  188. package/dist/persistence/sqlite.d.ts.map +1 -1
  189. package/dist/persistence/sqlite.js +36 -36
  190. package/dist/persistence/sqlite.js.map +1 -1
  191. package/dist/persistence/supabase.d.ts +3 -3
  192. package/dist/persistence/supabase.d.ts.map +1 -1
  193. package/dist/persistence/supabase.js +41 -43
  194. package/dist/persistence/supabase.js.map +1 -1
  195. package/dist/persistence/types.d.ts +5 -5
  196. package/dist/phase6/ceiling.d.ts +5 -5
  197. package/dist/phase6/ceiling.d.ts.map +1 -1
  198. package/dist/phase6/ceiling.js +67 -34
  199. package/dist/phase6/ceiling.js.map +1 -1
  200. package/dist/phase6/context.d.ts +3 -3
  201. package/dist/phase6/context.d.ts.map +1 -1
  202. package/dist/phase6/context.js +91 -45
  203. package/dist/phase6/context.js.map +1 -1
  204. package/dist/phase6/index.d.ts +13 -13
  205. package/dist/phase6/index.d.ts.map +1 -1
  206. package/dist/phase6/index.js +16 -16
  207. package/dist/phase6/index.js.map +1 -1
  208. package/dist/phase6/presets.d.ts +2 -2
  209. package/dist/phase6/presets.d.ts.map +1 -1
  210. package/dist/phase6/presets.js +39 -33
  211. package/dist/phase6/presets.js.map +1 -1
  212. package/dist/phase6/provenance.d.ts +4 -4
  213. package/dist/phase6/provenance.d.ts.map +1 -1
  214. package/dist/phase6/provenance.js +42 -35
  215. package/dist/phase6/provenance.js.map +1 -1
  216. package/dist/phase6/role-gates/index.d.ts +2 -2
  217. package/dist/phase6/role-gates/index.js +2 -2
  218. package/dist/phase6/role-gates/kernel.d.ts.map +1 -1
  219. package/dist/phase6/role-gates/kernel.js +16 -16
  220. package/dist/phase6/role-gates/kernel.js.map +1 -1
  221. package/dist/phase6/role-gates/policy.d.ts +2 -2
  222. package/dist/phase6/role-gates/policy.js +6 -6
  223. package/dist/phase6/role-gates.d.ts +4 -4
  224. package/dist/phase6/role-gates.d.ts.map +1 -1
  225. package/dist/phase6/role-gates.js +80 -58
  226. package/dist/phase6/role-gates.js.map +1 -1
  227. package/dist/phase6/types.d.ts +35 -35
  228. package/dist/phase6/types.d.ts.map +1 -1
  229. package/dist/phase6/types.js +166 -66
  230. package/dist/phase6/types.js.map +1 -1
  231. package/dist/phase6/weight-presets/canonical.d.ts +2 -2
  232. package/dist/phase6/weight-presets/canonical.d.ts.map +1 -1
  233. package/dist/phase6/weight-presets/canonical.js +12 -12
  234. package/dist/phase6/weight-presets/canonical.js.map +1 -1
  235. package/dist/phase6/weight-presets/deltas.d.ts +2 -2
  236. package/dist/phase6/weight-presets/deltas.d.ts.map +1 -1
  237. package/dist/phase6/weight-presets/deltas.js +27 -27
  238. package/dist/phase6/weight-presets/deltas.js.map +1 -1
  239. package/dist/phase6/weight-presets/index.d.ts +4 -4
  240. package/dist/phase6/weight-presets/index.js +4 -4
  241. package/dist/phase6/weight-presets/merger.d.ts +3 -3
  242. package/dist/phase6/weight-presets/merger.d.ts.map +1 -1
  243. package/dist/phase6/weight-presets/merger.js +40 -44
  244. package/dist/phase6/weight-presets/merger.js.map +1 -1
  245. package/dist/proof/index.d.ts +3 -3
  246. package/dist/proof/index.d.ts.map +1 -1
  247. package/dist/proof/index.js +44 -38
  248. package/dist/proof/index.js.map +1 -1
  249. package/dist/proof/merkle.d.ts +3 -3
  250. package/dist/proof/merkle.d.ts.map +1 -1
  251. package/dist/proof/merkle.js +26 -25
  252. package/dist/proof/merkle.js.map +1 -1
  253. package/dist/proof/zk-proofs.d.ts +6 -6
  254. package/dist/proof/zk-proofs.d.ts.map +1 -1
  255. package/dist/proof/zk-proofs.js +42 -43
  256. package/dist/proof/zk-proofs.js.map +1 -1
  257. package/dist/provenance/index.d.ts +3 -3
  258. package/dist/provenance/index.d.ts.map +1 -1
  259. package/dist/provenance/index.js +19 -17
  260. package/dist/provenance/index.js.map +1 -1
  261. package/dist/provenance/types.d.ts +4 -4
  262. package/dist/provenance/types.d.ts.map +1 -1
  263. package/dist/sandbox-training/challenges.d.ts +1 -1
  264. package/dist/sandbox-training/challenges.d.ts.map +1 -1
  265. package/dist/sandbox-training/challenges.js +228 -228
  266. package/dist/sandbox-training/challenges.js.map +1 -1
  267. package/dist/sandbox-training/graduation.d.ts +1 -1
  268. package/dist/sandbox-training/graduation.d.ts.map +1 -1
  269. package/dist/sandbox-training/graduation.js +14 -15
  270. package/dist/sandbox-training/graduation.js.map +1 -1
  271. package/dist/sandbox-training/index.d.ts +9 -9
  272. package/dist/sandbox-training/index.d.ts.map +1 -1
  273. package/dist/sandbox-training/index.js +6 -6
  274. package/dist/sandbox-training/index.js.map +1 -1
  275. package/dist/sandbox-training/promotion-service.d.ts +4 -4
  276. package/dist/sandbox-training/promotion-service.d.ts.map +1 -1
  277. package/dist/sandbox-training/promotion-service.js +5 -5
  278. package/dist/sandbox-training/promotion-service.js.map +1 -1
  279. package/dist/sandbox-training/runner.d.ts +1 -1
  280. package/dist/sandbox-training/runner.d.ts.map +1 -1
  281. package/dist/sandbox-training/runner.js +74 -73
  282. package/dist/sandbox-training/runner.js.map +1 -1
  283. package/dist/sandbox-training/scorer.d.ts +4 -4
  284. package/dist/sandbox-training/scorer.js +5 -5
  285. package/dist/sandbox-training/types.d.ts +4 -4
  286. package/dist/sandbox-training/types.d.ts.map +1 -1
  287. package/dist/sandbox-training/types.js +11 -7
  288. package/dist/sandbox-training/types.js.map +1 -1
  289. package/dist/trust-engine/ceiling-enforcement/audit.d.ts +1 -1
  290. package/dist/trust-engine/ceiling-enforcement/audit.d.ts.map +1 -1
  291. package/dist/trust-engine/ceiling-enforcement/audit.js +3 -4
  292. package/dist/trust-engine/ceiling-enforcement/audit.js.map +1 -1
  293. package/dist/trust-engine/ceiling-enforcement/index.d.ts +2 -2
  294. package/dist/trust-engine/ceiling-enforcement/index.js +2 -2
  295. package/dist/trust-engine/ceiling-enforcement/kernel.d.ts +1 -1
  296. package/dist/trust-engine/ceiling-enforcement/kernel.d.ts.map +1 -1
  297. package/dist/trust-engine/ceiling-enforcement/kernel.js +1 -1
  298. package/dist/trust-engine/context-policy/enforcement.d.ts.map +1 -1
  299. package/dist/trust-engine/context-policy/factory.d.ts +1 -1
  300. package/dist/trust-engine/context-policy/factory.d.ts.map +1 -1
  301. package/dist/trust-engine/context-policy/factory.js +1 -1
  302. package/dist/trust-engine/context-policy/factory.js.map +1 -1
  303. package/dist/trust-engine/context-policy/index.d.ts +2 -2
  304. package/dist/trust-engine/context-policy/index.js +2 -2
  305. package/dist/trust-engine/creation-modifiers/index.d.ts +1 -1
  306. package/dist/trust-engine/creation-modifiers/index.js +1 -1
  307. package/dist/trust-engine/creation-modifiers/types.d.ts.map +1 -1
  308. package/dist/trust-engine/creation-modifiers/types.js +2 -3
  309. package/dist/trust-engine/creation-modifiers/types.js.map +1 -1
  310. package/dist/trust-engine/decay-profiles.d.ts +1 -1
  311. package/dist/trust-engine/decay-profiles.d.ts.map +1 -1
  312. package/dist/trust-engine/decay-profiles.js +4 -4
  313. package/dist/trust-engine/decay-profiles.js.map +1 -1
  314. package/dist/trust-engine/index.d.ts +111 -45
  315. package/dist/trust-engine/index.d.ts.map +1 -1
  316. package/dist/trust-engine/index.js +418 -61
  317. package/dist/trust-engine/index.js.map +1 -1
  318. package/dist/trust-engine/phase6-types.d.ts +10 -10
  319. package/dist/trust-engine/phase6-types.d.ts.map +1 -1
  320. package/dist/trust-engine/phase6-types.js +25 -23
  321. package/dist/trust-engine/phase6-types.js.map +1 -1
  322. package/dist/trust-engine/types.d.ts +77 -0
  323. package/dist/trust-engine/types.d.ts.map +1 -0
  324. package/dist/trust-engine/types.js +20 -0
  325. package/dist/trust-engine/types.js.map +1 -0
  326. package/package.json +5 -4
@@ -0,0 +1,37 @@
1
+ /**
2
+ * L0 — Request Format Validator
3
+ *
4
+ * Validates that incoming requests conform to the expected structural format
5
+ * before any deeper analysis. Rejects malformed payloads, missing required
6
+ * fields, and structurally invalid inputs at the perimeter.
7
+ *
8
+ * Tier: input_validation
9
+ * Primary threat: prompt_injection
10
+ *
11
+ * @packageDocumentation
12
+ */
13
+ import { BaseSecurityLayer } from "../index.js";
14
+ import type { LayerInput, LayerExecutionResult } from "../types.js";
15
+ /**
16
+ * L0 Request Format Validator
17
+ *
18
+ * First line of defense — ensures every request has the correct shape
19
+ * before any downstream processing.
20
+ */
21
+ export declare class L0RequestFormatValidator extends BaseSecurityLayer {
22
+ constructor();
23
+ execute(input: LayerInput): Promise<LayerExecutionResult>;
24
+ /**
25
+ * Measure nesting depth of an object, with early bail-out.
26
+ */
27
+ private measureDepth;
28
+ /**
29
+ * Count total keys across all levels of an object.
30
+ */
31
+ private countKeys;
32
+ /**
33
+ * Detect prototype pollution attempts (__proto__, constructor, prototype).
34
+ */
35
+ private detectPrototypePollution;
36
+ }
37
+ //# sourceMappingURL=L0-request-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"L0-request-format.d.ts","sourceRoot":"","sources":["../../../src/layers/implementations/L0-request-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EACV,UAAU,EACV,oBAAoB,EAGrB,MAAM,aAAa,CAAC;AAWrB;;;;;GAKG;AACH,qBAAa,wBAAyB,SAAQ,iBAAiB;;IAkBvD,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA2I/D;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACH,OAAO,CAAC,SAAS;IAWjB;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAmBjC"}
@@ -0,0 +1,218 @@
1
+ /**
2
+ * L0 — Request Format Validator
3
+ *
4
+ * Validates that incoming requests conform to the expected structural format
5
+ * before any deeper analysis. Rejects malformed payloads, missing required
6
+ * fields, and structurally invalid inputs at the perimeter.
7
+ *
8
+ * Tier: input_validation
9
+ * Primary threat: prompt_injection
10
+ *
11
+ * @packageDocumentation
12
+ */
13
+ import { BaseSecurityLayer, createLayerConfig } from "../index.js";
14
+ // Maximum depth for nested objects to prevent stack overflow / complexity attacks
15
+ const MAX_NESTING_DEPTH = 20;
16
+ // Maximum number of keys in a single object
17
+ const MAX_OBJECT_KEYS = 500;
18
+ // Required payload fields for a well-formed request
19
+ const REQUIRED_PAYLOAD_FIELDS = ["action", "content"];
20
+ /**
21
+ * L0 Request Format Validator
22
+ *
23
+ * First line of defense — ensures every request has the correct shape
24
+ * before any downstream processing.
25
+ */
26
+ export class L0RequestFormatValidator extends BaseSecurityLayer {
27
+ constructor() {
28
+ super(createLayerConfig(0, "Request Format Validator", {
29
+ description: "Validates request structure, required fields, and payload shape",
30
+ tier: "input_validation",
31
+ primaryThreat: "prompt_injection",
32
+ secondaryThreats: ["denial_of_service"],
33
+ failMode: "block",
34
+ required: true,
35
+ timeoutMs: 200,
36
+ parallelizable: true,
37
+ dependencies: [],
38
+ }));
39
+ }
40
+ async execute(input) {
41
+ const startedAt = new Date().toISOString();
42
+ const t0 = performance.now();
43
+ const findings = [];
44
+ // 1. Validate top-level input fields
45
+ const inputValidation = this.validateInput(input);
46
+ if (!inputValidation.valid) {
47
+ for (const err of inputValidation.errors) {
48
+ findings.push({
49
+ type: "threat_detected",
50
+ severity: "high",
51
+ code: "L0_MISSING_FIELD",
52
+ description: `Missing required field: ${err.field}`,
53
+ evidence: [err.message],
54
+ remediation: `Provide the required field '${err.field}'`,
55
+ });
56
+ }
57
+ }
58
+ // 2. Validate payload is a plain object
59
+ if (input.payload !== null && input.payload !== undefined) {
60
+ if (typeof input.payload !== "object" || Array.isArray(input.payload)) {
61
+ findings.push({
62
+ type: "threat_detected",
63
+ severity: "high",
64
+ code: "L0_INVALID_PAYLOAD_TYPE",
65
+ description: "Payload must be a plain object, not an array or primitive",
66
+ evidence: [
67
+ `Received type: ${Array.isArray(input.payload) ? "array" : typeof input.payload}`,
68
+ ],
69
+ remediation: "Provide payload as a plain JSON object",
70
+ });
71
+ }
72
+ else {
73
+ // 3. Check nesting depth (prevents stack overflow attacks)
74
+ const depth = this.measureDepth(input.payload, 0);
75
+ if (depth > MAX_NESTING_DEPTH) {
76
+ findings.push({
77
+ type: "threat_detected",
78
+ severity: "high",
79
+ code: "L0_EXCESSIVE_NESTING",
80
+ description: `Payload nesting depth ${depth} exceeds maximum ${MAX_NESTING_DEPTH}`,
81
+ evidence: [`depth=${depth}, max=${MAX_NESTING_DEPTH}`],
82
+ remediation: `Flatten payload structure to at most ${MAX_NESTING_DEPTH} levels`,
83
+ });
84
+ }
85
+ // 4. Check key count (prevents resource exhaustion)
86
+ const keyCount = this.countKeys(input.payload);
87
+ if (keyCount > MAX_OBJECT_KEYS) {
88
+ findings.push({
89
+ type: "threat_detected",
90
+ severity: "medium",
91
+ code: "L0_EXCESSIVE_KEYS",
92
+ description: `Payload contains ${keyCount} keys, exceeding maximum ${MAX_OBJECT_KEYS}`,
93
+ evidence: [`keys=${keyCount}, max=${MAX_OBJECT_KEYS}`],
94
+ remediation: "Reduce the number of fields in the payload",
95
+ });
96
+ }
97
+ // 5. Check for required payload fields
98
+ for (const field of REQUIRED_PAYLOAD_FIELDS) {
99
+ if (!(field in input.payload)) {
100
+ findings.push({
101
+ type: "warning",
102
+ severity: "medium",
103
+ code: "L0_MISSING_PAYLOAD_FIELD",
104
+ description: `Payload missing recommended field '${field}'`,
105
+ evidence: [`Field '${field}' not found in payload`],
106
+ remediation: `Include '${field}' in the payload object`,
107
+ });
108
+ }
109
+ }
110
+ // 6. Detect prototype pollution attempts
111
+ const pollutionAttempts = this.detectPrototypePollution(input.payload);
112
+ for (const attempt of pollutionAttempts) {
113
+ findings.push({
114
+ type: "threat_detected",
115
+ severity: "critical",
116
+ code: "L0_PROTOTYPE_POLLUTION",
117
+ description: `Prototype pollution attempt detected via key '${attempt}'`,
118
+ evidence: [`Dangerous key: ${attempt}`],
119
+ remediation: "Remove __proto__, constructor, and prototype keys from payload",
120
+ });
121
+ }
122
+ }
123
+ }
124
+ // 7. Validate metadata if present
125
+ if (input.metadata) {
126
+ if (!input.metadata.requestTimestamp) {
127
+ findings.push({
128
+ type: "warning",
129
+ severity: "low",
130
+ code: "L0_MISSING_TIMESTAMP",
131
+ description: "Request metadata missing timestamp",
132
+ evidence: ["metadata.requestTimestamp is empty"],
133
+ });
134
+ }
135
+ if (!input.metadata.source) {
136
+ findings.push({
137
+ type: "warning",
138
+ severity: "low",
139
+ code: "L0_MISSING_SOURCE",
140
+ description: "Request metadata missing source identifier",
141
+ evidence: ["metadata.source is empty"],
142
+ });
143
+ }
144
+ }
145
+ const completedAt = new Date().toISOString();
146
+ const durationMs = performance.now() - t0;
147
+ const timing = {
148
+ startedAt,
149
+ completedAt,
150
+ durationMs,
151
+ waitTimeMs: 0,
152
+ processingTimeMs: durationMs,
153
+ };
154
+ const hasCritical = findings.some((f) => f.severity === "critical");
155
+ const hasHigh = findings.some((f) => f.severity === "high");
156
+ const passed = !hasCritical && !hasHigh;
157
+ if (passed) {
158
+ return this.createSuccessResult("allow", 0.95, findings, [], timing);
159
+ }
160
+ return this.createFailureResult(hasCritical ? "deny" : "escalate", 0.9, findings, timing);
161
+ }
162
+ /**
163
+ * Measure nesting depth of an object, with early bail-out.
164
+ */
165
+ measureDepth(obj, current) {
166
+ if (current > MAX_NESTING_DEPTH)
167
+ return current; // bail out early
168
+ if (obj === null || typeof obj !== "object")
169
+ return current;
170
+ let max = current;
171
+ const entries = Object.values(obj);
172
+ for (const val of entries) {
173
+ if (val !== null && typeof val === "object") {
174
+ const d = this.measureDepth(val, current + 1);
175
+ if (d > max)
176
+ max = d;
177
+ if (max > MAX_NESTING_DEPTH)
178
+ return max; // bail
179
+ }
180
+ }
181
+ return max;
182
+ }
183
+ /**
184
+ * Count total keys across all levels of an object.
185
+ */
186
+ countKeys(obj) {
187
+ let count = Object.keys(obj).length;
188
+ for (const val of Object.values(obj)) {
189
+ if (val !== null && typeof val === "object" && !Array.isArray(val)) {
190
+ count += this.countKeys(val);
191
+ if (count > MAX_OBJECT_KEYS)
192
+ return count; // bail early
193
+ }
194
+ }
195
+ return count;
196
+ }
197
+ /**
198
+ * Detect prototype pollution attempts (__proto__, constructor, prototype).
199
+ */
200
+ detectPrototypePollution(obj) {
201
+ const dangerous = ["__proto__", "constructor", "prototype"];
202
+ const found = [];
203
+ const check = (o, path) => {
204
+ for (const key of Object.keys(o)) {
205
+ if (dangerous.includes(key)) {
206
+ found.push(path ? `${path}.${key}` : key);
207
+ }
208
+ const val = o[key];
209
+ if (val !== null && typeof val === "object" && !Array.isArray(val)) {
210
+ check(val, path ? `${path}.${key}` : key);
211
+ }
212
+ }
213
+ };
214
+ check(obj, "");
215
+ return found;
216
+ }
217
+ }
218
+ //# sourceMappingURL=L0-request-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"L0-request-format.js","sourceRoot":"","sources":["../../../src/layers/implementations/L0-request-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * L1 — Input Size Limiter
3
+ *
4
+ * Enforces size constraints on incoming payloads to prevent denial-of-service
5
+ * via oversized inputs, token-flooding, or memory exhaustion attacks.
6
+ *
7
+ * Tier: input_validation
8
+ * Primary threat: denial_of_service
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ import { BaseSecurityLayer } from "../index.js";
13
+ import type { LayerInput, LayerExecutionResult } from "../types.js";
14
+ /** Default limits — can be overridden via constructor options */
15
+ export interface L1SizeLimits {
16
+ /** Maximum total payload size in bytes (default: 1MB) */
17
+ maxPayloadBytes: number;
18
+ /** Maximum length for any single string value (default: 100KB) */
19
+ maxStringLength: number;
20
+ /** Maximum number of array elements (default: 10,000) */
21
+ maxArrayLength: number;
22
+ /** Maximum total number of fields across the entire payload (default: 1,000) */
23
+ maxTotalFields: number;
24
+ }
25
+ /**
26
+ * L1 Input Size Limiter
27
+ *
28
+ * Catches oversized payloads before they consume downstream resources.
29
+ */
30
+ export declare class L1InputSizeLimiter extends BaseSecurityLayer {
31
+ private limits;
32
+ constructor(limits?: Partial<L1SizeLimits>);
33
+ execute(input: LayerInput): Promise<LayerExecutionResult>;
34
+ private buildTiming;
35
+ }
36
+ //# sourceMappingURL=L1-input-size.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"L1-input-size.d.ts","sourceRoot":"","sources":["../../../src/layers/implementations/L1-input-size.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EACV,UAAU,EACV,oBAAoB,EAGrB,MAAM,aAAa,CAAC;AAErB,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,yDAAyD;IACzD,eAAe,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,eAAe,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,gFAAgF;IAChF,cAAc,EAAE,MAAM,CAAC;CACxB;AASD;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,iBAAiB;IACvD,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC;IAkBpC,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmI/D,OAAO,CAAC,WAAW;CAUpB"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * L1 — Input Size Limiter
3
+ *
4
+ * Enforces size constraints on incoming payloads to prevent denial-of-service
5
+ * via oversized inputs, token-flooding, or memory exhaustion attacks.
6
+ *
7
+ * Tier: input_validation
8
+ * Primary threat: denial_of_service
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ import { BaseSecurityLayer, createLayerConfig } from "../index.js";
13
+ const DEFAULT_LIMITS = {
14
+ maxPayloadBytes: 1_048_576, // 1 MB
15
+ maxStringLength: 102_400, // 100 KB
16
+ maxArrayLength: 10_000,
17
+ maxTotalFields: 1_000,
18
+ };
19
+ /**
20
+ * L1 Input Size Limiter
21
+ *
22
+ * Catches oversized payloads before they consume downstream resources.
23
+ */
24
+ export class L1InputSizeLimiter extends BaseSecurityLayer {
25
+ limits;
26
+ constructor(limits) {
27
+ super(createLayerConfig(1, "Input Size Limiter", {
28
+ description: "Enforces payload size, string length, array length, and total field count limits",
29
+ tier: "input_validation",
30
+ primaryThreat: "denial_of_service",
31
+ secondaryThreats: ["resource_abuse"],
32
+ failMode: "block",
33
+ required: true,
34
+ timeoutMs: 200,
35
+ parallelizable: true,
36
+ dependencies: [],
37
+ }));
38
+ this.limits = { ...DEFAULT_LIMITS, ...limits };
39
+ }
40
+ async execute(input) {
41
+ const startedAt = new Date().toISOString();
42
+ const t0 = performance.now();
43
+ const findings = [];
44
+ const payload = input.payload;
45
+ // 1. Total payload size (JSON serialization byte count)
46
+ let serialized;
47
+ try {
48
+ serialized = JSON.stringify(payload);
49
+ }
50
+ catch {
51
+ const timing = this.buildTiming(startedAt, t0);
52
+ return this.createFailureResult("deny", 0.95, [
53
+ {
54
+ type: "threat_detected",
55
+ severity: "high",
56
+ code: "L1_UNSERIALIZABLE",
57
+ description: "Payload cannot be serialized to JSON — possible circular reference or exotic object",
58
+ evidence: ["JSON.stringify failed"],
59
+ remediation: "Ensure payload is a plain, serializable JSON object",
60
+ },
61
+ ], timing);
62
+ }
63
+ const payloadBytes = new TextEncoder().encode(serialized).length;
64
+ if (payloadBytes > this.limits.maxPayloadBytes) {
65
+ findings.push({
66
+ type: "threat_detected",
67
+ severity: "high",
68
+ code: "L1_PAYLOAD_TOO_LARGE",
69
+ description: `Payload size ${payloadBytes} bytes exceeds limit of ${this.limits.maxPayloadBytes} bytes`,
70
+ evidence: [
71
+ `size=${payloadBytes}, limit=${this.limits.maxPayloadBytes}`,
72
+ ],
73
+ remediation: `Reduce payload size to under ${this.limits.maxPayloadBytes} bytes`,
74
+ });
75
+ }
76
+ // 2. Walk the object checking strings, arrays, and field count
77
+ let totalFields = 0;
78
+ const violations = [];
79
+ const walk = (obj, path) => {
80
+ if (obj === null || obj === undefined)
81
+ return;
82
+ if (typeof obj === "string") {
83
+ if (obj.length > this.limits.maxStringLength) {
84
+ violations.push({
85
+ type: "threat_detected",
86
+ severity: "high",
87
+ code: "L1_STRING_TOO_LONG",
88
+ description: `String at '${path}' is ${obj.length} chars, exceeding limit of ${this.limits.maxStringLength}`,
89
+ evidence: [
90
+ `path=${path}, length=${obj.length}, limit=${this.limits.maxStringLength}`,
91
+ ],
92
+ remediation: `Shorten the string at '${path}'`,
93
+ });
94
+ }
95
+ return;
96
+ }
97
+ if (Array.isArray(obj)) {
98
+ if (obj.length > this.limits.maxArrayLength) {
99
+ violations.push({
100
+ type: "threat_detected",
101
+ severity: "high",
102
+ code: "L1_ARRAY_TOO_LONG",
103
+ description: `Array at '${path}' has ${obj.length} elements, exceeding limit of ${this.limits.maxArrayLength}`,
104
+ evidence: [
105
+ `path=${path}, length=${obj.length}, limit=${this.limits.maxArrayLength}`,
106
+ ],
107
+ remediation: `Reduce array size at '${path}'`,
108
+ });
109
+ }
110
+ // Walk array items (sample first N to avoid excessive traversal)
111
+ const sampleSize = Math.min(obj.length, 100);
112
+ for (let i = 0; i < sampleSize; i++) {
113
+ walk(obj[i], `${path}[${i}]`);
114
+ }
115
+ return;
116
+ }
117
+ if (typeof obj === "object") {
118
+ const keys = Object.keys(obj);
119
+ totalFields += keys.length;
120
+ if (totalFields > this.limits.maxTotalFields) {
121
+ violations.push({
122
+ type: "threat_detected",
123
+ severity: "medium",
124
+ code: "L1_TOO_MANY_FIELDS",
125
+ description: `Total field count ${totalFields} exceeds limit of ${this.limits.maxTotalFields}`,
126
+ evidence: [
127
+ `totalFields=${totalFields}, limit=${this.limits.maxTotalFields}`,
128
+ ],
129
+ remediation: "Reduce the number of fields in the payload",
130
+ });
131
+ return; // stop walking
132
+ }
133
+ for (const key of keys) {
134
+ walk(obj[key], path ? `${path}.${key}` : key);
135
+ }
136
+ }
137
+ };
138
+ walk(payload, "");
139
+ findings.push(...violations);
140
+ const timing = this.buildTiming(startedAt, t0);
141
+ const hasCritical = findings.some((f) => f.severity === "critical");
142
+ const hasHigh = findings.some((f) => f.severity === "high");
143
+ const passed = !hasCritical && !hasHigh;
144
+ if (passed) {
145
+ return this.createSuccessResult("allow", 0.95, findings, [], timing);
146
+ }
147
+ return this.createFailureResult("deny", 0.9, findings, timing);
148
+ }
149
+ buildTiming(startedAt, t0) {
150
+ const durationMs = performance.now() - t0;
151
+ return {
152
+ startedAt,
153
+ completedAt: new Date().toISOString(),
154
+ durationMs,
155
+ waitTimeMs: 0,
156
+ processingTimeMs: durationMs,
157
+ };
158
+ }
159
+ }
160
+ //# sourceMappingURL=L1-input-size.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"L1-input-size.js","sourceRoot":"","sources":["../../../src/layers/implementations/L1-input-size.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * L2 — Character Set Sanitizer
3
+ *
4
+ * Detects and strips dangerous Unicode sequences, invisible control characters,
5
+ * homoglyph attacks, bi-directional override characters, and other encoding-level
6
+ * prompt injection vectors.
7
+ *
8
+ * Tier: input_validation
9
+ * Primary threat: prompt_injection
10
+ *
11
+ * @packageDocumentation
12
+ */
13
+ import { BaseSecurityLayer } from "../index.js";
14
+ import type { LayerInput, LayerExecutionResult } from "../types.js";
15
+ /**
16
+ * L2 Character Set Sanitizer
17
+ *
18
+ * Strips dangerous characters and detects homoglyph attacks.
19
+ */
20
+ export declare class L2CharsetSanitizer extends BaseSecurityLayer {
21
+ constructor();
22
+ execute(input: LayerInput): Promise<LayerExecutionResult>;
23
+ private scanObject;
24
+ private scanString;
25
+ private detectHomoglyphs;
26
+ private buildTiming;
27
+ }
28
+ //# sourceMappingURL=L2-charset-sanitizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"L2-charset-sanitizer.d.ts","sourceRoot":"","sources":["../../../src/layers/implementations/L2-charset-sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EACV,UAAU,EACV,oBAAoB,EAIrB,MAAM,aAAa,CAAC;AA8FrB;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,iBAAiB;;IAkBjD,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgC/D,OAAO,CAAC,UAAU;IAuClB,OAAO,CAAC,UAAU;IA2DlB,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,WAAW;CAUpB"}