urma-mcp 0.1.0-rc.1
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 +201 -0
- package/README.md +389 -0
- package/assets/urma-banner.png +0 -0
- package/assets/urma-logo.png +0 -0
- package/dist/src/acquisition/frame-panel.d.ts +22 -0
- package/dist/src/acquisition/frame-panel.js +110 -0
- package/dist/src/acquisition/frame-panel.js.map +1 -0
- package/dist/src/acquisition/frames.d.ts +37 -0
- package/dist/src/acquisition/frames.js +463 -0
- package/dist/src/acquisition/frames.js.map +1 -0
- package/dist/src/acquisition/media.d.ts +59 -0
- package/dist/src/acquisition/media.js +946 -0
- package/dist/src/acquisition/media.js.map +1 -0
- package/dist/src/acquisition/overview.d.ts +31 -0
- package/dist/src/acquisition/overview.js +335 -0
- package/dist/src/acquisition/overview.js.map +1 -0
- package/dist/src/acquisition/panel.d.ts +16 -0
- package/dist/src/acquisition/panel.js +125 -0
- package/dist/src/acquisition/panel.js.map +1 -0
- package/dist/src/acquisition/records.d.ts +24 -0
- package/dist/src/acquisition/records.js +127 -0
- package/dist/src/acquisition/records.js.map +1 -0
- package/dist/src/acquisition/remote-budget.d.ts +4 -0
- package/dist/src/acquisition/remote-budget.js +121 -0
- package/dist/src/acquisition/remote-budget.js.map +1 -0
- package/dist/src/acquisition/singleflight.d.ts +10 -0
- package/dist/src/acquisition/singleflight.js +75 -0
- package/dist/src/acquisition/singleflight.js.map +1 -0
- package/dist/src/acquisition/storyboard.d.ts +36 -0
- package/dist/src/acquisition/storyboard.js +324 -0
- package/dist/src/acquisition/storyboard.js.map +1 -0
- package/dist/src/acquisition/transcript.d.ts +25 -0
- package/dist/src/acquisition/transcript.js +367 -0
- package/dist/src/acquisition/transcript.js.map +1 -0
- package/dist/src/acquisition/transport-policy.d.ts +7 -0
- package/dist/src/acquisition/transport-policy.js +22 -0
- package/dist/src/acquisition/transport-policy.js.map +1 -0
- package/dist/src/acquisition/video-timing.d.ts +24 -0
- package/dist/src/acquisition/video-timing.js +249 -0
- package/dist/src/acquisition/video-timing.js.map +1 -0
- package/dist/src/app.d.ts +49 -0
- package/dist/src/app.js +31 -0
- package/dist/src/app.js.map +1 -0
- package/dist/src/cli/doctor.d.ts +24 -0
- package/dist/src/cli/doctor.js +368 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/main.d.ts +2 -0
- package/dist/src/cli/main.js +79 -0
- package/dist/src/cli/main.js.map +1 -0
- package/dist/src/config.d.ts +36 -0
- package/dist/src/config.js +110 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/core/coverage.d.ts +20 -0
- package/dist/src/core/coverage.js +89 -0
- package/dist/src/core/coverage.js.map +1 -0
- package/dist/src/core/diagnostics.d.ts +58 -0
- package/dist/src/core/diagnostics.js +451 -0
- package/dist/src/core/diagnostics.js.map +1 -0
- package/dist/src/core/errors.d.ts +13 -0
- package/dist/src/core/errors.js +57 -0
- package/dist/src/core/errors.js.map +1 -0
- package/dist/src/core/frame-schedule.d.ts +16 -0
- package/dist/src/core/frame-schedule.js +52 -0
- package/dist/src/core/frame-schedule.js.map +1 -0
- package/dist/src/core/ids.d.ts +48 -0
- package/dist/src/core/ids.js +122 -0
- package/dist/src/core/ids.js.map +1 -0
- package/dist/src/core/model.d.ts +216 -0
- package/dist/src/core/model.js +2 -0
- package/dist/src/core/model.js.map +1 -0
- package/dist/src/core/request-key.d.ts +1 -0
- package/dist/src/core/request-key.js +8 -0
- package/dist/src/core/request-key.js.map +1 -0
- package/dist/src/core/search-limits.d.ts +11 -0
- package/dist/src/core/search-limits.js +13 -0
- package/dist/src/core/search-limits.js.map +1 -0
- package/dist/src/distribution/active.d.ts +20 -0
- package/dist/src/distribution/active.js +169 -0
- package/dist/src/distribution/active.js.map +1 -0
- package/dist/src/distribution/archive.d.ts +8 -0
- package/dist/src/distribution/archive.js +368 -0
- package/dist/src/distribution/archive.js.map +1 -0
- package/dist/src/distribution/download.d.ts +8 -0
- package/dist/src/distribution/download.js +93 -0
- package/dist/src/distribution/download.js.map +1 -0
- package/dist/src/distribution/host-registration.d.ts +7 -0
- package/dist/src/distribution/host-registration.js +64 -0
- package/dist/src/distribution/host-registration.js.map +1 -0
- package/dist/src/distribution/installer.d.ts +38 -0
- package/dist/src/distribution/installer.js +445 -0
- package/dist/src/distribution/installer.js.map +1 -0
- package/dist/src/distribution/integrity.d.ts +8 -0
- package/dist/src/distribution/integrity.js +131 -0
- package/dist/src/distribution/integrity.js.map +1 -0
- package/dist/src/distribution/lock.d.ts +14 -0
- package/dist/src/distribution/lock.js +136 -0
- package/dist/src/distribution/lock.js.map +1 -0
- package/dist/src/distribution/manifest.d.ts +46 -0
- package/dist/src/distribution/manifest.js +202 -0
- package/dist/src/distribution/manifest.js.map +1 -0
- package/dist/src/distribution/paths.d.ts +30 -0
- package/dist/src/distribution/paths.js +154 -0
- package/dist/src/distribution/paths.js.map +1 -0
- package/dist/src/distribution/platform.d.ts +15 -0
- package/dist/src/distribution/platform.js +76 -0
- package/dist/src/distribution/platform.js.map +1 -0
- package/dist/src/distribution/qualification.d.ts +26 -0
- package/dist/src/distribution/qualification.js +265 -0
- package/dist/src/distribution/qualification.js.map +1 -0
- package/dist/src/distribution/receipt.d.ts +52 -0
- package/dist/src/distribution/receipt.js +142 -0
- package/dist/src/distribution/receipt.js.map +1 -0
- package/dist/src/distribution/runtime.d.ts +8 -0
- package/dist/src/distribution/runtime.js +173 -0
- package/dist/src/distribution/runtime.js.map +1 -0
- package/dist/src/evidence/service.d.ts +959 -0
- package/dist/src/evidence/service.js +1455 -0
- package/dist/src/evidence/service.js.map +1 -0
- package/dist/src/evidence/state.d.ts +52 -0
- package/dist/src/evidence/state.js +362 -0
- package/dist/src/evidence/state.js.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/logo.d.ts +5 -0
- package/dist/src/mcp/logo.js +11 -0
- package/dist/src/mcp/logo.js.map +1 -0
- package/dist/src/mcp/projection.d.ts +4 -0
- package/dist/src/mcp/projection.js +144 -0
- package/dist/src/mcp/projection.js.map +1 -0
- package/dist/src/mcp/schemas.d.ts +1744 -0
- package/dist/src/mcp/schemas.js +662 -0
- package/dist/src/mcp/schemas.js.map +1 -0
- package/dist/src/mcp/server.d.ts +6 -0
- package/dist/src/mcp/server.js +470 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/stdio.d.ts +1 -0
- package/dist/src/mcp/stdio.js +36 -0
- package/dist/src/mcp/stdio.js.map +1 -0
- package/dist/src/remote/egress.d.ts +42 -0
- package/dist/src/remote/egress.js +611 -0
- package/dist/src/remote/egress.js.map +1 -0
- package/dist/src/remote/formats.d.ts +5 -0
- package/dist/src/remote/formats.js +30 -0
- package/dist/src/remote/formats.js.map +1 -0
- package/dist/src/remote/lease.d.ts +15 -0
- package/dist/src/remote/lease.js +2 -0
- package/dist/src/remote/lease.js.map +1 -0
- package/dist/src/remote/normalize.d.ts +14 -0
- package/dist/src/remote/normalize.js +243 -0
- package/dist/src/remote/normalize.js.map +1 -0
- package/dist/src/remote/policy.d.ts +13 -0
- package/dist/src/remote/policy.js +107 -0
- package/dist/src/remote/policy.js.map +1 -0
- package/dist/src/remote/worker.d.ts +14 -0
- package/dist/src/remote/worker.js +40 -0
- package/dist/src/remote/worker.js.map +1 -0
- package/dist/src/sources/candidates.d.ts +18 -0
- package/dist/src/sources/candidates.js +23 -0
- package/dist/src/sources/candidates.js.map +1 -0
- package/dist/src/sources/caption-tracks.d.ts +12 -0
- package/dist/src/sources/caption-tracks.js +75 -0
- package/dist/src/sources/caption-tracks.js.map +1 -0
- package/dist/src/sources/local.d.ts +42 -0
- package/dist/src/sources/local.js +203 -0
- package/dist/src/sources/local.js.map +1 -0
- package/dist/src/sources/metadata.d.ts +15 -0
- package/dist/src/sources/metadata.js +513 -0
- package/dist/src/sources/metadata.js.map +1 -0
- package/dist/src/sources/resolver.d.ts +22 -0
- package/dist/src/sources/resolver.js +363 -0
- package/dist/src/sources/resolver.js.map +1 -0
- package/dist/src/sources/timeline.d.ts +23 -0
- package/dist/src/sources/timeline.js +145 -0
- package/dist/src/sources/timeline.js.map +1 -0
- package/dist/src/sources/types.d.ts +67 -0
- package/dist/src/sources/types.js +2 -0
- package/dist/src/sources/types.js.map +1 -0
- package/dist/src/sources/youtube.d.ts +10 -0
- package/dist/src/sources/youtube.js +59 -0
- package/dist/src/sources/youtube.js.map +1 -0
- package/dist/src/store/blob-store.d.ts +20 -0
- package/dist/src/store/blob-store.js +156 -0
- package/dist/src/store/blob-store.js.map +1 -0
- package/dist/src/store/schema.d.ts +4 -0
- package/dist/src/store/schema.js +169 -0
- package/dist/src/store/schema.js.map +1 -0
- package/dist/src/store/sqlite-store.d.ts +47 -0
- package/dist/src/store/sqlite-store.js +545 -0
- package/dist/src/store/sqlite-store.js.map +1 -0
- package/dist/src/store/store.d.ts +138 -0
- package/dist/src/store/store.js +2 -0
- package/dist/src/store/store.js.map +1 -0
- package/dist/src/subprocess/ffmpeg.d.ts +18 -0
- package/dist/src/subprocess/ffmpeg.js +117 -0
- package/dist/src/subprocess/ffmpeg.js.map +1 -0
- package/dist/src/subprocess/ffprobe.d.ts +11 -0
- package/dist/src/subprocess/ffprobe.js +62 -0
- package/dist/src/subprocess/ffprobe.js.map +1 -0
- package/dist/src/subprocess/redaction.d.ts +3 -0
- package/dist/src/subprocess/redaction.js +31 -0
- package/dist/src/subprocess/redaction.js.map +1 -0
- package/dist/src/subprocess/remote-media.d.ts +3 -0
- package/dist/src/subprocess/remote-media.js +27 -0
- package/dist/src/subprocess/remote-media.js.map +1 -0
- package/dist/src/subprocess/runner.d.ts +23 -0
- package/dist/src/subprocess/runner.js +197 -0
- package/dist/src/subprocess/runner.js.map +1 -0
- package/dist/src/subprocess/versions.d.ts +8 -0
- package/dist/src/subprocess/versions.js +46 -0
- package/dist/src/subprocess/versions.js.map +1 -0
- package/dist/src/subprocess/ytdlp.d.ts +39 -0
- package/dist/src/subprocess/ytdlp.js +326 -0
- package/dist/src/subprocess/ytdlp.js.map +1 -0
- package/dist/src/version.d.ts +8 -0
- package/dist/src/version.js +44 -0
- package/dist/src/version.js.map +1 -0
- package/docs/ARCHITECTURE.md +273 -0
- package/docs/CONTRIBUTING.md +101 -0
- package/docs/EVIDENCE_MODEL.md +292 -0
- package/docs/PRODUCT_SCOPE.md +115 -0
- package/docs/SECURITY.md +182 -0
- package/docs/assets/architecture.png +0 -0
- package/docs/assets/contribution.png +0 -0
- package/docs/assets/evidence-model.png +0 -0
- package/docs/assets/product-scope.png +0 -0
- package/docs/assets/security.png +0 -0
- package/launcher-v1.mjs +430 -0
- package/package.json +45 -0
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
import { mkdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { DatabaseSync, } from "node:sqlite";
|
|
4
|
+
import { artifactHashFromId, parseArtifactId, sha256 as hashText, stableJson, } from "../core/ids.js";
|
|
5
|
+
import { UrmaError } from "../core/errors.js";
|
|
6
|
+
import { CREATE_FTS, CURRENT_SCHEMA, SCHEMA_VERSION } from "./schema.js";
|
|
7
|
+
const REQUIRED_SCHEMA_COLUMNS = {
|
|
8
|
+
sources: ["id", "kind", "identity_json", "latest_revision", "created_at"],
|
|
9
|
+
source_snapshots: ["source_id", "revision", "observed_at", "duration_ms", "descriptor_json"],
|
|
10
|
+
source_locators: ["source_id", "locator_digest", "private_reopen_locator", "observed_at"],
|
|
11
|
+
investigations: ["id", "source_id", "source_revision", "duration_ms", "created_at", "updated_at"],
|
|
12
|
+
transcript_tracks: ["id", "source_id", "source_revision", "language", "kind", "provider_track_id", "acquired_at", "metadata_json"],
|
|
13
|
+
transcript_segments: ["id", "track_id", "start_ms", "end_ms", "text", "ordinal"],
|
|
14
|
+
artifact_contents: ["id", "sha256", "byte_size", "blob_path", "mime_type", "created_at"],
|
|
15
|
+
artifacts: ["record_key", "id", "source_id", "source_revision", "kind", "role", "mime_type", "sha256", "byte_size", "blob_path", "start_ms", "end_ms", "params_json", "producer_json", "created_at"],
|
|
16
|
+
artifact_requests: ["request_key", "source_id", "source_revision", "operation", "artifact_record_key", "created_at"],
|
|
17
|
+
artifact_derivations: ["artifact_id", "parent_artifact_id"],
|
|
18
|
+
acquisitions: ["id", "source_id", "source_revision", "investigation_id", "operation", "request_key", "method", "status", "started_at", "completed_at", "wall_ms", "network_bytes", "network_accounting_complete", "error_code", "metadata_json"],
|
|
19
|
+
presentations: ["id", "investigation_id", "artifact_id", "modality", "evidence_kind", "start_ms", "end_ms", "points_json", "metadata_json", "presented_at"],
|
|
20
|
+
presentation_artifacts: ["presentation_id", "artifact_id"],
|
|
21
|
+
};
|
|
22
|
+
function currentSchemaMismatch(database) {
|
|
23
|
+
for (const [table, requiredColumns] of Object.entries(REQUIRED_SCHEMA_COLUMNS)) {
|
|
24
|
+
const row = database
|
|
25
|
+
.prepare("SELECT type FROM sqlite_master WHERE name=?")
|
|
26
|
+
.get(table);
|
|
27
|
+
if (row?.type !== "table")
|
|
28
|
+
return `missing table ${table}`;
|
|
29
|
+
const columns = new Set(database.prepare(`PRAGMA table_info(${table})`).all()
|
|
30
|
+
.map((column) => String(column.name)));
|
|
31
|
+
const missing = requiredColumns.filter((column) => !columns.has(column));
|
|
32
|
+
if (missing.length > 0) {
|
|
33
|
+
return `table ${table} is missing ${missing.join(", ")}`;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
function incompatibleSchema(message) {
|
|
39
|
+
return new UrmaError("INTERNAL_ERROR", `Urma data directory has an incompatible schema (${message}); create a fresh data directory and reacquire evidence (existing files were not modified)`);
|
|
40
|
+
}
|
|
41
|
+
function jsonObject(value, label) {
|
|
42
|
+
try {
|
|
43
|
+
const parsed = typeof value === "string" ? JSON.parse(value) : value;
|
|
44
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
45
|
+
throw new Error("not an object");
|
|
46
|
+
}
|
|
47
|
+
return parsed;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
throw new UrmaError("INTERNAL_ERROR", `Persisted ${label} is invalid JSON; inspect or restore the Urma database`, { cause: error });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function points(value) {
|
|
54
|
+
if (value === null)
|
|
55
|
+
return null;
|
|
56
|
+
try {
|
|
57
|
+
const parsed = JSON.parse(String(value));
|
|
58
|
+
if (!Array.isArray(parsed) ||
|
|
59
|
+
parsed.some((item) => !Number.isSafeInteger(item) || Number(item) < 0)) {
|
|
60
|
+
throw new Error("not millisecond points");
|
|
61
|
+
}
|
|
62
|
+
return parsed;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
throw new UrmaError("INTERNAL_ERROR", "Persisted presentation points are invalid; inspect or restore the Urma database", { cause: error });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function sourceFromRow(row) {
|
|
69
|
+
return {
|
|
70
|
+
sourceRef: row.id,
|
|
71
|
+
kind: row.kind,
|
|
72
|
+
identity: jsonObject(row.identity_json, "source identity"),
|
|
73
|
+
latestRevision: String(row.latest_revision),
|
|
74
|
+
createdAt: String(row.created_at),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function snapshotFromRow(row) {
|
|
78
|
+
return {
|
|
79
|
+
sourceRef: row.source_id,
|
|
80
|
+
revision: String(row.revision),
|
|
81
|
+
observedAt: String(row.observed_at),
|
|
82
|
+
durationMs: Number(row.duration_ms),
|
|
83
|
+
descriptor: jsonObject(row.descriptor_json, "source snapshot descriptor"),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function locatorFromRow(row) {
|
|
87
|
+
return {
|
|
88
|
+
sourceRef: row.source_id,
|
|
89
|
+
locatorDigest: String(row.locator_digest),
|
|
90
|
+
privateReopenLocator: String(row.private_reopen_locator),
|
|
91
|
+
observedAt: String(row.observed_at),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function trackFromRow(row) {
|
|
95
|
+
return {
|
|
96
|
+
id: String(row.id),
|
|
97
|
+
sourceRef: row.source_id,
|
|
98
|
+
sourceRevision: String(row.source_revision),
|
|
99
|
+
language: String(row.language),
|
|
100
|
+
kind: row.kind,
|
|
101
|
+
providerTrackId: row.provider_track_id === null
|
|
102
|
+
? null
|
|
103
|
+
: String(row.provider_track_id),
|
|
104
|
+
acquiredAt: String(row.acquired_at),
|
|
105
|
+
metadata: jsonObject(row.metadata_json, "transcript track metadata"),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function segmentFromRow(row) {
|
|
109
|
+
return {
|
|
110
|
+
id: Number(row.id),
|
|
111
|
+
trackId: String(row.track_id),
|
|
112
|
+
startMs: Number(row.start_ms),
|
|
113
|
+
endMs: Number(row.end_ms),
|
|
114
|
+
text: String(row.text),
|
|
115
|
+
ordinal: Number(row.ordinal),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function artifactFromRow(row) {
|
|
119
|
+
return {
|
|
120
|
+
artifactId: row.id,
|
|
121
|
+
sourceRef: row.source_id,
|
|
122
|
+
sourceRevision: String(row.source_revision),
|
|
123
|
+
kind: row.kind,
|
|
124
|
+
role: row.role,
|
|
125
|
+
mimeType: String(row.mime_type),
|
|
126
|
+
sha256: String(row.sha256),
|
|
127
|
+
byteSize: Number(row.byte_size),
|
|
128
|
+
blobPath: String(row.blob_path),
|
|
129
|
+
startMs: row.start_ms === null ? null : Number(row.start_ms),
|
|
130
|
+
endMs: row.end_ms === null ? null : Number(row.end_ms),
|
|
131
|
+
params: jsonObject(row.params_json, "artifact parameters"),
|
|
132
|
+
producer: jsonObject(row.producer_json, "artifact producer"),
|
|
133
|
+
createdAt: String(row.created_at),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function acquisitionFromRow(row) {
|
|
137
|
+
return {
|
|
138
|
+
id: String(row.id),
|
|
139
|
+
sourceRef: row.source_id,
|
|
140
|
+
sourceRevision: String(row.source_revision),
|
|
141
|
+
investigationRef: row.investigation_id === null
|
|
142
|
+
? null
|
|
143
|
+
: row.investigation_id,
|
|
144
|
+
operation: String(row.operation),
|
|
145
|
+
requestKey: String(row.request_key),
|
|
146
|
+
method: row.method,
|
|
147
|
+
status: row.status,
|
|
148
|
+
startedAt: String(row.started_at),
|
|
149
|
+
completedAt: row.completed_at === null ? null : String(row.completed_at),
|
|
150
|
+
wallMs: row.wall_ms === null ? null : Number(row.wall_ms),
|
|
151
|
+
networkBytes: row.network_bytes === null ? null : Number(row.network_bytes),
|
|
152
|
+
networkAccountingComplete: Number(row.network_accounting_complete) === 1,
|
|
153
|
+
errorCode: row.error_code === null ? null : String(row.error_code),
|
|
154
|
+
metadata: jsonObject(row.metadata_json, "acquisition metadata"),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
function presentedArtifactIds(value) {
|
|
158
|
+
const ids = new Set();
|
|
159
|
+
if (value.artifactId)
|
|
160
|
+
ids.add(value.artifactId);
|
|
161
|
+
for (const field of ["artifactIds", "presentationArtifactIds"]) {
|
|
162
|
+
const additional = value.metadata[field];
|
|
163
|
+
if (additional !== undefined) {
|
|
164
|
+
if (!Array.isArray(additional)) {
|
|
165
|
+
throw new UrmaError("CACHE_WRITE_FAILED", `Presentation ${field} metadata must be an array`);
|
|
166
|
+
}
|
|
167
|
+
for (const candidate of additional) {
|
|
168
|
+
if (typeof candidate !== "string") {
|
|
169
|
+
throw new UrmaError("CACHE_WRITE_FAILED", `Presentation ${field} metadata contains a non-string identifier`);
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
ids.add(parseArtifactId(candidate));
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
throw new UrmaError("CACHE_WRITE_FAILED", `Presentation ${field} metadata contains a malformed artifact identifier`, { cause: error });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return [...ids];
|
|
181
|
+
}
|
|
182
|
+
export class SqliteStore {
|
|
183
|
+
ftsEnabled;
|
|
184
|
+
#db;
|
|
185
|
+
constructor(databasePath) {
|
|
186
|
+
this.#db = new DatabaseSync(databasePath);
|
|
187
|
+
this.#db.exec("PRAGMA foreign_keys=ON; PRAGMA journal_mode=WAL; PRAGMA synchronous=NORMAL; PRAGMA busy_timeout=5000;");
|
|
188
|
+
const schemaMarker = this.#db
|
|
189
|
+
.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='schema_meta'")
|
|
190
|
+
.get();
|
|
191
|
+
if (!schemaMarker) {
|
|
192
|
+
const existingTables = this.#all(this.#db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'"));
|
|
193
|
+
if (existingTables.length > 0) {
|
|
194
|
+
this.#db.close();
|
|
195
|
+
throw new UrmaError("INTERNAL_ERROR", "Urma data directory contains an unversioned database; create a fresh data directory and reacquire evidence (existing files were not modified)");
|
|
196
|
+
}
|
|
197
|
+
this.#transaction(() => {
|
|
198
|
+
this.#db.exec("CREATE TABLE schema_meta (version INTEGER NOT NULL);");
|
|
199
|
+
this.#db.exec(CURRENT_SCHEMA);
|
|
200
|
+
this.#db
|
|
201
|
+
.prepare("INSERT INTO schema_meta(version) VALUES(?)")
|
|
202
|
+
.run(SCHEMA_VERSION);
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
const schemaRows = this.#all(this.#db.prepare("SELECT version FROM schema_meta"));
|
|
207
|
+
const schemaRow = schemaRows[0];
|
|
208
|
+
if (schemaRows.length !== 1 ||
|
|
209
|
+
!schemaRow ||
|
|
210
|
+
!Number.isSafeInteger(Number(schemaRow.version))) {
|
|
211
|
+
this.#db.close();
|
|
212
|
+
throw incompatibleSchema("schema_meta has no single valid version");
|
|
213
|
+
}
|
|
214
|
+
const initialVersion = Number(schemaRow.version);
|
|
215
|
+
if (initialVersion !== SCHEMA_VERSION) {
|
|
216
|
+
this.#db.close();
|
|
217
|
+
throw new UrmaError("INTERNAL_ERROR", `Urma data directory uses unsupported schema ${initialVersion}; create a fresh data directory and reacquire evidence (existing files were not modified)`);
|
|
218
|
+
}
|
|
219
|
+
const mismatch = currentSchemaMismatch(this.#db);
|
|
220
|
+
if (mismatch) {
|
|
221
|
+
this.#db.close();
|
|
222
|
+
throw incompatibleSchema(mismatch);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
try {
|
|
226
|
+
this.#db.exec(CREATE_FTS);
|
|
227
|
+
this.ftsEnabled = true;
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
this.ftsEnabled = false;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
static async open(databasePath) {
|
|
234
|
+
await mkdir(path.dirname(databasePath), { recursive: true });
|
|
235
|
+
return new SqliteStore(databasePath);
|
|
236
|
+
}
|
|
237
|
+
close() {
|
|
238
|
+
this.#db.close();
|
|
239
|
+
}
|
|
240
|
+
#transaction(action) {
|
|
241
|
+
this.#db.exec("BEGIN IMMEDIATE");
|
|
242
|
+
try {
|
|
243
|
+
const result = action();
|
|
244
|
+
this.#db.exec("COMMIT");
|
|
245
|
+
return result;
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
try {
|
|
249
|
+
this.#db.exec("ROLLBACK");
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
}
|
|
253
|
+
throw error;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
#all(statement, ...values) {
|
|
257
|
+
return statement.all(...values);
|
|
258
|
+
}
|
|
259
|
+
putSourceSnapshot(input) {
|
|
260
|
+
const { source, snapshot, locators } = input;
|
|
261
|
+
if (source.sourceRef !== snapshot.sourceRef) {
|
|
262
|
+
throw new UrmaError("CACHE_WRITE_FAILED", "Source and snapshot identifiers must refer to the same logical source");
|
|
263
|
+
}
|
|
264
|
+
if (source.latestRevision !== snapshot.revision) {
|
|
265
|
+
throw new UrmaError("CACHE_WRITE_FAILED", "Source latestRevision must point to the inserted snapshot revision");
|
|
266
|
+
}
|
|
267
|
+
for (const locator of locators) {
|
|
268
|
+
if (locator.sourceRef !== source.sourceRef ||
|
|
269
|
+
!/^[0-9a-f]{64}$/u.test(locator.locatorDigest) ||
|
|
270
|
+
locator.privateReopenLocator.length === 0) {
|
|
271
|
+
throw new UrmaError("CACHE_WRITE_FAILED", "Source locator is malformed or belongs to another logical source");
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
const now = new Date().toISOString();
|
|
275
|
+
this.#transaction(() => {
|
|
276
|
+
const existingSource = this.#db
|
|
277
|
+
.prepare("SELECT kind,identity_json FROM sources WHERE id=?")
|
|
278
|
+
.get(source.sourceRef);
|
|
279
|
+
if (existingSource &&
|
|
280
|
+
(String(existingSource.kind) !== source.kind ||
|
|
281
|
+
String(existingSource.identity_json) !== JSON.stringify(source.identity))) {
|
|
282
|
+
throw new UrmaError("CACHE_WRITE_FAILED", `Logical source ${source.sourceRef} is immutable and conflicts with its existing identity`);
|
|
283
|
+
}
|
|
284
|
+
this.#db
|
|
285
|
+
.prepare(`INSERT INTO sources(id,kind,identity_json,latest_revision,created_at)
|
|
286
|
+
VALUES(?,?,?,?,?)
|
|
287
|
+
ON CONFLICT(id) DO UPDATE SET kind=excluded.kind,identity_json=excluded.identity_json,latest_revision=excluded.latest_revision`)
|
|
288
|
+
.run(source.sourceRef, source.kind, JSON.stringify(source.identity), source.latestRevision, now);
|
|
289
|
+
this.#db
|
|
290
|
+
.prepare(`INSERT INTO source_snapshots(source_id,revision,observed_at,duration_ms,descriptor_json)
|
|
291
|
+
VALUES(?,?,?,?,?)
|
|
292
|
+
ON CONFLICT(source_id,revision) DO NOTHING`)
|
|
293
|
+
.run(snapshot.sourceRef, snapshot.revision, snapshot.observedAt, snapshot.durationMs, JSON.stringify(snapshot.descriptor));
|
|
294
|
+
const stored = this.#db
|
|
295
|
+
.prepare("SELECT * FROM source_snapshots WHERE source_id=? AND revision=?")
|
|
296
|
+
.get(snapshot.sourceRef, snapshot.revision);
|
|
297
|
+
if (!stored) {
|
|
298
|
+
throw new UrmaError("CACHE_WRITE_FAILED", "Source snapshot could not be read back after insertion");
|
|
299
|
+
}
|
|
300
|
+
if (Number(stored.duration_ms) !== snapshot.durationMs ||
|
|
301
|
+
String(stored.observed_at) !== snapshot.observedAt ||
|
|
302
|
+
String(stored.descriptor_json) !== JSON.stringify(snapshot.descriptor)) {
|
|
303
|
+
throw new UrmaError("CACHE_WRITE_FAILED", `Source snapshot ${snapshot.revision} is immutable and conflicts with an existing observation`);
|
|
304
|
+
}
|
|
305
|
+
const putLocator = this.#db.prepare(`INSERT INTO source_locators(source_id,locator_digest,private_reopen_locator,observed_at)
|
|
306
|
+
VALUES(?,?,?,?) ON CONFLICT(source_id,locator_digest) DO NOTHING`);
|
|
307
|
+
for (const locator of locators) {
|
|
308
|
+
putLocator.run(locator.sourceRef, locator.locatorDigest, locator.privateReopenLocator, locator.observedAt);
|
|
309
|
+
const storedLocator = this.#db
|
|
310
|
+
.prepare("SELECT private_reopen_locator FROM source_locators WHERE source_id=? AND locator_digest=?")
|
|
311
|
+
.get(locator.sourceRef, locator.locatorDigest);
|
|
312
|
+
if (!storedLocator || String(storedLocator.private_reopen_locator) !== locator.privateReopenLocator) {
|
|
313
|
+
throw new UrmaError("CACHE_WRITE_FAILED", `Source locator ${locator.locatorDigest} is immutable and conflicts with an existing private locator`);
|
|
314
|
+
}
|
|
315
|
+
this.#db
|
|
316
|
+
.prepare("UPDATE source_locators SET observed_at=? WHERE source_id=? AND locator_digest=?")
|
|
317
|
+
.run(locator.observedAt, locator.sourceRef, locator.locatorDigest);
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
return this.getSnapshot(snapshot.sourceRef, snapshot.revision);
|
|
321
|
+
}
|
|
322
|
+
getSource(sourceRef) {
|
|
323
|
+
const row = this.#db
|
|
324
|
+
.prepare("SELECT * FROM sources WHERE id=?")
|
|
325
|
+
.get(sourceRef);
|
|
326
|
+
return row ? sourceFromRow(row) : null;
|
|
327
|
+
}
|
|
328
|
+
getSnapshot(sourceRef, revision) {
|
|
329
|
+
const row = this.#db
|
|
330
|
+
.prepare("SELECT * FROM source_snapshots WHERE source_id=? AND revision=?")
|
|
331
|
+
.get(sourceRef, revision);
|
|
332
|
+
return row ? snapshotFromRow(row) : null;
|
|
333
|
+
}
|
|
334
|
+
getLatestSnapshot(sourceRef) {
|
|
335
|
+
const source = this.getSource(sourceRef);
|
|
336
|
+
if (!source)
|
|
337
|
+
return null;
|
|
338
|
+
return this.getSnapshot(sourceRef, source.latestRevision);
|
|
339
|
+
}
|
|
340
|
+
getLocator(sourceRef, locatorDigest) {
|
|
341
|
+
const row = this.#db
|
|
342
|
+
.prepare("SELECT * FROM source_locators WHERE source_id=? AND locator_digest=?")
|
|
343
|
+
.get(sourceRef, locatorDigest);
|
|
344
|
+
return row ? locatorFromRow(row) : null;
|
|
345
|
+
}
|
|
346
|
+
listSourceLocators(sourceRef) {
|
|
347
|
+
return this.#all(this.#db.prepare("SELECT * FROM source_locators WHERE source_id=? ORDER BY observed_at,locator_digest"), sourceRef).map(locatorFromRow);
|
|
348
|
+
}
|
|
349
|
+
findSourcesByLocatorDigest(locatorDigest) {
|
|
350
|
+
return this.#all(this.#db.prepare(`SELECT sources.* FROM sources
|
|
351
|
+
INNER JOIN source_locators ON source_locators.source_id = sources.id
|
|
352
|
+
WHERE source_locators.locator_digest=?
|
|
353
|
+
ORDER BY sources.id`), locatorDigest).map(sourceFromRow);
|
|
354
|
+
}
|
|
355
|
+
createInvestigation(value) {
|
|
356
|
+
this.#transaction(() => {
|
|
357
|
+
const snapshot = this.getSnapshot(value.sourceRef, value.sourceRevision);
|
|
358
|
+
if (!snapshot) {
|
|
359
|
+
throw new UrmaError("CACHE_WRITE_FAILED", `Investigation ${value.investigationRef} references an unknown source snapshot`);
|
|
360
|
+
}
|
|
361
|
+
if (snapshot.durationMs !== value.durationMs) {
|
|
362
|
+
throw new UrmaError("CACHE_WRITE_FAILED", `Investigation ${value.investigationRef} duration does not match its pinned source snapshot`);
|
|
363
|
+
}
|
|
364
|
+
this.#db
|
|
365
|
+
.prepare("INSERT INTO investigations(id,source_id,source_revision,duration_ms,created_at,updated_at) VALUES(?,?,?,?,?,?)")
|
|
366
|
+
.run(value.investigationRef, value.sourceRef, value.sourceRevision, value.durationMs, value.createdAt, value.updatedAt);
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
getInvestigation(ref) {
|
|
370
|
+
const row = this.#db
|
|
371
|
+
.prepare("SELECT * FROM investigations WHERE id=?")
|
|
372
|
+
.get(ref);
|
|
373
|
+
return row
|
|
374
|
+
? {
|
|
375
|
+
investigationRef: row.id,
|
|
376
|
+
sourceRef: row.source_id,
|
|
377
|
+
sourceRevision: String(row.source_revision),
|
|
378
|
+
durationMs: Number(row.duration_ms),
|
|
379
|
+
createdAt: String(row.created_at),
|
|
380
|
+
updatedAt: String(row.updated_at),
|
|
381
|
+
}
|
|
382
|
+
: null;
|
|
383
|
+
}
|
|
384
|
+
putTranscript(track, segments) {
|
|
385
|
+
this.#transaction(() => {
|
|
386
|
+
this.#db
|
|
387
|
+
.prepare(`INSERT INTO transcript_tracks(id,source_id,source_revision,language,kind,provider_track_id,acquired_at,metadata_json) VALUES(?,?,?,?,?,?,?,?)
|
|
388
|
+
ON CONFLICT(id) DO UPDATE SET acquired_at=excluded.acquired_at,metadata_json=excluded.metadata_json`)
|
|
389
|
+
.run(track.id, track.sourceRef, track.sourceRevision, track.language, track.kind, track.providerTrackId, track.acquiredAt, JSON.stringify(track.metadata));
|
|
390
|
+
if (this.ftsEnabled) {
|
|
391
|
+
this.#db
|
|
392
|
+
.prepare("DELETE FROM transcript_fts WHERE track_id=?")
|
|
393
|
+
.run(track.id);
|
|
394
|
+
}
|
|
395
|
+
this.#db
|
|
396
|
+
.prepare("DELETE FROM transcript_segments WHERE track_id=?")
|
|
397
|
+
.run(track.id);
|
|
398
|
+
const insert = this.#db.prepare("INSERT INTO transcript_segments(track_id,start_ms,end_ms,text,ordinal) VALUES(?,?,?,?,?)");
|
|
399
|
+
const insertFts = this.ftsEnabled
|
|
400
|
+
? this.#db.prepare("INSERT INTO transcript_fts(text,track_id,segment_id) VALUES(?,?,?)")
|
|
401
|
+
: null;
|
|
402
|
+
for (const segment of segments) {
|
|
403
|
+
const result = insert.run(track.id, segment.startMs, segment.endMs, segment.text, segment.ordinal);
|
|
404
|
+
insertFts?.run(segment.text, track.id, Number(result.lastInsertRowid));
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
listTranscriptTracks(sourceRef, revision) {
|
|
409
|
+
return this.#all(this.#db.prepare("SELECT * FROM transcript_tracks WHERE source_id=? AND source_revision=? ORDER BY language,kind,id"), sourceRef, revision).map(trackFromRow);
|
|
410
|
+
}
|
|
411
|
+
listTranscriptSegments(trackId, startMs = 0, endMs = Number.MAX_SAFE_INTEGER) {
|
|
412
|
+
return this.#all(this.#db.prepare("SELECT * FROM transcript_segments WHERE track_id=? AND end_ms>? AND start_ms<? ORDER BY ordinal"), trackId, startMs, endMs).map(segmentFromRow);
|
|
413
|
+
}
|
|
414
|
+
// Probe FTS capability at the storage layer only
|
|
415
|
+
// EvidenceService uses the bounded fallback because LIMIT cannot prove completeness
|
|
416
|
+
searchTranscriptSegments(trackId, query, limit) {
|
|
417
|
+
if (this.ftsEnabled) {
|
|
418
|
+
try {
|
|
419
|
+
return this.#all(this.#db.prepare(`SELECT s.* FROM transcript_fts f JOIN transcript_segments s ON s.id=f.segment_id WHERE f.track_id=? AND transcript_fts MATCH ? ORDER BY rank,s.ordinal LIMIT ?`), trackId, query, limit).map(segmentFromRow);
|
|
420
|
+
}
|
|
421
|
+
catch {
|
|
422
|
+
/* use the deterministic fallback for punctuation-heavy literal queries */
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
const needle = query.normalize("NFKC").toLowerCase();
|
|
426
|
+
return this.listTranscriptSegments(trackId)
|
|
427
|
+
.filter((segment) => segment.text.normalize("NFKC").toLowerCase().includes(needle))
|
|
428
|
+
.slice(0, limit);
|
|
429
|
+
}
|
|
430
|
+
putArtifact(artifact, request, parents = []) {
|
|
431
|
+
this.#transaction(() => {
|
|
432
|
+
if (artifactHashFromId(artifact.artifactId) !== artifact.sha256) {
|
|
433
|
+
throw new UrmaError("CACHE_WRITE_FAILED", `Artifact ID does not match declared SHA-256 for ${artifact.artifactId}`);
|
|
434
|
+
}
|
|
435
|
+
this.#db
|
|
436
|
+
.prepare("INSERT OR IGNORE INTO artifact_contents(id,sha256,byte_size,blob_path,mime_type,created_at) VALUES(?,?,?,?,?,?)")
|
|
437
|
+
.run(artifact.artifactId, artifact.sha256, artifact.byteSize, artifact.blobPath, artifact.mimeType, artifact.createdAt);
|
|
438
|
+
const content = this.#db
|
|
439
|
+
.prepare("SELECT sha256,byte_size,blob_path FROM artifact_contents WHERE id=?")
|
|
440
|
+
.get(artifact.artifactId);
|
|
441
|
+
if (!content ||
|
|
442
|
+
content.sha256 !== artifact.sha256 ||
|
|
443
|
+
Number(content.byte_size) !== artifact.byteSize ||
|
|
444
|
+
content.blob_path !== artifact.blobPath) {
|
|
445
|
+
throw new UrmaError("CACHE_WRITE_FAILED", `Artifact content metadata conflicts with existing immutable content ${artifact.artifactId}`);
|
|
446
|
+
}
|
|
447
|
+
const recordKey = hashText(stableJson({
|
|
448
|
+
artifactId: artifact.artifactId,
|
|
449
|
+
sourceRef: artifact.sourceRef,
|
|
450
|
+
sourceRevision: artifact.sourceRevision,
|
|
451
|
+
kind: artifact.kind,
|
|
452
|
+
role: artifact.role,
|
|
453
|
+
startMs: artifact.startMs,
|
|
454
|
+
endMs: artifact.endMs,
|
|
455
|
+
params: artifact.params,
|
|
456
|
+
producer: artifact.producer,
|
|
457
|
+
}));
|
|
458
|
+
this.#db
|
|
459
|
+
.prepare(`INSERT OR IGNORE INTO artifacts(record_key,id,source_id,source_revision,kind,role,mime_type,sha256,byte_size,blob_path,start_ms,end_ms,params_json,producer_json,created_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`)
|
|
460
|
+
.run(recordKey, artifact.artifactId, artifact.sourceRef, artifact.sourceRevision, artifact.kind, artifact.role, artifact.mimeType, artifact.sha256, artifact.byteSize, artifact.blobPath, artifact.startMs, artifact.endMs, JSON.stringify(artifact.params), JSON.stringify(artifact.producer), artifact.createdAt);
|
|
461
|
+
if (request) {
|
|
462
|
+
this.#db
|
|
463
|
+
.prepare("INSERT OR REPLACE INTO artifact_requests(request_key,source_id,source_revision,operation,artifact_record_key,created_at) VALUES(?,?,?,?,?,?)")
|
|
464
|
+
.run(request.requestKey, artifact.sourceRef, artifact.sourceRevision, request.operation, recordKey, artifact.createdAt);
|
|
465
|
+
}
|
|
466
|
+
const derive = this.#db.prepare("INSERT OR IGNORE INTO artifact_derivations(artifact_id,parent_artifact_id) VALUES(?,?)");
|
|
467
|
+
for (const parent of parents)
|
|
468
|
+
derive.run(artifact.artifactId, parent);
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
getArtifact(id) {
|
|
472
|
+
const row = this.#db
|
|
473
|
+
.prepare("SELECT * FROM artifacts WHERE id=? ORDER BY created_at,record_key LIMIT 1")
|
|
474
|
+
.get(id);
|
|
475
|
+
return row ? artifactFromRow(row) : null;
|
|
476
|
+
}
|
|
477
|
+
getArtifactByRequest(key) {
|
|
478
|
+
const row = this.#db
|
|
479
|
+
.prepare("SELECT a.* FROM artifact_requests r JOIN artifacts a ON a.record_key=r.artifact_record_key WHERE r.request_key=?")
|
|
480
|
+
.get(key);
|
|
481
|
+
return row ? artifactFromRow(row) : null;
|
|
482
|
+
}
|
|
483
|
+
listArtifacts(ref, revision) {
|
|
484
|
+
return this.#all(this.#db.prepare("SELECT * FROM artifacts WHERE source_id=? AND source_revision=? ORDER BY created_at"), ref, revision).map(artifactFromRow);
|
|
485
|
+
}
|
|
486
|
+
beginAcquisition(value) {
|
|
487
|
+
this.#db
|
|
488
|
+
.prepare(`INSERT INTO acquisitions(id,source_id,source_revision,investigation_id,operation,request_key,method,status,started_at,completed_at,wall_ms,network_bytes,network_accounting_complete,error_code,metadata_json) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`)
|
|
489
|
+
.run(value.id, value.sourceRef, value.sourceRevision, value.investigationRef, value.operation, value.requestKey, value.method, value.status, value.startedAt, value.completedAt, value.wallMs, value.networkBytes, value.networkAccountingComplete ? 1 : 0, value.errorCode, JSON.stringify(value.metadata));
|
|
490
|
+
}
|
|
491
|
+
finishAcquisition(id, value) {
|
|
492
|
+
this.#db
|
|
493
|
+
.prepare("UPDATE acquisitions SET status=?,completed_at=?,wall_ms=?,network_bytes=?,network_accounting_complete=?,error_code=?,metadata_json=? WHERE id=?")
|
|
494
|
+
.run(value.status, value.completedAt, value.wallMs, value.networkBytes, value.networkAccountingComplete ? 1 : 0, value.errorCode, JSON.stringify(value.metadata), id);
|
|
495
|
+
}
|
|
496
|
+
listAcquisitions(ref) {
|
|
497
|
+
return this.#all(this.#db.prepare("SELECT * FROM acquisitions WHERE investigation_id=? ORDER BY started_at,id"), ref).map(acquisitionFromRow);
|
|
498
|
+
}
|
|
499
|
+
addPresentation(value) {
|
|
500
|
+
this.#transaction(() => {
|
|
501
|
+
this.#db
|
|
502
|
+
.prepare(`INSERT INTO presentations(id,investigation_id,artifact_id,modality,evidence_kind,start_ms,end_ms,points_json,metadata_json,presented_at) VALUES(?,?,?,?,?,?,?,?,?,?)`)
|
|
503
|
+
.run(value.id, value.investigationRef, value.artifactId, value.modality, value.evidenceKind, value.startMs, value.endMs, value.pointsMs === null ? null : JSON.stringify(value.pointsMs), JSON.stringify(value.metadata), value.presentedAt);
|
|
504
|
+
const insert = this.#db.prepare("INSERT INTO presentation_artifacts(presentation_id,artifact_id) VALUES(?,?)");
|
|
505
|
+
for (const artifactId of presentedArtifactIds(value)) {
|
|
506
|
+
insert.run(value.id, artifactId);
|
|
507
|
+
}
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
listPresentations(ref) {
|
|
511
|
+
return this.#all(this.#db.prepare("SELECT * FROM presentations WHERE investigation_id=? ORDER BY presented_at,id"), ref).map((row) => ({
|
|
512
|
+
id: String(row.id),
|
|
513
|
+
investigationRef: row.investigation_id,
|
|
514
|
+
artifactId: row.artifact_id === null
|
|
515
|
+
? null
|
|
516
|
+
: row.artifact_id,
|
|
517
|
+
modality: row.modality,
|
|
518
|
+
evidenceKind: row.evidence_kind,
|
|
519
|
+
startMs: row.start_ms === null ? null : Number(row.start_ms),
|
|
520
|
+
endMs: row.end_ms === null ? null : Number(row.end_ms),
|
|
521
|
+
pointsMs: points(row.points_json),
|
|
522
|
+
metadata: jsonObject(row.metadata_json, "presentation metadata"),
|
|
523
|
+
presentedAt: String(row.presented_at),
|
|
524
|
+
}));
|
|
525
|
+
}
|
|
526
|
+
isArtifactPresented(ref, artifactId) {
|
|
527
|
+
return (this.#db
|
|
528
|
+
.prepare("SELECT 1 FROM presentation_artifacts pa JOIN presentations p ON p.id=pa.presentation_id WHERE p.investigation_id=? AND pa.artifact_id=? LIMIT 1")
|
|
529
|
+
.get(ref, artifactId) !== undefined);
|
|
530
|
+
}
|
|
531
|
+
listPresentedArtifactIds(ref) {
|
|
532
|
+
return this.#all(this.#db.prepare("SELECT DISTINCT pa.artifact_id FROM presentation_artifacts pa JOIN presentations p ON p.id=pa.presentation_id WHERE p.investigation_id=? ORDER BY pa.artifact_id"), ref).map((row) => row.artifact_id);
|
|
533
|
+
}
|
|
534
|
+
cacheStats() {
|
|
535
|
+
const scalar = (sql) => Number(this.#db.prepare(sql).get().value);
|
|
536
|
+
return {
|
|
537
|
+
sources: scalar("SELECT count(*) value FROM sources"),
|
|
538
|
+
investigations: scalar("SELECT count(*) value FROM investigations"),
|
|
539
|
+
artifacts: scalar("SELECT count(*) value FROM artifact_contents"),
|
|
540
|
+
artifactBytes: scalar("SELECT coalesce(sum(byte_size),0) value FROM artifact_contents"),
|
|
541
|
+
acquisitions: scalar("SELECT count(*) value FROM acquisitions"),
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
//# sourceMappingURL=sqlite-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-store.js","sourceRoot":"","sources":["../../../src/store/sqlite-store.ts"],"names":[],"mappings":"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"}
|