@pcircle/footprint 1.2.2 → 1.3.0
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/LICENSE +1 -1
- package/README.md +31 -43
- package/SKILL.md +45 -45
- package/dist/src/cli/constants.d.ts +20 -0
- package/dist/src/cli/constants.d.ts.map +1 -0
- package/dist/src/cli/constants.js +25 -0
- package/dist/src/cli/constants.js.map +1 -0
- package/dist/src/cli/index.d.ts +3 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +25 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/setup.d.ts +6 -0
- package/dist/src/cli/setup.d.ts.map +1 -0
- package/dist/src/cli/setup.js +334 -0
- package/dist/src/cli/setup.js.map +1 -0
- package/dist/src/cli/types.d.ts +38 -0
- package/dist/src/cli/types.d.ts.map +1 -0
- package/dist/src/cli/types.js +5 -0
- package/dist/src/cli/types.js.map +1 -0
- package/dist/src/cli/utils/config.d.ts +19 -0
- package/dist/src/cli/utils/config.d.ts.map +1 -0
- package/dist/src/cli/utils/config.js +86 -0
- package/dist/src/cli/utils/config.js.map +1 -0
- package/dist/src/cli/utils/detect.d.ts +14 -0
- package/dist/src/cli/utils/detect.d.ts.map +1 -0
- package/dist/src/cli/utils/detect.js +57 -0
- package/dist/src/cli/utils/detect.js.map +1 -0
- package/dist/src/cli/utils/env.d.ts +10 -0
- package/dist/src/cli/utils/env.d.ts.map +1 -0
- package/dist/src/cli/utils/env.js +54 -0
- package/dist/src/cli/utils/env.js.map +1 -0
- package/dist/src/cli/utils/validation.d.ts +17 -0
- package/dist/src/cli/utils/validation.d.ts.map +1 -0
- package/dist/src/cli/utils/validation.js +77 -0
- package/dist/src/cli/utils/validation.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +13 -11
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/storage/export.d.ts +2 -2
- package/dist/src/lib/storage/export.d.ts.map +1 -1
- package/dist/src/lib/storage/export.js +39 -39
- package/dist/src/lib/storage/export.js.map +1 -1
- package/dist/src/tools/capture-footprint.js +1 -1
- package/dist/src/tools/capture-footprint.js.map +1 -1
- package/dist/src/tools/delete-footprints.d.ts +2 -2
- package/dist/src/tools/delete-footprints.d.ts.map +1 -1
- package/dist/src/tools/delete-footprints.js +4 -4
- package/dist/src/tools/delete-footprints.js.map +1 -1
- package/dist/src/tools/export-footprints.d.ts +4 -4
- package/dist/src/tools/export-footprints.d.ts.map +1 -1
- package/dist/src/tools/export-footprints.js +6 -6
- package/dist/src/tools/export-footprints.js.map +1 -1
- package/dist/src/tools/get-footprint.js +19 -19
- package/dist/src/tools/get-footprint.js.map +1 -1
- package/dist/src/tools/list-footprints.d.ts +2 -2
- package/dist/src/tools/list-footprints.js +11 -11
- package/dist/src/tools/list-footprints.js.map +1 -1
- package/dist/src/tools/search-footprints.d.ts +2 -2
- package/dist/src/tools/search-footprints.js +11 -11
- package/dist/src/tools/search-footprints.js.map +1 -1
- package/dist/src/tools/suggest-capture.js +1 -1
- package/dist/src/tools/suggest-capture.js.map +1 -1
- package/dist/src/tools/verify-footprint.js +11 -11
- package/dist/src/tools/verify-footprint.js.map +1 -1
- package/dist/src/ui/register.js +2 -2
- package/dist/src/ui/register.js.map +1 -1
- package/dist/ui/dashboard.html +49 -49
- package/dist/ui/detail.html +9 -9
- package/dist/ui/export.html +17 -17
- package/package.json +13 -6
- package/dist/tests/error-handling.test.d.ts +0 -2
- package/dist/tests/error-handling.test.d.ts.map +0 -1
- package/dist/tests/error-handling.test.js +0 -114
- package/dist/tests/error-handling.test.js.map +0 -1
- package/dist/tests/fixtures.d.ts +0 -87
- package/dist/tests/fixtures.d.ts.map +0 -1
- package/dist/tests/fixtures.js +0 -130
- package/dist/tests/fixtures.js.map +0 -1
- package/dist/tests/integration.test.d.ts +0 -2
- package/dist/tests/integration.test.d.ts.map +0 -1
- package/dist/tests/integration.test.js +0 -115
- package/dist/tests/integration.test.js.map +0 -1
- package/dist/tests/resources.test.d.ts +0 -2
- package/dist/tests/resources.test.d.ts.map +0 -1
- package/dist/tests/resources.test.js +0 -73
- package/dist/tests/resources.test.js.map +0 -1
- package/dist/tests/setup.d.ts +0 -8
- package/dist/tests/setup.d.ts.map +0 -1
- package/dist/tests/setup.js +0 -8
- package/dist/tests/setup.js.map +0 -1
- package/dist/tests/tools.test.d.ts +0 -2
- package/dist/tests/tools.test.d.ts.map +0 -1
- package/dist/tests/tools.test.js +0 -224
- package/dist/tests/tools.test.js.map +0 -1
- package/dist/ui-tmp/ui/export.html +0 -409
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/* global console */
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
/**
|
|
4
|
+
* Escape string for safe use in shell single quotes
|
|
5
|
+
* Prevents shell injection attacks by properly escaping special characters
|
|
6
|
+
*/
|
|
7
|
+
function escapeShellString(str) {
|
|
8
|
+
// In single quotes, only single quote needs escaping
|
|
9
|
+
// We escape it by ending the quote, adding an escaped quote, and starting a new quote
|
|
10
|
+
return `'${str.replace(/'/g, "'\\''")}'`;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generate environment variable export statement with proper escaping
|
|
14
|
+
* Note: _shell parameter reserved for future shell-specific syntax (e.g., fish)
|
|
15
|
+
*/
|
|
16
|
+
export function generateEnvExport(_shell, dataDir, passphrase) {
|
|
17
|
+
return [
|
|
18
|
+
"",
|
|
19
|
+
"# Footprint MCP Server Environment Variables",
|
|
20
|
+
`export FOOTPRINT_DATA_DIR=${escapeShellString(dataDir)}`,
|
|
21
|
+
`export FOOTPRINT_PASSPHRASE=${escapeShellString(passphrase)}`,
|
|
22
|
+
"",
|
|
23
|
+
].join("\n");
|
|
24
|
+
}
|
|
25
|
+
const FOOTPRINT_HEADER = "# Footprint MCP Server";
|
|
26
|
+
const FOOTPRINT_BLOCK_REGEX = /# Footprint MCP Server[\s\S]*?export FOOTPRINT_PASSPHRASE/;
|
|
27
|
+
/**
|
|
28
|
+
* Append environment variables to shell RC file with secure permissions (0o600)
|
|
29
|
+
*/
|
|
30
|
+
export function appendToShellRc(rcPath, content) {
|
|
31
|
+
if (!fs.existsSync(rcPath)) {
|
|
32
|
+
throw new Error(`Shell RC file not found: ${rcPath}`);
|
|
33
|
+
}
|
|
34
|
+
const existing = fs.readFileSync(rcPath, "utf-8");
|
|
35
|
+
if (FOOTPRINT_BLOCK_REGEX.test(existing)) {
|
|
36
|
+
throw new Error("Footprint already configured in shell RC file. " +
|
|
37
|
+
"Please remove existing configuration before re-running setup, " +
|
|
38
|
+
"or manually update the existing configuration.");
|
|
39
|
+
}
|
|
40
|
+
// Add header if content doesn't already include it (defensive)
|
|
41
|
+
const wrappedContent = content.includes(FOOTPRINT_HEADER)
|
|
42
|
+
? content
|
|
43
|
+
: `\n${FOOTPRINT_HEADER}\n${content}`;
|
|
44
|
+
fs.appendFileSync(rcPath, wrappedContent, "utf-8");
|
|
45
|
+
// Set restrictive permissions (owner read/write only)
|
|
46
|
+
try {
|
|
47
|
+
fs.chmodSync(rcPath, 0o600);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
51
|
+
console.warn(`Warning: Could not set secure permissions on ${rcPath}: ${message}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../../src/cli/utils/env.ts"],"names":[],"mappings":"AAAA,oBAAoB;AAEpB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB;;;GAGG;AACH,SAAS,iBAAiB,CAAC,GAAW;IACpC,qDAAqD;IACrD,sFAAsF;IACtF,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,OAAe,EACf,UAAkB;IAElB,OAAO;QACL,EAAE;QACF,8CAA8C;QAC9C,6BAA6B,iBAAiB,CAAC,OAAO,CAAC,EAAE;QACzD,+BAA+B,iBAAiB,CAAC,UAAU,CAAC,EAAE;QAC9D,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAClD,MAAM,qBAAqB,GACzB,2DAA2D,CAAC;AAE9D;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,OAAe;IAC7D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,IAAI,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,iDAAiD;YAC/C,gEAAgE;YAChE,gDAAgD,CACnD,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACvD,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,KAAK,gBAAgB,KAAK,OAAO,EAAE,CAAC;IAExC,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAEnD,sDAAsD;IACtD,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CACV,gDAAgD,MAAM,KAAK,OAAO,EAAE,CACrE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ValidationResult } from "../types.js";
|
|
2
|
+
export type PathValidationResult = ValidationResult & {
|
|
3
|
+
normalizedPath?: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Validate password strength using zxcvbn
|
|
7
|
+
*/
|
|
8
|
+
export declare function validatePassword(password: string): ValidationResult;
|
|
9
|
+
/**
|
|
10
|
+
* Validate and normalize file path with security checks:
|
|
11
|
+
* - Rejects dangerous shell characters
|
|
12
|
+
* - Expands tilde (~) to home directory
|
|
13
|
+
* - Ensures path is absolute and within home directory
|
|
14
|
+
* - Rejects symbolic links (could point outside allowed directories)
|
|
15
|
+
*/
|
|
16
|
+
export declare function validatePath(inputPath: string): PathValidationResult;
|
|
17
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/validation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAMpD,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAkBnE;AASD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB,CA+CpE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import zxcvbn from "zxcvbn";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import * as os from "os";
|
|
4
|
+
import * as fs from "fs";
|
|
5
|
+
import { MIN_PASSWORD_SCORE, MIN_PASSWORD_LENGTH } from "../constants.js";
|
|
6
|
+
/** Characters not allowed in paths (shell injection prevention) */
|
|
7
|
+
const DANGEROUS_PATH_CHARS = /[;&|`$()]/g;
|
|
8
|
+
/**
|
|
9
|
+
* Validate password strength using zxcvbn
|
|
10
|
+
*/
|
|
11
|
+
export function validatePassword(password) {
|
|
12
|
+
if (password.length < MIN_PASSWORD_LENGTH) {
|
|
13
|
+
return {
|
|
14
|
+
valid: false,
|
|
15
|
+
message: `Password must be at least ${MIN_PASSWORD_LENGTH} characters`,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const result = zxcvbn(password);
|
|
19
|
+
if (result.score < MIN_PASSWORD_SCORE) {
|
|
20
|
+
return {
|
|
21
|
+
valid: false,
|
|
22
|
+
message: `Password is too weak. ${result.feedback.suggestions.join(" ")}`,
|
|
23
|
+
score: result.score,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return { valid: true, score: result.score };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Helper to create invalid result
|
|
30
|
+
*/
|
|
31
|
+
function invalid(message) {
|
|
32
|
+
return { valid: false, message };
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Validate and normalize file path with security checks:
|
|
36
|
+
* - Rejects dangerous shell characters
|
|
37
|
+
* - Expands tilde (~) to home directory
|
|
38
|
+
* - Ensures path is absolute and within home directory
|
|
39
|
+
* - Rejects symbolic links (could point outside allowed directories)
|
|
40
|
+
*/
|
|
41
|
+
export function validatePath(inputPath) {
|
|
42
|
+
if (!inputPath || typeof inputPath !== "string") {
|
|
43
|
+
return invalid("Path must be a non-empty string");
|
|
44
|
+
}
|
|
45
|
+
// Security: Reject dangerous shell characters
|
|
46
|
+
if (DANGEROUS_PATH_CHARS.test(inputPath)) {
|
|
47
|
+
return invalid("Path contains invalid characters. Special shell characters are not allowed.");
|
|
48
|
+
}
|
|
49
|
+
// Expand tilde to home directory
|
|
50
|
+
const homeDir = os.homedir();
|
|
51
|
+
const expanded = inputPath.startsWith("~")
|
|
52
|
+
? path.join(homeDir, inputPath.slice(1))
|
|
53
|
+
: inputPath;
|
|
54
|
+
if (!path.isAbsolute(expanded)) {
|
|
55
|
+
return invalid("Path must be absolute (e.g., /Users/name/data or ~/.footprint)");
|
|
56
|
+
}
|
|
57
|
+
// Normalize to prevent path traversal attacks (../)
|
|
58
|
+
const normalized = path.resolve(path.normalize(expanded));
|
|
59
|
+
// Security: Ensure path is within user's home directory
|
|
60
|
+
if (!normalized.startsWith(homeDir)) {
|
|
61
|
+
return invalid(`Path must be within your home directory (${homeDir})`);
|
|
62
|
+
}
|
|
63
|
+
// Security: Reject symbolic links (could point outside allowed directories)
|
|
64
|
+
if (fs.existsSync(normalized)) {
|
|
65
|
+
try {
|
|
66
|
+
if (fs.lstatSync(normalized).isSymbolicLink()) {
|
|
67
|
+
return invalid("Symbolic links are not allowed for security reasons. Please use a real directory path.");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
72
|
+
return invalid(`Failed to validate path: ${message}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { valid: true, normalizedPath: normalized };
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../src/cli/utils/validation.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAuC/C;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,oBAAoB,CAAoC;gBAEpD,MAAM,EAAE,YAAY;IAuBhC;;;;;;;OAOG;YACW,aAAa;IAsC3B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,aAAa;IA2HrB,OAAO,CAAC,iBAAiB;IAqCnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;;OAGG;IACH,KAAK,IAAI,IAAI;CAId;AAGD,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA4C1C;AAeD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
/* global console, process */
|
|
2
3
|
import { McpServer, ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
4
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
5
|
import { EvidenceDatabase, storeSalt, retrieveSalt, } from "./lib/storage/index.js";
|
|
@@ -157,18 +158,18 @@ export class FootprintServer {
|
|
|
157
158
|
}, createGetTagStatsHandler(this.db));
|
|
158
159
|
}
|
|
159
160
|
registerResources() {
|
|
160
|
-
this.server.registerResource("
|
|
161
|
-
title: "
|
|
161
|
+
this.server.registerResource("evidence", new ResourceTemplate("evidence://{id}", { list: undefined }), {
|
|
162
|
+
title: "Evidence Content",
|
|
162
163
|
description: "Access encrypted footprint record by ID",
|
|
163
164
|
mimeType: "text/plain",
|
|
164
165
|
}, async (uri, { id }) => {
|
|
165
166
|
try {
|
|
166
|
-
const
|
|
167
|
-
if (!
|
|
168
|
-
throw new Error(`
|
|
167
|
+
const evidence = this.db.findById(id);
|
|
168
|
+
if (!evidence) {
|
|
169
|
+
throw new Error(`Evidence with ID ${id} not found`);
|
|
169
170
|
}
|
|
170
171
|
const key = await this.getDerivedKey();
|
|
171
|
-
const decrypted = decrypt(
|
|
172
|
+
const decrypted = decrypt(evidence.encryptedContent, evidence.nonce, key);
|
|
172
173
|
return {
|
|
173
174
|
contents: [
|
|
174
175
|
{ uri: uri.href, mimeType: "text/plain", text: decrypted },
|
|
@@ -176,7 +177,7 @@ export class FootprintServer {
|
|
|
176
177
|
};
|
|
177
178
|
}
|
|
178
179
|
catch (error) {
|
|
179
|
-
throw new Error(`Failed to access
|
|
180
|
+
throw new Error(`Failed to access evidence resource: ${getErrorMessage(error)}`);
|
|
180
181
|
}
|
|
181
182
|
});
|
|
182
183
|
}
|
|
@@ -193,9 +194,10 @@ export class FootprintServer {
|
|
|
193
194
|
this.db.close();
|
|
194
195
|
}
|
|
195
196
|
}
|
|
196
|
-
|
|
197
|
+
// Export main as named function
|
|
198
|
+
export async function main() {
|
|
197
199
|
const config = {
|
|
198
|
-
dbPath: process.env.FOOTPRINT_DB_PATH || "./
|
|
200
|
+
dbPath: process.env.FOOTPRINT_DB_PATH || "./evidence.db",
|
|
199
201
|
password: process.env.FOOTPRINT_PASSWORD || "",
|
|
200
202
|
};
|
|
201
203
|
if (!config.password) {
|
|
@@ -229,11 +231,11 @@ async function main() {
|
|
|
229
231
|
process.on("exit", cleanup);
|
|
230
232
|
await server.start();
|
|
231
233
|
}
|
|
232
|
-
//
|
|
234
|
+
// Only run if this is the main module (not imported by CLI)
|
|
233
235
|
const isMainModule = import.meta.url === `file://${process.argv[1]}` ||
|
|
234
236
|
process.argv[1]?.endsWith("/footprint") ||
|
|
235
237
|
process.argv[1]?.endsWith("/dist/index.js");
|
|
236
|
-
if (isMainModule) {
|
|
238
|
+
if (isMainModule && !process.argv.includes("setup")) {
|
|
237
239
|
main().catch((error) => {
|
|
238
240
|
console.error("Server error:", error);
|
|
239
241
|
process.exit(1);
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { EvidenceDatabase } from './database.js';
|
|
2
2
|
export interface ExportOptions {
|
|
3
|
-
|
|
3
|
+
evidenceIds?: string[];
|
|
4
4
|
includeGitInfo?: boolean;
|
|
5
5
|
password?: string;
|
|
6
6
|
}
|
|
@@ -8,7 +8,7 @@ export interface ExportResult {
|
|
|
8
8
|
filename: string;
|
|
9
9
|
zipData: Uint8Array;
|
|
10
10
|
checksum: string;
|
|
11
|
-
|
|
11
|
+
evidenceCount: number;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* Export evidences to a ZIP archive with encrypted data and metadata.
|
|
@@ -1 +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,
|
|
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"}
|
|
@@ -18,32 +18,32 @@ const MAX_EXPORT_SIZE_MB = 100;
|
|
|
18
18
|
*/
|
|
19
19
|
export async function exportEvidences(db, options = {}) {
|
|
20
20
|
try {
|
|
21
|
-
const {
|
|
22
|
-
// Get
|
|
23
|
-
let
|
|
24
|
-
if (
|
|
21
|
+
const { evidenceIds, includeGitInfo = false } = options;
|
|
22
|
+
// Get evidences to export - validate IDs if specified
|
|
23
|
+
let evidences;
|
|
24
|
+
if (evidenceIds) {
|
|
25
25
|
// Validate all IDs exist first
|
|
26
|
-
const notFound =
|
|
26
|
+
const notFound = evidenceIds.filter(id => !db.findById(id));
|
|
27
27
|
if (notFound.length > 0) {
|
|
28
|
-
throw new Error(`
|
|
28
|
+
throw new Error(`Evidence IDs not found: ${notFound.join(', ')}`);
|
|
29
29
|
}
|
|
30
30
|
// Map with proper error handling (should never throw after validation above)
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
if (!
|
|
34
|
-
throw new Error(`
|
|
31
|
+
evidences = evidenceIds.map(id => {
|
|
32
|
+
const evidence = db.findById(id);
|
|
33
|
+
if (!evidence) {
|
|
34
|
+
throw new Error(`Evidence ${id} not found`);
|
|
35
35
|
}
|
|
36
|
-
return
|
|
36
|
+
return evidence;
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
39
|
else {
|
|
40
|
-
|
|
40
|
+
evidences = db.list();
|
|
41
41
|
}
|
|
42
42
|
// Validate export size to prevent OOM crashes
|
|
43
|
-
const estimatedSizeMB =
|
|
43
|
+
const estimatedSizeMB = evidences.reduce((sum, e) => sum + e.encryptedContent.length, 0) / (1024 * 1024);
|
|
44
44
|
if (estimatedSizeMB > MAX_EXPORT_SIZE_MB) {
|
|
45
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
|
|
46
|
+
`Please export in smaller batches using the evidenceIds parameter.`);
|
|
47
47
|
}
|
|
48
48
|
// Create ZIP archive
|
|
49
49
|
const zip = new JSZip();
|
|
@@ -51,48 +51,48 @@ export async function exportEvidences(db, options = {}) {
|
|
|
51
51
|
const manifest = {
|
|
52
52
|
version: EXPORT_FORMAT_VERSION,
|
|
53
53
|
exportDate: new Date().toISOString(),
|
|
54
|
-
|
|
54
|
+
evidenceCount: evidences.length,
|
|
55
55
|
includeGitInfo,
|
|
56
56
|
};
|
|
57
57
|
zip.file('manifest.json', JSON.stringify(manifest, null, 2));
|
|
58
|
-
// Add each
|
|
58
|
+
// Add each evidence
|
|
59
59
|
const checksumEntries = [];
|
|
60
|
-
for (const
|
|
61
|
-
const
|
|
60
|
+
for (const evidence of evidences) {
|
|
61
|
+
const evidenceFolder = `evidences/${evidence.id}`;
|
|
62
62
|
// Add encrypted-data
|
|
63
|
-
zip.file(`${
|
|
63
|
+
zip.file(`${evidenceFolder}/encrypted-data`, evidence.encryptedContent);
|
|
64
64
|
// Calculate checksum for encrypted data
|
|
65
65
|
const dataChecksum = createHash('sha256')
|
|
66
|
-
.update(
|
|
66
|
+
.update(evidence.encryptedContent)
|
|
67
67
|
.digest('hex');
|
|
68
|
-
checksumEntries.push(`${dataChecksum} ${
|
|
68
|
+
checksumEntries.push(`${dataChecksum} ${evidenceFolder}/encrypted-data`);
|
|
69
69
|
// Add metadata.json
|
|
70
70
|
const metadata = {
|
|
71
|
-
id:
|
|
72
|
-
timestamp:
|
|
73
|
-
conversationId:
|
|
74
|
-
llmProvider:
|
|
75
|
-
contentHash:
|
|
76
|
-
messageCount:
|
|
77
|
-
tags:
|
|
78
|
-
nonce: Array.from(
|
|
71
|
+
id: evidence.id,
|
|
72
|
+
timestamp: evidence.timestamp,
|
|
73
|
+
conversationId: evidence.conversationId,
|
|
74
|
+
llmProvider: evidence.llmProvider,
|
|
75
|
+
contentHash: evidence.contentHash,
|
|
76
|
+
messageCount: evidence.messageCount,
|
|
77
|
+
tags: evidence.tags,
|
|
78
|
+
nonce: Array.from(evidence.nonce), // Convert Uint8Array to array for JSON
|
|
79
79
|
};
|
|
80
80
|
const metadataJson = JSON.stringify(metadata, null, 2);
|
|
81
|
-
zip.file(`${
|
|
81
|
+
zip.file(`${evidenceFolder}/metadata.json`, metadataJson);
|
|
82
82
|
const metadataChecksum = createHash('sha256')
|
|
83
83
|
.update(metadataJson)
|
|
84
84
|
.digest('hex');
|
|
85
|
-
checksumEntries.push(`${metadataChecksum} ${
|
|
85
|
+
checksumEntries.push(`${metadataChecksum} ${evidenceFolder}/metadata.json`);
|
|
86
86
|
// Add git-info.json if requested and available
|
|
87
|
-
if (includeGitInfo &&
|
|
87
|
+
if (includeGitInfo && evidence.gitCommitHash && evidence.gitTimestamp) {
|
|
88
88
|
const gitInfo = {
|
|
89
|
-
gitCommitHash:
|
|
90
|
-
gitTimestamp:
|
|
89
|
+
gitCommitHash: evidence.gitCommitHash,
|
|
90
|
+
gitTimestamp: evidence.gitTimestamp,
|
|
91
91
|
};
|
|
92
92
|
const gitInfoJson = JSON.stringify(gitInfo, null, 2);
|
|
93
|
-
zip.file(`${
|
|
93
|
+
zip.file(`${evidenceFolder}/git-info.json`, gitInfoJson);
|
|
94
94
|
const gitChecksum = createHash('sha256').update(gitInfoJson).digest('hex');
|
|
95
|
-
checksumEntries.push(`${gitChecksum} ${
|
|
95
|
+
checksumEntries.push(`${gitChecksum} ${evidenceFolder}/git-info.json`);
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
// Add checksum.txt
|
|
@@ -113,16 +113,16 @@ export async function exportEvidences(db, options = {}) {
|
|
|
113
113
|
const zipChecksum = createHash('sha256').update(zipData).digest('hex');
|
|
114
114
|
// Generate filename
|
|
115
115
|
const timestamp = new Date().toISOString().split('T')[0]; // YYYY-MM-DD
|
|
116
|
-
const filename = `
|
|
116
|
+
const filename = `evidence-export-${timestamp}.zip`;
|
|
117
117
|
return {
|
|
118
118
|
filename,
|
|
119
119
|
zipData,
|
|
120
120
|
checksum: zipChecksum,
|
|
121
|
-
|
|
121
|
+
evidenceCount: evidences.length,
|
|
122
122
|
};
|
|
123
123
|
}
|
|
124
124
|
catch (error) {
|
|
125
|
-
throw new Error(`Failed to export
|
|
125
|
+
throw new Error(`Failed to export evidences: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
//# sourceMappingURL=export.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../../../src/lib/storage/export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAuBzC,iCAAiC;AACjC,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAEtC,gEAAgE;AAChE,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAoB,EACpB,UAAyB,EAAE;IAE3B,IAAI,CAAC;QACH,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../../../src/lib/storage/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -78,7 +78,7 @@ export function createCaptureFootprintHandler(db, getDerivedKey) {
|
|
|
78
78
|
gitTimestamp: gitInfo?.timestamp || null,
|
|
79
79
|
tags: params.tags || null,
|
|
80
80
|
});
|
|
81
|
-
return formatSuccessResponse("
|
|
81
|
+
return formatSuccessResponse("Evidence captured successfully", {
|
|
82
82
|
ID: id,
|
|
83
83
|
Timestamp: timestamp,
|
|
84
84
|
"Git Commit": gitInfo?.commitHash || "N/A",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture-footprint.js","sourceRoot":"","sources":["../../../src/tools/capture-footprint.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"capture-footprint.js","sourceRoot":"","sources":["../../../src/tools/capture-footprint.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import * as z from "zod";
|
|
|
2
2
|
import type { EvidenceDatabase } from "../lib/storage/index.js";
|
|
3
3
|
export declare const deleteFootprintsSchema: {
|
|
4
4
|
inputSchema: {
|
|
5
|
-
|
|
5
|
+
evidenceIds: z.ZodArray<z.ZodString, "many">;
|
|
6
6
|
};
|
|
7
7
|
outputSchema: {
|
|
8
8
|
deletedCount: z.ZodNumber;
|
|
@@ -14,7 +14,7 @@ export declare const deleteFootprintsMetadata: {
|
|
|
14
14
|
description: string;
|
|
15
15
|
};
|
|
16
16
|
export declare function createDeleteFootprintsHandler(db: EvidenceDatabase): (params: {
|
|
17
|
-
|
|
17
|
+
evidenceIds: string[];
|
|
18
18
|
}) => Promise<import("../lib/tool-response.js").ToolResponse<{
|
|
19
19
|
deletedCount: number;
|
|
20
20
|
success: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-footprints.d.ts","sourceRoot":"","sources":["../../../src/tools/delete-footprints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,eAAO,MAAM,sBAAsB;;;;;;;;CAWlC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;CAGpC,CAAC;AAEF,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"delete-footprints.d.ts","sourceRoot":"","sources":["../../../src/tools/delete-footprints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,eAAO,MAAM,sBAAsB;;;;;;;;CAWlC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;CAGpC,CAAC;AAEF,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,gBAAgB;iBAIhC,MAAM,EAAE;;;;IAezC"}
|
|
@@ -3,7 +3,7 @@ import { wrapToolHandler } from "../lib/tool-wrapper.js";
|
|
|
3
3
|
import { createToolResponse } from "../lib/tool-response.js";
|
|
4
4
|
export const deleteFootprintsSchema = {
|
|
5
5
|
inputSchema: {
|
|
6
|
-
|
|
6
|
+
evidenceIds: z
|
|
7
7
|
.array(z.string())
|
|
8
8
|
.min(1)
|
|
9
9
|
.describe("Array of footprint IDs to delete"),
|
|
@@ -19,10 +19,10 @@ export const deleteFootprintsMetadata = {
|
|
|
19
19
|
};
|
|
20
20
|
export function createDeleteFootprintsHandler(db) {
|
|
21
21
|
return wrapToolHandler("delete-footprints", "Verify the footprint IDs exist.", async (params) => {
|
|
22
|
-
if (!params.
|
|
23
|
-
throw new Error("At least one
|
|
22
|
+
if (!params.evidenceIds || params.evidenceIds.length === 0) {
|
|
23
|
+
throw new Error("At least one evidence ID is required");
|
|
24
24
|
}
|
|
25
|
-
const deletedCount = db.deleteMany(params.
|
|
25
|
+
const deletedCount = db.deleteMany(params.evidenceIds);
|
|
26
26
|
const success = deletedCount > 0;
|
|
27
27
|
const resultText = success
|
|
28
28
|
? `🗑️ Successfully deleted ${deletedCount} footprint record${deletedCount > 1 ? "s" : ""}`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-footprints.js","sourceRoot":"","sources":["../../../src/tools/delete-footprints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,WAAW,EAAE;QACX,
|
|
1
|
+
{"version":3,"file":"delete-footprints.js","sourceRoot":"","sources":["../../../src/tools/delete-footprints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,WAAW,EAAE;QACX,WAAW,EAAE,CAAC;aACX,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CAAC,kCAAkC,CAAC;KAChD;IACD,YAAY,EAAE;QACZ,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;KACrB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EAAE,kDAAkD;CAChE,CAAC;AAEF,MAAM,UAAU,6BAA6B,CAAC,EAAoB;IAChE,OAAO,eAAe,CACpB,mBAAmB,EACnB,iCAAiC,EACjC,KAAK,EAAE,MAAiC,EAAE,EAAE;QAC1C,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,YAAY,GAAG,CAAC,CAAC;QAEjC,MAAM,UAAU,GAAG,OAAO;YACxB,CAAC,CAAC,4BAA4B,YAAY,oBAAoB,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC3F,CAAC,CAAC,qDAAqD,CAAC;QAE1D,OAAO,kBAAkB,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -2,13 +2,13 @@ import * as z from "zod";
|
|
|
2
2
|
import type { EvidenceDatabase } from "../lib/storage/index.js";
|
|
3
3
|
export declare const exportFootprintsSchema: {
|
|
4
4
|
inputSchema: {
|
|
5
|
-
|
|
5
|
+
evidenceIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
6
6
|
includeGitInfo: z.ZodOptional<z.ZodBoolean>;
|
|
7
7
|
};
|
|
8
8
|
outputSchema: {
|
|
9
9
|
filename: z.ZodString;
|
|
10
10
|
checksum: z.ZodString;
|
|
11
|
-
|
|
11
|
+
evidenceCount: z.ZodNumber;
|
|
12
12
|
success: z.ZodBoolean;
|
|
13
13
|
};
|
|
14
14
|
};
|
|
@@ -22,12 +22,12 @@ export declare const exportFootprintsMetadata: {
|
|
|
22
22
|
};
|
|
23
23
|
};
|
|
24
24
|
export declare function createExportFootprintsHandler(db: EvidenceDatabase): (params: {
|
|
25
|
-
|
|
25
|
+
evidenceIds?: string[];
|
|
26
26
|
includeGitInfo?: boolean;
|
|
27
27
|
}) => Promise<import("../lib/tool-response.js").ToolResponse<{
|
|
28
28
|
filename: string;
|
|
29
29
|
checksum: string;
|
|
30
|
-
|
|
30
|
+
evidenceCount: number;
|
|
31
31
|
success: boolean;
|
|
32
32
|
}>>;
|
|
33
33
|
//# sourceMappingURL=export-footprints.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-footprints.d.ts","sourceRoot":"","sources":["../../../src/tools/export-footprints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,eAAO,MAAM,sBAAsB;;;;;;;;;;;CAclC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;CAQpC,CAAC;AAEF,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"export-footprints.d.ts","sourceRoot":"","sources":["../../../src/tools/export-footprints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,eAAO,MAAM,sBAAsB;;;;;;;;;;;CAclC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;CAQpC,CAAC;AAEF,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,gBAAgB;kBAI/B,MAAM,EAAE;qBAAmB,OAAO;;;;;;IA4BpE"}
|