@pcircle/footprint 1.3.0 → 1.5.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/README.md +136 -160
- package/SKILL.md +7 -7
- package/dist/src/analyzers/content-analyzer.d.ts.map +1 -1
- package/dist/src/analyzers/content-analyzer.js +20 -4
- package/dist/src/analyzers/content-analyzer.js.map +1 -1
- package/dist/src/cli/index.js +0 -0
- package/dist/src/cli/setup.d.ts.map +1 -1
- package/dist/src/cli/setup.js +34 -12
- package/dist/src/cli/setup.js.map +1 -1
- package/dist/src/cli/utils/env.d.ts +7 -2
- package/dist/src/cli/utils/env.d.ts.map +1 -1
- package/dist/src/cli/utils/env.js +37 -6
- package/dist/src/cli/utils/env.js.map +1 -1
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +41 -28
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/crypto/decrypt.d.ts.map +1 -1
- package/dist/src/lib/crypto/decrypt.js +12 -8
- package/dist/src/lib/crypto/decrypt.js.map +1 -1
- package/dist/src/lib/crypto/encrypt.d.ts.map +1 -1
- package/dist/src/lib/crypto/encrypt.js +6 -3
- package/dist/src/lib/crypto/encrypt.js.map +1 -1
- package/dist/src/lib/crypto/key-derivation.d.ts +1 -1
- package/dist/src/lib/crypto/key-derivation.d.ts.map +1 -1
- package/dist/src/lib/crypto/key-derivation.js +11 -11
- package/dist/src/lib/crypto/key-derivation.js.map +1 -1
- package/dist/src/lib/storage/database.d.ts +46 -3
- package/dist/src/lib/storage/database.d.ts.map +1 -1
- package/dist/src/lib/storage/database.js +175 -80
- package/dist/src/lib/storage/database.js.map +1 -1
- package/dist/src/lib/storage/export.d.ts +1 -2
- package/dist/src/lib/storage/export.d.ts.map +1 -1
- package/dist/src/lib/storage/export.js +46 -33
- package/dist/src/lib/storage/export.js.map +1 -1
- package/dist/src/lib/storage/salt-storage.d.ts +1 -1
- package/dist/src/lib/storage/salt-storage.d.ts.map +1 -1
- package/dist/src/lib/storage/salt-storage.js +26 -18
- package/dist/src/lib/storage/salt-storage.js.map +1 -1
- package/dist/src/lib/storage/schema.d.ts +1 -1
- package/dist/src/lib/storage/schema.d.ts.map +1 -1
- package/dist/src/lib/storage/schema.js +29 -47
- package/dist/src/lib/storage/schema.js.map +1 -1
- package/dist/src/lib/tool-wrapper.d.ts.map +1 -1
- package/dist/src/lib/tool-wrapper.js +2 -2
- package/dist/src/lib/tool-wrapper.js.map +1 -1
- package/dist/src/prompts/skill-prompt.d.ts +6 -0
- package/dist/src/prompts/skill-prompt.d.ts.map +1 -0
- package/dist/src/prompts/skill-prompt.js +125 -0
- package/dist/src/prompts/skill-prompt.js.map +1 -0
- package/dist/src/tools/capture-footprint.d.ts +2 -2
- package/dist/src/tools/capture-footprint.d.ts.map +1 -1
- package/dist/src/tools/capture-footprint.js +52 -11
- package/dist/src/tools/capture-footprint.js.map +1 -1
- package/dist/src/tools/delete-footprints.d.ts +18 -1
- package/dist/src/tools/delete-footprints.d.ts.map +1 -1
- package/dist/src/tools/delete-footprints.js +53 -5
- package/dist/src/tools/delete-footprints.js.map +1 -1
- package/dist/src/tools/export-footprints.d.ts +11 -3
- package/dist/src/tools/export-footprints.d.ts.map +1 -1
- package/dist/src/tools/export-footprints.js +48 -9
- package/dist/src/tools/export-footprints.js.map +1 -1
- package/dist/src/tools/get-footprint.d.ts +1 -7
- package/dist/src/tools/get-footprint.d.ts.map +1 -1
- package/dist/src/tools/get-footprint.js +7 -3
- package/dist/src/tools/get-footprint.js.map +1 -1
- package/dist/src/tools/index.d.ts +1 -3
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +1 -3
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/list-footprints.d.ts +1 -15
- package/dist/src/tools/list-footprints.d.ts.map +1 -1
- package/dist/src/tools/list-footprints.js +17 -6
- package/dist/src/tools/list-footprints.js.map +1 -1
- package/dist/src/tools/manage-tags.d.ts +47 -0
- package/dist/src/tools/manage-tags.d.ts.map +1 -0
- package/dist/src/tools/manage-tags.js +109 -0
- package/dist/src/tools/manage-tags.js.map +1 -0
- package/dist/src/tools/search-footprints.d.ts +2 -16
- package/dist/src/tools/search-footprints.d.ts.map +1 -1
- package/dist/src/tools/search-footprints.js +23 -7
- package/dist/src/tools/search-footprints.js.map +1 -1
- package/dist/src/tools/suggest-capture.d.ts +1 -1
- package/dist/src/tools/suggest-capture.d.ts.map +1 -1
- package/dist/src/tools/suggest-capture.js +6 -2
- package/dist/src/tools/suggest-capture.js.map +1 -1
- package/dist/src/tools/verify-footprint.d.ts +7 -54
- package/dist/src/tools/verify-footprint.d.ts.map +1 -1
- package/dist/src/tools/verify-footprint.js +11 -8
- package/dist/src/tools/verify-footprint.js.map +1 -1
- package/dist/src/types.d.ts +4 -4
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/ui/register.js +1 -1
- package/dist/src/ui/register.js.map +1 -1
- package/dist/ui/dashboard.html +80 -67
- package/dist/ui/detail.html +62 -49
- package/dist/ui/export.html +64 -51
- package/package.json +18 -13
- package/dist/src/lib/errors/base-error.d.ts +0 -15
- package/dist/src/lib/errors/base-error.d.ts.map +0 -1
- package/dist/src/lib/errors/base-error.js +0 -34
- package/dist/src/lib/errors/base-error.js.map +0 -1
- package/dist/src/lib/errors/crypto-error.d.ts +0 -29
- package/dist/src/lib/errors/crypto-error.d.ts.map +0 -1
- package/dist/src/lib/errors/crypto-error.js +0 -43
- package/dist/src/lib/errors/crypto-error.js.map +0 -1
- package/dist/src/lib/errors/index.d.ts +0 -26
- package/dist/src/lib/errors/index.d.ts.map +0 -1
- package/dist/src/lib/errors/index.js +0 -26
- package/dist/src/lib/errors/index.js.map +0 -1
- package/dist/src/lib/errors/storage-error.d.ts +0 -25
- package/dist/src/lib/errors/storage-error.d.ts.map +0 -1
- package/dist/src/lib/errors/storage-error.js +0 -38
- package/dist/src/lib/errors/storage-error.js.map +0 -1
- package/dist/src/lib/errors/validation-error.d.ts +0 -21
- package/dist/src/lib/errors/validation-error.d.ts.map +0 -1
- package/dist/src/lib/errors/validation-error.js +0 -29
- package/dist/src/lib/errors/validation-error.js.map +0 -1
- package/dist/src/test-helpers.d.ts +0 -33
- package/dist/src/test-helpers.d.ts.map +0 -1
- package/dist/src/test-helpers.js +0 -108
- package/dist/src/test-helpers.js.map +0 -1
- package/dist/src/tools/get-tag-stats.d.ts +0 -30
- package/dist/src/tools/get-tag-stats.d.ts.map +0 -1
- package/dist/src/tools/get-tag-stats.js +0 -33
- package/dist/src/tools/get-tag-stats.js.map +0 -1
- package/dist/src/tools/remove-tag.d.ts +0 -22
- package/dist/src/tools/remove-tag.d.ts.map +0 -1
- package/dist/src/tools/remove-tag.js +0 -30
- package/dist/src/tools/remove-tag.js.map +0 -1
- package/dist/src/tools/rename-tag.d.ts +0 -24
- package/dist/src/tools/rename-tag.d.ts.map +0 -1
- package/dist/src/tools/rename-tag.js +0 -34
- package/dist/src/tools/rename-tag.js.map +0 -1
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Generate environment variable export statement with proper escaping
|
|
3
|
-
*
|
|
3
|
+
* Supports POSIX shells (bash/zsh) and fish shell syntax
|
|
4
4
|
*/
|
|
5
|
-
export declare function generateEnvExport(
|
|
5
|
+
export declare function generateEnvExport(shell: string, dataDir: string, passphrase: string): string;
|
|
6
6
|
/**
|
|
7
7
|
* Append environment variables to shell RC file with secure permissions (0o600)
|
|
8
8
|
*/
|
|
9
9
|
export declare function appendToShellRc(rcPath: string, content: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* Remove Footprint environment block from shell RC file (used for rollback)
|
|
12
|
+
* Returns true if block was found and removed
|
|
13
|
+
*/
|
|
14
|
+
export declare function removeFootprintFromRc(rcPath: string): boolean;
|
|
10
15
|
//# sourceMappingURL=env.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/env.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/env.ts"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,MAAM,CAkBR;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA8BrE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAY7D"}
|
|
@@ -3,17 +3,31 @@ import * as fs from "fs";
|
|
|
3
3
|
/**
|
|
4
4
|
* Escape string for safe use in shell single quotes
|
|
5
5
|
* Prevents shell injection attacks by properly escaping special characters
|
|
6
|
+
* POSIX shells (bash/zsh): end quote, escaped quote, restart quote
|
|
7
|
+
* Fish shell: backslash-escaped single quote inside single quotes
|
|
6
8
|
*/
|
|
7
|
-
function escapeShellString(str) {
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
function escapeShellString(str, shell) {
|
|
10
|
+
if (shell === "fish") {
|
|
11
|
+
// Fish supports backslash escapes inside single quotes
|
|
12
|
+
return `'${str.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`;
|
|
13
|
+
}
|
|
14
|
+
// POSIX shells (bash/zsh)
|
|
10
15
|
return `'${str.replace(/'/g, "'\\''")}'`;
|
|
11
16
|
}
|
|
12
17
|
/**
|
|
13
18
|
* Generate environment variable export statement with proper escaping
|
|
14
|
-
*
|
|
19
|
+
* Supports POSIX shells (bash/zsh) and fish shell syntax
|
|
15
20
|
*/
|
|
16
|
-
export function generateEnvExport(
|
|
21
|
+
export function generateEnvExport(shell, dataDir, passphrase) {
|
|
22
|
+
if (shell === "fish") {
|
|
23
|
+
return [
|
|
24
|
+
"",
|
|
25
|
+
"# Footprint MCP Server Environment Variables",
|
|
26
|
+
`set -gx FOOTPRINT_DATA_DIR ${escapeShellString(dataDir, "fish")}`,
|
|
27
|
+
`set -gx FOOTPRINT_PASSPHRASE ${escapeShellString(passphrase, "fish")}`,
|
|
28
|
+
"",
|
|
29
|
+
].join("\n");
|
|
30
|
+
}
|
|
17
31
|
return [
|
|
18
32
|
"",
|
|
19
33
|
"# Footprint MCP Server Environment Variables",
|
|
@@ -23,7 +37,7 @@ export function generateEnvExport(_shell, dataDir, passphrase) {
|
|
|
23
37
|
].join("\n");
|
|
24
38
|
}
|
|
25
39
|
const FOOTPRINT_HEADER = "# Footprint MCP Server";
|
|
26
|
-
const FOOTPRINT_BLOCK_REGEX =
|
|
40
|
+
const FOOTPRINT_BLOCK_REGEX = /\n?# Footprint MCP Server[^\n]*\n(?:(?:export |set -gx )FOOTPRINT_[^\n]*\n?)+/;
|
|
27
41
|
/**
|
|
28
42
|
* Append environment variables to shell RC file with secure permissions (0o600)
|
|
29
43
|
*/
|
|
@@ -51,4 +65,21 @@ export function appendToShellRc(rcPath, content) {
|
|
|
51
65
|
console.warn(`Warning: Could not set secure permissions on ${rcPath}: ${message}`);
|
|
52
66
|
}
|
|
53
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Remove Footprint environment block from shell RC file (used for rollback)
|
|
70
|
+
* Returns true if block was found and removed
|
|
71
|
+
*/
|
|
72
|
+
export function removeFootprintFromRc(rcPath) {
|
|
73
|
+
if (!fs.existsSync(rcPath))
|
|
74
|
+
return false;
|
|
75
|
+
const stat = fs.statSync(rcPath);
|
|
76
|
+
const content = fs.readFileSync(rcPath, "utf-8");
|
|
77
|
+
if (!FOOTPRINT_BLOCK_REGEX.test(content))
|
|
78
|
+
return false;
|
|
79
|
+
const cleaned = content.replace(FOOTPRINT_BLOCK_REGEX, "");
|
|
80
|
+
fs.writeFileSync(rcPath, cleaned, "utf-8");
|
|
81
|
+
// Restore original file permissions
|
|
82
|
+
fs.chmodSync(rcPath, stat.mode);
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
54
85
|
//# sourceMappingURL=env.js.map
|
|
@@ -1 +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
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../../src/cli/utils/env.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":";AAoBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAkC/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;IA8BhC;;;;;;;OAOG;YACW,aAAa;IAsC3B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,aAAa;IAqGrB,OAAO,CAAC,iBAAiB;IAwCnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;;OAGG;IACH,KAAK,IAAI,IAAI;CAId;AAGD,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAkD1C"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/* global console, process */
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { realpathSync } from "node:fs";
|
|
3
6
|
import { McpServer, ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
7
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
8
|
import { EvidenceDatabase, storeSalt, retrieveSalt, } from "./lib/storage/index.js";
|
|
@@ -7,8 +10,9 @@ import { deriveKey, rederiveKey } from "./lib/crypto/index.js";
|
|
|
7
10
|
import { registerUIResources } from "./ui/register.js";
|
|
8
11
|
import { getErrorMessage } from "./lib/tool-wrapper.js";
|
|
9
12
|
import { decrypt } from "./lib/crypto/index.js";
|
|
13
|
+
import { registerSkillPrompts } from "./prompts/skill-prompt.js";
|
|
10
14
|
// Import all tool handlers
|
|
11
|
-
import { captureFootprintSchema, captureFootprintMetadata, createCaptureFootprintHandler, listFootprintsSchema, listFootprintsMetadata, createListFootprintsHandler, exportFootprintsSchema, exportFootprintsMetadata, createExportFootprintsHandler, getFootprintSchema, getFootprintMetadata, createGetFootprintHandler, searchFootprintsSchema, searchFootprintsMetadata, createSearchFootprintsHandler, verifyFootprintSchema, verifyFootprintMetadata, createVerifyFootprintHandler, suggestCaptureSchema, suggestCaptureMetadata, createSuggestCaptureHandler, deleteFootprintsSchema, deleteFootprintsMetadata, createDeleteFootprintsHandler,
|
|
15
|
+
import { captureFootprintSchema, captureFootprintMetadata, createCaptureFootprintHandler, listFootprintsSchema, listFootprintsMetadata, createListFootprintsHandler, exportFootprintsSchema, exportFootprintsMetadata, createExportFootprintsHandler, getFootprintSchema, getFootprintMetadata, createGetFootprintHandler, searchFootprintsSchema, searchFootprintsMetadata, createSearchFootprintsHandler, verifyFootprintSchema, verifyFootprintMetadata, createVerifyFootprintHandler, suggestCaptureSchema, suggestCaptureMetadata, createSuggestCaptureHandler, deleteFootprintsSchema, deleteFootprintsMetadata, createDeleteFootprintsHandler, manageTagsSchema, manageTagsMetadata, createManageTagsHandler, } from "./tools/index.js";
|
|
12
16
|
/**
|
|
13
17
|
* Footprint Server - Captures LLM conversations as encrypted evidence
|
|
14
18
|
* with Git timestamps and export capabilities.
|
|
@@ -28,13 +32,19 @@ export class FootprintServer {
|
|
|
28
32
|
throw new Error(`Failed to initialize database: ${getErrorMessage(error)}`);
|
|
29
33
|
}
|
|
30
34
|
this.server = new McpServer({
|
|
31
|
-
name: config.name || "
|
|
32
|
-
version: config.version || "
|
|
35
|
+
name: config.name || "footprint",
|
|
36
|
+
version: config.version || "1.5.0",
|
|
33
37
|
});
|
|
34
38
|
// Register UI resources for MCP Apps
|
|
35
39
|
registerUIResources(this.server);
|
|
36
40
|
this.registerTools();
|
|
37
41
|
this.registerResources();
|
|
42
|
+
try {
|
|
43
|
+
registerSkillPrompts(this.server);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
throw new Error(`Failed to register skill prompts: ${getErrorMessage(error)}`);
|
|
47
|
+
}
|
|
38
48
|
}
|
|
39
49
|
/**
|
|
40
50
|
* Get or derive encryption key using stored salt (thread-safe)
|
|
@@ -138,24 +148,12 @@ export class FootprintServer {
|
|
|
138
148
|
inputSchema: deleteFootprintsSchema.inputSchema,
|
|
139
149
|
outputSchema: deleteFootprintsSchema.outputSchema,
|
|
140
150
|
}, createDeleteFootprintsHandler(this.db));
|
|
141
|
-
//
|
|
142
|
-
this.server.registerTool("
|
|
143
|
-
...
|
|
144
|
-
inputSchema:
|
|
145
|
-
outputSchema:
|
|
146
|
-
},
|
|
147
|
-
// Remove tag tool
|
|
148
|
-
this.server.registerTool("remove-tag", {
|
|
149
|
-
...removeTagMetadata,
|
|
150
|
-
inputSchema: removeTagSchema.inputSchema,
|
|
151
|
-
outputSchema: removeTagSchema.outputSchema,
|
|
152
|
-
}, createRemoveTagHandler(this.db));
|
|
153
|
-
// Get tag statistics tool
|
|
154
|
-
this.server.registerTool("get-tag-stats", {
|
|
155
|
-
...getTagStatsMetadata,
|
|
156
|
-
inputSchema: getTagStatsSchema.inputSchema,
|
|
157
|
-
outputSchema: getTagStatsSchema.outputSchema,
|
|
158
|
-
}, createGetTagStatsHandler(this.db));
|
|
151
|
+
// Unified tag management tool (replaces rename-tag, remove-tag, get-tag-stats)
|
|
152
|
+
this.server.registerTool("manage-tags", {
|
|
153
|
+
...manageTagsMetadata,
|
|
154
|
+
inputSchema: manageTagsSchema.inputSchema,
|
|
155
|
+
outputSchema: manageTagsSchema.outputSchema,
|
|
156
|
+
}, createManageTagsHandler(this.db));
|
|
159
157
|
}
|
|
160
158
|
registerResources() {
|
|
161
159
|
this.server.registerResource("evidence", new ResourceTemplate("evidence://{id}", { list: undefined }), {
|
|
@@ -164,6 +162,9 @@ export class FootprintServer {
|
|
|
164
162
|
mimeType: "text/plain",
|
|
165
163
|
}, async (uri, { id }) => {
|
|
166
164
|
try {
|
|
165
|
+
if (!id || typeof id !== "string" || !/^[a-zA-Z0-9_-]+$/.test(id)) {
|
|
166
|
+
throw new Error("Invalid evidence ID format");
|
|
167
|
+
}
|
|
167
168
|
const evidence = this.db.findById(id);
|
|
168
169
|
if (!evidence) {
|
|
169
170
|
throw new Error(`Evidence with ID ${id} not found`);
|
|
@@ -197,16 +198,22 @@ export class FootprintServer {
|
|
|
197
198
|
// Export main as named function
|
|
198
199
|
export async function main() {
|
|
199
200
|
const config = {
|
|
200
|
-
dbPath: process.env.
|
|
201
|
-
|
|
201
|
+
dbPath: process.env.FOOTPRINT_DATA_DIR
|
|
202
|
+
? path.join(process.env.FOOTPRINT_DATA_DIR, "footprint.db")
|
|
203
|
+
: process.env.FOOTPRINT_DB_PATH || "./evidence.db",
|
|
204
|
+
password: process.env.FOOTPRINT_PASSPHRASE || process.env.FOOTPRINT_PASSWORD || "",
|
|
202
205
|
};
|
|
203
206
|
if (!config.password) {
|
|
204
|
-
console.error("Error:
|
|
207
|
+
console.error("Error: FOOTPRINT_PASSPHRASE environment variable required");
|
|
205
208
|
process.exit(1);
|
|
206
209
|
}
|
|
207
210
|
const server = new FootprintServer(config);
|
|
208
211
|
// Setup cleanup handlers for graceful shutdown
|
|
212
|
+
let cleanedUp = false;
|
|
209
213
|
const cleanup = () => {
|
|
214
|
+
if (cleanedUp)
|
|
215
|
+
return;
|
|
216
|
+
cleanedUp = true;
|
|
210
217
|
server.close();
|
|
211
218
|
};
|
|
212
219
|
// Handle uncaught exceptions and promise rejections
|
|
@@ -232,14 +239,20 @@ export async function main() {
|
|
|
232
239
|
await server.start();
|
|
233
240
|
}
|
|
234
241
|
// Only run if this is the main module (not imported by CLI)
|
|
235
|
-
const isMainModule =
|
|
236
|
-
|
|
237
|
-
|
|
242
|
+
const isMainModule = (() => {
|
|
243
|
+
try {
|
|
244
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
245
|
+
const mainFile = realpathSync(process.argv[1] ?? "");
|
|
246
|
+
return thisFile === mainFile;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
})();
|
|
238
252
|
if (isMainModule && !process.argv.includes("setup")) {
|
|
239
253
|
main().catch((error) => {
|
|
240
254
|
console.error("Server error:", error);
|
|
241
255
|
process.exit(1);
|
|
242
256
|
});
|
|
243
257
|
}
|
|
244
|
-
export { FootprintTestHelpers } from "./test-helpers.js";
|
|
245
258
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,6BAA6B;AAE7B,OAAO,EACL,SAAS,EACT,gBAAgB,GACjB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,YAAY,GACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAmB,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decrypt.d.ts","sourceRoot":"","sources":["../../../../src/lib/crypto/decrypt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"decrypt.d.ts","sourceRoot":"","sources":["../../../../src/lib/crypto/decrypt.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CACrB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,UAAU,GACd,MAAM,CA8BR"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
/* global TextDecoder */
|
|
2
|
+
import { xchacha20poly1305 } from "@noble/ciphers/chacha.js";
|
|
2
3
|
/**
|
|
3
4
|
* Decrypt ciphertext using XChaCha20-Poly1305 AEAD
|
|
4
5
|
*
|
|
@@ -10,10 +11,10 @@ import { xchacha20poly1305 } from '@noble/ciphers/chacha';
|
|
|
10
11
|
*/
|
|
11
12
|
export function decrypt(ciphertext, nonce, key) {
|
|
12
13
|
if (key.length !== 32) {
|
|
13
|
-
throw new Error(
|
|
14
|
+
throw new Error("Key must be 32 bytes");
|
|
14
15
|
}
|
|
15
16
|
if (nonce.length !== 24) {
|
|
16
|
-
throw new Error(
|
|
17
|
+
throw new Error("Nonce must be 24 bytes");
|
|
17
18
|
}
|
|
18
19
|
// Create cipher instance
|
|
19
20
|
const cipher = xchacha20poly1305(key, nonce);
|
|
@@ -21,14 +22,17 @@ export function decrypt(ciphertext, nonce, key) {
|
|
|
21
22
|
// Decrypt and verify authentication tag
|
|
22
23
|
const plaintextBytes = cipher.decrypt(ciphertext);
|
|
23
24
|
// Convert bytes back to string
|
|
24
|
-
|
|
25
|
+
const result = new TextDecoder().decode(plaintextBytes);
|
|
26
|
+
// Zero decrypted bytes from memory (defense-in-depth)
|
|
27
|
+
plaintextBytes.fill(0);
|
|
28
|
+
return result;
|
|
25
29
|
}
|
|
26
30
|
catch (error) {
|
|
27
|
-
// Log detailed error for debugging (server-side only, never exposed to client)
|
|
28
|
-
const originalError = error instanceof Error ? error.message : String(error);
|
|
29
|
-
console.error('[Decrypt] Decryption failed:', originalError);
|
|
30
31
|
// User-facing error remains generic (security best practice)
|
|
31
|
-
|
|
32
|
+
// Original error preserved in cause chain for debugging
|
|
33
|
+
throw new Error("Decryption failed: invalid key or tampered data", {
|
|
34
|
+
cause: error,
|
|
35
|
+
});
|
|
32
36
|
}
|
|
33
37
|
}
|
|
34
38
|
//# sourceMappingURL=decrypt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decrypt.js","sourceRoot":"","sources":["../../../../src/lib/crypto/decrypt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"decrypt.js","sourceRoot":"","sources":["../../../../src/lib/crypto/decrypt.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;;;;;GAQG;AACH,MAAM,UAAU,OAAO,CACrB,UAAsB,EACtB,KAAiB,EACjB,GAAe;IAEf,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,yBAAyB;IACzB,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,wCAAwC;QACxC,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAElD,+BAA+B;QAC/B,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAExD,sDAAsD;QACtD,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6DAA6D;QAC7D,wDAAwD;QACxD,MAAM,IAAI,KAAK,CAAC,iDAAiD,EAAE;YACjE,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../../../src/lib/crypto/encrypt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../../../src/lib/crypto/encrypt.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,UAAU,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,aAAa,CAqBzE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
1
|
+
/* global TextEncoder */
|
|
2
|
+
import { xchacha20poly1305 } from "@noble/ciphers/chacha.js";
|
|
3
|
+
import { randomBytes } from "@noble/hashes/utils.js";
|
|
3
4
|
/**
|
|
4
5
|
* Encrypt plaintext using XChaCha20-Poly1305 AEAD
|
|
5
6
|
*
|
|
@@ -9,7 +10,7 @@ import { randomBytes } from '@noble/hashes/utils';
|
|
|
9
10
|
*/
|
|
10
11
|
export function encrypt(plaintext, key) {
|
|
11
12
|
if (key.length !== 32) {
|
|
12
|
-
throw new Error(
|
|
13
|
+
throw new Error("Key must be 32 bytes");
|
|
13
14
|
}
|
|
14
15
|
// Generate random 24-byte nonce (XChaCha20 extended nonce)
|
|
15
16
|
const nonce = randomBytes(24);
|
|
@@ -19,6 +20,8 @@ export function encrypt(plaintext, key) {
|
|
|
19
20
|
const cipher = xchacha20poly1305(key, nonce);
|
|
20
21
|
// Encrypt with authentication
|
|
21
22
|
const ciphertext = cipher.encrypt(plaintextBytes);
|
|
23
|
+
// Zero plaintext bytes from memory (defense-in-depth)
|
|
24
|
+
plaintextBytes.fill(0);
|
|
22
25
|
return { ciphertext, nonce };
|
|
23
26
|
}
|
|
24
27
|
//# sourceMappingURL=encrypt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encrypt.js","sourceRoot":"","sources":["../../../../src/lib/crypto/encrypt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"encrypt.js","sourceRoot":"","sources":["../../../../src/lib/crypto/encrypt.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAOrD;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,SAAiB,EAAE,GAAe;IACxD,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,2DAA2D;IAC3D,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAE9B,6BAA6B;IAC7B,MAAM,cAAc,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAE3D,yBAAyB;IACzB,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE7C,8BAA8B;IAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAElD,sDAAsD;IACtD,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEvB,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-derivation.d.ts","sourceRoot":"","sources":["../../../../src/lib/crypto/key-derivation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGlE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM,GACxC,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"key-derivation.d.ts","sourceRoot":"","sources":["../../../../src/lib/crypto/key-derivation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGlE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM,GACxC,OAAO,CAAC,UAAU,CAAC,CAmBrB;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM,GACxC,OAAO,CAAC,UAAU,CAAC,CAoBrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,UAAU,EACvB,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM,GACxC,OAAO,CAAC,OAAO,CAAC,CA8BlB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { argon2id } from
|
|
2
|
-
import { randomBytes } from
|
|
3
|
-
import { timingSafeEqual } from
|
|
4
|
-
import { DEFAULT_KDF_PARAMS } from
|
|
1
|
+
import { argon2id } from "@noble/hashes/argon2.js";
|
|
2
|
+
import { randomBytes } from "@noble/hashes/utils.js";
|
|
3
|
+
import { timingSafeEqual } from "node:crypto";
|
|
4
|
+
import { DEFAULT_KDF_PARAMS } from "./types.js";
|
|
5
5
|
/**
|
|
6
6
|
* Derive encryption key from password using Argon2id
|
|
7
7
|
*
|
|
@@ -22,7 +22,7 @@ import { DEFAULT_KDF_PARAMS } from './types.js';
|
|
|
22
22
|
*/
|
|
23
23
|
export async function deriveKey(password, params = {}) {
|
|
24
24
|
if (!password || password.length === 0) {
|
|
25
|
-
throw new Error(
|
|
25
|
+
throw new Error("Password cannot be empty");
|
|
26
26
|
}
|
|
27
27
|
const kdfParams = { ...DEFAULT_KDF_PARAMS, ...params };
|
|
28
28
|
// Generate random salt (16 bytes)
|
|
@@ -47,11 +47,11 @@ export async function deriveKey(password, params = {}) {
|
|
|
47
47
|
*/
|
|
48
48
|
export async function rederiveKey(password, salt, params = {}) {
|
|
49
49
|
if (!password || password.length === 0) {
|
|
50
|
-
throw new Error(
|
|
50
|
+
throw new Error("Password cannot be empty");
|
|
51
51
|
}
|
|
52
52
|
const kdfParams = { ...DEFAULT_KDF_PARAMS, ...params };
|
|
53
53
|
if (salt.length !== 16) {
|
|
54
|
-
throw new Error(
|
|
54
|
+
throw new Error("Salt must be 16 bytes");
|
|
55
55
|
}
|
|
56
56
|
// Re-derive key using same salt
|
|
57
57
|
const key = argon2id(password, salt, {
|
|
@@ -76,13 +76,13 @@ export async function rederiveKey(password, salt, params = {}) {
|
|
|
76
76
|
*/
|
|
77
77
|
export async function verifyKey(password, salt, expectedKey, params = {}) {
|
|
78
78
|
if (!password || password.length === 0) {
|
|
79
|
-
throw new Error(
|
|
79
|
+
throw new Error("Password cannot be empty");
|
|
80
80
|
}
|
|
81
81
|
if (salt.length !== 16) {
|
|
82
|
-
throw new Error(
|
|
82
|
+
throw new Error("Salt must be 16 bytes");
|
|
83
83
|
}
|
|
84
84
|
if (expectedKey.length !== 32) {
|
|
85
|
-
throw new Error(
|
|
85
|
+
throw new Error("Expected key must be 32 bytes");
|
|
86
86
|
}
|
|
87
87
|
const kdfParams = { ...DEFAULT_KDF_PARAMS, ...params };
|
|
88
88
|
// Re-derive key using same salt
|
|
@@ -94,7 +94,7 @@ export async function verifyKey(password, salt, expectedKey, params = {}) {
|
|
|
94
94
|
});
|
|
95
95
|
// Constant-time comparison to prevent timing attacks
|
|
96
96
|
try {
|
|
97
|
-
return timingSafeEqual(
|
|
97
|
+
return timingSafeEqual(derivedKey, expectedKey);
|
|
98
98
|
}
|
|
99
99
|
catch {
|
|
100
100
|
// timingSafeEqual throws if lengths don't match
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-derivation.js","sourceRoot":"","sources":["../../../../src/lib/crypto/key-derivation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"key-derivation.js","sourceRoot":"","sources":["../../../../src/lib/crypto/key-derivation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import Database from
|
|
2
|
-
import type { Evidence } from
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import type { Evidence } from "./types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Evidence database with CRUD operations
|
|
5
5
|
* Manages encrypted evidence storage with SQLite backend
|
|
@@ -17,7 +17,7 @@ export declare class EvidenceDatabase {
|
|
|
17
17
|
* @param evidence - Evidence data without id, createdAt, updatedAt
|
|
18
18
|
* @returns UUID of created evidence
|
|
19
19
|
*/
|
|
20
|
-
create(evidence: Omit<Evidence,
|
|
20
|
+
create(evidence: Omit<Evidence, "id" | "createdAt" | "updatedAt">): string;
|
|
21
21
|
/**
|
|
22
22
|
* Finds evidence by ID
|
|
23
23
|
* @param id - Evidence UUID
|
|
@@ -53,6 +53,38 @@ export declare class EvidenceDatabase {
|
|
|
53
53
|
* @throws Error if tags array is empty or all tags are whitespace
|
|
54
54
|
*/
|
|
55
55
|
addTags(id: string, tags: string[]): void;
|
|
56
|
+
/**
|
|
57
|
+
* Builds a WHERE clause from search/filter options
|
|
58
|
+
* @param options - Filter criteria
|
|
59
|
+
* @returns SQL WHERE clause string and parameter values
|
|
60
|
+
*/
|
|
61
|
+
private buildWhereClause;
|
|
62
|
+
/**
|
|
63
|
+
* Gets count of evidences matching filter criteria
|
|
64
|
+
* @param options - Filter criteria (query, tags, date range)
|
|
65
|
+
* @returns Number of matching evidences
|
|
66
|
+
*/
|
|
67
|
+
getFilteredCount(options: {
|
|
68
|
+
query?: string;
|
|
69
|
+
tags?: string[];
|
|
70
|
+
dateFrom?: string;
|
|
71
|
+
dateTo?: string;
|
|
72
|
+
}): number;
|
|
73
|
+
/**
|
|
74
|
+
* Search evidences and return both paginated results and total matching count
|
|
75
|
+
* in a single pass (builds WHERE clause once instead of twice)
|
|
76
|
+
*/
|
|
77
|
+
searchWithCount(options: {
|
|
78
|
+
query?: string;
|
|
79
|
+
tags?: string[];
|
|
80
|
+
dateFrom?: string;
|
|
81
|
+
dateTo?: string;
|
|
82
|
+
limit?: number;
|
|
83
|
+
offset?: number;
|
|
84
|
+
}): {
|
|
85
|
+
evidences: Evidence[];
|
|
86
|
+
total: number;
|
|
87
|
+
};
|
|
56
88
|
/**
|
|
57
89
|
* Search and filter evidences by various criteria
|
|
58
90
|
* @param options - Search and filter options
|
|
@@ -105,6 +137,17 @@ export declare class EvidenceDatabase {
|
|
|
105
137
|
* @returns Map of tag to count
|
|
106
138
|
*/
|
|
107
139
|
getTagCounts(): Map<string, number>;
|
|
140
|
+
/**
|
|
141
|
+
* Gets total count of all evidence records
|
|
142
|
+
* @returns Total number of evidences in the database
|
|
143
|
+
*/
|
|
144
|
+
getTotalCount(): number;
|
|
145
|
+
/**
|
|
146
|
+
* Gets count of evidence records matching a search query
|
|
147
|
+
* @param query - Search text to match against conversationId and tags
|
|
148
|
+
* @returns Number of matching evidences
|
|
149
|
+
*/
|
|
150
|
+
getSearchCount(query: string): number;
|
|
108
151
|
/**
|
|
109
152
|
* Get the underlying database instance
|
|
110
153
|
* Used for salt storage and other low-level operations
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../../src/lib/storage/database.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../../src/lib/storage/database.ts"],"names":[],"mappings":"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"}
|