@ai-pip/csl 0.1.1 → 0.1.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.
- package/package.json +10 -28
- package/src/index.test.ts +429 -0
- package/{index.ts → src/index.ts} +53 -50
- package/src/test-external.js +547 -0
- package/layers/csl/adapters/index.ts +0 -9
- package/layers/csl/adapters/input/DOMAdapter.ts +0 -236
- package/layers/csl/adapters/input/UIAdapter.ts +0 -0
- package/layers/csl/adapters/output/ConsoleLogger.ts +0 -34
- package/layers/csl/adapters/output/CryptoHashGenerator.ts +0 -29
- package/layers/csl/adapters/output/FilePolicyRepository.ts +0 -0
- package/layers/csl/adapters/output/InMemoryPolicyRepository.ts +0 -135
- package/layers/csl/adapters/output/SystemTimestampProvider.ts +0 -9
- package/layers/csl/domain/entities/CSLResult.ts +0 -309
- package/layers/csl/domain/entities/Segment.ts +0 -338
- package/layers/csl/domain/entities/index.ts +0 -2
- package/layers/csl/domain/exceptions/ClassificationError.ts +0 -26
- package/layers/csl/domain/exceptions/SegmentationError.ts +0 -30
- package/layers/csl/domain/exceptions/index.ts +0 -2
- package/layers/csl/domain/index.ts +0 -4
- package/layers/csl/domain/services/AnomalyService.ts +0 -255
- package/layers/csl/domain/services/LineageService.ts +0 -224
- package/layers/csl/domain/services/NormalizationService.ts +0 -392
- package/layers/csl/domain/services/OriginClassificationService.ts +0 -69
- package/layers/csl/domain/services/PiDetectionService.ts +0 -475
- package/layers/csl/domain/services/PolicyService.ts +0 -296
- package/layers/csl/domain/services/SegmentClassificationService.ts +0 -105
- package/layers/csl/domain/services/SerializationService.ts +0 -229
- package/layers/csl/domain/services/index.ts +0 -7
- package/layers/csl/domain/value-objects/AnomalyScore.ts +0 -23
- package/layers/csl/domain/value-objects/ContentHash.ts +0 -54
- package/layers/csl/domain/value-objects/LineageEntry.ts +0 -42
- package/layers/csl/domain/value-objects/Origin-map.ts +0 -67
- package/layers/csl/domain/value-objects/Origin.ts +0 -99
- package/layers/csl/domain/value-objects/Pattern.ts +0 -221
- package/layers/csl/domain/value-objects/PiDetection.ts +0 -140
- package/layers/csl/domain/value-objects/PiDetectionResult.ts +0 -275
- package/layers/csl/domain/value-objects/PolicyRule.ts +0 -151
- package/layers/csl/domain/value-objects/TrustLevel.ts +0 -34
- package/layers/csl/domain/value-objects/index.ts +0 -10
- package/layers/csl/index.ts +0 -3
- package/layers/csl/ports/index.ts +0 -10
- package/layers/csl/ports/input/ClassificationPort.ts +0 -76
- package/layers/csl/ports/input/SegmentationPort.ts +0 -81
- package/layers/csl/ports/output/DOMAdapter.ts +0 -14
- package/layers/csl/ports/output/HashGenerator.ts +0 -18
- package/layers/csl/ports/output/Logger.ts +0 -17
- package/layers/csl/ports/output/PolicyRepository.ts +0 -29
- package/layers/csl/ports/output/SegmentClassified.ts +0 -8
- package/layers/csl/ports/output/TimeStampProvider.ts +0 -5
- package/layers/csl/services/CSLService.ts +0 -393
- package/layers/csl/services/index.ts +0 -1
- package/layers/csl/types/entities-types.ts +0 -37
- package/layers/csl/types/index.ts +0 -4
- package/layers/csl/types/pi-types.ts +0 -111
- package/layers/csl/types/port-output-types.ts +0 -17
- package/layers/csl/types/value-objects-types.ts +0 -213
- package/layers/csl/utils/colors.ts +0 -25
- package/layers/csl/utils/pattern-helpers.ts +0 -174
package/package.json
CHANGED
|
@@ -1,38 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-pip/csl",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "SDK oficial
|
|
3
|
+
"version": "0.1.3",
|
|
4
|
+
"description": "SDK oficial de la capa Context Segmentation Layer (CSL) del protocolo AI-PIP.",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"types": "./index.ts",
|
|
7
6
|
"exports": {
|
|
8
7
|
".": {
|
|
9
|
-
"types": "./index.ts",
|
|
10
|
-
"import": "./index.ts"
|
|
8
|
+
"types": "./src/index.ts",
|
|
9
|
+
"import": "./src/index.ts"
|
|
11
10
|
}
|
|
12
11
|
},
|
|
13
12
|
"files": [
|
|
14
|
-
"
|
|
13
|
+
"src",
|
|
15
14
|
"README.md",
|
|
16
|
-
"
|
|
15
|
+
"package.json"
|
|
17
16
|
],
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@ai-pip/csl-layer": "0.0.0"
|
|
19
|
+
},
|
|
18
20
|
"engines": {
|
|
19
21
|
"node": ">=22.6.0"
|
|
20
22
|
},
|
|
21
|
-
"keywords": [
|
|
22
|
-
"ai-pip",
|
|
23
|
-
"csl",
|
|
24
|
-
"context-segmentation",
|
|
25
|
-
"prompt-security",
|
|
26
|
-
"llm-security",
|
|
27
|
-
"prompt-injection",
|
|
28
|
-
"ai-safety",
|
|
29
|
-
"content-classification",
|
|
30
|
-
"trust-levels",
|
|
31
|
-
"anomaly-detection",
|
|
32
|
-
"typescript",
|
|
33
|
-
"browser-extension",
|
|
34
|
-
"ai-protocol"
|
|
35
|
-
],
|
|
36
23
|
"license": "MIT",
|
|
37
24
|
"publishConfig": {
|
|
38
25
|
"access": "public"
|
|
@@ -41,10 +28,5 @@
|
|
|
41
28
|
"type": "git",
|
|
42
29
|
"url": "https://github.com/MasliahDev99/AI-PIP.git",
|
|
43
30
|
"directory": "src/sdk/csl"
|
|
44
|
-
}
|
|
45
|
-
"homepage": "https://github.com/MasliahDev99/AI-PIP",
|
|
46
|
-
"bugs": {
|
|
47
|
-
"url": "https://github.com/MasliahDev99/AI-PIP/issues"
|
|
48
|
-
},
|
|
49
|
-
"scripts": {}
|
|
31
|
+
}
|
|
50
32
|
}
|
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest'
|
|
2
|
+
import {
|
|
3
|
+
createCSLService,
|
|
4
|
+
CSLService,
|
|
5
|
+
type CreateCSLServiceOptions,
|
|
6
|
+
type LoggerPort,
|
|
7
|
+
type HashGeneratorPort,
|
|
8
|
+
type TimeStampProviderPort,
|
|
9
|
+
InMemoryPolicyRepository,
|
|
10
|
+
PolicyRule,
|
|
11
|
+
SegmentationError,
|
|
12
|
+
} from './index'
|
|
13
|
+
|
|
14
|
+
describe('@ai-pip/csl SDK', () => {
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
// Limpiar el body antes de cada test
|
|
17
|
+
document.body.innerHTML = ''
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
describe('createCSLService', () => {
|
|
21
|
+
it('debe crear un servicio con configuración por defecto', () => {
|
|
22
|
+
const service = createCSLService()
|
|
23
|
+
|
|
24
|
+
expect(service).toBeInstanceOf(CSLService)
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
it('debe crear un servicio con configuración personalizada', () => {
|
|
28
|
+
const options: CreateCSLServiceOptions = {
|
|
29
|
+
enablePolicyValidation: false,
|
|
30
|
+
enableLineageTracking: false,
|
|
31
|
+
hashAlgorithm: 'sha512',
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const service = createCSLService(options)
|
|
35
|
+
|
|
36
|
+
expect(service).toBeInstanceOf(CSLService)
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
it('debe aceptar dependencias personalizadas', () => {
|
|
40
|
+
const customLogger: LoggerPort = {
|
|
41
|
+
debug: vi.fn(),
|
|
42
|
+
info: vi.fn(),
|
|
43
|
+
warn: vi.fn(),
|
|
44
|
+
error: vi.fn(),
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const customHashGenerator: HashGeneratorPort = {
|
|
48
|
+
generate: vi.fn().mockResolvedValue('mock-hash'),
|
|
49
|
+
compare: vi.fn().mockResolvedValue(true),
|
|
50
|
+
generateHMAC: vi.fn().mockResolvedValue('mock-hmac'),
|
|
51
|
+
compareHMAC: vi.fn().mockResolvedValue(true),
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const customTimestampProvider: TimeStampProviderPort = {
|
|
55
|
+
now: vi.fn().mockReturnValue(1234567890),
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const customPolicyRepository = new InMemoryPolicyRepository()
|
|
59
|
+
|
|
60
|
+
const service = createCSLService({
|
|
61
|
+
logger: customLogger,
|
|
62
|
+
hashGenerator: customHashGenerator,
|
|
63
|
+
timestampProvider: customTimestampProvider,
|
|
64
|
+
policyRepository: customPolicyRepository,
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
expect(service).toBeInstanceOf(CSLService)
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
it('debe usar implementaciones por defecto cuando no se proporcionan', () => {
|
|
71
|
+
const service = createCSLService()
|
|
72
|
+
|
|
73
|
+
expect(service).toBeInstanceOf(CSLService)
|
|
74
|
+
// El servicio debe estar creado correctamente con todas las dependencias
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
describe('CSLService.segment', () => {
|
|
79
|
+
it('debe procesar un elemento DOM simple', async () => {
|
|
80
|
+
const body = document.body
|
|
81
|
+
|
|
82
|
+
// Crear contenido simple
|
|
83
|
+
const div = document.createElement('div')
|
|
84
|
+
div.textContent = 'Hello, world!'
|
|
85
|
+
body.appendChild(div)
|
|
86
|
+
|
|
87
|
+
const service = createCSLService({
|
|
88
|
+
enablePolicyValidation: false,
|
|
89
|
+
enableLineageTracking: false,
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
const result = await service.segment(body)
|
|
93
|
+
|
|
94
|
+
expect(result).toBeDefined()
|
|
95
|
+
expect(result.segments).toBeDefined()
|
|
96
|
+
expect(Array.isArray(result.segments)).toBe(true)
|
|
97
|
+
expect(result.metadata).toBeDefined()
|
|
98
|
+
expect(result.metadata.total_segments).toBeGreaterThanOrEqual(0)
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
it('debe procesar múltiples segmentos', async () => {
|
|
102
|
+
const body = document.body
|
|
103
|
+
|
|
104
|
+
// Crear múltiples elementos
|
|
105
|
+
const div1 = document.createElement('div')
|
|
106
|
+
div1.textContent = 'Primer segmento'
|
|
107
|
+
body.appendChild(div1)
|
|
108
|
+
|
|
109
|
+
const div2 = document.createElement('div')
|
|
110
|
+
div2.textContent = 'Segundo segmento'
|
|
111
|
+
body.appendChild(div2)
|
|
112
|
+
|
|
113
|
+
const service = createCSLService({
|
|
114
|
+
enablePolicyValidation: false,
|
|
115
|
+
enableLineageTracking: false,
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
const result = await service.segment(body)
|
|
119
|
+
|
|
120
|
+
expect(result.segments.length).toBeGreaterThanOrEqual(2)
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
it('debe retornar metadatos correctos', async () => {
|
|
124
|
+
const body = document.body
|
|
125
|
+
|
|
126
|
+
const div = document.createElement('div')
|
|
127
|
+
div.textContent = 'Test content'
|
|
128
|
+
body.appendChild(div)
|
|
129
|
+
|
|
130
|
+
const service = createCSLService({
|
|
131
|
+
enablePolicyValidation: false,
|
|
132
|
+
enableLineageTracking: false,
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
const result = await service.segment(body)
|
|
136
|
+
|
|
137
|
+
expect(result.metadata).toHaveProperty('total_segments')
|
|
138
|
+
expect(result.metadata).toHaveProperty('trust_distribution')
|
|
139
|
+
expect(result.metadata).toHaveProperty('anomaly_score')
|
|
140
|
+
expect(result.metadata).toHaveProperty('blocked_segments')
|
|
141
|
+
expect(result.metadata).toHaveProperty('processing_time_ms')
|
|
142
|
+
expect(typeof result.metadata.processing_time_ms).toBe('number')
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
it('debe calcular la distribución de confianza correctamente', async () => {
|
|
146
|
+
const body = document.body
|
|
147
|
+
|
|
148
|
+
const div = document.createElement('div')
|
|
149
|
+
div.textContent = 'Content for testing'
|
|
150
|
+
body.appendChild(div)
|
|
151
|
+
|
|
152
|
+
const service = createCSLService({
|
|
153
|
+
enablePolicyValidation: false,
|
|
154
|
+
enableLineageTracking: false,
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
const result = await service.segment(body)
|
|
158
|
+
|
|
159
|
+
expect(result.metadata.trust_distribution).toHaveProperty('TC')
|
|
160
|
+
expect(result.metadata.trust_distribution).toHaveProperty('STC')
|
|
161
|
+
expect(result.metadata.trust_distribution).toHaveProperty('UC')
|
|
162
|
+
expect(
|
|
163
|
+
result.metadata.trust_distribution.TC +
|
|
164
|
+
result.metadata.trust_distribution.STC +
|
|
165
|
+
result.metadata.trust_distribution.UC
|
|
166
|
+
).toBe(result.metadata.total_segments)
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
it('debe manejar elementos vacíos', async () => {
|
|
170
|
+
const body = document.body
|
|
171
|
+
|
|
172
|
+
// Body vacío
|
|
173
|
+
|
|
174
|
+
const service = createCSLService({
|
|
175
|
+
enablePolicyValidation: false,
|
|
176
|
+
enableLineageTracking: false,
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
const result = await service.segment(body)
|
|
180
|
+
|
|
181
|
+
expect(result.segments).toEqual([])
|
|
182
|
+
expect(result.metadata.total_segments).toBe(0)
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
it('debe procesar el documento completo', async () => {
|
|
186
|
+
const div = document.createElement('div')
|
|
187
|
+
div.textContent = 'Document content'
|
|
188
|
+
document.body.appendChild(div)
|
|
189
|
+
|
|
190
|
+
const service = createCSLService({
|
|
191
|
+
enablePolicyValidation: false,
|
|
192
|
+
enableLineageTracking: false,
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
const result = await service.segment(document)
|
|
196
|
+
|
|
197
|
+
expect(result).toBeDefined()
|
|
198
|
+
expect(result.segments.length).toBeGreaterThanOrEqual(0)
|
|
199
|
+
})
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
describe('CSLService con políticas', () => {
|
|
203
|
+
it('debe validar políticas cuando está habilitado', async () => {
|
|
204
|
+
const body = document.body
|
|
205
|
+
|
|
206
|
+
const div = document.createElement('div')
|
|
207
|
+
div.textContent = 'Test content'
|
|
208
|
+
body.appendChild(div)
|
|
209
|
+
|
|
210
|
+
const policyRepository = new InMemoryPolicyRepository()
|
|
211
|
+
const policy = new PolicyRule(
|
|
212
|
+
'1.0',
|
|
213
|
+
[],
|
|
214
|
+
[],
|
|
215
|
+
{ protectedRoles: [], immutableInstructions: [] },
|
|
216
|
+
{ enabled: false, blockMetadataExposure: false, sanitizeInternalReferences: false }
|
|
217
|
+
)
|
|
218
|
+
await policyRepository.savePolicy(policy)
|
|
219
|
+
|
|
220
|
+
const service = createCSLService({
|
|
221
|
+
policyRepository,
|
|
222
|
+
enablePolicyValidation: true,
|
|
223
|
+
enableLineageTracking: false,
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
const result = await service.segment(body)
|
|
227
|
+
|
|
228
|
+
expect(result).toBeDefined()
|
|
229
|
+
expect(result.segments).toBeDefined()
|
|
230
|
+
})
|
|
231
|
+
})
|
|
232
|
+
|
|
233
|
+
describe('CSLService con linaje', () => {
|
|
234
|
+
it('debe trackear linaje cuando está habilitado', async () => {
|
|
235
|
+
const body = document.body
|
|
236
|
+
|
|
237
|
+
const div = document.createElement('div')
|
|
238
|
+
div.textContent = 'Test content for lineage'
|
|
239
|
+
body.appendChild(div)
|
|
240
|
+
|
|
241
|
+
const service = createCSLService({
|
|
242
|
+
enablePolicyValidation: false,
|
|
243
|
+
enableLineageTracking: true,
|
|
244
|
+
})
|
|
245
|
+
|
|
246
|
+
const result = await service.segment(body)
|
|
247
|
+
|
|
248
|
+
expect(result.lineage).toBeDefined()
|
|
249
|
+
expect(Array.isArray(result.lineage)).toBe(true)
|
|
250
|
+
})
|
|
251
|
+
|
|
252
|
+
it('no debe trackear linaje cuando está deshabilitado', async () => {
|
|
253
|
+
const body = document.body
|
|
254
|
+
|
|
255
|
+
const div = document.createElement('div')
|
|
256
|
+
div.textContent = 'Test content'
|
|
257
|
+
body.appendChild(div)
|
|
258
|
+
|
|
259
|
+
const service = createCSLService({
|
|
260
|
+
enablePolicyValidation: false,
|
|
261
|
+
enableLineageTracking: false,
|
|
262
|
+
})
|
|
263
|
+
|
|
264
|
+
const result = await service.segment(body)
|
|
265
|
+
|
|
266
|
+
// El linaje puede estar vacío pero debe existir
|
|
267
|
+
expect(result.lineage).toBeDefined()
|
|
268
|
+
})
|
|
269
|
+
})
|
|
270
|
+
|
|
271
|
+
describe('Manejo de errores', () => {
|
|
272
|
+
it('debe lanzar SegmentationError en caso de error', async () => {
|
|
273
|
+
const service = createCSLService({
|
|
274
|
+
enablePolicyValidation: false,
|
|
275
|
+
enableLineageTracking: false,
|
|
276
|
+
})
|
|
277
|
+
|
|
278
|
+
// Intentar procesar un elemento inválido debería causar error
|
|
279
|
+
await expect(async () => {
|
|
280
|
+
await service.segment(null as any)
|
|
281
|
+
}).rejects.toThrow(SegmentationError)
|
|
282
|
+
})
|
|
283
|
+
})
|
|
284
|
+
|
|
285
|
+
describe('CSLResult', () => {
|
|
286
|
+
it('debe tener método getBlockedCount', async () => {
|
|
287
|
+
const body = document.body
|
|
288
|
+
|
|
289
|
+
const div = document.createElement('div')
|
|
290
|
+
div.textContent = 'Test content'
|
|
291
|
+
body.appendChild(div)
|
|
292
|
+
|
|
293
|
+
const service = createCSLService({
|
|
294
|
+
enablePolicyValidation: false,
|
|
295
|
+
enableLineageTracking: false,
|
|
296
|
+
})
|
|
297
|
+
|
|
298
|
+
const result = await service.segment(body)
|
|
299
|
+
|
|
300
|
+
expect(typeof result.getBlockedCount).toBe('function')
|
|
301
|
+
const blockedCount = result.getBlockedCount()
|
|
302
|
+
expect(typeof blockedCount).toBe('number')
|
|
303
|
+
expect(blockedCount).toBeGreaterThanOrEqual(0)
|
|
304
|
+
})
|
|
305
|
+
|
|
306
|
+
it('debe tener método getTrustDistribution', async () => {
|
|
307
|
+
const body = document.body
|
|
308
|
+
|
|
309
|
+
const div = document.createElement('div')
|
|
310
|
+
div.textContent = 'Test content'
|
|
311
|
+
body.appendChild(div)
|
|
312
|
+
|
|
313
|
+
const service = createCSLService({
|
|
314
|
+
enablePolicyValidation: false,
|
|
315
|
+
enableLineageTracking: false,
|
|
316
|
+
})
|
|
317
|
+
|
|
318
|
+
const result = await service.segment(body)
|
|
319
|
+
|
|
320
|
+
expect(result.metadata.trust_distribution).toHaveProperty('TC')
|
|
321
|
+
expect(result.metadata.trust_distribution).toHaveProperty('STC')
|
|
322
|
+
expect(result.metadata.trust_distribution).toHaveProperty('UC')
|
|
323
|
+
})
|
|
324
|
+
})
|
|
325
|
+
|
|
326
|
+
describe('Segmentos', () => {
|
|
327
|
+
it('debe crear segmentos con propiedades correctas', async () => {
|
|
328
|
+
const body = document.body
|
|
329
|
+
|
|
330
|
+
const div = document.createElement('div')
|
|
331
|
+
div.textContent = 'Test segment content'
|
|
332
|
+
body.appendChild(div)
|
|
333
|
+
|
|
334
|
+
const service = createCSLService({
|
|
335
|
+
enablePolicyValidation: false,
|
|
336
|
+
enableLineageTracking: false,
|
|
337
|
+
})
|
|
338
|
+
|
|
339
|
+
const result = await service.segment(body)
|
|
340
|
+
|
|
341
|
+
if (result.segments.length > 0) {
|
|
342
|
+
const segment = result.segments[0]
|
|
343
|
+
|
|
344
|
+
expect(segment).toHaveProperty('id')
|
|
345
|
+
expect(segment).toHaveProperty('content')
|
|
346
|
+
expect(segment).toHaveProperty('origin')
|
|
347
|
+
expect(segment).toHaveProperty('mime')
|
|
348
|
+
expect(segment).toHaveProperty('timestamp')
|
|
349
|
+
expect(segment).toHaveProperty('source')
|
|
350
|
+
expect(typeof segment?.id).toBe('string')
|
|
351
|
+
expect(typeof segment?.content).toBe('string')
|
|
352
|
+
expect(typeof segment?.shouldBlock).toBe('function')
|
|
353
|
+
}
|
|
354
|
+
})
|
|
355
|
+
|
|
356
|
+
it('debe detectar si un segmento debe ser bloqueado', async () => {
|
|
357
|
+
const body = document.body
|
|
358
|
+
|
|
359
|
+
const div = document.createElement('div')
|
|
360
|
+
div.textContent = 'Normal content'
|
|
361
|
+
body.appendChild(div)
|
|
362
|
+
|
|
363
|
+
const service = createCSLService({
|
|
364
|
+
enablePolicyValidation: false,
|
|
365
|
+
enableLineageTracking: false,
|
|
366
|
+
})
|
|
367
|
+
|
|
368
|
+
const result = await service.segment(body)
|
|
369
|
+
|
|
370
|
+
expect(result.segments.length).toBeGreaterThan(0)
|
|
371
|
+
const segment = result.segments[0]
|
|
372
|
+
expect(segment).toBeDefined()
|
|
373
|
+
if (!segment) return // Type guard
|
|
374
|
+
const shouldBlock = segment.shouldBlock()
|
|
375
|
+
expect(typeof shouldBlock).toBe('boolean')
|
|
376
|
+
})
|
|
377
|
+
})
|
|
378
|
+
|
|
379
|
+
describe('Configuración de hash algorithm', () => {
|
|
380
|
+
it('debe usar sha256 por defecto', async () => {
|
|
381
|
+
const body = document.body
|
|
382
|
+
|
|
383
|
+
const div = document.createElement('div')
|
|
384
|
+
div.textContent = 'Test content'
|
|
385
|
+
body.appendChild(div)
|
|
386
|
+
|
|
387
|
+
const service = createCSLService({
|
|
388
|
+
enablePolicyValidation: false,
|
|
389
|
+
enableLineageTracking: false,
|
|
390
|
+
})
|
|
391
|
+
|
|
392
|
+
const result = await service.segment(body)
|
|
393
|
+
|
|
394
|
+
// Verificar que los segmentos tienen hash
|
|
395
|
+
expect(result.segments.length).toBeGreaterThan(0)
|
|
396
|
+
const segment = result.segments[0]
|
|
397
|
+
expect(segment).toBeDefined()
|
|
398
|
+
if (!segment) return // Type guard
|
|
399
|
+
if (segment.hash) {
|
|
400
|
+
expect(segment.hash.algorithm).toBe('sha256')
|
|
401
|
+
}
|
|
402
|
+
})
|
|
403
|
+
|
|
404
|
+
it('debe usar sha512 cuando se configura', async () => {
|
|
405
|
+
const body = document.body
|
|
406
|
+
|
|
407
|
+
const div = document.createElement('div')
|
|
408
|
+
div.textContent = 'Test content'
|
|
409
|
+
body.appendChild(div)
|
|
410
|
+
|
|
411
|
+
const service = createCSLService({
|
|
412
|
+
hashAlgorithm: 'sha512',
|
|
413
|
+
enablePolicyValidation: false,
|
|
414
|
+
enableLineageTracking: false,
|
|
415
|
+
})
|
|
416
|
+
|
|
417
|
+
const result = await service.segment(body)
|
|
418
|
+
|
|
419
|
+
// Verificar que los segmentos tienen hash con sha512
|
|
420
|
+
expect(result.segments.length).toBeGreaterThan(0)
|
|
421
|
+
const segment = result.segments[0]
|
|
422
|
+
expect(segment).toBeDefined()
|
|
423
|
+
if (!segment) return // Type guard
|
|
424
|
+
if (segment.hash) {
|
|
425
|
+
expect(segment.hash.algorithm).toBe('sha512')
|
|
426
|
+
}
|
|
427
|
+
})
|
|
428
|
+
})
|
|
429
|
+
})
|
|
@@ -28,103 +28,106 @@
|
|
|
28
28
|
// ============================================================================
|
|
29
29
|
|
|
30
30
|
// Servicio principal
|
|
31
|
-
export { CSLService, type CSLServiceConfig } from '
|
|
31
|
+
export { CSLService, type CSLServiceConfig } from '@ai-pip/csl-layer'
|
|
32
32
|
|
|
33
33
|
// ============================================================================
|
|
34
34
|
// PORTS (Interfaces públicas)
|
|
35
35
|
// ============================================================================
|
|
36
36
|
|
|
37
37
|
// Input ports (interfaces que CSL expone)
|
|
38
|
-
export type { SegmentationPort } from '
|
|
39
|
-
export type { ClassificationPort } from '
|
|
38
|
+
export type { SegmentationPort } from '@ai-pip/csl-layer'
|
|
39
|
+
export type { ClassificationPort } from '@ai-pip/csl-layer'
|
|
40
40
|
|
|
41
41
|
// Output ports (interfaces que CSL necesita)
|
|
42
|
-
export type { LoggerPort } from '
|
|
43
|
-
export type { HashGeneratorPort } from '
|
|
44
|
-
export type { TimeStampProviderPort } from '
|
|
45
|
-
export type { PolicyRepositoryPort } from '
|
|
46
|
-
export type { SegmentClassified } from '
|
|
42
|
+
export type { LoggerPort } from '@ai-pip/csl-layer'
|
|
43
|
+
export type { HashGeneratorPort } from '@ai-pip/csl-layer'
|
|
44
|
+
export type { TimeStampProviderPort } from '@ai-pip/csl-layer'
|
|
45
|
+
export type { PolicyRepositoryPort } from '@ai-pip/csl-layer'
|
|
46
|
+
export type { SegmentClassified } from '@ai-pip/csl-layer'
|
|
47
47
|
|
|
48
48
|
// ============================================================================
|
|
49
49
|
// ENTIDADES
|
|
50
50
|
// ============================================================================
|
|
51
51
|
|
|
52
|
-
export { CSLResult } from '
|
|
53
|
-
export { Segment } from '
|
|
52
|
+
export { CSLResult } from '@ai-pip/csl-layer'
|
|
53
|
+
export { Segment } from '@ai-pip/csl-layer'
|
|
54
54
|
|
|
55
55
|
// ============================================================================
|
|
56
56
|
// VALUE OBJECTS
|
|
57
57
|
// ============================================================================
|
|
58
58
|
|
|
59
|
-
export { Origin } from '
|
|
60
|
-
export { TrustLevel } from '
|
|
61
|
-
export { AnomalyScore } from '
|
|
62
|
-
export { ContentHash } from '
|
|
63
|
-
export { LineageEntry } from '
|
|
64
|
-
export { PiDetection } from '
|
|
65
|
-
export { PiDetectionResult } from '
|
|
66
|
-
export { PolicyRule } from '
|
|
67
|
-
export { Pattern } from '
|
|
59
|
+
export { Origin } from '@ai-pip/csl-layer'
|
|
60
|
+
export { TrustLevel } from '@ai-pip/csl-layer'
|
|
61
|
+
export { AnomalyScore } from '@ai-pip/csl-layer'
|
|
62
|
+
export { ContentHash } from '@ai-pip/csl-layer'
|
|
63
|
+
export { LineageEntry } from '@ai-pip/csl-layer'
|
|
64
|
+
export { PiDetection } from '@ai-pip/csl-layer'
|
|
65
|
+
export { PiDetectionResult } from '@ai-pip/csl-layer'
|
|
66
|
+
export { PolicyRule } from '@ai-pip/csl-layer'
|
|
67
|
+
export { Pattern } from '@ai-pip/csl-layer'
|
|
68
68
|
|
|
69
69
|
// ============================================================================
|
|
70
70
|
// SERVICIOS DE DOMINIO
|
|
71
71
|
// ============================================================================
|
|
72
72
|
|
|
73
|
-
export { NormalizationService } from '
|
|
74
|
-
export { OriginClassificationService } from '
|
|
75
|
-
export { PiDetectionService } from '
|
|
76
|
-
export { AnomalyService } from '
|
|
77
|
-
export { PolicyService } from '
|
|
78
|
-
export { LineageService } from '
|
|
79
|
-
export { SerializationService } from '
|
|
73
|
+
export { NormalizationService } from '@ai-pip/csl-layer'
|
|
74
|
+
export { OriginClassificationService } from '@ai-pip/csl-layer'
|
|
75
|
+
export { PiDetectionService } from '@ai-pip/csl-layer'
|
|
76
|
+
export { AnomalyService } from '@ai-pip/csl-layer'
|
|
77
|
+
export { PolicyService } from '@ai-pip/csl-layer'
|
|
78
|
+
export { LineageService } from '@ai-pip/csl-layer'
|
|
79
|
+
export { SerializationService } from '@ai-pip/csl-layer'
|
|
80
80
|
|
|
81
81
|
// ============================================================================
|
|
82
82
|
// ADAPTERS (Implementaciones por defecto)
|
|
83
83
|
// ============================================================================
|
|
84
84
|
|
|
85
85
|
// Input adapters
|
|
86
|
-
export { DOMAdapter } from '
|
|
86
|
+
export { DOMAdapter } from '@ai-pip/csl-layer'
|
|
87
87
|
|
|
88
88
|
// Output adapters
|
|
89
|
-
export { ConsoleLogger } from '
|
|
90
|
-
export { CryptoHashGenerator } from '
|
|
91
|
-
export { SystemTimestamProvider } from '
|
|
92
|
-
export { InMemoryPolicyRepository } from '
|
|
89
|
+
export { ConsoleLogger } from '@ai-pip/csl-layer'
|
|
90
|
+
export { CryptoHashGenerator } from '@ai-pip/csl-layer'
|
|
91
|
+
export { SystemTimestamProvider } from '@ai-pip/csl-layer'
|
|
92
|
+
export { InMemoryPolicyRepository } from '@ai-pip/csl-layer'
|
|
93
93
|
|
|
94
94
|
// ============================================================================
|
|
95
95
|
// EXCEPCIONES
|
|
96
96
|
// ============================================================================
|
|
97
97
|
|
|
98
|
-
export { SegmentationError } from '
|
|
99
|
-
export { ClassificationError } from '
|
|
98
|
+
export { SegmentationError } from '@ai-pip/csl-layer'
|
|
99
|
+
export { ClassificationError } from '@ai-pip/csl-layer'
|
|
100
100
|
|
|
101
101
|
// ============================================================================
|
|
102
102
|
// TIPOS
|
|
103
103
|
// ============================================================================
|
|
104
104
|
|
|
105
|
-
export type * from '
|
|
105
|
+
export type * from '@ai-pip/csl-layer'
|
|
106
106
|
// Exportar enums y valores (no solo tipos)
|
|
107
|
-
export { OriginType } from '
|
|
107
|
+
export { OriginType } from '@ai-pip/csl-layer'
|
|
108
108
|
|
|
109
109
|
// ============================================================================
|
|
110
110
|
// FACTORY FUNCTION - Creación fácil del servicio
|
|
111
111
|
// ============================================================================
|
|
112
112
|
|
|
113
|
-
import {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
113
|
+
import {
|
|
114
|
+
CSLService,
|
|
115
|
+
type CSLServiceConfig,
|
|
116
|
+
DOMAdapter,
|
|
117
|
+
OriginClassificationService,
|
|
118
|
+
PiDetectionService,
|
|
119
|
+
AnomalyService,
|
|
120
|
+
PolicyService,
|
|
121
|
+
LineageService,
|
|
122
|
+
CryptoHashGenerator,
|
|
123
|
+
ConsoleLogger,
|
|
124
|
+
SystemTimestamProvider,
|
|
125
|
+
InMemoryPolicyRepository,
|
|
126
|
+
type PolicyRepositoryPort,
|
|
127
|
+
type LoggerPort,
|
|
128
|
+
type HashGeneratorPort,
|
|
129
|
+
type TimeStampProviderPort
|
|
130
|
+
} from '@ai-pip/csl-layer'
|
|
128
131
|
|
|
129
132
|
/**
|
|
130
133
|
* Opciones para crear el servicio CSL
|