@pcircle/footprint 1.1.1 → 1.2.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.
- package/README.md +165 -12
- package/SKILL.md +72 -15
- package/dist/src/analyzers/content-analyzer.d.ts +20 -0
- package/dist/src/analyzers/content-analyzer.d.ts.map +1 -0
- package/dist/src/analyzers/content-analyzer.js +169 -0
- package/dist/src/analyzers/content-analyzer.js.map +1 -0
- package/dist/src/index.d.ts +38 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +243 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/crypto/decrypt.d.ts.map +1 -0
- package/dist/{lib → src/lib}/crypto/decrypt.js +4 -0
- package/dist/src/lib/crypto/decrypt.js.map +1 -0
- package/dist/src/lib/crypto/encrypt.d.ts.map +1 -0
- package/dist/src/lib/crypto/encrypt.js.map +1 -0
- package/dist/{lib → src/lib}/crypto/index.d.ts +1 -1
- package/dist/src/lib/crypto/index.d.ts.map +1 -0
- package/dist/{lib → src/lib}/crypto/index.js +1 -1
- package/dist/src/lib/crypto/index.js.map +1 -0
- package/dist/{lib → src/lib}/crypto/key-derivation.d.ts +17 -3
- package/dist/src/lib/crypto/key-derivation.d.ts.map +1 -0
- package/dist/{lib → src/lib}/crypto/key-derivation.js +44 -3
- package/dist/src/lib/crypto/key-derivation.js.map +1 -0
- package/dist/src/lib/crypto/types.d.ts.map +1 -0
- package/dist/src/lib/crypto/types.js.map +1 -0
- package/dist/src/lib/errors/base-error.d.ts +15 -0
- package/dist/src/lib/errors/base-error.d.ts.map +1 -0
- package/dist/src/lib/errors/base-error.js +34 -0
- package/dist/src/lib/errors/base-error.js.map +1 -0
- package/dist/src/lib/errors/crypto-error.d.ts +29 -0
- package/dist/src/lib/errors/crypto-error.d.ts.map +1 -0
- package/dist/src/lib/errors/crypto-error.js +43 -0
- package/dist/src/lib/errors/crypto-error.js.map +1 -0
- package/dist/src/lib/errors/index.d.ts +26 -0
- package/dist/src/lib/errors/index.d.ts.map +1 -0
- package/dist/src/lib/errors/index.js +26 -0
- package/dist/src/lib/errors/index.js.map +1 -0
- package/dist/src/lib/errors/storage-error.d.ts +25 -0
- package/dist/src/lib/errors/storage-error.d.ts.map +1 -0
- package/dist/src/lib/errors/storage-error.js +38 -0
- package/dist/src/lib/errors/storage-error.js.map +1 -0
- package/dist/src/lib/errors/validation-error.d.ts +21 -0
- package/dist/src/lib/errors/validation-error.d.ts.map +1 -0
- package/dist/src/lib/errors/validation-error.js +29 -0
- package/dist/src/lib/errors/validation-error.js.map +1 -0
- package/dist/{lib → src/lib}/storage/database.d.ts +14 -2
- package/dist/src/lib/storage/database.d.ts.map +1 -0
- package/dist/{lib → src/lib}/storage/database.js +65 -29
- package/dist/src/lib/storage/database.js.map +1 -0
- package/dist/src/lib/storage/export.d.ts.map +1 -0
- package/dist/{lib → src/lib}/storage/export.js +16 -1
- package/dist/src/lib/storage/export.js.map +1 -0
- package/dist/{lib → src/lib}/storage/git.d.ts +1 -1
- package/dist/src/lib/storage/git.d.ts.map +1 -0
- package/dist/{lib → src/lib}/storage/git.js +5 -2
- package/dist/src/lib/storage/git.js.map +1 -0
- package/dist/{lib → src/lib}/storage/index.d.ts +1 -0
- package/dist/src/lib/storage/index.d.ts.map +1 -0
- package/dist/{lib → src/lib}/storage/index.js +1 -0
- package/dist/src/lib/storage/index.js.map +1 -0
- package/dist/src/lib/storage/salt-storage.d.ts +25 -0
- package/dist/src/lib/storage/salt-storage.d.ts.map +1 -0
- package/dist/src/lib/storage/salt-storage.js +66 -0
- package/dist/src/lib/storage/salt-storage.js.map +1 -0
- package/dist/src/lib/storage/schema.d.ts.map +1 -0
- package/dist/{lib → src/lib}/storage/schema.js +22 -1
- package/dist/src/lib/storage/schema.js.map +1 -0
- package/dist/src/lib/storage/types.d.ts.map +1 -0
- package/dist/src/lib/storage/types.js.map +1 -0
- package/dist/src/lib/tool-response.d.ts +84 -0
- package/dist/src/lib/tool-response.d.ts.map +1 -0
- package/dist/src/lib/tool-response.js +91 -0
- package/dist/src/lib/tool-response.js.map +1 -0
- package/dist/src/lib/tool-wrapper.d.ts +45 -0
- package/dist/src/lib/tool-wrapper.d.ts.map +1 -0
- package/dist/src/lib/tool-wrapper.js +73 -0
- package/dist/src/lib/tool-wrapper.js.map +1 -0
- package/dist/{test-helpers.d.ts → src/test-helpers.d.ts} +4 -4
- package/dist/src/test-helpers.d.ts.map +1 -0
- package/dist/{test-helpers.js → src/test-helpers.js} +2 -2
- package/dist/src/test-helpers.js.map +1 -0
- package/dist/src/tools/capture-footprint.d.ts +29 -0
- package/dist/src/tools/capture-footprint.d.ts.map +1 -0
- package/dist/src/tools/capture-footprint.js +94 -0
- package/dist/src/tools/capture-footprint.js.map +1 -0
- package/dist/src/tools/delete-footprints.d.ts +22 -0
- package/dist/src/tools/delete-footprints.d.ts.map +1 -0
- package/dist/src/tools/delete-footprints.js +33 -0
- package/dist/src/tools/delete-footprints.js.map +1 -0
- package/dist/src/tools/export-footprints.d.ts +33 -0
- package/dist/src/tools/export-footprints.d.ts.map +1 -0
- package/dist/src/tools/export-footprints.js +50 -0
- package/dist/src/tools/export-footprints.js.map +1 -0
- package/dist/src/tools/get-footprint.d.ts +51 -0
- package/dist/src/tools/get-footprint.d.ts.map +1 -0
- package/dist/src/tools/get-footprint.js +66 -0
- package/dist/src/tools/get-footprint.js.map +1 -0
- package/dist/src/tools/get-tag-stats.d.ts +30 -0
- package/dist/src/tools/get-tag-stats.d.ts.map +1 -0
- package/dist/src/tools/get-tag-stats.js +33 -0
- package/dist/src/tools/get-tag-stats.js.map +1 -0
- package/dist/src/tools/index.d.ts +16 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +16 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/list-footprints.d.ts +57 -0
- package/dist/src/tools/list-footprints.d.ts.map +1 -0
- package/dist/src/tools/list-footprints.js +57 -0
- package/dist/src/tools/list-footprints.js.map +1 -0
- package/dist/src/tools/remove-tag.d.ts +22 -0
- package/dist/src/tools/remove-tag.d.ts.map +1 -0
- package/dist/src/tools/remove-tag.js +30 -0
- package/dist/src/tools/remove-tag.js.map +1 -0
- package/dist/src/tools/rename-tag.d.ts +24 -0
- package/dist/src/tools/rename-tag.d.ts.map +1 -0
- package/dist/src/tools/rename-tag.js +34 -0
- package/dist/src/tools/rename-tag.js.map +1 -0
- package/dist/src/tools/search-footprints.d.ts +60 -0
- package/dist/src/tools/search-footprints.d.ts.map +1 -0
- package/dist/src/tools/search-footprints.js +78 -0
- package/dist/src/tools/search-footprints.js.map +1 -0
- package/dist/src/tools/suggest-capture.d.ts +21 -0
- package/dist/src/tools/suggest-capture.d.ts.map +1 -0
- package/dist/src/tools/suggest-capture.js +37 -0
- package/dist/src/tools/suggest-capture.js.map +1 -0
- package/dist/src/tools/verify-footprint.d.ts +104 -0
- package/dist/src/tools/verify-footprint.d.ts.map +1 -0
- package/dist/src/tools/verify-footprint.js +102 -0
- package/dist/src/tools/verify-footprint.js.map +1 -0
- package/dist/{types.d.ts → src/types.d.ts} +1 -1
- package/dist/src/types.d.ts.map +1 -0
- package/dist/{lib/storage → src}/types.js.map +1 -1
- package/dist/src/ui/register.d.ts.map +1 -0
- package/dist/src/ui/register.js +94 -0
- package/dist/src/ui/register.js.map +1 -0
- package/dist/tests/error-handling.test.d.ts +2 -0
- package/dist/tests/error-handling.test.d.ts.map +1 -0
- package/dist/tests/error-handling.test.js +114 -0
- package/dist/tests/error-handling.test.js.map +1 -0
- package/dist/tests/fixtures.d.ts +87 -0
- package/dist/tests/fixtures.d.ts.map +1 -0
- package/dist/tests/fixtures.js +130 -0
- package/dist/tests/fixtures.js.map +1 -0
- package/dist/tests/integration.test.d.ts +2 -0
- package/dist/tests/integration.test.d.ts.map +1 -0
- package/dist/tests/integration.test.js +115 -0
- package/dist/tests/integration.test.js.map +1 -0
- package/dist/tests/resources.test.d.ts +2 -0
- package/dist/tests/resources.test.d.ts.map +1 -0
- package/dist/tests/resources.test.js +73 -0
- package/dist/tests/resources.test.js.map +1 -0
- package/dist/tests/setup.d.ts +8 -0
- package/dist/tests/setup.d.ts.map +1 -0
- package/dist/tests/setup.js +8 -0
- package/dist/tests/setup.js.map +1 -0
- package/dist/tests/tools.test.d.ts +2 -0
- package/dist/tests/tools.test.d.ts.map +1 -0
- package/dist/tests/tools.test.js +224 -0
- package/dist/tests/tools.test.js.map +1 -0
- package/dist/ui/dashboard.html +1 -1
- package/dist/ui/detail.html +1 -1
- package/dist/ui/export.html +1 -1
- package/dist/ui-tmp/ui/export.html +1 -1
- package/package.json +8 -8
- package/dist/index.d.ts +0 -19
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -694
- package/dist/index.js.map +0 -1
- package/dist/lib/crypto/decrypt.d.ts.map +0 -1
- package/dist/lib/crypto/decrypt.js.map +0 -1
- package/dist/lib/crypto/encrypt.d.ts.map +0 -1
- package/dist/lib/crypto/encrypt.js.map +0 -1
- package/dist/lib/crypto/index.d.ts.map +0 -1
- package/dist/lib/crypto/index.js.map +0 -1
- package/dist/lib/crypto/key-derivation.d.ts.map +0 -1
- package/dist/lib/crypto/key-derivation.js.map +0 -1
- package/dist/lib/crypto/types.d.ts.map +0 -1
- package/dist/lib/crypto/types.js.map +0 -1
- package/dist/lib/storage/database.d.ts.map +0 -1
- package/dist/lib/storage/database.js.map +0 -1
- package/dist/lib/storage/export.d.ts.map +0 -1
- package/dist/lib/storage/export.js.map +0 -1
- package/dist/lib/storage/git.d.ts.map +0 -1
- package/dist/lib/storage/git.js.map +0 -1
- package/dist/lib/storage/index.d.ts.map +0 -1
- package/dist/lib/storage/index.js.map +0 -1
- package/dist/lib/storage/schema.d.ts.map +0 -1
- package/dist/lib/storage/schema.js.map +0 -1
- package/dist/lib/storage/types.d.ts.map +0 -1
- package/dist/test-helpers.d.ts.map +0 -1
- package/dist/test-helpers.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/ui/register.d.ts.map +0 -1
- package/dist/ui/register.js +0 -154
- package/dist/ui/register.js.map +0 -1
- /package/dist/{lib → src/lib}/crypto/decrypt.d.ts +0 -0
- /package/dist/{lib → src/lib}/crypto/encrypt.d.ts +0 -0
- /package/dist/{lib → src/lib}/crypto/encrypt.js +0 -0
- /package/dist/{lib → src/lib}/crypto/types.d.ts +0 -0
- /package/dist/{lib → src/lib}/crypto/types.js +0 -0
- /package/dist/{lib → src/lib}/storage/export.d.ts +0 -0
- /package/dist/{lib → src/lib}/storage/schema.d.ts +0 -0
- /package/dist/{lib → src/lib}/storage/types.d.ts +0 -0
- /package/dist/{lib → src/lib}/storage/types.js +0 -0
- /package/dist/{types.js → src/types.js} +0 -0
- /package/dist/{ui → src/ui}/register.d.ts +0 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { FootprintError } from './base-error.js';
|
|
2
|
+
/**
|
|
3
|
+
* Storage error for database and file system operations
|
|
4
|
+
* HTTP status code: 500 (Internal Server Error)
|
|
5
|
+
*/
|
|
6
|
+
export declare class StorageError extends FootprintError {
|
|
7
|
+
constructor(message: string, context?: Record<string, unknown>);
|
|
8
|
+
/**
|
|
9
|
+
* Create a storage error for resource not found
|
|
10
|
+
*/
|
|
11
|
+
static notFound(resource: string, id: string): StorageError;
|
|
12
|
+
/**
|
|
13
|
+
* Create a storage error for database operations
|
|
14
|
+
*/
|
|
15
|
+
static databaseOperation(operation: string, originalError: Error): StorageError;
|
|
16
|
+
/**
|
|
17
|
+
* Create a storage error for file operations
|
|
18
|
+
*/
|
|
19
|
+
static fileOperation(operation: string, filePath: string, originalError: Error): StorageError;
|
|
20
|
+
/**
|
|
21
|
+
* Create a storage error for resource already exists
|
|
22
|
+
*/
|
|
23
|
+
static alreadyExists(resource: string, id: string): StorageError;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=storage-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-error.d.ts","sourceRoot":"","sources":["../../../../src/lib/errors/storage-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;GAGG;AACH,qBAAa,YAAa,SAAQ,cAAc;gBAClC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI9D;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY;IAI3D;;OAEG;IACH,MAAM,CAAC,iBAAiB,CACtB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,KAAK,GACnB,YAAY;IAOf;;OAEG;IACH,MAAM,CAAC,aAAa,CAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,KAAK,GACnB,YAAY;IAOf;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY;CAMjE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { FootprintError } from './base-error.js';
|
|
2
|
+
/**
|
|
3
|
+
* Storage error for database and file system operations
|
|
4
|
+
* HTTP status code: 500 (Internal Server Error)
|
|
5
|
+
*/
|
|
6
|
+
export class StorageError extends FootprintError {
|
|
7
|
+
constructor(message, context) {
|
|
8
|
+
super(message, 'STORAGE_ERROR', 500, context);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create a storage error for resource not found
|
|
12
|
+
*/
|
|
13
|
+
static notFound(resource, id) {
|
|
14
|
+
return new StorageError(`${resource} not found: ${id}`, { resource, id });
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create a storage error for database operations
|
|
18
|
+
*/
|
|
19
|
+
static databaseOperation(operation, originalError) {
|
|
20
|
+
return new StorageError(`Database ${operation} failed: ${originalError.message}`, { operation, originalError: originalError.message });
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a storage error for file operations
|
|
24
|
+
*/
|
|
25
|
+
static fileOperation(operation, filePath, originalError) {
|
|
26
|
+
return new StorageError(`File ${operation} failed for ${filePath}: ${originalError.message}`, { operation, filePath, originalError: originalError.message });
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create a storage error for resource already exists
|
|
30
|
+
*/
|
|
31
|
+
static alreadyExists(resource, id) {
|
|
32
|
+
return new StorageError(`${resource} already exists: ${id}`, {
|
|
33
|
+
resource,
|
|
34
|
+
id
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=storage-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-error.js","sourceRoot":"","sources":["../../../../src/lib/errors/storage-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;GAGG;AACH,MAAM,OAAO,YAAa,SAAQ,cAAc;IAC9C,YAAY,OAAe,EAAE,OAAiC;QAC5D,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,QAAgB,EAAE,EAAU;QAC1C,OAAO,IAAI,YAAY,CAAC,GAAG,QAAQ,eAAe,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,iBAAiB,CACtB,SAAiB,EACjB,aAAoB;QAEpB,OAAO,IAAI,YAAY,CACrB,YAAY,SAAS,YAAY,aAAa,CAAC,OAAO,EAAE,EACxD,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,CACpD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAClB,SAAiB,EACjB,QAAgB,EAChB,aAAoB;QAEpB,OAAO,IAAI,YAAY,CACrB,QAAQ,SAAS,eAAe,QAAQ,KAAK,aAAa,CAAC,OAAO,EAAE,EACpE,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,CAC9D,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,QAAgB,EAAE,EAAU;QAC/C,OAAO,IAAI,YAAY,CAAC,GAAG,QAAQ,oBAAoB,EAAE,EAAE,EAAE;YAC3D,QAAQ;YACR,EAAE;SACH,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { FootprintError } from './base-error.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validation error for invalid user input
|
|
4
|
+
* HTTP status code: 400 (Bad Request)
|
|
5
|
+
*/
|
|
6
|
+
export declare class ValidationError extends FootprintError {
|
|
7
|
+
constructor(message: string, context?: Record<string, unknown>);
|
|
8
|
+
/**
|
|
9
|
+
* Create a validation error for empty/missing required fields
|
|
10
|
+
*/
|
|
11
|
+
static required(field: string): ValidationError;
|
|
12
|
+
/**
|
|
13
|
+
* Create a validation error for invalid format
|
|
14
|
+
*/
|
|
15
|
+
static invalidFormat(field: string, expectedFormat: string): ValidationError;
|
|
16
|
+
/**
|
|
17
|
+
* Create a validation error for out of range values
|
|
18
|
+
*/
|
|
19
|
+
static outOfRange(field: string, value: number, min?: number, max?: number): ValidationError;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=validation-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-error.d.ts","sourceRoot":"","sources":["../../../../src/lib/errors/validation-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,cAAc;gBACrC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI9D;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe;IAI/C;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,eAAe;IAO5E;;OAEG;IACH,MAAM,CAAC,UAAU,CACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,GAAG,CAAC,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,GACX,eAAe;CAMnB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { FootprintError } from './base-error.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validation error for invalid user input
|
|
4
|
+
* HTTP status code: 400 (Bad Request)
|
|
5
|
+
*/
|
|
6
|
+
export class ValidationError extends FootprintError {
|
|
7
|
+
constructor(message, context) {
|
|
8
|
+
super(message, 'VALIDATION_ERROR', 400, context);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create a validation error for empty/missing required fields
|
|
12
|
+
*/
|
|
13
|
+
static required(field) {
|
|
14
|
+
return new ValidationError(`${field} is required`, { field });
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create a validation error for invalid format
|
|
18
|
+
*/
|
|
19
|
+
static invalidFormat(field, expectedFormat) {
|
|
20
|
+
return new ValidationError(`${field} has invalid format, expected: ${expectedFormat}`, { field, expectedFormat });
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a validation error for out of range values
|
|
24
|
+
*/
|
|
25
|
+
static outOfRange(field, value, min, max) {
|
|
26
|
+
return new ValidationError(`${field} is out of range (value: ${value}, min: ${min}, max: ${max})`, { field, value, min, max });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=validation-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-error.js","sourceRoot":"","sources":["../../../../src/lib/errors/validation-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;GAGG;AACH,MAAM,OAAO,eAAgB,SAAQ,cAAc;IACjD,YAAY,OAAe,EAAE,OAAiC;QAC5D,KAAK,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,KAAa;QAC3B,OAAO,IAAI,eAAe,CAAC,GAAG,KAAK,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAa,EAAE,cAAsB;QACxD,OAAO,IAAI,eAAe,CACxB,GAAG,KAAK,kCAAkC,cAAc,EAAE,EAC1D,EAAE,KAAK,EAAE,cAAc,EAAE,CAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU,CACf,KAAa,EACb,KAAa,EACb,GAAY,EACZ,GAAY;QAEZ,OAAO,IAAI,eAAe,CACxB,GAAG,KAAK,4BAA4B,KAAK,UAAU,GAAG,UAAU,GAAG,GAAG,EACtE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAC3B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
1
2
|
import type { Evidence } from './types.js';
|
|
2
3
|
/**
|
|
3
4
|
* Evidence database with CRUD operations
|
|
@@ -8,6 +9,7 @@ export declare class EvidenceDatabase {
|
|
|
8
9
|
/**
|
|
9
10
|
* Creates or opens an evidence database
|
|
10
11
|
* @param dbPath - Path to SQLite database file
|
|
12
|
+
* @throws Error if database initialization fails
|
|
11
13
|
*/
|
|
12
14
|
constructor(dbPath: string);
|
|
13
15
|
/**
|
|
@@ -48,6 +50,7 @@ export declare class EvidenceDatabase {
|
|
|
48
50
|
* Adds tags to an evidence (appends to existing tags)
|
|
49
51
|
* @param id - Evidence UUID
|
|
50
52
|
* @param tags - Array of tags to add
|
|
53
|
+
* @throws Error if tags array is empty or all tags are whitespace
|
|
51
54
|
*/
|
|
52
55
|
addTags(id: string, tags: string[]): void;
|
|
53
56
|
/**
|
|
@@ -83,16 +86,18 @@ export declare class EvidenceDatabase {
|
|
|
83
86
|
*/
|
|
84
87
|
updateTags(id: string, tags: string | null): boolean;
|
|
85
88
|
/**
|
|
86
|
-
* Renames a tag across all evidences
|
|
89
|
+
* Renames a tag across all evidences atomically using transaction
|
|
87
90
|
* @param oldTag - Tag to rename
|
|
88
91
|
* @param newTag - New tag name
|
|
89
92
|
* @returns Number of evidences updated
|
|
93
|
+
* @throws Error if transaction fails (no partial updates)
|
|
90
94
|
*/
|
|
91
95
|
renameTag(oldTag: string, newTag: string): number;
|
|
92
96
|
/**
|
|
93
|
-
* Removes a tag from all evidences
|
|
97
|
+
* Removes a tag from all evidences atomically using transaction
|
|
94
98
|
* @param tag - Tag to remove
|
|
95
99
|
* @returns Number of evidences updated
|
|
100
|
+
* @throws Error if transaction fails (no partial updates)
|
|
96
101
|
*/
|
|
97
102
|
removeTag(tag: string): number;
|
|
98
103
|
/**
|
|
@@ -100,6 +105,13 @@ export declare class EvidenceDatabase {
|
|
|
100
105
|
* @returns Map of tag to count
|
|
101
106
|
*/
|
|
102
107
|
getTagCounts(): Map<string, number>;
|
|
108
|
+
/**
|
|
109
|
+
* Get the underlying database instance
|
|
110
|
+
* Used for salt storage and other low-level operations
|
|
111
|
+
*
|
|
112
|
+
* @returns SQLite database instance
|
|
113
|
+
*/
|
|
114
|
+
getDb(): Database.Database;
|
|
103
115
|
/**
|
|
104
116
|
* Closes the database connection
|
|
105
117
|
* Should be called when done with the database
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../../src/lib/storage/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAqB3C;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAAoB;IAE9B;;;;OAIG;gBACS,MAAM,EAAE,MAAM;IAW1B;;;;OAIG;IACH,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,MAAM;IAmC1E;;;;OAIG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAkBrC;;;;OAIG;IACH,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,QAAQ,EAAE;IAiBxD;;;;OAIG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,QAAQ,EAAE;IA4B/D;;;;;OAKG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAoB5E;;;;;OAKG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAwCzC;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,QAAQ,EAAE;IAqEd;;;;OAIG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAU3B;;;;OAIG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM;IAajC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IAepD;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IA4BjD;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IA4B9B;;;OAGG;IACH,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAmBnC;;;;;OAKG;IACH,KAAK,IAAI,QAAQ,CAAC,QAAQ;IAI1B;;;OAGG;IACH,KAAK,IAAI,IAAI;IAIb;;;;;OAKG;IACH,OAAO,CAAC,aAAa;CAiBtB"}
|
|
@@ -9,10 +9,18 @@ export class EvidenceDatabase {
|
|
|
9
9
|
/**
|
|
10
10
|
* Creates or opens an evidence database
|
|
11
11
|
* @param dbPath - Path to SQLite database file
|
|
12
|
+
* @throws Error if database initialization fails
|
|
12
13
|
*/
|
|
13
14
|
constructor(dbPath) {
|
|
14
15
|
this.db = new Database(dbPath);
|
|
15
|
-
|
|
16
|
+
try {
|
|
17
|
+
createSchema(this.db);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
// Clean up database connection on any initialization failure
|
|
21
|
+
this.db.close();
|
|
22
|
+
throw new Error(`Failed to initialize database: ${error instanceof Error ? error.message : String(error)}`);
|
|
23
|
+
}
|
|
16
24
|
}
|
|
17
25
|
/**
|
|
18
26
|
* Creates a new evidence record
|
|
@@ -136,9 +144,18 @@ export class EvidenceDatabase {
|
|
|
136
144
|
* Adds tags to an evidence (appends to existing tags)
|
|
137
145
|
* @param id - Evidence UUID
|
|
138
146
|
* @param tags - Array of tags to add
|
|
147
|
+
* @throws Error if tags array is empty or all tags are whitespace
|
|
139
148
|
*/
|
|
140
149
|
addTags(id, tags) {
|
|
141
150
|
try {
|
|
151
|
+
if (tags.length === 0) {
|
|
152
|
+
throw new Error('Tags array cannot be empty');
|
|
153
|
+
}
|
|
154
|
+
// Filter out empty/whitespace-only tags
|
|
155
|
+
const validTags = tags.map(t => t.trim()).filter(t => t.length > 0);
|
|
156
|
+
if (validTags.length === 0) {
|
|
157
|
+
throw new Error('All provided tags are empty or whitespace');
|
|
158
|
+
}
|
|
142
159
|
// First, get existing tags
|
|
143
160
|
const evidence = this.findById(id);
|
|
144
161
|
if (!evidence) {
|
|
@@ -148,8 +165,8 @@ export class EvidenceDatabase {
|
|
|
148
165
|
const existingTags = evidence.tags
|
|
149
166
|
? evidence.tags.split(',').map(t => t.trim()).filter(t => t)
|
|
150
167
|
: [];
|
|
151
|
-
// Merge tags (deduplicate)
|
|
152
|
-
const mergedTags = [...new Set([...existingTags, ...
|
|
168
|
+
// Merge tags (deduplicate) using validTags instead of raw tags
|
|
169
|
+
const mergedTags = [...new Set([...existingTags, ...validTags])];
|
|
153
170
|
// Update database with comma-separated format
|
|
154
171
|
const stmt = this.db.prepare(`
|
|
155
172
|
UPDATE evidences
|
|
@@ -285,51 +302,61 @@ export class EvidenceDatabase {
|
|
|
285
302
|
}
|
|
286
303
|
}
|
|
287
304
|
/**
|
|
288
|
-
* Renames a tag across all evidences
|
|
305
|
+
* Renames a tag across all evidences atomically using transaction
|
|
289
306
|
* @param oldTag - Tag to rename
|
|
290
307
|
* @param newTag - New tag name
|
|
291
308
|
* @returns Number of evidences updated
|
|
309
|
+
* @throws Error if transaction fails (no partial updates)
|
|
292
310
|
*/
|
|
293
311
|
renameTag(oldTag, newTag) {
|
|
294
312
|
try {
|
|
295
|
-
//
|
|
296
|
-
const
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
313
|
+
// Wrap in transaction for atomic updates
|
|
314
|
+
const transaction = this.db.transaction(() => {
|
|
315
|
+
// Get all evidences with this tag
|
|
316
|
+
const evidences = this.search({ tags: [oldTag] });
|
|
317
|
+
let updatedCount = 0;
|
|
318
|
+
for (const evidence of evidences) {
|
|
319
|
+
if (!evidence.tags)
|
|
320
|
+
continue;
|
|
321
|
+
const tags = evidence.tags.split(',').map(t => t.trim());
|
|
322
|
+
const newTags = tags.map(t => t === oldTag ? newTag : t);
|
|
323
|
+
if (this.updateTags(evidence.id, newTags.join(','))) {
|
|
324
|
+
updatedCount++;
|
|
325
|
+
}
|
|
305
326
|
}
|
|
306
|
-
|
|
307
|
-
|
|
327
|
+
return updatedCount;
|
|
328
|
+
});
|
|
329
|
+
return transaction();
|
|
308
330
|
}
|
|
309
331
|
catch (error) {
|
|
310
332
|
throw new Error(`Failed to rename tag: ${error instanceof Error ? error.message : String(error)}`);
|
|
311
333
|
}
|
|
312
334
|
}
|
|
313
335
|
/**
|
|
314
|
-
* Removes a tag from all evidences
|
|
336
|
+
* Removes a tag from all evidences atomically using transaction
|
|
315
337
|
* @param tag - Tag to remove
|
|
316
338
|
* @returns Number of evidences updated
|
|
339
|
+
* @throws Error if transaction fails (no partial updates)
|
|
317
340
|
*/
|
|
318
341
|
removeTag(tag) {
|
|
319
342
|
try {
|
|
320
|
-
//
|
|
321
|
-
const
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
343
|
+
// Wrap in transaction for atomic updates
|
|
344
|
+
const transaction = this.db.transaction(() => {
|
|
345
|
+
// Get all evidences with this tag
|
|
346
|
+
const evidences = this.search({ tags: [tag] });
|
|
347
|
+
let updatedCount = 0;
|
|
348
|
+
for (const evidence of evidences) {
|
|
349
|
+
if (!evidence.tags)
|
|
350
|
+
continue;
|
|
351
|
+
const tags = evidence.tags.split(',').map(t => t.trim()).filter(t => t !== tag);
|
|
352
|
+
const newTags = tags.length > 0 ? tags.join(',') : null;
|
|
353
|
+
if (this.updateTags(evidence.id, newTags)) {
|
|
354
|
+
updatedCount++;
|
|
355
|
+
}
|
|
330
356
|
}
|
|
331
|
-
|
|
332
|
-
|
|
357
|
+
return updatedCount;
|
|
358
|
+
});
|
|
359
|
+
return transaction();
|
|
333
360
|
}
|
|
334
361
|
catch (error) {
|
|
335
362
|
throw new Error(`Failed to remove tag: ${error instanceof Error ? error.message : String(error)}`);
|
|
@@ -356,6 +383,15 @@ export class EvidenceDatabase {
|
|
|
356
383
|
throw new Error(`Failed to get tag counts: ${error instanceof Error ? error.message : String(error)}`);
|
|
357
384
|
}
|
|
358
385
|
}
|
|
386
|
+
/**
|
|
387
|
+
* Get the underlying database instance
|
|
388
|
+
* Used for salt storage and other low-level operations
|
|
389
|
+
*
|
|
390
|
+
* @returns SQLite database instance
|
|
391
|
+
*/
|
|
392
|
+
getDb() {
|
|
393
|
+
return this.db;
|
|
394
|
+
}
|
|
359
395
|
/**
|
|
360
396
|
* Closes the database connection
|
|
361
397
|
* Should be called when done with the database
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../../src/lib/storage/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsB3C;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IACnB,EAAE,CAAoB;IAE9B;;;;OAIG;IACH,YAAY,MAAc;QACxB,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC;YACH,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,6DAA6D;YAC7D,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,QAA0D;QAC/D,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;OAM5B,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CACN,EAAE,EACF,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,cAAc,EACvB,QAAQ,CAAC,WAAW,EACpB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EACtC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAC3B,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,YAAY,EACrB,QAAQ,CAAC,aAAa,EACtB,QAAQ,CAAC,YAAY,EACrB,QAAQ,CAAC,IAAI,EACb,GAAG,EACH,GAAG,CACJ,CAAC;YAEF,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,EAAU;QACjB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;OAE5B,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAA4B,CAAC;YACpD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wDAAwD;YACxD,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,oBAAoB,CAAC,cAAsB;QACzC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;OAI5B,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAkB,CAAC;YACvD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,+CAA+C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACxG,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAC,OAA6C;QAChD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;YAC7B,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;YAEpC,IAAI,KAAK,GAAG,iDAAiD,CAAC;YAC9D,MAAM,MAAM,GAAa,EAAE,CAAC;YAE5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,IAAI,UAAU,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnB,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;oBACf,KAAK,IAAI,WAAW,CAAC;oBACrB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,KAAK,IAAI,oBAAoB,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAkB,CAAC;YAClD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzG,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,EAAU,EAAE,aAAqB,EAAE,YAAoB;QACnE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;OAM5B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YAEnF,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,EAAU,EAAE,IAAc;QAChC,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChD,CAAC;YAED,wCAAwC;YACxC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC/D,CAAC;YAED,2BAA2B;YAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;YACtD,CAAC;YAED,8DAA8D;YAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI;gBAChC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5D,CAAC,CAAC,EAAE,CAAC;YAEP,+DAA+D;YAC/D,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAEjE,8CAA8C;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;OAK5B,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,OAON;QACC,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;YAErE,yBAAyB;YACzB,MAAM,UAAU,GAAa,EAAE,CAAC;YAChC,MAAM,MAAM,GAAwB,EAAE,CAAC;YAEvC,yCAAyC;YACzC,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC1B,UAAU,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;gBAC1D,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC;gBAC1C,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAC5C,CAAC;YAED,iEAAiE;YACjE,+DAA+D;YAC/D,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,6DAA6D;oBAC7D,UAAU,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;oBAC3E,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC9B,MAAM,CAAC,IAAI,CACT,GAAG,UAAU,IAAI,EAAO,2BAA2B;oBACnD,KAAK,UAAU,IAAI,EAAK,gCAAgC;oBACxD,KAAK,UAAU,EAAE,EAAO,yBAAyB;oBACjD,UAAU,CAAc,2BAA2B;qBACpD,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,uBAAuB;YACvB,IAAI,QAAQ,EAAE,CAAC;gBACb,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;YAED,oBAAoB;YACpB,IAAI,GAAG,GAAG,yBAAyB,CAAC;YACpC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,GAAG,IAAI,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9C,CAAC;YACD,GAAG,IAAI,0BAA0B,CAAC;YAElC,iBAAiB;YACjB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,GAAG,IAAI,UAAU,CAAC;gBAClB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnB,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;oBACf,GAAG,IAAI,WAAW,CAAC;oBACnB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,GAAG,IAAI,oBAAoB,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAkB,CAAC;YAClD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,EAAU;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5B,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,GAAa;QACtB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAE/B,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sCAAsC,YAAY,GAAG,CAAC,CAAC;YACpF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;YAChC,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,EAAU,EAAE,IAAmB;QACxC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;OAK5B,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5D,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,SAAS,CAAC,MAAc,EAAE,MAAc;QACtC,IAAI,CAAC;YACH,yCAAyC;YACzC,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;gBAC3C,kCAAkC;gBAClC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAClD,IAAI,YAAY,GAAG,CAAC,CAAC;gBAErB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,IAAI,CAAC,QAAQ,CAAC,IAAI;wBAAE,SAAS;oBAE7B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;oBACzD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAEzD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;wBACpD,YAAY,EAAE,CAAC;oBACjB,CAAC;gBACH,CAAC;gBAED,OAAO,YAAY,CAAC;YACtB,CAAC,CAAC,CAAC;YAEH,OAAO,WAAW,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,GAAW;QACnB,IAAI,CAAC;YACH,yCAAyC;YACzC,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;gBAC3C,kCAAkC;gBAClC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC/C,IAAI,YAAY,GAAG,CAAC,CAAC;gBAErB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,IAAI,CAAC,QAAQ,CAAC,IAAI;wBAAE,SAAS;oBAE7B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;oBAChF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBAExD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC;wBAC1C,YAAY,EAAE,CAAC;oBACjB,CAAC;gBACH,CAAC;gBAED,OAAO,YAAY,CAAC;YACtB,CAAC,CAAC,CAAC;YAEH,OAAO,WAAW,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,YAAY;QACV,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC;YACjG,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAwB,CAAC;YAE9C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC5C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACnE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzG,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK;QACH,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACK,aAAa,CAAC,GAAgB;QACpC,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,gBAAgB,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC;YACtD,KAAK,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;YAChC,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../../src/lib/storage/export.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAeD;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,gBAAgB,EACpB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAqIvB"}
|
|
@@ -2,6 +2,8 @@ import JSZip from 'jszip';
|
|
|
2
2
|
import { createHash } from 'node:crypto';
|
|
3
3
|
// Export format version constant
|
|
4
4
|
const EXPORT_FORMAT_VERSION = '1.0.0';
|
|
5
|
+
// Maximum export size in MB (configurable limit to prevent OOM)
|
|
6
|
+
const MAX_EXPORT_SIZE_MB = 100;
|
|
5
7
|
/**
|
|
6
8
|
* Export evidences to a ZIP archive with encrypted data and metadata.
|
|
7
9
|
*
|
|
@@ -25,11 +27,24 @@ export async function exportEvidences(db, options = {}) {
|
|
|
25
27
|
if (notFound.length > 0) {
|
|
26
28
|
throw new Error(`Evidence IDs not found: ${notFound.join(', ')}`);
|
|
27
29
|
}
|
|
28
|
-
|
|
30
|
+
// Map with proper error handling (should never throw after validation above)
|
|
31
|
+
evidences = evidenceIds.map(id => {
|
|
32
|
+
const evidence = db.findById(id);
|
|
33
|
+
if (!evidence) {
|
|
34
|
+
throw new Error(`Evidence ${id} not found`);
|
|
35
|
+
}
|
|
36
|
+
return evidence;
|
|
37
|
+
});
|
|
29
38
|
}
|
|
30
39
|
else {
|
|
31
40
|
evidences = db.list();
|
|
32
41
|
}
|
|
42
|
+
// Validate export size to prevent OOM crashes
|
|
43
|
+
const estimatedSizeMB = evidences.reduce((sum, e) => sum + e.encryptedContent.length, 0) / (1024 * 1024);
|
|
44
|
+
if (estimatedSizeMB > MAX_EXPORT_SIZE_MB) {
|
|
45
|
+
throw new Error(`Export size (${estimatedSizeMB.toFixed(1)}MB) exceeds limit (${MAX_EXPORT_SIZE_MB}MB). ` +
|
|
46
|
+
`Please export in smaller batches using the evidenceIds parameter.`);
|
|
47
|
+
}
|
|
33
48
|
// Create ZIP archive
|
|
34
49
|
const zip = new JSZip();
|
|
35
50
|
// Add manifest.json
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../../../src/lib/storage/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ export interface GitInfo {
|
|
|
8
8
|
author?: string;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
|
-
* Get current Git commit information
|
|
11
|
+
* Get current Git commit information with proper error logging
|
|
12
12
|
* @param dir - Directory path (defaults to process.cwd())
|
|
13
13
|
* @returns GitInfo or null if not a git repository
|
|
14
14
|
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../../src/lib/storage/git.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAsBD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAqCzB"}
|
|
@@ -19,7 +19,7 @@ async function findGitRoot(startDir) {
|
|
|
19
19
|
return null;
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
|
-
* Get current Git commit information
|
|
22
|
+
* Get current Git commit information with proper error logging
|
|
23
23
|
* @param dir - Directory path (defaults to process.cwd())
|
|
24
24
|
* @returns GitInfo or null if not a git repository
|
|
25
25
|
*/
|
|
@@ -28,6 +28,7 @@ export async function getCurrentCommit(dir = process.cwd()) {
|
|
|
28
28
|
// Find git root directory
|
|
29
29
|
const gitRoot = await findGitRoot(dir);
|
|
30
30
|
if (!gitRoot) {
|
|
31
|
+
console.warn(`[Git] Not a git repository: ${dir}`);
|
|
31
32
|
return null;
|
|
32
33
|
}
|
|
33
34
|
// Get current commit SHA
|
|
@@ -37,6 +38,7 @@ export async function getCurrentCommit(dir = process.cwd()) {
|
|
|
37
38
|
depth: 1,
|
|
38
39
|
});
|
|
39
40
|
if (commits.length === 0) {
|
|
41
|
+
console.warn(`[Git] No commits found in repository: ${gitRoot}`);
|
|
40
42
|
return null;
|
|
41
43
|
}
|
|
42
44
|
const commit = commits[0];
|
|
@@ -48,7 +50,8 @@ export async function getCurrentCommit(dir = process.cwd()) {
|
|
|
48
50
|
};
|
|
49
51
|
}
|
|
50
52
|
catch (error) {
|
|
51
|
-
//
|
|
53
|
+
// Log specific error for debugging
|
|
54
|
+
console.error(`[Git] Failed to get commit info from ${dir}:`, error instanceof Error ? error.message : String(error));
|
|
52
55
|
return null;
|
|
53
56
|
}
|
|
54
57
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../../src/lib/storage/git.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,gBAAgB,CAAC;AACjC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAYxB;;;;GAIG;AACH,KAAK,UAAU,WAAW,CAAC,QAAgB;IACzC,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;IAEzC,OAAO,UAAU,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,IAAI,CAAC;QACH,0BAA0B;QAC1B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,yBAAyB;QACzB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC;YAC5B,EAAE;YACF,GAAG,EAAE,OAAO;YACZ,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,yCAAyC,OAAO,EAAE,CAAC,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAE1B,OAAO;YACL,UAAU,EAAE,MAAM,CAAC,GAAG;YACtB,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;YAC3E,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;YAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI;SAClC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,mCAAmC;QACnC,OAAO,CAAC,KAAK,CACX,wCAAwC,GAAG,GAAG,EAC9C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -3,4 +3,5 @@ export { EvidenceDatabase } from './database.js';
|
|
|
3
3
|
export type { Evidence, Metadata } from './types.js';
|
|
4
4
|
export { getCurrentCommit, type GitInfo } from './git.js';
|
|
5
5
|
export { exportEvidences, type ExportOptions, type ExportResult } from './export.js';
|
|
6
|
+
export { storeSalt, retrieveSalt, hasSalt } from './salt-storage.js';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -2,4 +2,5 @@ export { createSchema, verifySchema } from './schema.js';
|
|
|
2
2
|
export { EvidenceDatabase } from './database.js';
|
|
3
3
|
export { getCurrentCommit } from './git.js';
|
|
4
4
|
export { exportEvidences } from './export.js';
|
|
5
|
+
export { storeSalt, retrieveSalt, hasSalt } from './salt-storage.js';
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAgB,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAyC,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
/**
|
|
3
|
+
* Store the master salt in database (one-time operation)
|
|
4
|
+
* This salt is used for all key derivations to ensure consistency
|
|
5
|
+
*
|
|
6
|
+
* @param db - SQLite database instance
|
|
7
|
+
* @param salt - 16-byte salt from initial key derivation
|
|
8
|
+
* @throws Error if salt already exists or storage fails
|
|
9
|
+
*/
|
|
10
|
+
export declare function storeSalt(db: Database.Database, salt: Uint8Array): void;
|
|
11
|
+
/**
|
|
12
|
+
* Retrieve the master salt from database
|
|
13
|
+
*
|
|
14
|
+
* @param db - SQLite database instance
|
|
15
|
+
* @returns 16-byte salt, or null if not found
|
|
16
|
+
*/
|
|
17
|
+
export declare function retrieveSalt(db: Database.Database): Uint8Array | null;
|
|
18
|
+
/**
|
|
19
|
+
* Check if master salt exists in database
|
|
20
|
+
*
|
|
21
|
+
* @param db - SQLite database instance
|
|
22
|
+
* @returns true if salt is stored, false otherwise
|
|
23
|
+
*/
|
|
24
|
+
export declare function hasSalt(db: Database.Database): boolean;
|
|
25
|
+
//# sourceMappingURL=salt-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"salt-storage.d.ts","sourceRoot":"","sources":["../../../../src/lib/storage/salt-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAwBvE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,UAAU,GAAG,IAAI,CAUrE;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAOtD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Store the master salt in database (one-time operation)
|
|
3
|
+
* This salt is used for all key derivations to ensure consistency
|
|
4
|
+
*
|
|
5
|
+
* @param db - SQLite database instance
|
|
6
|
+
* @param salt - 16-byte salt from initial key derivation
|
|
7
|
+
* @throws Error if salt already exists or storage fails
|
|
8
|
+
*/
|
|
9
|
+
export function storeSalt(db, salt) {
|
|
10
|
+
if (salt.length !== 16) {
|
|
11
|
+
throw new Error('Salt must be 16 bytes');
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
// Check if salt already exists (should only be set once)
|
|
15
|
+
const existing = db.prepare('SELECT id FROM crypto_keys WHERE id = 1').get();
|
|
16
|
+
if (existing) {
|
|
17
|
+
throw new Error('Salt already exists in database');
|
|
18
|
+
}
|
|
19
|
+
// Store salt (id=1 ensures singleton via PRIMARY KEY constraint)
|
|
20
|
+
const stmt = db.prepare(`
|
|
21
|
+
INSERT INTO crypto_keys (id, salt)
|
|
22
|
+
VALUES (1, ?)
|
|
23
|
+
`);
|
|
24
|
+
stmt.run(Buffer.from(salt));
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error instanceof Error && error.message === 'Salt already exists in database') {
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
throw new Error(`Failed to store salt: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Retrieve the master salt from database
|
|
35
|
+
*
|
|
36
|
+
* @param db - SQLite database instance
|
|
37
|
+
* @returns 16-byte salt, or null if not found
|
|
38
|
+
*/
|
|
39
|
+
export function retrieveSalt(db) {
|
|
40
|
+
try {
|
|
41
|
+
const row = db.prepare('SELECT salt FROM crypto_keys WHERE id = 1').get();
|
|
42
|
+
if (!row) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
return new Uint8Array(row.salt);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
throw new Error(`Failed to retrieve salt: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if master salt exists in database
|
|
53
|
+
*
|
|
54
|
+
* @param db - SQLite database instance
|
|
55
|
+
* @returns true if salt is stored, false otherwise
|
|
56
|
+
*/
|
|
57
|
+
export function hasSalt(db) {
|
|
58
|
+
try {
|
|
59
|
+
const row = db.prepare('SELECT id FROM crypto_keys WHERE id = 1').get();
|
|
60
|
+
return row !== undefined;
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=salt-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"salt-storage.js","sourceRoot":"","sources":["../../../../src/lib/storage/salt-storage.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,EAAqB,EAAE,IAAgB;IAC/D,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC;QACH,yDAAyD;QACzD,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7E,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,iEAAiE;QACjE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAGvB,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,iCAAiC,EAAE,CAAC;YAClF,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IACvG,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,EAAqB;IAChD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,EAAkC,CAAC;QAC1G,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IAC1G,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,EAAqB;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,EAAE,CAAC;QACxE,OAAO,GAAG,KAAK,SAAS,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/lib/storage/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAO3C;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAuExD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CA2C3D"}
|