@pcircle/footprint 1.2.2 → 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/LICENSE +1 -1
- package/README.md +125 -161
- package/SKILL.md +50 -50
- 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/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 +356 -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 +15 -0
- package/dist/src/cli/utils/env.d.ts.map +1 -0
- package/dist/src/cli/utils/env.js +85 -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 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +53 -38
- 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 +3 -4
- package/dist/src/lib/storage/export.d.ts.map +1 -1
- package/dist/src/lib/storage/export.js +75 -62
- 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 +53 -12
- package/dist/src/tools/capture-footprint.js.map +1 -1
- package/dist/src/tools/delete-footprints.d.ts +19 -2
- package/dist/src/tools/delete-footprints.d.ts.map +1 -1
- package/dist/src/tools/delete-footprints.js +56 -8
- package/dist/src/tools/delete-footprints.js.map +1 -1
- package/dist/src/tools/export-footprints.d.ts +14 -6
- package/dist/src/tools/export-footprints.d.ts.map +1 -1
- package/dist/src/tools/export-footprints.js +54 -15
- 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 +26 -22
- 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 +3 -17
- package/dist/src/tools/list-footprints.d.ts.map +1 -1
- package/dist/src/tools/list-footprints.js +27 -16
- 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 +4 -18
- package/dist/src/tools/search-footprints.d.ts.map +1 -1
- package/dist/src/tools/search-footprints.js +32 -16
- 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 +22 -19
- 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 +3 -3
- package/dist/src/ui/register.js.map +1 -1
- package/dist/ui/dashboard.html +78 -65
- package/dist/ui/detail.html +69 -56
- package/dist/ui/export.html +72 -59
- package/package.json +28 -16
- 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
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"skill-prompt.d.ts","sourceRoot":"","sources":["../../../src/prompts/skill-prompt.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiDzE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyF5D"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { fileURLToPath } from "url";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import * as fs from "fs";
|
|
4
|
+
import * as z from "zod";
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = path.dirname(__filename);
|
|
7
|
+
/**
|
|
8
|
+
* Resolve SKILL.md from the package root.
|
|
9
|
+
* Handles both dev (src/prompts/) and built (dist/prompts/) paths.
|
|
10
|
+
*/
|
|
11
|
+
function findSkillMd() {
|
|
12
|
+
const candidates = [
|
|
13
|
+
path.resolve(__dirname, "../../SKILL.md"), // from dist/prompts/ or src/prompts/
|
|
14
|
+
path.resolve(__dirname, "../../../SKILL.md"), // fallback
|
|
15
|
+
];
|
|
16
|
+
for (const p of candidates) {
|
|
17
|
+
if (fs.existsSync(p))
|
|
18
|
+
return fs.readFileSync(p, "utf-8");
|
|
19
|
+
}
|
|
20
|
+
throw new Error("SKILL.md not found");
|
|
21
|
+
}
|
|
22
|
+
const QUICK_REFERENCE = `# Footprint Quick Reference
|
|
23
|
+
|
|
24
|
+
## Decision Tree
|
|
25
|
+
Should I capture this conversation?
|
|
26
|
+
\u251C\u2500 User explicitly asked \u2192 YES (capture immediately)
|
|
27
|
+
\u251C\u2500 High-value content (IP/Legal/Business/Research/Compliance) \u2192 SUGGEST to user
|
|
28
|
+
\u251C\u2500 Casual chat/small talk \u2192 NO
|
|
29
|
+
\u2514\u2500 Uncertain \u2192 ASK user
|
|
30
|
+
|
|
31
|
+
## Tool Selection
|
|
32
|
+
- Save conversation \u2192 capture-footprint
|
|
33
|
+
- Browse/overview \u2192 list-footprints
|
|
34
|
+
- Full content retrieval \u2192 get-footprint
|
|
35
|
+
- Find by query/tags/dates \u2192 search-footprints
|
|
36
|
+
- Legal/audit export \u2192 export-footprints
|
|
37
|
+
- Verify integrity \u2192 verify-footprint
|
|
38
|
+
- Tag management \u2192 manage-tags (stats/rename/remove)
|
|
39
|
+
- Keyword pre-filter \u2192 suggest-capture
|
|
40
|
+
- Semantic assessment \u2192 Use footprint-should-capture prompt
|
|
41
|
+
|
|
42
|
+
## Tag Conventions
|
|
43
|
+
Format: 3-6 tags, comma-separated
|
|
44
|
+
Types: decision, milestone, research, review, approval
|
|
45
|
+
Domains: api, ui, database, security, legal, business
|
|
46
|
+
Status: draft, finalized, approved, rejected
|
|
47
|
+
|
|
48
|
+
## conversationId Format
|
|
49
|
+
{topic-type}-{descriptive-name}-{YYYY-MM-DD}`;
|
|
50
|
+
/**
|
|
51
|
+
* Register all Footprint MCP prompts on the server.
|
|
52
|
+
*/
|
|
53
|
+
export function registerSkillPrompts(server) {
|
|
54
|
+
const skillContent = findSkillMd();
|
|
55
|
+
// Full SKILL.md content
|
|
56
|
+
server.registerPrompt("footprint-skill", {
|
|
57
|
+
description: "Complete Footprint agent skill guide — decision tree, tool reference, best practices, error recovery, and workflow examples",
|
|
58
|
+
}, async () => ({
|
|
59
|
+
messages: [
|
|
60
|
+
{
|
|
61
|
+
role: "user",
|
|
62
|
+
content: { type: "text", text: skillContent },
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
}));
|
|
66
|
+
// Condensed quick reference
|
|
67
|
+
server.registerPrompt("footprint-quick-ref", {
|
|
68
|
+
description: "Condensed quick reference for Footprint — decision tree, tool selection, tag conventions",
|
|
69
|
+
}, async () => ({
|
|
70
|
+
messages: [
|
|
71
|
+
{
|
|
72
|
+
role: "user",
|
|
73
|
+
content: { type: "text", text: QUICK_REFERENCE },
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
}));
|
|
77
|
+
// Semantic capture decision framework
|
|
78
|
+
server.registerPrompt("footprint-should-capture", {
|
|
79
|
+
description: "Semantic decision framework for whether to capture a conversation as evidence. Provides structured criteria for the AI to assess, unlike suggest-capture which uses keyword matching.",
|
|
80
|
+
argsSchema: {
|
|
81
|
+
conversationSummary: z
|
|
82
|
+
.string()
|
|
83
|
+
.min(1, "Conversation summary cannot be empty")
|
|
84
|
+
.max(10000, "Conversation summary too long (max 10000 characters)")
|
|
85
|
+
.describe("Brief summary of the conversation content to evaluate"),
|
|
86
|
+
},
|
|
87
|
+
}, async ({ conversationSummary }) => ({
|
|
88
|
+
messages: [
|
|
89
|
+
{
|
|
90
|
+
role: "user",
|
|
91
|
+
content: {
|
|
92
|
+
type: "text",
|
|
93
|
+
text: `Evaluate whether this conversation should be captured as evidence using Footprint.
|
|
94
|
+
|
|
95
|
+
## Conversation Summary
|
|
96
|
+
${conversationSummary}
|
|
97
|
+
|
|
98
|
+
## Decision Criteria
|
|
99
|
+
Rate each category 0-3 (0=none, 1=low, 2=medium, 3=high):
|
|
100
|
+
|
|
101
|
+
1. **Intellectual Property Value**: Does it contain inventions, algorithms, novel approaches, patents, trade secrets?
|
|
102
|
+
2. **Legal Significance**: Does it involve contracts, agreements, licenses, legal obligations, regulatory requirements?
|
|
103
|
+
3. **Business Decision Impact**: Does it record decisions, approvals, milestones, deliverables, strategic direction?
|
|
104
|
+
4. **Research Value**: Does it contain hypotheses, findings, experimental results, data analysis, methodology?
|
|
105
|
+
5. **Compliance/Audit Need**: Does it need to be documented for audit trails, regulatory compliance, evidence preservation?
|
|
106
|
+
|
|
107
|
+
## Decision Rules
|
|
108
|
+
- Any category >= 2 \u2192 RECOMMEND CAPTURE
|
|
109
|
+
- Multiple categories >= 1 \u2192 RECOMMEND CAPTURE
|
|
110
|
+
- All categories = 0 \u2192 DO NOT CAPTURE
|
|
111
|
+
- Uncertain \u2192 ASK USER
|
|
112
|
+
|
|
113
|
+
## Response Format
|
|
114
|
+
Respond with:
|
|
115
|
+
- **Capture**: yes/no/ask
|
|
116
|
+
- **Confidence**: 0.0-1.0
|
|
117
|
+
- **Primary Reason**: One sentence
|
|
118
|
+
- **Suggested Tags**: comma-separated
|
|
119
|
+
- **Suggested conversationId**: {topic}-{descriptor}-{YYYY-MM-DD} format`,
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=skill-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-prompt.js","sourceRoot":"","sources":["../../../src/prompts/skill-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C;;;GAGG;AACH,SAAS,WAAW;IAClB,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,qCAAqC;QAChF,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,WAAW;KAC1D,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;6CA2BqB,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,YAAY,GAAG,WAAW,EAAE,CAAC;IAEnC,wBAAwB;IACxB,MAAM,CAAC,cAAc,CACnB,iBAAiB,EACjB;QACE,WAAW,EACT,6HAA6H;KAChI,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,YAAY,EAAE;aACvD;SACF;KACF,CAAC,CACH,CAAC;IAEF,4BAA4B;IAC5B,MAAM,CAAC,cAAc,CACnB,qBAAqB,EACrB;QACE,WAAW,EACT,0FAA0F;KAC7F,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,eAAe,EAAE;aAC1D;SACF;KACF,CAAC,CACH,CAAC;IAEF,sCAAsC;IACtC,MAAM,CAAC,cAAc,CACnB,0BAA0B,EAC1B;QACE,WAAW,EACT,uLAAuL;QACzL,UAAU,EAAE;YACV,mBAAmB,EAAE,CAAC;iBACnB,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,EAAE,sCAAsC,CAAC;iBAC9C,GAAG,CAAC,KAAK,EAAE,sDAAsD,CAAC;iBAClE,QAAQ,CAAC,uDAAuD,CAAC;SACrE;KACF,EACD,KAAK,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC,CAAC;QAClC,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;;;EAGhB,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;yEAuBoD;iBAC9D;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -4,9 +4,9 @@ import type { CaptureEvidenceParams } from "../types.js";
|
|
|
4
4
|
export declare const captureFootprintSchema: {
|
|
5
5
|
inputSchema: {
|
|
6
6
|
conversationId: z.ZodString;
|
|
7
|
-
llmProvider: z.ZodString
|
|
7
|
+
llmProvider: z.ZodDefault<z.ZodString>;
|
|
8
8
|
content: z.ZodString;
|
|
9
|
-
messageCount: z.ZodNumber
|
|
9
|
+
messageCount: z.ZodOptional<z.ZodNumber>;
|
|
10
10
|
tags: z.ZodOptional<z.ZodString>;
|
|
11
11
|
};
|
|
12
12
|
outputSchema: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture-footprint.d.ts","sourceRoot":"","sources":["../../../src/tools/capture-footprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAKzB,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"capture-footprint.d.ts","sourceRoot":"","sources":["../../../src/tools/capture-footprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAKzB,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;CAyClC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;CAIpC,CAAC;AAEF,wBAAgB,6BAA6B,CAC3C,EAAE,EAAE,gBAAgB,EACpB,aAAa,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC;;;;;IAyHzC"}
|
|
@@ -6,15 +6,28 @@ import { encrypt } from "../lib/crypto/index.js";
|
|
|
6
6
|
import { getCurrentCommit, } from "../lib/storage/index.js";
|
|
7
7
|
export const captureFootprintSchema = {
|
|
8
8
|
inputSchema: {
|
|
9
|
-
conversationId: z
|
|
9
|
+
conversationId: z
|
|
10
|
+
.string()
|
|
11
|
+
.max(500, "Conversation ID too long (max 500 chars)")
|
|
12
|
+
.describe("Unique conversation identifier. Recommended format: {topic}-{descriptor}-{YYYY-MM-DD} (e.g., api-auth-decision-2026-01-28)"),
|
|
10
13
|
llmProvider: z
|
|
11
14
|
.string()
|
|
12
|
-
.
|
|
15
|
+
.default("unknown")
|
|
16
|
+
.describe("LLM provider name (e.g., Claude Sonnet 4.5). Defaults to 'unknown' if not specified."),
|
|
13
17
|
content: z
|
|
14
18
|
.string()
|
|
15
|
-
.
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
.max(10 * 1024 * 1024, "Content exceeds 10MB limit")
|
|
20
|
+
.describe("Full conversation text including both human and assistant messages. Include complete message history for accurate evidence preservation."),
|
|
21
|
+
messageCount: z
|
|
22
|
+
.number()
|
|
23
|
+
.int()
|
|
24
|
+
.positive()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe("Number of messages in the conversation. If omitted, auto-calculated by counting conversation turn markers (Human:/Assistant:/User:/AI:/System:)."),
|
|
27
|
+
tags: z
|
|
28
|
+
.string()
|
|
29
|
+
.optional()
|
|
30
|
+
.describe("Comma-separated tags for categorization (e.g., 'ip,patent,decision'). Use 3-6 tags. Common types: decision, milestone, research, legal, compliance."),
|
|
18
31
|
},
|
|
19
32
|
outputSchema: {
|
|
20
33
|
id: z.string(),
|
|
@@ -25,7 +38,7 @@ export const captureFootprintSchema = {
|
|
|
25
38
|
};
|
|
26
39
|
export const captureFootprintMetadata = {
|
|
27
40
|
title: "Capture Footprint",
|
|
28
|
-
description: "Capture and encrypt LLM conversation as footprint",
|
|
41
|
+
description: "Capture and encrypt an LLM conversation as a tamper-evident footprint. Use when: user explicitly asks to save, or high-value content detected (IP, legal, business, research, compliance). Creates encrypted record with SHA-256 hash and Git timestamp anchor.",
|
|
29
42
|
};
|
|
30
43
|
export function createCaptureFootprintHandler(db, getDerivedKey) {
|
|
31
44
|
return wrapToolHandler("capture-footprint", "Check content is not empty, messageCount is positive, and tags format is valid.", async (params) => {
|
|
@@ -33,7 +46,14 @@ export function createCaptureFootprintHandler(db, getDerivedKey) {
|
|
|
33
46
|
if (!params.content || params.content.trim().length === 0) {
|
|
34
47
|
throw new Error("Content cannot be empty");
|
|
35
48
|
}
|
|
36
|
-
|
|
49
|
+
const MAX_CONTENT_LENGTH = 10 * 1024 * 1024; // 10MB
|
|
50
|
+
if (params.content.length > MAX_CONTENT_LENGTH) {
|
|
51
|
+
throw new Error(`Content too large (${(params.content.length / (1024 * 1024)).toFixed(1)}MB). Maximum 10MB allowed.`);
|
|
52
|
+
}
|
|
53
|
+
if (params.conversationId.length > 500) {
|
|
54
|
+
throw new Error("Conversation ID too long (max 500 chars)");
|
|
55
|
+
}
|
|
56
|
+
if (params.messageCount !== undefined && params.messageCount <= 0) {
|
|
37
57
|
throw new Error("Message count must be positive");
|
|
38
58
|
}
|
|
39
59
|
// eslint-disable-next-line no-control-regex
|
|
@@ -42,6 +62,8 @@ export function createCaptureFootprintHandler(db, getDerivedKey) {
|
|
|
42
62
|
}
|
|
43
63
|
// Validate and sanitize tags if provided
|
|
44
64
|
if (params.tags) {
|
|
65
|
+
const MAX_TAG_LENGTH = 100;
|
|
66
|
+
const MAX_TAGS_COUNT = 20;
|
|
45
67
|
const tags = params.tags
|
|
46
68
|
.split(",")
|
|
47
69
|
.map((t) => t.trim())
|
|
@@ -49,14 +71,33 @@ export function createCaptureFootprintHandler(db, getDerivedKey) {
|
|
|
49
71
|
if (tags.length === 0) {
|
|
50
72
|
throw new Error("All provided tags are empty or whitespace");
|
|
51
73
|
}
|
|
74
|
+
if (tags.length > MAX_TAGS_COUNT) {
|
|
75
|
+
throw new Error(`Too many tags (${tags.length}). Maximum ${MAX_TAGS_COUNT} tags allowed.`);
|
|
76
|
+
}
|
|
52
77
|
for (const tag of tags) {
|
|
78
|
+
if (tag.length > MAX_TAG_LENGTH) {
|
|
79
|
+
throw new Error(`Tag too long (${tag.length} chars). Maximum ${MAX_TAG_LENGTH} characters per tag.`);
|
|
80
|
+
}
|
|
53
81
|
// eslint-disable-next-line no-control-regex
|
|
54
82
|
if (/[\x00\n\r,]/.test(tag)) {
|
|
55
83
|
throw new Error(`Invalid tag format: "${tag}". Tags cannot contain null bytes, newlines, or commas.`);
|
|
56
84
|
}
|
|
57
85
|
}
|
|
58
|
-
|
|
86
|
+
// Use sanitized tags without mutating original params
|
|
87
|
+
params = { ...params, tags: tags.join(",") };
|
|
88
|
+
}
|
|
89
|
+
// Auto-calculate messageCount if not provided
|
|
90
|
+
let messageCount = params.messageCount;
|
|
91
|
+
if (!messageCount) {
|
|
92
|
+
const turnPattern = /^(Human|Assistant|User|System|AI):/im;
|
|
93
|
+
const lines = params.content.split("\n");
|
|
94
|
+
messageCount = lines.filter((line) => turnPattern.test(line.trim())).length;
|
|
95
|
+
if (messageCount === 0)
|
|
96
|
+
messageCount = 1; // Default to 1 if no turns detected
|
|
59
97
|
}
|
|
98
|
+
// Apply runtime defaults for parameters with Zod schema defaults
|
|
99
|
+
// (Zod defaults only apply through MCP SDK transport layer)
|
|
100
|
+
const llmProvider = params.llmProvider || "unknown";
|
|
60
101
|
// Encrypt and capture
|
|
61
102
|
const key = await getDerivedKey();
|
|
62
103
|
const encrypted = await encrypt(params.content, key);
|
|
@@ -69,20 +110,20 @@ export function createCaptureFootprintHandler(db, getDerivedKey) {
|
|
|
69
110
|
const id = db.create({
|
|
70
111
|
timestamp,
|
|
71
112
|
conversationId: params.conversationId,
|
|
72
|
-
llmProvider
|
|
113
|
+
llmProvider,
|
|
73
114
|
encryptedContent: encrypted.ciphertext,
|
|
74
115
|
nonce: encrypted.nonce,
|
|
75
116
|
contentHash,
|
|
76
|
-
messageCount
|
|
117
|
+
messageCount,
|
|
77
118
|
gitCommitHash: gitInfo?.commitHash || null,
|
|
78
119
|
gitTimestamp: gitInfo?.timestamp || null,
|
|
79
120
|
tags: params.tags || null,
|
|
80
121
|
});
|
|
81
|
-
return formatSuccessResponse("
|
|
122
|
+
return formatSuccessResponse("Evidence captured successfully", {
|
|
82
123
|
ID: id,
|
|
83
124
|
Timestamp: timestamp,
|
|
84
125
|
"Git Commit": gitInfo?.commitHash || "N/A",
|
|
85
|
-
"Message Count":
|
|
126
|
+
"Message Count": messageCount,
|
|
86
127
|
}, {
|
|
87
128
|
id,
|
|
88
129
|
timestamp,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture-footprint.js","sourceRoot":"","sources":["../../../src/tools/capture-footprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"capture-footprint.js","sourceRoot":"","sources":["../../../src/tools/capture-footprint.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,17 @@ 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>;
|
|
6
|
+
confirmDelete: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
6
7
|
};
|
|
7
8
|
outputSchema: {
|
|
8
9
|
deletedCount: z.ZodNumber;
|
|
10
|
+
previewed: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
11
|
+
id: z.ZodString;
|
|
12
|
+
conversationId: z.ZodString;
|
|
13
|
+
timestamp: z.ZodString;
|
|
14
|
+
}, z.core.$strip>>>;
|
|
15
|
+
notFoundIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
9
16
|
success: z.ZodBoolean;
|
|
10
17
|
};
|
|
11
18
|
};
|
|
@@ -14,9 +21,19 @@ export declare const deleteFootprintsMetadata: {
|
|
|
14
21
|
description: string;
|
|
15
22
|
};
|
|
16
23
|
export declare function createDeleteFootprintsHandler(db: EvidenceDatabase): (params: {
|
|
17
|
-
|
|
24
|
+
evidenceIds: string[];
|
|
25
|
+
confirmDelete?: boolean;
|
|
18
26
|
}) => Promise<import("../lib/tool-response.js").ToolResponse<{
|
|
19
27
|
deletedCount: number;
|
|
28
|
+
previewed: {
|
|
29
|
+
id: string;
|
|
30
|
+
conversationId: string | null;
|
|
31
|
+
timestamp: string;
|
|
32
|
+
}[];
|
|
33
|
+
success: boolean;
|
|
34
|
+
}> | import("../lib/tool-response.js").ToolResponse<{
|
|
35
|
+
deletedCount: number;
|
|
36
|
+
notFoundIds: string[];
|
|
20
37
|
success: boolean;
|
|
21
38
|
}>>;
|
|
22
39
|
//# sourceMappingURL=delete-footprints.d.ts.map
|
|
@@ -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
|
|
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;;;;;;;;;;;;;;;CA+BlC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;CAIpC,CAAC;AAEF,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,gBAAgB;iBAIhC,MAAM,EAAE;oBAAkB,OAAO;;;;;;;;;;;;;IA2DlE"}
|
|
@@ -3,31 +3,79 @@ 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
|
+
.max(100, "Maximum 100 IDs per delete operation")
|
|
10
|
+
.describe("Array of footprint IDs to delete. Always verify IDs first with search-footprints or list-footprints."),
|
|
11
|
+
confirmDelete: z
|
|
12
|
+
.boolean()
|
|
13
|
+
.optional()
|
|
14
|
+
.default(false)
|
|
15
|
+
.describe("Set to true to confirm deletion. Without this, returns a preview of records to be deleted without actually deleting them. Two-step pattern: first call without confirmDelete to preview, then call with confirmDelete: true to execute."),
|
|
10
16
|
},
|
|
11
17
|
outputSchema: {
|
|
12
18
|
deletedCount: z.number(),
|
|
19
|
+
previewed: z
|
|
20
|
+
.array(z.object({
|
|
21
|
+
id: z.string(),
|
|
22
|
+
conversationId: z.string(),
|
|
23
|
+
timestamp: z.string(),
|
|
24
|
+
}))
|
|
25
|
+
.optional(),
|
|
26
|
+
notFoundIds: z.array(z.string()).optional(),
|
|
13
27
|
success: z.boolean(),
|
|
14
28
|
},
|
|
15
29
|
};
|
|
16
30
|
export const deleteFootprintsMetadata = {
|
|
17
31
|
title: "Delete Footprints",
|
|
18
|
-
description: "Permanently delete one or more footprint records",
|
|
32
|
+
description: "Permanently delete one or more footprint records. WARNING: Irreversible operation. Uses two-step confirmation: first call previews records, second call with confirmDelete: true performs deletion.",
|
|
19
33
|
};
|
|
20
34
|
export function createDeleteFootprintsHandler(db) {
|
|
21
35
|
return wrapToolHandler("delete-footprints", "Verify the footprint IDs exist.", async (params) => {
|
|
22
|
-
if (!params.
|
|
23
|
-
throw new Error("At least one
|
|
36
|
+
if (!params.evidenceIds || params.evidenceIds.length === 0) {
|
|
37
|
+
throw new Error("At least one evidence ID is required");
|
|
24
38
|
}
|
|
25
|
-
|
|
39
|
+
if (params.evidenceIds.length > 100) {
|
|
40
|
+
throw new Error(`Too many IDs (${params.evidenceIds.length}). Maximum 100 per delete operation.`);
|
|
41
|
+
}
|
|
42
|
+
// Preview mode: show what would be deleted without actually deleting
|
|
43
|
+
if (!params.confirmDelete) {
|
|
44
|
+
const previewed = params.evidenceIds
|
|
45
|
+
.map((id) => db.findById(id))
|
|
46
|
+
.filter((e) => e !== null)
|
|
47
|
+
.map((e) => ({
|
|
48
|
+
id: e.id,
|
|
49
|
+
conversationId: e.conversationId,
|
|
50
|
+
timestamp: e.timestamp,
|
|
51
|
+
}));
|
|
52
|
+
const resultText = previewed.length > 0
|
|
53
|
+
? `⚠️ Preview: ${previewed.length} record(s) would be deleted:\n${previewed.map((p) => ` - ${p.id} (${p.conversationId})`).join("\n")}\n\nTo confirm, call again with confirmDelete: true`
|
|
54
|
+
: `⚠️ No records found with the provided IDs`;
|
|
55
|
+
return createToolResponse(resultText, {
|
|
56
|
+
deletedCount: 0,
|
|
57
|
+
previewed,
|
|
58
|
+
success: false,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// Check which IDs exist before deletion (Set for O(1) lookup)
|
|
62
|
+
const existingIds = params.evidenceIds.filter((id) => db.findById(id));
|
|
63
|
+
const existingSet = new Set(existingIds);
|
|
64
|
+
const notFoundIds = params.evidenceIds.filter((id) => !existingSet.has(id));
|
|
65
|
+
// Actual deletion
|
|
66
|
+
const deletedCount = db.deleteMany(existingIds);
|
|
26
67
|
const success = deletedCount > 0;
|
|
27
|
-
|
|
68
|
+
let resultText = success
|
|
28
69
|
? `🗑️ Successfully deleted ${deletedCount} footprint record${deletedCount > 1 ? "s" : ""}`
|
|
29
70
|
: `⚠️ No footprint records found with the provided IDs`;
|
|
30
|
-
|
|
71
|
+
if (notFoundIds.length > 0) {
|
|
72
|
+
resultText += `\n⚠️ IDs not found: ${notFoundIds.join(", ")}`;
|
|
73
|
+
}
|
|
74
|
+
return createToolResponse(resultText, {
|
|
75
|
+
deletedCount,
|
|
76
|
+
notFoundIds,
|
|
77
|
+
success,
|
|
78
|
+
});
|
|
31
79
|
});
|
|
32
80
|
}
|
|
33
81
|
//# sourceMappingURL=delete-footprints.js.map
|
|
@@ -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":"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"}
|
|
@@ -2,13 +2,19 @@ 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>>;
|
|
6
6
|
includeGitInfo: z.ZodOptional<z.ZodBoolean>;
|
|
7
|
+
outputMode: z.ZodDefault<z.ZodEnum<{
|
|
8
|
+
base64: "base64";
|
|
9
|
+
file: "file";
|
|
10
|
+
both: "both";
|
|
11
|
+
}>>;
|
|
7
12
|
};
|
|
8
13
|
outputSchema: {
|
|
9
|
-
filename: z.ZodString
|
|
14
|
+
filename: z.ZodOptional<z.ZodString>;
|
|
15
|
+
base64Data: z.ZodOptional<z.ZodString>;
|
|
10
16
|
checksum: z.ZodString;
|
|
11
|
-
|
|
17
|
+
evidenceCount: z.ZodNumber;
|
|
12
18
|
success: z.ZodBoolean;
|
|
13
19
|
};
|
|
14
20
|
};
|
|
@@ -22,12 +28,14 @@ export declare const exportFootprintsMetadata: {
|
|
|
22
28
|
};
|
|
23
29
|
};
|
|
24
30
|
export declare function createExportFootprintsHandler(db: EvidenceDatabase): (params: {
|
|
25
|
-
|
|
31
|
+
evidenceIds?: string[];
|
|
26
32
|
includeGitInfo?: boolean;
|
|
33
|
+
outputMode?: "file" | "base64" | "both";
|
|
27
34
|
}) => Promise<import("../lib/tool-response.js").ToolResponse<{
|
|
28
|
-
filename: string;
|
|
29
35
|
checksum: string;
|
|
30
|
-
|
|
36
|
+
evidenceCount: number;
|
|
31
37
|
success: boolean;
|
|
38
|
+
base64Data?: string | undefined;
|
|
39
|
+
filename?: string | undefined;
|
|
32
40
|
}>>;
|
|
33
41
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"export-footprints.d.ts","sourceRoot":"","sources":["../../../src/tools/export-footprints.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;CA0BlC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;CASpC,CAAC;AAEF,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,gBAAgB;kBAK9C,MAAM,EAAE;qBACL,OAAO;iBACX,MAAM,GAAG,QAAQ,GAAG,MAAM;;;;;;;IAmE5C"}
|
|
@@ -1,24 +1,33 @@
|
|
|
1
|
+
/* global Buffer, process */
|
|
1
2
|
import * as z from "zod";
|
|
2
3
|
import { wrapToolHandler } from "../lib/tool-wrapper.js";
|
|
3
4
|
import { formatSuccessResponse } from "../lib/tool-response.js";
|
|
4
5
|
export const exportFootprintsSchema = {
|
|
5
6
|
inputSchema: {
|
|
6
|
-
|
|
7
|
+
evidenceIds: z
|
|
7
8
|
.array(z.string())
|
|
8
9
|
.optional()
|
|
9
|
-
.describe("Specific IDs
|
|
10
|
-
includeGitInfo: z
|
|
10
|
+
.describe("Specific evidence IDs to export. If omitted, exports all evidence."),
|
|
11
|
+
includeGitInfo: z
|
|
12
|
+
.boolean()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Include Git commit hash and timestamp in export metadata"),
|
|
15
|
+
outputMode: z
|
|
16
|
+
.enum(["file", "base64", "both"])
|
|
17
|
+
.default("both")
|
|
18
|
+
.describe("Output mode: 'file' writes ZIP to disk, 'base64' returns ZIP as base64 string (for Claude Desktop/MCP clients), 'both' does both (default, backward compatible)."),
|
|
11
19
|
},
|
|
12
20
|
outputSchema: {
|
|
13
|
-
filename: z.string(),
|
|
21
|
+
filename: z.string().optional(),
|
|
22
|
+
base64Data: z.string().optional(),
|
|
14
23
|
checksum: z.string(),
|
|
15
|
-
|
|
24
|
+
evidenceCount: z.number(),
|
|
16
25
|
success: z.boolean(),
|
|
17
26
|
},
|
|
18
27
|
};
|
|
19
28
|
export const exportFootprintsMetadata = {
|
|
20
29
|
title: "Export Footprints",
|
|
21
|
-
description: "Export footprints to encrypted ZIP archive",
|
|
30
|
+
description: "Export footprints to encrypted ZIP archive. Supports file output (write to disk), base64 output (for MCP clients like Claude Desktop), or both. Default is 'both' for backward compatibility.",
|
|
22
31
|
_meta: {
|
|
23
32
|
ui: {
|
|
24
33
|
resourceUri: "ui://footprint/export.html",
|
|
@@ -26,23 +35,53 @@ export const exportFootprintsMetadata = {
|
|
|
26
35
|
},
|
|
27
36
|
};
|
|
28
37
|
export function createExportFootprintsHandler(db) {
|
|
29
|
-
return wrapToolHandler("export-footprints", "Check
|
|
38
|
+
return wrapToolHandler("export-footprints", "Check evidenceIds exist and filesystem has write permissions.", async (params) => {
|
|
30
39
|
const { exportEvidences } = await import("../lib/storage/index.js");
|
|
31
40
|
const fs = await import("fs");
|
|
41
|
+
const outputMode = params.outputMode || "both";
|
|
32
42
|
const result = await exportEvidences(db, {
|
|
33
|
-
|
|
43
|
+
evidenceIds: params.evidenceIds,
|
|
34
44
|
includeGitInfo: params.includeGitInfo ?? false,
|
|
35
45
|
});
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
46
|
+
// Enforce size limit for base64 mode (base64 adds ~33% overhead)
|
|
47
|
+
const MAX_BASE64_SIZE = 75 * 1024 * 1024; // 75MB
|
|
48
|
+
if ((outputMode === "base64" || outputMode === "both") &&
|
|
49
|
+
result.zipData.length > MAX_BASE64_SIZE) {
|
|
50
|
+
throw new Error(`Export too large for base64 mode (${(result.zipData.length / (1024 * 1024)).toFixed(1)}MB). ` +
|
|
51
|
+
`Use outputMode="file" or export fewer records.`);
|
|
52
|
+
}
|
|
53
|
+
let filename;
|
|
54
|
+
let base64Data;
|
|
55
|
+
// Write to disk if file or both mode
|
|
56
|
+
if (outputMode === "file" || outputMode === "both") {
|
|
57
|
+
const os = await import("os");
|
|
58
|
+
const path = await import("path");
|
|
59
|
+
const outputDir = process.env.FOOTPRINT_DATA_DIR ||
|
|
60
|
+
process.env.FOOTPRINT_EXPORT_DIR ||
|
|
61
|
+
os.tmpdir();
|
|
62
|
+
const outputPath = path.join(outputDir, result.filename);
|
|
63
|
+
fs.writeFileSync(outputPath, result.zipData);
|
|
64
|
+
filename = outputPath;
|
|
65
|
+
}
|
|
66
|
+
// Generate base64 if base64 or both mode
|
|
67
|
+
if (outputMode === "base64" || outputMode === "both") {
|
|
68
|
+
base64Data = Buffer.from(result.zipData).toString("base64");
|
|
69
|
+
}
|
|
70
|
+
const details = {
|
|
71
|
+
"Footprint Count": result.evidenceCount,
|
|
40
72
|
Checksum: result.checksum,
|
|
41
73
|
"Git Info": params.includeGitInfo ? "Included" : "Excluded",
|
|
42
|
-
|
|
43
|
-
|
|
74
|
+
"Output Mode": outputMode,
|
|
75
|
+
};
|
|
76
|
+
if (filename)
|
|
77
|
+
details.Filename = filename;
|
|
78
|
+
if (base64Data)
|
|
79
|
+
details["Base64 Size"] = `${Math.round(base64Data.length / 1024)}KB`;
|
|
80
|
+
return formatSuccessResponse("Export completed successfully", details, {
|
|
81
|
+
...(filename && { filename }),
|
|
82
|
+
...(base64Data && { base64Data }),
|
|
44
83
|
checksum: result.checksum,
|
|
45
|
-
|
|
84
|
+
evidenceCount: result.evidenceCount,
|
|
46
85
|
success: true,
|
|
47
86
|
});
|
|
48
87
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-footprints.js","sourceRoot":"","sources":["../../../src/tools/export-footprints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,WAAW,EAAE;QACX,
|
|
1
|
+
{"version":3,"file":"export-footprints.js","sourceRoot":"","sources":["../../../src/tools/export-footprints.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,13 +14,7 @@ export declare const getFootprintSchema: {
|
|
|
14
14
|
gitInfo: z.ZodNullable<z.ZodObject<{
|
|
15
15
|
commitHash: z.ZodString;
|
|
16
16
|
timestamp: z.ZodString;
|
|
17
|
-
},
|
|
18
|
-
timestamp: string;
|
|
19
|
-
commitHash: string;
|
|
20
|
-
}, {
|
|
21
|
-
timestamp: string;
|
|
22
|
-
commitHash: string;
|
|
23
|
-
}>>;
|
|
17
|
+
}, z.core.$strip>>;
|
|
24
18
|
tags: z.ZodNullable<z.ZodString>;
|
|
25
19
|
};
|
|
26
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-footprint.d.ts","sourceRoot":"","sources":["../../../src/tools/get-footprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAIzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"get-footprint.d.ts","sourceRoot":"","sources":["../../../src/tools/get-footprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAIzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;CAuB9B,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;CAShC,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,gBAAgB,EACpB,aAAa,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC;QAKjB,MAAM;;;;;;;;;;;;;IA0C9B"}
|