@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.
Files changed (184) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +125 -161
  3. package/SKILL.md +50 -50
  4. package/dist/src/analyzers/content-analyzer.d.ts.map +1 -1
  5. package/dist/src/analyzers/content-analyzer.js +20 -4
  6. package/dist/src/analyzers/content-analyzer.js.map +1 -1
  7. package/dist/src/cli/constants.d.ts +20 -0
  8. package/dist/src/cli/constants.d.ts.map +1 -0
  9. package/dist/src/cli/constants.js +25 -0
  10. package/dist/src/cli/constants.js.map +1 -0
  11. package/dist/src/cli/index.d.ts +3 -0
  12. package/dist/src/cli/index.d.ts.map +1 -0
  13. package/dist/src/cli/index.js +25 -0
  14. package/dist/src/cli/index.js.map +1 -0
  15. package/dist/src/cli/setup.d.ts +6 -0
  16. package/dist/src/cli/setup.d.ts.map +1 -0
  17. package/dist/src/cli/setup.js +356 -0
  18. package/dist/src/cli/setup.js.map +1 -0
  19. package/dist/src/cli/types.d.ts +38 -0
  20. package/dist/src/cli/types.d.ts.map +1 -0
  21. package/dist/src/cli/types.js +5 -0
  22. package/dist/src/cli/types.js.map +1 -0
  23. package/dist/src/cli/utils/config.d.ts +19 -0
  24. package/dist/src/cli/utils/config.d.ts.map +1 -0
  25. package/dist/src/cli/utils/config.js +86 -0
  26. package/dist/src/cli/utils/config.js.map +1 -0
  27. package/dist/src/cli/utils/detect.d.ts +14 -0
  28. package/dist/src/cli/utils/detect.d.ts.map +1 -0
  29. package/dist/src/cli/utils/detect.js +57 -0
  30. package/dist/src/cli/utils/detect.js.map +1 -0
  31. package/dist/src/cli/utils/env.d.ts +15 -0
  32. package/dist/src/cli/utils/env.d.ts.map +1 -0
  33. package/dist/src/cli/utils/env.js +85 -0
  34. package/dist/src/cli/utils/env.js.map +1 -0
  35. package/dist/src/cli/utils/validation.d.ts +17 -0
  36. package/dist/src/cli/utils/validation.d.ts.map +1 -0
  37. package/dist/src/cli/utils/validation.js +77 -0
  38. package/dist/src/cli/utils/validation.js.map +1 -0
  39. package/dist/src/index.d.ts +1 -1
  40. package/dist/src/index.d.ts.map +1 -1
  41. package/dist/src/index.js +53 -38
  42. package/dist/src/index.js.map +1 -1
  43. package/dist/src/lib/crypto/decrypt.d.ts.map +1 -1
  44. package/dist/src/lib/crypto/decrypt.js +12 -8
  45. package/dist/src/lib/crypto/decrypt.js.map +1 -1
  46. package/dist/src/lib/crypto/encrypt.d.ts.map +1 -1
  47. package/dist/src/lib/crypto/encrypt.js +6 -3
  48. package/dist/src/lib/crypto/encrypt.js.map +1 -1
  49. package/dist/src/lib/crypto/key-derivation.d.ts +1 -1
  50. package/dist/src/lib/crypto/key-derivation.d.ts.map +1 -1
  51. package/dist/src/lib/crypto/key-derivation.js +11 -11
  52. package/dist/src/lib/crypto/key-derivation.js.map +1 -1
  53. package/dist/src/lib/storage/database.d.ts +46 -3
  54. package/dist/src/lib/storage/database.d.ts.map +1 -1
  55. package/dist/src/lib/storage/database.js +175 -80
  56. package/dist/src/lib/storage/database.js.map +1 -1
  57. package/dist/src/lib/storage/export.d.ts +3 -4
  58. package/dist/src/lib/storage/export.d.ts.map +1 -1
  59. package/dist/src/lib/storage/export.js +75 -62
  60. package/dist/src/lib/storage/export.js.map +1 -1
  61. package/dist/src/lib/storage/salt-storage.d.ts +1 -1
  62. package/dist/src/lib/storage/salt-storage.d.ts.map +1 -1
  63. package/dist/src/lib/storage/salt-storage.js +26 -18
  64. package/dist/src/lib/storage/salt-storage.js.map +1 -1
  65. package/dist/src/lib/storage/schema.d.ts +1 -1
  66. package/dist/src/lib/storage/schema.d.ts.map +1 -1
  67. package/dist/src/lib/storage/schema.js +29 -47
  68. package/dist/src/lib/storage/schema.js.map +1 -1
  69. package/dist/src/lib/tool-wrapper.d.ts.map +1 -1
  70. package/dist/src/lib/tool-wrapper.js +2 -2
  71. package/dist/src/lib/tool-wrapper.js.map +1 -1
  72. package/dist/src/prompts/skill-prompt.d.ts +6 -0
  73. package/dist/src/prompts/skill-prompt.d.ts.map +1 -0
  74. package/dist/src/prompts/skill-prompt.js +125 -0
  75. package/dist/src/prompts/skill-prompt.js.map +1 -0
  76. package/dist/src/tools/capture-footprint.d.ts +2 -2
  77. package/dist/src/tools/capture-footprint.d.ts.map +1 -1
  78. package/dist/src/tools/capture-footprint.js +53 -12
  79. package/dist/src/tools/capture-footprint.js.map +1 -1
  80. package/dist/src/tools/delete-footprints.d.ts +19 -2
  81. package/dist/src/tools/delete-footprints.d.ts.map +1 -1
  82. package/dist/src/tools/delete-footprints.js +56 -8
  83. package/dist/src/tools/delete-footprints.js.map +1 -1
  84. package/dist/src/tools/export-footprints.d.ts +14 -6
  85. package/dist/src/tools/export-footprints.d.ts.map +1 -1
  86. package/dist/src/tools/export-footprints.js +54 -15
  87. package/dist/src/tools/export-footprints.js.map +1 -1
  88. package/dist/src/tools/get-footprint.d.ts +1 -7
  89. package/dist/src/tools/get-footprint.d.ts.map +1 -1
  90. package/dist/src/tools/get-footprint.js +26 -22
  91. package/dist/src/tools/get-footprint.js.map +1 -1
  92. package/dist/src/tools/index.d.ts +1 -3
  93. package/dist/src/tools/index.d.ts.map +1 -1
  94. package/dist/src/tools/index.js +1 -3
  95. package/dist/src/tools/index.js.map +1 -1
  96. package/dist/src/tools/list-footprints.d.ts +3 -17
  97. package/dist/src/tools/list-footprints.d.ts.map +1 -1
  98. package/dist/src/tools/list-footprints.js +27 -16
  99. package/dist/src/tools/list-footprints.js.map +1 -1
  100. package/dist/src/tools/manage-tags.d.ts +47 -0
  101. package/dist/src/tools/manage-tags.d.ts.map +1 -0
  102. package/dist/src/tools/manage-tags.js +109 -0
  103. package/dist/src/tools/manage-tags.js.map +1 -0
  104. package/dist/src/tools/search-footprints.d.ts +4 -18
  105. package/dist/src/tools/search-footprints.d.ts.map +1 -1
  106. package/dist/src/tools/search-footprints.js +32 -16
  107. package/dist/src/tools/search-footprints.js.map +1 -1
  108. package/dist/src/tools/suggest-capture.d.ts +1 -1
  109. package/dist/src/tools/suggest-capture.d.ts.map +1 -1
  110. package/dist/src/tools/suggest-capture.js +6 -2
  111. package/dist/src/tools/suggest-capture.js.map +1 -1
  112. package/dist/src/tools/verify-footprint.d.ts +7 -54
  113. package/dist/src/tools/verify-footprint.d.ts.map +1 -1
  114. package/dist/src/tools/verify-footprint.js +22 -19
  115. package/dist/src/tools/verify-footprint.js.map +1 -1
  116. package/dist/src/types.d.ts +4 -4
  117. package/dist/src/types.d.ts.map +1 -1
  118. package/dist/src/ui/register.js +3 -3
  119. package/dist/src/ui/register.js.map +1 -1
  120. package/dist/ui/dashboard.html +78 -65
  121. package/dist/ui/detail.html +69 -56
  122. package/dist/ui/export.html +72 -59
  123. package/package.json +28 -16
  124. package/dist/src/lib/errors/base-error.d.ts +0 -15
  125. package/dist/src/lib/errors/base-error.d.ts.map +0 -1
  126. package/dist/src/lib/errors/base-error.js +0 -34
  127. package/dist/src/lib/errors/base-error.js.map +0 -1
  128. package/dist/src/lib/errors/crypto-error.d.ts +0 -29
  129. package/dist/src/lib/errors/crypto-error.d.ts.map +0 -1
  130. package/dist/src/lib/errors/crypto-error.js +0 -43
  131. package/dist/src/lib/errors/crypto-error.js.map +0 -1
  132. package/dist/src/lib/errors/index.d.ts +0 -26
  133. package/dist/src/lib/errors/index.d.ts.map +0 -1
  134. package/dist/src/lib/errors/index.js +0 -26
  135. package/dist/src/lib/errors/index.js.map +0 -1
  136. package/dist/src/lib/errors/storage-error.d.ts +0 -25
  137. package/dist/src/lib/errors/storage-error.d.ts.map +0 -1
  138. package/dist/src/lib/errors/storage-error.js +0 -38
  139. package/dist/src/lib/errors/storage-error.js.map +0 -1
  140. package/dist/src/lib/errors/validation-error.d.ts +0 -21
  141. package/dist/src/lib/errors/validation-error.d.ts.map +0 -1
  142. package/dist/src/lib/errors/validation-error.js +0 -29
  143. package/dist/src/lib/errors/validation-error.js.map +0 -1
  144. package/dist/src/test-helpers.d.ts +0 -33
  145. package/dist/src/test-helpers.d.ts.map +0 -1
  146. package/dist/src/test-helpers.js +0 -108
  147. package/dist/src/test-helpers.js.map +0 -1
  148. package/dist/src/tools/get-tag-stats.d.ts +0 -30
  149. package/dist/src/tools/get-tag-stats.d.ts.map +0 -1
  150. package/dist/src/tools/get-tag-stats.js +0 -33
  151. package/dist/src/tools/get-tag-stats.js.map +0 -1
  152. package/dist/src/tools/remove-tag.d.ts +0 -22
  153. package/dist/src/tools/remove-tag.d.ts.map +0 -1
  154. package/dist/src/tools/remove-tag.js +0 -30
  155. package/dist/src/tools/remove-tag.js.map +0 -1
  156. package/dist/src/tools/rename-tag.d.ts +0 -24
  157. package/dist/src/tools/rename-tag.d.ts.map +0 -1
  158. package/dist/src/tools/rename-tag.js +0 -34
  159. package/dist/src/tools/rename-tag.js.map +0 -1
  160. package/dist/tests/error-handling.test.d.ts +0 -2
  161. package/dist/tests/error-handling.test.d.ts.map +0 -1
  162. package/dist/tests/error-handling.test.js +0 -114
  163. package/dist/tests/error-handling.test.js.map +0 -1
  164. package/dist/tests/fixtures.d.ts +0 -87
  165. package/dist/tests/fixtures.d.ts.map +0 -1
  166. package/dist/tests/fixtures.js +0 -130
  167. package/dist/tests/fixtures.js.map +0 -1
  168. package/dist/tests/integration.test.d.ts +0 -2
  169. package/dist/tests/integration.test.d.ts.map +0 -1
  170. package/dist/tests/integration.test.js +0 -115
  171. package/dist/tests/integration.test.js.map +0 -1
  172. package/dist/tests/resources.test.d.ts +0 -2
  173. package/dist/tests/resources.test.d.ts.map +0 -1
  174. package/dist/tests/resources.test.js +0 -73
  175. package/dist/tests/resources.test.js.map +0 -1
  176. package/dist/tests/setup.d.ts +0 -8
  177. package/dist/tests/setup.d.ts.map +0 -1
  178. package/dist/tests/setup.js +0 -8
  179. package/dist/tests/setup.js.map +0 -1
  180. package/dist/tests/tools.test.d.ts +0 -2
  181. package/dist/tests/tools.test.d.ts.map +0 -1
  182. package/dist/tests/tools.test.js +0 -224
  183. package/dist/tests/tools.test.js.map +0 -1
  184. 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;;;;;;;;;;;;;;CAkBlC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;CAGpC,CAAC;AAEF,wBAAgB,6BAA6B,CAC3C,EAAE,EAAE,gBAAgB,EACpB,aAAa,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC;;;;;IAmFzC"}
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.string().describe("Conversation ID"),
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
- .describe("LLM provider name (e.g., Claude Sonnet 4.5)"),
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
- .describe("Conversation content (messages, prompts, responses)"),
16
- messageCount: z.number().int().positive().describe("Number of messages"),
17
- tags: z.string().optional().describe("Optional tags (comma-separated)"),
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
- if (params.messageCount <= 0) {
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
- params.tags = tags.join(",");
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: params.llmProvider,
113
+ llmProvider,
73
114
  encryptedContent: encrypted.ciphertext,
74
115
  nonce: encrypted.nonce,
75
116
  contentHash,
76
- messageCount: params.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("Footprint captured successfully", {
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": params.messageCount,
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":"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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,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
- ids: z.ZodArray<z.ZodString, "many">;
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
- ids: string[];
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;;;;;;;;CAWlC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;CAGpC,CAAC;AAEF,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,gBAAgB;SAIxC,MAAM,EAAE;;;;IAejC"}
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
- ids: z
6
+ evidenceIds: z
7
7
  .array(z.string())
8
8
  .min(1)
9
- .describe("Array of footprint IDs to delete"),
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.ids || params.ids.length === 0) {
23
- throw new Error("At least one footprint ID is required");
36
+ if (!params.evidenceIds || params.evidenceIds.length === 0) {
37
+ throw new Error("At least one evidence ID is required");
24
38
  }
25
- const deletedCount = db.deleteMany(params.ids);
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
- const resultText = success
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
- return createToolResponse(resultText, { deletedCount, success });
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,GAAG,EAAE,CAAC;aACH,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,MAAyB,EAAE,EAAE;QAClC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/C,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"}
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
- ids: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
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
- footprintCount: z.ZodNumber;
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
- ids?: string[];
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
- footprintCount: number;
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":"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;UAIvC,MAAM,EAAE;qBAAmB,OAAO;;;;;;IA4B5D"}
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
- ids: z
7
+ evidenceIds: z
7
8
  .array(z.string())
8
9
  .optional()
9
- .describe("Specific IDs (empty = all)"),
10
- includeGitInfo: z.boolean().optional().describe("Include Git timestamps"),
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
- footprintCount: z.number(),
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 ids exist and filesystem has write permissions.", async (params) => {
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
- ids: params.ids,
43
+ evidenceIds: params.evidenceIds,
34
44
  includeGitInfo: params.includeGitInfo ?? false,
35
45
  });
36
- fs.writeFileSync(result.filename, result.zipData);
37
- return formatSuccessResponse("Export completed successfully", {
38
- "Footprint Count": result.footprintCount,
39
- Filename: result.filename,
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
- filename: result.filename,
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
- footprintCount: result.footprintCount,
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,GAAG,EAAE,CAAC;aACH,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,QAAQ,EAAE;aACV,QAAQ,CAAC,4BAA4B,CAAC;QACzC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;KAC1E;IACD,YAAY,EAAE;QACZ,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;QAC1B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;KACrB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EAAE,4CAA4C;IACzD,KAAK,EAAE;QACL,EAAE,EAAE;YACF,WAAW,EAAE,4BAA4B;SAC1C;KACF;CACF,CAAC;AAEF,MAAM,UAAU,6BAA6B,CAAC,EAAoB;IAChE,OAAO,eAAe,CACpB,mBAAmB,EACnB,uDAAuD,EACvD,KAAK,EAAE,MAAoD,EAAE,EAAE;QAC7D,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACpE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE;YACvC,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,KAAK;SAC/C,CAAC,CAAC;QAEH,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAElD,OAAO,qBAAqB,CAC1B,+BAA+B,EAC/B;YACE,iBAAiB,EAAE,MAAM,CAAC,cAAc;YACxC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;SAC5D,EACD;YACE,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,OAAO,EAAE,IAAI;SACd,CACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
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
- }, "strip", z.ZodTypeAny, {
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;;;;;;;;;;;;;;;;;;;;;;;CAmB9B,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;CAQhC,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,gBAAgB,EACpB,aAAa,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC;QAKjB,MAAM;;;;;;;;;;;;;IAuC9B"}
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"}