@pcircle/footprint 1.3.0 → 1.6.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 +215 -137
- package/SKILL.md +77 -33
- package/bin/footprint.js +16 -0
- package/dist/src/adapters/claude.d.ts +2 -0
- package/dist/src/adapters/claude.d.ts.map +1 -0
- package/dist/src/adapters/claude.js +7 -0
- package/dist/src/adapters/claude.js.map +1 -0
- package/dist/src/adapters/codex.d.ts +2 -0
- package/dist/src/adapters/codex.d.ts.map +1 -0
- package/dist/src/adapters/codex.js +7 -0
- package/dist/src/adapters/codex.js.map +1 -0
- package/dist/src/adapters/gemini.d.ts +2 -0
- package/dist/src/adapters/gemini.d.ts.map +1 -0
- package/dist/src/adapters/gemini.js +7 -0
- package/dist/src/adapters/gemini.js.map +1 -0
- package/dist/src/adapters/index.d.ts +5 -0
- package/dist/src/adapters/index.d.ts.map +1 -0
- package/dist/src/adapters/index.js +12 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/adapters/structured-prefix.d.ts +10 -0
- package/dist/src/adapters/structured-prefix.d.ts.map +1 -0
- package/dist/src/adapters/structured-prefix.js +59 -0
- package/dist/src/adapters/structured-prefix.js.map +1 -0
- package/dist/src/adapters/types.d.ts +32 -0
- package/dist/src/adapters/types.d.ts.map +1 -0
- package/dist/src/adapters/types.js +2 -0
- package/dist/src/adapters/types.js.map +1 -0
- 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/context-flow.d.ts +92 -0
- package/dist/src/cli/context-flow.d.ts.map +1 -0
- package/dist/src/cli/context-flow.js +724 -0
- package/dist/src/cli/context-flow.js.map +1 -0
- package/dist/src/cli/history-display.d.ts +27 -0
- package/dist/src/cli/history-display.d.ts.map +1 -0
- package/dist/src/cli/history-display.js +167 -0
- package/dist/src/cli/history-display.js.map +1 -0
- package/dist/src/cli/index.js +924 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/launch-spec.d.ts +31 -0
- package/dist/src/cli/launch-spec.d.ts.map +1 -0
- package/dist/src/cli/launch-spec.js +182 -0
- package/dist/src/cli/launch-spec.js.map +1 -0
- package/dist/src/cli/live-demo.d.ts +34 -0
- package/dist/src/cli/live-demo.d.ts.map +1 -0
- package/dist/src/cli/live-demo.js +254 -0
- package/dist/src/cli/live-demo.js.map +1 -0
- package/dist/src/cli/pty-transcript.d.ts +34 -0
- package/dist/src/cli/pty-transcript.d.ts.map +1 -0
- package/dist/src/cli/pty-transcript.js +174 -0
- package/dist/src/cli/pty-transcript.js.map +1 -0
- package/dist/src/cli/session-display.d.ts +74 -0
- package/dist/src/cli/session-display.d.ts.map +1 -0
- package/dist/src/cli/session-display.js +922 -0
- package/dist/src/cli/session-display.js.map +1 -0
- package/dist/src/cli/session-execution.d.ts +55 -0
- package/dist/src/cli/session-execution.d.ts.map +1 -0
- package/dist/src/cli/session-execution.js +817 -0
- package/dist/src/cli/session-execution.js.map +1 -0
- package/dist/src/cli/session-runtime.d.ts +5 -0
- package/dist/src/cli/session-runtime.d.ts.map +1 -0
- package/dist/src/cli/session-runtime.js +11 -0
- package/dist/src/cli/session-runtime.js.map +1 -0
- package/dist/src/cli/setup.d.ts.map +1 -1
- package/dist/src/cli/setup.js +36 -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 +4 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +187 -33
- package/dist/src/index.js.map +1 -1
- package/dist/src/ingestion/deterministic.d.ts +3 -0
- package/dist/src/ingestion/deterministic.d.ts.map +1 -0
- package/dist/src/ingestion/deterministic.js +862 -0
- package/dist/src/ingestion/deterministic.js.map +1 -0
- package/dist/src/ingestion/index.d.ts +5 -0
- package/dist/src/ingestion/index.d.ts.map +1 -0
- package/dist/src/ingestion/index.js +27 -0
- package/dist/src/ingestion/index.js.map +1 -0
- package/dist/src/ingestion/semantic.d.ts +6 -0
- package/dist/src/ingestion/semantic.d.ts.map +1 -0
- package/dist/src/ingestion/semantic.js +627 -0
- package/dist/src/ingestion/semantic.js.map +1 -0
- package/dist/src/ingestion/types.d.ts +10 -0
- package/dist/src/ingestion/types.d.ts.map +1 -0
- package/dist/src/ingestion/types.js +2 -0
- package/dist/src/ingestion/types.js.map +1 -0
- package/dist/src/lib/context-memory.d.ts +140 -0
- package/dist/src/lib/context-memory.d.ts.map +1 -0
- package/dist/src/lib/context-memory.js +974 -0
- package/dist/src/lib/context-memory.js.map +1 -0
- 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/history-handoff.d.ts +43 -0
- package/dist/src/lib/history-handoff.d.ts.map +1 -0
- package/dist/src/lib/history-handoff.js +179 -0
- package/dist/src/lib/history-handoff.js.map +1 -0
- package/dist/src/lib/observability.d.ts +3 -0
- package/dist/src/lib/observability.d.ts.map +1 -0
- package/dist/src/lib/observability.js +63 -0
- package/dist/src/lib/observability.js.map +1 -0
- package/dist/src/lib/session-artifacts.d.ts +51 -0
- package/dist/src/lib/session-artifacts.d.ts.map +1 -0
- package/dist/src/lib/session-artifacts.js +132 -0
- package/dist/src/lib/session-artifacts.js.map +1 -0
- package/dist/src/lib/session-filters.d.ts +11 -0
- package/dist/src/lib/session-filters.d.ts.map +1 -0
- package/dist/src/lib/session-filters.js +16 -0
- package/dist/src/lib/session-filters.js.map +1 -0
- package/dist/src/lib/session-history.d.ts +50 -0
- package/dist/src/lib/session-history.d.ts.map +1 -0
- package/dist/src/lib/session-history.js +73 -0
- package/dist/src/lib/session-history.js.map +1 -0
- package/dist/src/lib/session-trends.d.ts +129 -0
- package/dist/src/lib/session-trends.d.ts.map +1 -0
- package/dist/src/lib/session-trends.js +361 -0
- package/dist/src/lib/session-trends.js.map +1 -0
- package/dist/src/lib/storage/database.d.ts +257 -3
- package/dist/src/lib/storage/database.d.ts.map +1 -1
- package/dist/src/lib/storage/database.js +1836 -161
- package/dist/src/lib/storage/database.js.map +1 -1
- package/dist/src/lib/storage/export-sessions.d.ts +33 -0
- package/dist/src/lib/storage/export-sessions.d.ts.map +1 -0
- package/dist/src/lib/storage/export-sessions.js +525 -0
- package/dist/src/lib/storage/export-sessions.js.map +1 -0
- 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/index.d.ts +7 -6
- package/dist/src/lib/storage/index.d.ts.map +1 -1
- package/dist/src/lib/storage/index.js +6 -5
- package/dist/src/lib/storage/index.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 +7 -2
- package/dist/src/lib/storage/schema.d.ts.map +1 -1
- package/dist/src/lib/storage/schema.js +357 -40
- package/dist/src/lib/storage/schema.js.map +1 -1
- package/dist/src/lib/storage/types.d.ts +122 -0
- package/dist/src/lib/storage/types.d.ts.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 +138 -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/confirm-context-link.d.ts +62 -0
- package/dist/src/tools/confirm-context-link.d.ts.map +1 -0
- package/dist/src/tools/confirm-context-link.js +36 -0
- package/dist/src/tools/confirm-context-link.js.map +1 -0
- package/dist/src/tools/context-schemas.d.ts +694 -0
- package/dist/src/tools/context-schemas.d.ts.map +1 -0
- package/dist/src/tools/context-schemas.js +171 -0
- package/dist/src/tools/context-schemas.js.map +1 -0
- 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/export-sessions.d.ts +111 -0
- package/dist/src/tools/export-sessions.d.ts.map +1 -0
- package/dist/src/tools/export-sessions.js +136 -0
- package/dist/src/tools/export-sessions.js.map +1 -0
- package/dist/src/tools/get-context.d.ts +208 -0
- package/dist/src/tools/get-context.d.ts.map +1 -0
- package/dist/src/tools/get-context.js +27 -0
- package/dist/src/tools/get-context.js.map +1 -0
- 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/get-history-handoff.d.ts +109 -0
- package/dist/src/tools/get-history-handoff.d.ts.map +1 -0
- package/dist/src/tools/get-history-handoff.js +85 -0
- package/dist/src/tools/get-history-handoff.js.map +1 -0
- package/dist/src/tools/get-history-trends.d.ts +155 -0
- package/dist/src/tools/get-history-trends.d.ts.map +1 -0
- package/dist/src/tools/get-history-trends.js +123 -0
- package/dist/src/tools/get-history-trends.js.map +1 -0
- package/dist/src/tools/get-session-artifacts.d.ts +151 -0
- package/dist/src/tools/get-session-artifacts.d.ts.map +1 -0
- package/dist/src/tools/get-session-artifacts.js +184 -0
- package/dist/src/tools/get-session-artifacts.js.map +1 -0
- package/dist/src/tools/get-session-decisions.d.ts +69 -0
- package/dist/src/tools/get-session-decisions.d.ts.map +1 -0
- package/dist/src/tools/get-session-decisions.js +99 -0
- package/dist/src/tools/get-session-decisions.js.map +1 -0
- package/dist/src/tools/get-session-messages.d.ts +55 -0
- package/dist/src/tools/get-session-messages.d.ts.map +1 -0
- package/dist/src/tools/get-session-messages.js +89 -0
- package/dist/src/tools/get-session-messages.js.map +1 -0
- package/dist/src/tools/get-session-narrative.d.ts +72 -0
- package/dist/src/tools/get-session-narrative.d.ts.map +1 -0
- package/dist/src/tools/get-session-narrative.js +106 -0
- package/dist/src/tools/get-session-narrative.js.map +1 -0
- package/dist/src/tools/get-session-timeline.d.ts +55 -0
- package/dist/src/tools/get-session-timeline.d.ts.map +1 -0
- package/dist/src/tools/get-session-timeline.js +93 -0
- package/dist/src/tools/get-session-timeline.js.map +1 -0
- package/dist/src/tools/get-session-trends.d.ts +108 -0
- package/dist/src/tools/get-session-trends.d.ts.map +1 -0
- package/dist/src/tools/get-session-trends.js +130 -0
- package/dist/src/tools/get-session-trends.js.map +1 -0
- package/dist/src/tools/get-session.d.ts +251 -0
- package/dist/src/tools/get-session.d.ts.map +1 -0
- package/dist/src/tools/get-session.js +290 -0
- package/dist/src/tools/get-session.js.map +1 -0
- package/dist/src/tools/index.d.ts +23 -3
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +23 -3
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/list-contexts.d.ts +50 -0
- package/dist/src/tools/list-contexts.d.ts.map +1 -0
- package/dist/src/tools/list-contexts.js +28 -0
- package/dist/src/tools/list-contexts.js.map +1 -0
- 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/list-sessions.d.ts +86 -0
- package/dist/src/tools/list-sessions.d.ts.map +1 -0
- package/dist/src/tools/list-sessions.js +97 -0
- package/dist/src/tools/list-sessions.js.map +1 -0
- 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/merge-contexts.d.ts +58 -0
- package/dist/src/tools/merge-contexts.d.ts.map +1 -0
- package/dist/src/tools/merge-contexts.js +27 -0
- package/dist/src/tools/merge-contexts.js.map +1 -0
- package/dist/src/tools/move-session-context.d.ts +62 -0
- package/dist/src/tools/move-session-context.d.ts.map +1 -0
- package/dist/src/tools/move-session-context.js +33 -0
- package/dist/src/tools/move-session-context.js.map +1 -0
- package/dist/src/tools/reingest-session.d.ts +31 -0
- package/dist/src/tools/reingest-session.d.ts.map +1 -0
- package/dist/src/tools/reingest-session.js +43 -0
- package/dist/src/tools/reingest-session.js.map +1 -0
- package/dist/src/tools/reject-context-link.d.ts +58 -0
- package/dist/src/tools/reject-context-link.d.ts.map +1 -0
- package/dist/src/tools/reject-context-link.js +26 -0
- package/dist/src/tools/reject-context-link.js.map +1 -0
- package/dist/src/tools/resolve-context.d.ts +287 -0
- package/dist/src/tools/resolve-context.d.ts.map +1 -0
- package/dist/src/tools/resolve-context.js +35 -0
- package/dist/src/tools/resolve-context.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/search-history.d.ts +86 -0
- package/dist/src/tools/search-history.d.ts.map +1 -0
- package/dist/src/tools/search-history.js +103 -0
- package/dist/src/tools/search-history.js.map +1 -0
- package/dist/src/tools/session-ui-metadata.d.ts +15 -0
- package/dist/src/tools/session-ui-metadata.d.ts.map +1 -0
- package/dist/src/tools/session-ui-metadata.js +15 -0
- package/dist/src/tools/session-ui-metadata.js.map +1 -0
- package/dist/src/tools/set-active-context.d.ts +58 -0
- package/dist/src/tools/set-active-context.d.ts.map +1 -0
- package/dist/src/tools/set-active-context.js +26 -0
- package/dist/src/tools/set-active-context.js.map +1 -0
- package/dist/src/tools/split-context.d.ts +62 -0
- package/dist/src/tools/split-context.d.ts.map +1 -0
- package/dist/src/tools/split-context.js +36 -0
- package/dist/src/tools/split-context.js.map +1 -0
- 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 +6 -4
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/ui/register.d.ts +6 -1
- package/dist/src/ui/register.d.ts.map +1 -1
- package/dist/src/ui/register.js +60 -16
- package/dist/src/ui/register.js.map +1 -1
- package/dist/ui/dashboard.html +259 -875
- package/dist/ui/detail.html +124 -252
- package/dist/ui/export.html +133 -303
- package/dist/ui/session-dashboard-live.html +264 -0
- package/dist/ui/session-dashboard.html +329 -0
- package/dist/ui/session-detail-live.html +336 -0
- package/dist/ui/session-detail.html +355 -0
- package/package.json +61 -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
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import JSZip from
|
|
2
|
-
import { createHash } from
|
|
1
|
+
import JSZip from "jszip";
|
|
2
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
3
3
|
// Export format version constant
|
|
4
|
-
const EXPORT_FORMAT_VERSION =
|
|
4
|
+
const EXPORT_FORMAT_VERSION = "1.0.0";
|
|
5
5
|
// Maximum export size in MB (configurable limit to prevent OOM)
|
|
6
6
|
const MAX_EXPORT_SIZE_MB = 100;
|
|
7
7
|
/**
|
|
@@ -22,25 +22,35 @@ export async function exportEvidences(db, options = {}) {
|
|
|
22
22
|
// Get evidences to export - validate IDs if specified
|
|
23
23
|
let evidences;
|
|
24
24
|
if (evidenceIds) {
|
|
25
|
-
//
|
|
26
|
-
const notFound =
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
// Map with proper error handling (should never throw after validation above)
|
|
31
|
-
evidences = evidenceIds.map(id => {
|
|
25
|
+
// Single-pass: collect evidences and track missing IDs
|
|
26
|
+
const notFound = [];
|
|
27
|
+
const found = [];
|
|
28
|
+
for (const id of evidenceIds) {
|
|
32
29
|
const evidence = db.findById(id);
|
|
33
|
-
if (
|
|
34
|
-
|
|
30
|
+
if (evidence) {
|
|
31
|
+
found.push(evidence);
|
|
35
32
|
}
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
else {
|
|
34
|
+
notFound.push(id);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (notFound.length > 0) {
|
|
38
|
+
throw new Error(`Evidence IDs not found: ${notFound.join(", ")}`);
|
|
39
|
+
}
|
|
40
|
+
evidences = found;
|
|
38
41
|
}
|
|
39
42
|
else {
|
|
43
|
+
// Check record count before loading all into memory
|
|
44
|
+
const totalCount = db.getTotalCount();
|
|
45
|
+
if (totalCount > 10000) {
|
|
46
|
+
throw new Error(`Too many evidences to export at once (${totalCount}). ` +
|
|
47
|
+
`Please use evidenceIds to export in batches of up to 10,000.`);
|
|
48
|
+
}
|
|
40
49
|
evidences = db.list();
|
|
41
50
|
}
|
|
42
51
|
// Validate export size to prevent OOM crashes
|
|
43
|
-
const estimatedSizeMB = evidences.reduce((sum, e) => sum + e.encryptedContent.length, 0) /
|
|
52
|
+
const estimatedSizeMB = evidences.reduce((sum, e) => sum + e.encryptedContent.length, 0) /
|
|
53
|
+
(1024 * 1024);
|
|
44
54
|
if (estimatedSizeMB > MAX_EXPORT_SIZE_MB) {
|
|
45
55
|
throw new Error(`Export size (${estimatedSizeMB.toFixed(1)}MB) exceeds limit (${MAX_EXPORT_SIZE_MB}MB). ` +
|
|
46
56
|
`Please export in smaller batches using the evidenceIds parameter.`);
|
|
@@ -54,7 +64,7 @@ export async function exportEvidences(db, options = {}) {
|
|
|
54
64
|
evidenceCount: evidences.length,
|
|
55
65
|
includeGitInfo,
|
|
56
66
|
};
|
|
57
|
-
zip.file(
|
|
67
|
+
zip.file("manifest.json", JSON.stringify(manifest, null, 2));
|
|
58
68
|
// Add each evidence
|
|
59
69
|
const checksumEntries = [];
|
|
60
70
|
for (const evidence of evidences) {
|
|
@@ -62,9 +72,9 @@ export async function exportEvidences(db, options = {}) {
|
|
|
62
72
|
// Add encrypted-data
|
|
63
73
|
zip.file(`${evidenceFolder}/encrypted-data`, evidence.encryptedContent);
|
|
64
74
|
// Calculate checksum for encrypted data
|
|
65
|
-
const dataChecksum = createHash(
|
|
75
|
+
const dataChecksum = createHash("sha256")
|
|
66
76
|
.update(evidence.encryptedContent)
|
|
67
|
-
.digest(
|
|
77
|
+
.digest("hex");
|
|
68
78
|
checksumEntries.push(`${dataChecksum} ${evidenceFolder}/encrypted-data`);
|
|
69
79
|
// Add metadata.json
|
|
70
80
|
const metadata = {
|
|
@@ -79,9 +89,9 @@ export async function exportEvidences(db, options = {}) {
|
|
|
79
89
|
};
|
|
80
90
|
const metadataJson = JSON.stringify(metadata, null, 2);
|
|
81
91
|
zip.file(`${evidenceFolder}/metadata.json`, metadataJson);
|
|
82
|
-
const metadataChecksum = createHash(
|
|
92
|
+
const metadataChecksum = createHash("sha256")
|
|
83
93
|
.update(metadataJson)
|
|
84
|
-
.digest(
|
|
94
|
+
.digest("hex");
|
|
85
95
|
checksumEntries.push(`${metadataChecksum} ${evidenceFolder}/metadata.json`);
|
|
86
96
|
// Add git-info.json if requested and available
|
|
87
97
|
if (includeGitInfo && evidence.gitCommitHash && evidence.gitTimestamp) {
|
|
@@ -91,29 +101,32 @@ export async function exportEvidences(db, options = {}) {
|
|
|
91
101
|
};
|
|
92
102
|
const gitInfoJson = JSON.stringify(gitInfo, null, 2);
|
|
93
103
|
zip.file(`${evidenceFolder}/git-info.json`, gitInfoJson);
|
|
94
|
-
const gitChecksum = createHash(
|
|
104
|
+
const gitChecksum = createHash("sha256")
|
|
105
|
+
.update(gitInfoJson)
|
|
106
|
+
.digest("hex");
|
|
95
107
|
checksumEntries.push(`${gitChecksum} ${evidenceFolder}/git-info.json`);
|
|
96
108
|
}
|
|
97
109
|
}
|
|
98
110
|
// Add checksum.txt
|
|
99
111
|
const checksumContent = [
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
112
|
+
"SHA-256 Checksums",
|
|
113
|
+
"=================",
|
|
114
|
+
"",
|
|
103
115
|
...checksumEntries,
|
|
104
|
-
].join(
|
|
105
|
-
zip.file(
|
|
116
|
+
].join("\n");
|
|
117
|
+
zip.file("checksum.txt", checksumContent);
|
|
106
118
|
// Generate ZIP data
|
|
107
119
|
const zipData = await zip.generateAsync({
|
|
108
|
-
type:
|
|
109
|
-
compression:
|
|
120
|
+
type: "uint8array",
|
|
121
|
+
compression: "DEFLATE",
|
|
110
122
|
compressionOptions: { level: 9 },
|
|
111
123
|
});
|
|
112
124
|
// Calculate ZIP checksum
|
|
113
|
-
const zipChecksum = createHash(
|
|
114
|
-
// Generate filename
|
|
115
|
-
const timestamp = new Date().toISOString().split(
|
|
116
|
-
const
|
|
125
|
+
const zipChecksum = createHash("sha256").update(zipData).digest("hex");
|
|
126
|
+
// Generate filename with random suffix for unpredictability
|
|
127
|
+
const timestamp = new Date().toISOString().split("T")[0]; // YYYY-MM-DD
|
|
128
|
+
const uniqueSuffix = randomUUID().slice(0, 8);
|
|
129
|
+
const filename = `evidence-export-${timestamp}-${uniqueSuffix}.zip`;
|
|
117
130
|
return {
|
|
118
131
|
filename,
|
|
119
132
|
zipData,
|
|
@@ -122,7 +135,7 @@ export async function exportEvidences(db, options = {}) {
|
|
|
122
135
|
};
|
|
123
136
|
}
|
|
124
137
|
catch (error) {
|
|
125
|
-
throw new Error(`Failed to export evidences: ${error instanceof Error ? error.message :
|
|
138
|
+
throw new Error(`Failed to export evidences: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
126
139
|
}
|
|
127
140
|
}
|
|
128
141
|
//# sourceMappingURL=export.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../../../src/lib/storage/export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../../../src/lib/storage/export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsBrD,iCAAiC;AACjC,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAEtC,gEAAgE;AAChE,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAoB,EACpB,UAAyB,EAAE;IAE3B,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,cAAc,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;QAExD,sDAAsD;QACtD,IAAI,SAAS,CAAC;QACd,IAAI,WAAW,EAAE,CAAC;YAChB,uDAAuD;YACvD,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAkD,EAAE,CAAC;YAChE,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACjC,IAAI,QAAQ,EAAE,CAAC;oBACb,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,oDAAoD;YACpD,MAAM,UAAU,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;YACtC,IAAI,UAAU,GAAG,KAAK,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CACb,yCAAyC,UAAU,KAAK;oBACtD,8DAA8D,CACjE,CAAC;YACJ,CAAC;YACD,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QAED,8CAA8C;QAC9C,MAAM,eAAe,GACnB,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;YAChE,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QAEhB,IAAI,eAAe,GAAG,kBAAkB,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CACb,gBAAgB,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,kBAAkB,OAAO;gBACvF,mEAAmE,CACtE,CAAC;QACJ,CAAC;QAED,qBAAqB;QACrB,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;QAExB,oBAAoB;QACpB,MAAM,QAAQ,GAAiB;YAC7B,OAAO,EAAE,qBAAqB;YAC9B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,cAAc;SACf,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE7D,oBAAoB;QACpB,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,cAAc,GAAG,aAAa,QAAQ,CAAC,EAAE,EAAE,CAAC;YAElD,qBAAqB;YACrB,GAAG,CAAC,IAAI,CAAC,GAAG,cAAc,iBAAiB,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YAExE,wCAAwC;YACxC,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC;iBACtC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;iBACjC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjB,eAAe,CAAC,IAAI,CAAC,GAAG,YAAY,KAAK,cAAc,iBAAiB,CAAC,CAAC;YAE1E,oBAAoB;YACpB,MAAM,QAAQ,GAAG;gBACf,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,cAAc,EAAE,QAAQ,CAAC,cAAc;gBACvC,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,YAAY,EAAE,QAAQ,CAAC,YAAY;gBACnC,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,uCAAuC;aAC3E,CAAC;YACF,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACvD,GAAG,CAAC,IAAI,CAAC,GAAG,cAAc,gBAAgB,EAAE,YAAY,CAAC,CAAC;YAE1D,MAAM,gBAAgB,GAAG,UAAU,CAAC,QAAQ,CAAC;iBAC1C,MAAM,CAAC,YAAY,CAAC;iBACpB,MAAM,CAAC,KAAK,CAAC,CAAC;YACjB,eAAe,CAAC,IAAI,CAClB,GAAG,gBAAgB,KAAK,cAAc,gBAAgB,CACvD,CAAC;YAEF,+CAA+C;YAC/C,IAAI,cAAc,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;gBACtE,MAAM,OAAO,GAAG;oBACd,aAAa,EAAE,QAAQ,CAAC,aAAa;oBACrC,YAAY,EAAE,QAAQ,CAAC,YAAY;iBACpC,CAAC;gBACF,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACrD,GAAG,CAAC,IAAI,CAAC,GAAG,cAAc,gBAAgB,EAAE,WAAW,CAAC,CAAC;gBAEzD,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC;qBACrC,MAAM,CAAC,WAAW,CAAC;qBACnB,MAAM,CAAC,KAAK,CAAC,CAAC;gBACjB,eAAe,CAAC,IAAI,CAAC,GAAG,WAAW,KAAK,cAAc,gBAAgB,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,MAAM,eAAe,GAAG;YACtB,mBAAmB;YACnB,mBAAmB;YACnB,EAAE;YACF,GAAG,eAAe;SACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;QAE1C,oBAAoB;QACpB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC;YACtC,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,SAAS;YACtB,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;SACjC,CAAC,CAAC;QAEH,yBAAyB;QACzB,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEvE,4DAA4D;QAC5D,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;QACvE,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,mBAAmB,SAAS,IAAI,YAAY,MAAM,CAAC;QAEpE,OAAO;YACL,QAAQ;YACR,OAAO;YACP,QAAQ,EAAE,WAAW;YACrB,aAAa,EAAE,SAAS,CAAC,MAAM;SAChC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAC1F,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
export { createSchema, verifySchema } from
|
|
2
|
-
export { EvidenceDatabase } from
|
|
3
|
-
export type { Evidence, Metadata } from
|
|
4
|
-
export { getCurrentCommit, type GitInfo } from
|
|
5
|
-
export { exportEvidences, type ExportOptions, type ExportResult } from
|
|
6
|
-
export {
|
|
1
|
+
export { createSchema, verifySchema } from "./schema.js";
|
|
2
|
+
export { EvidenceDatabase } from "./database.js";
|
|
3
|
+
export type { ArtifactRecord, ArtifactType, ContextLinkRejectionRecord, ContextLinkSource, ContextRecord, ContextSessionLinkRecord, ContextStatus, ContextWorkspacePreferenceRecord, DecisionRecord, DecisionStatus, Evidence, IngestionRunRecord, IngestionStage, IngestionStatus, Metadata, NarrativeKind, NarrativeRecord, SessionDetail, SessionHost, SessionMessageRecord, SessionMessageRole, SessionRecord, SessionStatus, TimelineEventRecord, } from "./types.js";
|
|
4
|
+
export { getCurrentCommit, type GitInfo } from "./git.js";
|
|
5
|
+
export { exportEvidences, type ExportOptions, type ExportResult, } from "./export.js";
|
|
6
|
+
export { exportSessions, type SessionExportOptions, type SessionExportResult, } from "./export-sessions.js";
|
|
7
|
+
export { storeSalt, retrieveSalt, hasSalt } from "./salt-storage.js";
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EACV,cAAc,EACd,YAAY,EACZ,0BAA0B,EAC1B,iBAAiB,EACjB,aAAa,EACb,wBAAwB,EACxB,aAAa,EACb,gCAAgC,EAChC,cAAc,EACd,cAAc,EACd,QAAQ,EACR,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,QAAQ,EACR,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EACL,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
export { createSchema, verifySchema } from
|
|
2
|
-
export { EvidenceDatabase } from
|
|
3
|
-
export { getCurrentCommit } from
|
|
4
|
-
export { exportEvidences } from
|
|
5
|
-
export {
|
|
1
|
+
export { createSchema, verifySchema } from "./schema.js";
|
|
2
|
+
export { EvidenceDatabase } from "./database.js";
|
|
3
|
+
export { getCurrentCommit } from "./git.js";
|
|
4
|
+
export { exportEvidences, } from "./export.js";
|
|
5
|
+
export { exportSessions, } from "./export-sessions.js";
|
|
6
|
+
export { storeSalt, retrieveSalt, hasSalt } from "./salt-storage.js";
|
|
6
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AA2BjD,OAAO,EAAE,gBAAgB,EAAgB,MAAM,UAAU,CAAC;AAC1D,OAAO,EACL,eAAe,GAGhB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,GAGf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"salt-storage.d.ts","sourceRoot":"","sources":["../../../../src/lib/storage/salt-storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"salt-storage.d.ts","sourceRoot":"","sources":["../../../../src/lib/storage/salt-storage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAmCvE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,UAAU,GAAG,IAAI,CAcrE;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAOtD"}
|
|
@@ -8,26 +8,32 @@
|
|
|
8
8
|
*/
|
|
9
9
|
export function storeSalt(db, salt) {
|
|
10
10
|
if (salt.length !== 16) {
|
|
11
|
-
throw new Error(
|
|
11
|
+
throw new Error("Salt must be 16 bytes");
|
|
12
12
|
}
|
|
13
13
|
try {
|
|
14
|
-
//
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
14
|
+
// Atomic check-and-insert within a transaction to prevent TOCTOU race
|
|
15
|
+
const insertSalt = db.transaction(() => {
|
|
16
|
+
const existing = db
|
|
17
|
+
.prepare("SELECT id FROM crypto_keys WHERE id = 1")
|
|
18
|
+
.get();
|
|
19
|
+
if (existing) {
|
|
20
|
+
throw new Error("Salt already exists in database");
|
|
21
|
+
}
|
|
22
|
+
// Store salt (id=1 ensures singleton via PRIMARY KEY + CHECK constraint)
|
|
23
|
+
const stmt = db.prepare(`
|
|
24
|
+
INSERT INTO crypto_keys (id, salt)
|
|
25
|
+
VALUES (1, ?)
|
|
26
|
+
`);
|
|
27
|
+
stmt.run(Buffer.from(salt));
|
|
28
|
+
});
|
|
29
|
+
insertSalt();
|
|
25
30
|
}
|
|
26
31
|
catch (error) {
|
|
27
|
-
if (error instanceof Error &&
|
|
32
|
+
if (error instanceof Error &&
|
|
33
|
+
error.message === "Salt already exists in database") {
|
|
28
34
|
throw error;
|
|
29
35
|
}
|
|
30
|
-
throw new Error(`Failed to store salt: ${error instanceof Error ? error.message :
|
|
36
|
+
throw new Error(`Failed to store salt: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
31
37
|
}
|
|
32
38
|
}
|
|
33
39
|
/**
|
|
@@ -38,14 +44,16 @@ export function storeSalt(db, salt) {
|
|
|
38
44
|
*/
|
|
39
45
|
export function retrieveSalt(db) {
|
|
40
46
|
try {
|
|
41
|
-
const row = db
|
|
47
|
+
const row = db
|
|
48
|
+
.prepare("SELECT salt FROM crypto_keys WHERE id = 1")
|
|
49
|
+
.get();
|
|
42
50
|
if (!row) {
|
|
43
51
|
return null;
|
|
44
52
|
}
|
|
45
53
|
return new Uint8Array(row.salt);
|
|
46
54
|
}
|
|
47
55
|
catch (error) {
|
|
48
|
-
throw new Error(`Failed to retrieve salt: ${error instanceof Error ? error.message :
|
|
56
|
+
throw new Error(`Failed to retrieve salt: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
49
57
|
}
|
|
50
58
|
}
|
|
51
59
|
/**
|
|
@@ -56,10 +64,10 @@ export function retrieveSalt(db) {
|
|
|
56
64
|
*/
|
|
57
65
|
export function hasSalt(db) {
|
|
58
66
|
try {
|
|
59
|
-
const row = db.prepare(
|
|
67
|
+
const row = db.prepare("SELECT id FROM crypto_keys WHERE id = 1").get();
|
|
60
68
|
return row !== undefined;
|
|
61
69
|
}
|
|
62
|
-
catch
|
|
70
|
+
catch {
|
|
63
71
|
return false;
|
|
64
72
|
}
|
|
65
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"salt-storage.js","sourceRoot":"","sources":["../../../../src/lib/storage/salt-storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"salt-storage.js","sourceRoot":"","sources":["../../../../src/lib/storage/salt-storage.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,EAAqB,EAAE,IAAgB;IAC/D,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC;QACH,sEAAsE;QACtE,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACrC,MAAM,QAAQ,GAAG,EAAE;iBAChB,OAAO,CAAC,yCAAyC,CAAC;iBAClD,GAAG,EAAE,CAAC;YACT,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACrD,CAAC;YAED,yEAAyE;YACzE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;OAGvB,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,UAAU,EAAE,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,KAAK;YACtB,KAAK,CAAC,OAAO,KAAK,iCAAiC,EACnD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,IAAI,KAAK,CACb,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACpF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,EAAqB;IAChD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,2CAA2C,CAAC;aACpD,GAAG,EAAkC,CAAC;QACzC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACvF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,EAAqB;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,EAAE,CAAC;QACxE,OAAO,GAAG,KAAK,SAAS,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import type Database from
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
export interface SchemaInitResult {
|
|
3
|
+
previousVersion: number;
|
|
4
|
+
currentVersion: number;
|
|
5
|
+
upgraded: boolean;
|
|
6
|
+
}
|
|
2
7
|
/**
|
|
3
8
|
* Creates the database schema (tables and indexes)
|
|
4
9
|
* This function is idempotent - safe to run multiple times
|
|
5
10
|
*
|
|
6
11
|
* @param db - SQLite database instance
|
|
7
12
|
*/
|
|
8
|
-
export declare function createSchema(db: Database.Database):
|
|
13
|
+
export declare function createSchema(db: Database.Database): SchemaInitResult;
|
|
9
14
|
/**
|
|
10
15
|
* Verifies that the database schema is valid
|
|
11
16
|
* Checks for existence of required tables
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/lib/storage/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAO3C;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/lib/storage/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAO3C,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAmCD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,gBAAgB,CA2VpE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CA6M3D"}
|