elepha 0.1.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.md +375 -0
- package/README.md +135 -0
- package/bin/elepha.js +2 -0
- package/dist/adapters/base.js +600 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claude-code.js +260 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/codex.js +499 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/discriminators.js +39 -0
- package/dist/adapters/discriminators.js.map +1 -0
- package/dist/adapters/index.js +6 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/internal-command.js +3 -0
- package/dist/adapters/internal-command.js.map +1 -0
- package/dist/cli/backup-wizard.js +97 -0
- package/dist/cli/backup-wizard.js.map +1 -0
- package/dist/cli/capture-service.js +80 -0
- package/dist/cli/capture-service.js.map +1 -0
- package/dist/cli/commands/backfills.js +336 -0
- package/dist/cli/commands/backfills.js.map +1 -0
- package/dist/cli/commands/backup.js +234 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/config.js +66 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/consent.js +237 -0
- package/dist/cli/commands/consent.js.map +1 -0
- package/dist/cli/commands/daemon-control.js +76 -0
- package/dist/cli/commands/daemon-control.js.map +1 -0
- package/dist/cli/commands/doctor.js +31 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/hook.js +24 -0
- package/dist/cli/commands/hook.js.map +1 -0
- package/dist/cli/commands/import.js +611 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/init.js +19 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/inspect.js +54 -0
- package/dist/cli/commands/inspect.js.map +1 -0
- package/dist/cli/commands/install.js +49 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/internal.js +16 -0
- package/dist/cli/commands/internal.js.map +1 -0
- package/dist/cli/commands/mcp.js +12 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/projects.js +26 -0
- package/dist/cli/commands/projects.js.map +1 -0
- package/dist/cli/commands/purge.js +216 -0
- package/dist/cli/commands/purge.js.map +1 -0
- package/dist/cli/commands/reingest.js +80 -0
- package/dist/cli/commands/reingest.js.map +1 -0
- package/dist/cli/commands/rekey.js +58 -0
- package/dist/cli/commands/rekey.js.map +1 -0
- package/dist/cli/commands/restore.js +376 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/rollup.js +130 -0
- package/dist/cli/commands/rollup.js.map +1 -0
- package/dist/cli/commands/sanitize.js +72 -0
- package/dist/cli/commands/sanitize.js.map +1 -0
- package/dist/cli/commands/segment.js +153 -0
- package/dist/cli/commands/segment.js.map +1 -0
- package/dist/cli/commands/self-update.js +26 -0
- package/dist/cli/commands/self-update.js.map +1 -0
- package/dist/cli/commands/start.js +53 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/stats.js +42 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/status.js +73 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/uninstall.js +23 -0
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/config-wizard.js +104 -0
- package/dist/cli/config-wizard.js.map +1 -0
- package/dist/cli/destructive-op.js +32 -0
- package/dist/cli/destructive-op.js.map +1 -0
- package/dist/cli/import-wizard.js +89 -0
- package/dist/cli/import-wizard.js.map +1 -0
- package/dist/cli/index.js +74 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init-wizard.js +80 -0
- package/dist/cli/init-wizard.js.map +1 -0
- package/dist/cli/init.js +159 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/launcher-probe.js +71 -0
- package/dist/cli/launcher-probe.js.map +1 -0
- package/dist/cli/project-path.js +16 -0
- package/dist/cli/project-path.js.map +1 -0
- package/dist/cli/purge-wizard.js +200 -0
- package/dist/cli/purge-wizard.js.map +1 -0
- package/dist/cli/restore-wizard.js +101 -0
- package/dist/cli/restore-wizard.js.map +1 -0
- package/dist/cli/shared.js +128 -0
- package/dist/cli/shared.js.map +1 -0
- package/dist/cli/status.js +22 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/wordmark.js +15 -0
- package/dist/cli/wordmark.js.map +1 -0
- package/dist/config/constants.js +115 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/env.js +168 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/memory-config.js +63 -0
- package/dist/config/memory-config.js.map +1 -0
- package/dist/config/paths.js +343 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/settings.js +132 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/config/version.js +12 -0
- package/dist/config/version.js.map +1 -0
- package/dist/daemon/failure-window.js +38 -0
- package/dist/daemon/failure-window.js.map +1 -0
- package/dist/daemon/heartbeat.js +40 -0
- package/dist/daemon/heartbeat.js.map +1 -0
- package/dist/daemon/index.js +873 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/log-rotation.js +27 -0
- package/dist/daemon/log-rotation.js.map +1 -0
- package/dist/daemon/readability-guard.js +89 -0
- package/dist/daemon/readability-guard.js.map +1 -0
- package/dist/daemon/rollup-service.js +239 -0
- package/dist/daemon/rollup-service.js.map +1 -0
- package/dist/daemon/update-check.js +87 -0
- package/dist/daemon/update-check.js.map +1 -0
- package/dist/daemon/work-queue.js +28 -0
- package/dist/daemon/work-queue.js.map +1 -0
- package/dist/discovery/session-projects.js +242 -0
- package/dist/discovery/session-projects.js.map +1 -0
- package/dist/hooks/codex-trust.js +80 -0
- package/dist/hooks/codex-trust.js.map +1 -0
- package/dist/hooks/common.js +81 -0
- package/dist/hooks/common.js.map +1 -0
- package/dist/hooks/hook-log.js +38 -0
- package/dist/hooks/hook-log.js.map +1 -0
- package/dist/hooks/installer.js +200 -0
- package/dist/hooks/installer.js.map +1 -0
- package/dist/hooks/session-start.js +321 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/hooks/user-prompt-submit.js +248 -0
- package/dist/hooks/user-prompt-submit.js.map +1 -0
- package/dist/install/binary.js +72 -0
- package/dist/install/binary.js.map +1 -0
- package/dist/install/config-file.js +119 -0
- package/dist/install/config-file.js.map +1 -0
- package/dist/install/daemon-health.js +48 -0
- package/dist/install/daemon-health.js.map +1 -0
- package/dist/install/daemon-service.js +309 -0
- package/dist/install/daemon-service.js.map +1 -0
- package/dist/install/doctor.js +180 -0
- package/dist/install/doctor.js.map +1 -0
- package/dist/install/health-checks.js +90 -0
- package/dist/install/health-checks.js.map +1 -0
- package/dist/install/installer.js +411 -0
- package/dist/install/installer.js.map +1 -0
- package/dist/install/launchd-backend.js +261 -0
- package/dist/install/launchd-backend.js.map +1 -0
- package/dist/install/launcher.js +224 -0
- package/dist/install/launcher.js.map +1 -0
- package/dist/install/markers.js +14 -0
- package/dist/install/markers.js.map +1 -0
- package/dist/install/platform.js +29 -0
- package/dist/install/platform.js.map +1 -0
- package/dist/install/present-tools.js +16 -0
- package/dist/install/present-tools.js.map +1 -0
- package/dist/install/self-update.js +120 -0
- package/dist/install/self-update.js.map +1 -0
- package/dist/install/service-backend.js +36 -0
- package/dist/install/service-backend.js.map +1 -0
- package/dist/install/service-manifest.js +36 -0
- package/dist/install/service-manifest.js.map +1 -0
- package/dist/install/status.js +58 -0
- package/dist/install/status.js.map +1 -0
- package/dist/install/systemd-backend.js +225 -0
- package/dist/install/systemd-backend.js.map +1 -0
- package/dist/markers.js +5 -0
- package/dist/markers.js.map +1 -0
- package/dist/mcp/installer.js +131 -0
- package/dist/mcp/installer.js.map +1 -0
- package/dist/mcp/server.js +81 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/get-context.js +3 -0
- package/dist/mcp/tools/get-context.js.map +1 -0
- package/dist/mcp/tools/list-projects.js +3 -0
- package/dist/mcp/tools/list-projects.js.map +1 -0
- package/dist/mcp/tools/save-memory.js +3 -0
- package/dist/mcp/tools/save-memory.js.map +1 -0
- package/dist/mcp/tools.js +288 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/rendering/raw-turn-renderer.js +85 -0
- package/dist/rendering/raw-turn-renderer.js.map +1 -0
- package/dist/security/file-permissions.js +15 -0
- package/dist/security/file-permissions.js.map +1 -0
- package/dist/security/provider-transcript.js +74 -0
- package/dist/security/provider-transcript.js.map +1 -0
- package/dist/security/sanitize.js +210 -0
- package/dist/security/sanitize.js.map +1 -0
- package/dist/security/self-ingestion.js +47 -0
- package/dist/security/self-ingestion.js.map +1 -0
- package/dist/security/sentinel.js +19 -0
- package/dist/security/sentinel.js.map +1 -0
- package/dist/security/subprocess-allowlist.js +421 -0
- package/dist/security/subprocess-allowlist.js.map +1 -0
- package/dist/serving/instructions.js +33 -0
- package/dist/serving/instructions.js.map +1 -0
- package/dist/serving/lexical-recall.js +249 -0
- package/dist/serving/lexical-recall.js.map +1 -0
- package/dist/serving/session-reader.js +302 -0
- package/dist/serving/session-reader.js.map +1 -0
- package/dist/storage/backfill-runner.js +34 -0
- package/dist/storage/backfill-runner.js.map +1 -0
- package/dist/storage/backup.js +46 -0
- package/dist/storage/backup.js.map +1 -0
- package/dist/storage/candidate-validator.js +77 -0
- package/dist/storage/candidate-validator.js.map +1 -0
- package/dist/storage/consent-store.js +198 -0
- package/dist/storage/consent-store.js.map +1 -0
- package/dist/storage/custom-title-backfill.js +68 -0
- package/dist/storage/custom-title-backfill.js.map +1 -0
- package/dist/storage/db.js +312 -0
- package/dist/storage/db.js.map +1 -0
- package/dist/storage/external-agent-import-purge.js +182 -0
- package/dist/storage/external-agent-import-purge.js.map +1 -0
- package/dist/storage/first-prompt-search-backfill.js +76 -0
- package/dist/storage/first-prompt-search-backfill.js.map +1 -0
- package/dist/storage/first-prompt-search.js +7 -0
- package/dist/storage/first-prompt-search.js.map +1 -0
- package/dist/storage/injection-store.js +37 -0
- package/dist/storage/injection-store.js.map +1 -0
- package/dist/storage/memory-store.js +428 -0
- package/dist/storage/memory-store.js.map +1 -0
- package/dist/storage/project-resolver.js +294 -0
- package/dist/storage/project-resolver.js.map +1 -0
- package/dist/storage/project-store.js +104 -0
- package/dist/storage/project-store.js.map +1 -0
- package/dist/storage/rendered-chars-backfill.js +85 -0
- package/dist/storage/rendered-chars-backfill.js.map +1 -0
- package/dist/storage/resegmentation.js +582 -0
- package/dist/storage/resegmentation.js.map +1 -0
- package/dist/storage/rollup-store.js +246 -0
- package/dist/storage/rollup-store.js.map +1 -0
- package/dist/storage/root-commit-backfill.js +32 -0
- package/dist/storage/root-commit-backfill.js.map +1 -0
- package/dist/storage/sanitize-backfill.js +184 -0
- package/dist/storage/sanitize-backfill.js.map +1 -0
- package/dist/storage/segmentation.js +87 -0
- package/dist/storage/segmentation.js.map +1 -0
- package/dist/storage/session-fields-backfill.js +196 -0
- package/dist/storage/session-fields-backfill.js.map +1 -0
- package/dist/storage/session-read-model.js +130 -0
- package/dist/storage/session-read-model.js.map +1 -0
- package/dist/storage/session-store.js +200 -0
- package/dist/storage/session-store.js.map +1 -0
- package/dist/storage/session-title-backfill.js +75 -0
- package/dist/storage/session-title-backfill.js.map +1 -0
- package/dist/storage/session-title.js +71 -0
- package/dist/storage/session-title.js.map +1 -0
- package/dist/storage/shown-session-list-store.js +33 -0
- package/dist/storage/shown-session-list-store.js.map +1 -0
- package/dist/storage/stats.js +30 -0
- package/dist/storage/stats.js.map +1 -0
- package/dist/storage/turn-store.js +202 -0
- package/dist/storage/turn-store.js.map +1 -0
- package/dist/storage/ulid.js +17 -0
- package/dist/storage/ulid.js.map +1 -0
- package/dist/summarizer/anthropic-call.js +76 -0
- package/dist/summarizer/anthropic-call.js.map +1 -0
- package/dist/summarizer/call-log.js +120 -0
- package/dist/summarizer/call-log.js.map +1 -0
- package/dist/summarizer/haiku-provider.js +136 -0
- package/dist/summarizer/haiku-provider.js.map +1 -0
- package/dist/summarizer/pricing.js +8 -0
- package/dist/summarizer/pricing.js.map +1 -0
- package/dist/summarizer/prompt-cache.js +6 -0
- package/dist/summarizer/prompt-cache.js.map +1 -0
- package/dist/summarizer/prompt.js +47 -0
- package/dist/summarizer/prompt.js.map +1 -0
- package/dist/summarizer/provider-config.js +25 -0
- package/dist/summarizer/provider-config.js.map +1 -0
- package/dist/summarizer/rollup-prompt.js +225 -0
- package/dist/summarizer/rollup-prompt.js.map +1 -0
- package/dist/summarizer/rollup-provider.js +224 -0
- package/dist/summarizer/rollup-provider.js.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/util/error.js +5 -0
- package/dist/util/error.js.map +1 -0
- package/dist/util/fs.js +97 -0
- package/dist/util/fs.js.map +1 -0
- package/dist/util/relative-time.js +12 -0
- package/dist/util/relative-time.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
// Read/write facade for summarized memory records.
|
|
2
|
+
// Data concerns live in dedicated stores; this class preserves the existing API.
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { canonicalizeExisting, isWithin, normalizeForCompare, samePath } from '../config/paths.js';
|
|
5
|
+
import { ConsentStore } from './consent-store.js';
|
|
6
|
+
import { InjectionStore } from './injection-store.js';
|
|
7
|
+
import { ProjectStore } from './project-store.js';
|
|
8
|
+
import { hydrateSessionRow, SessionStore } from './session-store.js';
|
|
9
|
+
import { ShownSessionListStore } from './shown-session-list-store.js';
|
|
10
|
+
import { minMedianMax } from './stats.js';
|
|
11
|
+
import { TurnStore } from './turn-store.js';
|
|
12
|
+
export { hydrateTurnDecisions } from './turn-store.js';
|
|
13
|
+
export class MemoryStore {
|
|
14
|
+
db;
|
|
15
|
+
consent;
|
|
16
|
+
projects;
|
|
17
|
+
sessions;
|
|
18
|
+
turns;
|
|
19
|
+
injections;
|
|
20
|
+
shownSessionLists;
|
|
21
|
+
constructor(db, options = {}) {
|
|
22
|
+
this.db = db;
|
|
23
|
+
this.consent = new ConsentStore(db);
|
|
24
|
+
this.projects = new ProjectStore(db, options);
|
|
25
|
+
this.sessions = new SessionStore(db, (id) => this.projects.getProjectById(id), options.resolveGitCommitCount);
|
|
26
|
+
this.turns = new TurnStore(db, this.sessions);
|
|
27
|
+
this.injections = new InjectionStore(db);
|
|
28
|
+
this.shownSessionLists = new ShownSessionListStore(db);
|
|
29
|
+
}
|
|
30
|
+
get database() {
|
|
31
|
+
return this.db;
|
|
32
|
+
}
|
|
33
|
+
recordInjection(input) {
|
|
34
|
+
return this.injections.recordInjection(input);
|
|
35
|
+
}
|
|
36
|
+
injectionsForSession(tool, nativeSessionId, atOrBefore) {
|
|
37
|
+
return this.injections.injectionsForSession(tool, nativeSessionId, atOrBefore);
|
|
38
|
+
}
|
|
39
|
+
hasMemoryForNativeTurn(tool, nativeId, turnIndex) {
|
|
40
|
+
return this.turns.hasMemoryForNativeTurn(tool, nativeId, turnIndex);
|
|
41
|
+
}
|
|
42
|
+
upsertProject(projectPath) {
|
|
43
|
+
return this.projects.upsertProject(projectPath);
|
|
44
|
+
}
|
|
45
|
+
getProjectById(id) {
|
|
46
|
+
return this.projects.getProjectById(id);
|
|
47
|
+
}
|
|
48
|
+
findProject(query) {
|
|
49
|
+
return this.projects.findProject(query);
|
|
50
|
+
}
|
|
51
|
+
listProjects() {
|
|
52
|
+
return this.projects.listProjects();
|
|
53
|
+
}
|
|
54
|
+
sessionCountsByProject() {
|
|
55
|
+
const rows = this.db.prepare('SELECT project_id, COUNT(*) AS c FROM sessions GROUP BY project_id').all();
|
|
56
|
+
return new Map(rows.map((row) => [row.project_id, row.c]));
|
|
57
|
+
}
|
|
58
|
+
upsertSession(tool, nativeId, projectId, sourcePath, meta) {
|
|
59
|
+
return this.sessions.upsertSession(tool, nativeId, projectId, sourcePath, meta);
|
|
60
|
+
}
|
|
61
|
+
findSession(tool, nativeId) {
|
|
62
|
+
return this.sessions.findSession(tool, nativeId);
|
|
63
|
+
}
|
|
64
|
+
/** A purge freezes the whole native transcript, across all its segments. */
|
|
65
|
+
isTranscriptPurged(tool, nativeId) {
|
|
66
|
+
return this.db.prepare('SELECT 1 FROM purged_transcripts WHERE tool = ? AND native_id = ?').get(tool, nativeId) !== undefined;
|
|
67
|
+
}
|
|
68
|
+
/** Records only the stable provider/session identity, never transcript content. */
|
|
69
|
+
recordIncognitoTranscript(tool, nativeId) {
|
|
70
|
+
this.db
|
|
71
|
+
.prepare('INSERT OR IGNORE INTO incognito_transcripts (tool, native_id, tombstoned_at) VALUES (?, ?, ?)')
|
|
72
|
+
.run(tool, nativeId, new Date().toISOString());
|
|
73
|
+
}
|
|
74
|
+
isTranscriptIncognito(tool, nativeId) {
|
|
75
|
+
return this.db.prepare('SELECT 1 FROM incognito_transcripts WHERE tool = ? AND native_id = ?').get(tool, nativeId) !== undefined;
|
|
76
|
+
}
|
|
77
|
+
startNextSegment(previous, projectId, sourcePath, meta) {
|
|
78
|
+
return this.sessions.startNextSegment(previous, projectId, sourcePath, meta);
|
|
79
|
+
}
|
|
80
|
+
listSessionsForRollupRebuild(currentVersion) {
|
|
81
|
+
return this.sessions.listSessionsForRollupRebuild(currentVersion);
|
|
82
|
+
}
|
|
83
|
+
listOpenSessions() {
|
|
84
|
+
return this.sessions.listOpenSessions();
|
|
85
|
+
}
|
|
86
|
+
getSessionCursor(tool, nativeId) {
|
|
87
|
+
return this.sessions.getSessionCursor(tool, nativeId);
|
|
88
|
+
}
|
|
89
|
+
advanceExistingSessionCursor(tool, nativeId, cursor) {
|
|
90
|
+
return this.sessions.advanceExistingSessionCursor(tool, nativeId, cursor);
|
|
91
|
+
}
|
|
92
|
+
getLastIngestedAt() {
|
|
93
|
+
return this.turns.getLastIngestedAt();
|
|
94
|
+
}
|
|
95
|
+
recordTurn(turn, sessionDbId, projectId, summary) {
|
|
96
|
+
return this.turns.recordTurn(turn, sessionDbId, projectId, summary);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Creates the project/session and records one live turn as one SQLite
|
|
100
|
+
* transaction. Write blockers and native-turn dedupe are authoritative
|
|
101
|
+
* here: an earlier scan check may avoid work, but it cannot make a
|
|
102
|
+
* persistence decision across concurrent writers.
|
|
103
|
+
*/
|
|
104
|
+
recordIngestedTurn(turn, meta, startNextSegment, summary) {
|
|
105
|
+
const resolved = this.resolveTurnGitValues(turn, startNextSegment);
|
|
106
|
+
const write = this.db.transaction(() => {
|
|
107
|
+
if (this.recordIncognitoIfWriteBlocked(turn)) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
if (this.turns.hasMemoryForNativeTurn(turn.tool, turn.sessionId, turn.turnIndex)) {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
const project = this.projects.upsertProject(turn.projectPath, resolved.projectIdentity);
|
|
114
|
+
let session = this.sessions.upsertSession(turn.tool, turn.sessionId, project.id, turn.sourcePath, meta, resolved.gitCommitCount);
|
|
115
|
+
if (startNextSegment) {
|
|
116
|
+
session = this.sessions.startNextSegment(session, project.id, turn.sourcePath, meta, resolved.gitCommitCount);
|
|
117
|
+
}
|
|
118
|
+
return { project, session, inserted: this.turns.recordTurnInTransaction(turn, session.id, project.id, summary) };
|
|
119
|
+
});
|
|
120
|
+
return write();
|
|
121
|
+
}
|
|
122
|
+
recordDroppedTurn(turn, meta) {
|
|
123
|
+
const resolved = this.resolveTurnGitValues(turn, false);
|
|
124
|
+
const write = this.db.transaction(() => {
|
|
125
|
+
if (this.recordIncognitoIfWriteBlocked(turn)) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
const project = this.projects.upsertProject(turn.projectPath, resolved.projectIdentity);
|
|
129
|
+
const session = this.sessions.upsertSession(turn.tool, turn.sessionId, project.id, turn.sourcePath, meta, resolved.gitCommitCount);
|
|
130
|
+
this.sessions.updateSessionTitle(session.id, turn);
|
|
131
|
+
this.sessions.advanceSessionCursor(session.id, turn.cursor);
|
|
132
|
+
return true;
|
|
133
|
+
});
|
|
134
|
+
return write();
|
|
135
|
+
}
|
|
136
|
+
resolveTurnGitValues(turn, startNextSegment) {
|
|
137
|
+
const projectIdentity = this.projects.resolveProjectIdentity(turn.projectPath);
|
|
138
|
+
const existingSession = this.sessions.findSession(turn.tool, turn.sessionId);
|
|
139
|
+
const needsGitCommitCount = existingSession === undefined || startNextSegment;
|
|
140
|
+
return {
|
|
141
|
+
projectIdentity,
|
|
142
|
+
gitCommitCount: needsGitCommitCount
|
|
143
|
+
? this.sessions.gitCommitCount(projectIdentity.gitRoot ?? turn.projectPath)
|
|
144
|
+
: existingSession.git_commit_count,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/** The final consent and tombstone decision must share the transaction that would mutate capture rows. */
|
|
148
|
+
recordIncognitoIfWriteBlocked(turn) {
|
|
149
|
+
const consentState = this.consent.consentState(turn.projectPath);
|
|
150
|
+
const mustRecordIncognito = consentState === 'denied' ||
|
|
151
|
+
this.isTranscriptPurged(turn.tool, turn.sessionId) ||
|
|
152
|
+
this.isTranscriptIncognito(turn.tool, turn.sessionId);
|
|
153
|
+
if (mustRecordIncognito) {
|
|
154
|
+
this.recordIncognitoTranscript(turn.tool, turn.sessionId);
|
|
155
|
+
}
|
|
156
|
+
return consentState !== 'approved' || mustRecordIncognito;
|
|
157
|
+
}
|
|
158
|
+
reingestTurn(turn, sessionDbId, projectId, summary) {
|
|
159
|
+
this.turns.reingestTurn(turn, sessionDbId, projectId, summary);
|
|
160
|
+
}
|
|
161
|
+
listSessionsWithMemoriesSince(sinceIso) {
|
|
162
|
+
return this.sessions.listSessionsWithMemoriesSince(sinceIso);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Consolidates project rows that identify the same repository even when a
|
|
166
|
+
* checkout was renamed or moved. A stored remote is the durable identity,
|
|
167
|
+
* followed by the root commit; a live git root is the fallback for legacy
|
|
168
|
+
* rows without either value.
|
|
169
|
+
*
|
|
170
|
+
* When a group has a live checkout, its canonical row is chosen from those
|
|
171
|
+
* live members, preferring the repository root and then the shallowest
|
|
172
|
+
* path. Without a live checkout, the shallowest row survives but keeps its
|
|
173
|
+
* existing path and git root rather than being rewritten to stale data.
|
|
174
|
+
*/
|
|
175
|
+
planRekeyProjectsByIdentity(resolveGitRoot) {
|
|
176
|
+
const groups = new Map();
|
|
177
|
+
for (const project of this.listProjects()) {
|
|
178
|
+
const gitRoot = project.path ? resolveGitRoot(project.path) : null;
|
|
179
|
+
const identity = project.git_remote || project.git_root_commit || gitRoot;
|
|
180
|
+
if (!identity) {
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
const key = gitRoot === identity ? normalizeForCompare(identity) : identity;
|
|
184
|
+
const members = groups.get(key);
|
|
185
|
+
if (members) {
|
|
186
|
+
members.push({ project, gitRoot });
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
groups.set(key, [{ project, gitRoot }]);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const plans = [];
|
|
193
|
+
for (const members of groups.values()) {
|
|
194
|
+
const liveMembers = members.filter((member) => member.gitRoot !== null);
|
|
195
|
+
const candidates = liveMembers.length > 0 ? liveMembers : members;
|
|
196
|
+
const canonicalMember = candidates.find((member) => member.gitRoot !== null && samePath(member.project.path, member.gitRoot)) ??
|
|
197
|
+
candidates.reduce((shallowest, member) => member.project.path.split('/').length < shallowest.project.path.split('/').length ? member : shallowest);
|
|
198
|
+
const gitRoot = canonicalMember.gitRoot;
|
|
199
|
+
const requiresCanonicalization = gitRoot !== null &&
|
|
200
|
+
(!samePath(canonicalMember.project.path, gitRoot) || canonicalMember.project.display_name !== path.basename(gitRoot));
|
|
201
|
+
if (members.length < 2 && !requiresCanonicalization) {
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
plans.push({
|
|
205
|
+
canonical: canonicalMember.project,
|
|
206
|
+
gitRoot,
|
|
207
|
+
merged: members.map((member) => member.project).filter((member) => member.id !== canonicalMember.project.id),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
return plans;
|
|
211
|
+
}
|
|
212
|
+
/** Applies planRekeyProjectsByIdentity's plan in a single transaction. Returns the plan that was applied, for reporting. */
|
|
213
|
+
rekeyProjectsByIdentity(resolveGitRoot) {
|
|
214
|
+
const plans = this.planRekeyProjectsByIdentity(resolveGitRoot);
|
|
215
|
+
const apply = this.db.transaction(() => {
|
|
216
|
+
for (const plan of plans) {
|
|
217
|
+
for (const victim of plan.merged) {
|
|
218
|
+
this.db.prepare('UPDATE memories SET project_id = ? WHERE project_id = ?').run(plan.canonical.id, victim.id);
|
|
219
|
+
this.db.prepare('UPDATE sessions SET project_id = ? WHERE project_id = ?').run(plan.canonical.id, victim.id);
|
|
220
|
+
this.db.prepare('UPDATE session_rollups SET project_id = ? WHERE project_id = ?').run(plan.canonical.id, victim.id);
|
|
221
|
+
this.db.prepare('DELETE FROM projects WHERE id = ?').run(victim.id);
|
|
222
|
+
}
|
|
223
|
+
if (plan.gitRoot !== null) {
|
|
224
|
+
this.db
|
|
225
|
+
.prepare('UPDATE projects SET path = ?, display_name = ?, git_root = ? WHERE id = ?')
|
|
226
|
+
.run(plan.gitRoot, path.basename(plan.gitRoot), plan.gitRoot, plan.canonical.id);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
apply();
|
|
231
|
+
return plans;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Project rows matching a purge query: exact path match if one exists,
|
|
235
|
+
* otherwise every row whose path or display_name contains the query.
|
|
236
|
+
* Unlike findProject() (single best guess, for UX lookups), this returns
|
|
237
|
+
* every match because one project can be fragmented across multiple rows,
|
|
238
|
+
* and a purge that only
|
|
239
|
+
* hit the first match would silently leave the rest behind.
|
|
240
|
+
*/
|
|
241
|
+
findProjectsForPurge(query) {
|
|
242
|
+
if (query.trim().length === 0) {
|
|
243
|
+
return [];
|
|
244
|
+
}
|
|
245
|
+
const rows = this.listProjects();
|
|
246
|
+
const exact = rows.filter((r) => r.path === query);
|
|
247
|
+
if (exact.length > 0) {
|
|
248
|
+
return exact;
|
|
249
|
+
}
|
|
250
|
+
return rows.filter((r) => r.path.includes(query) || r.display_name?.includes(query));
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Computes what a purge would delete, without deleting anything. The
|
|
254
|
+
* actual session list, not just a count: aggregates hide misclassification.
|
|
255
|
+
*/
|
|
256
|
+
planPurge(scope) {
|
|
257
|
+
let sessionRows;
|
|
258
|
+
if (scope.projectRoot !== undefined) {
|
|
259
|
+
const root = canonicalizeExisting(scope.projectRoot);
|
|
260
|
+
const projectIds = this.listProjects()
|
|
261
|
+
.filter((p) => isWithin(root, canonicalizeExisting(p.path)))
|
|
262
|
+
.map((p) => p.id);
|
|
263
|
+
sessionRows = this.sessionsForProjectIds(projectIds);
|
|
264
|
+
}
|
|
265
|
+
else if (scope.projectPath !== undefined) {
|
|
266
|
+
const projectIds = this.findProjectsForPurge(scope.projectPath).map((p) => p.id);
|
|
267
|
+
sessionRows = this.sessionsForProjectIds(projectIds);
|
|
268
|
+
}
|
|
269
|
+
else if (scope.projectIds !== undefined) {
|
|
270
|
+
sessionRows = this.sessionsForProjectIds(scope.projectIds);
|
|
271
|
+
}
|
|
272
|
+
else if (scope.all || scope.newerThan !== undefined || scope.olderThan !== undefined) {
|
|
273
|
+
sessionRows = this.db
|
|
274
|
+
.prepare('SELECT * FROM sessions')
|
|
275
|
+
.all()
|
|
276
|
+
.map((row) => hydrateSessionRow(row));
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
sessionRows = [];
|
|
280
|
+
}
|
|
281
|
+
const newerThan = scope.newerThan;
|
|
282
|
+
if (newerThan !== undefined) {
|
|
283
|
+
sessionRows = sessionRows.filter((session) => session.last_ingested_at >= newerThan);
|
|
284
|
+
}
|
|
285
|
+
const olderThan = scope.olderThan;
|
|
286
|
+
if (olderThan !== undefined) {
|
|
287
|
+
sessionRows = sessionRows.filter((session) => session.last_ingested_at <= olderThan);
|
|
288
|
+
}
|
|
289
|
+
const projectById = new Map(this.listProjects().map((p) => [p.id, p]));
|
|
290
|
+
const countTurns = this.db.prepare('SELECT COUNT(*) as c FROM memories WHERE session_id = ?');
|
|
291
|
+
const sessions = sessionRows.map((s) => ({
|
|
292
|
+
id: s.id,
|
|
293
|
+
nativeId: s.native_id,
|
|
294
|
+
title: s.title,
|
|
295
|
+
projectId: s.project_id,
|
|
296
|
+
projectPath: projectById.get(s.project_id)?.path ?? '(unknown project)',
|
|
297
|
+
tool: s.tool,
|
|
298
|
+
startedAt: s.started_at,
|
|
299
|
+
lastIngestedAt: s.last_ingested_at,
|
|
300
|
+
turnCount: countTurns.get(s.id).c,
|
|
301
|
+
}));
|
|
302
|
+
// A project is "emptied" if every one of its sessions is in this
|
|
303
|
+
// purge - compare against its true total, not just what we selected.
|
|
304
|
+
const purgedByProject = new Map();
|
|
305
|
+
for (const s of sessions) {
|
|
306
|
+
purgedByProject.set(s.projectId, (purgedByProject.get(s.projectId) ?? 0) + 1);
|
|
307
|
+
}
|
|
308
|
+
const totalSessionsByProject = this.db.prepare('SELECT COUNT(*) as c FROM sessions WHERE project_id = ?');
|
|
309
|
+
const emptiedProjects = [];
|
|
310
|
+
for (const [projectId, purgedCount] of purgedByProject) {
|
|
311
|
+
const total = totalSessionsByProject.get(projectId).c;
|
|
312
|
+
if (purgedCount === total) {
|
|
313
|
+
const project = projectById.get(projectId);
|
|
314
|
+
if (project) {
|
|
315
|
+
emptiedProjects.push(project);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return { scope, sessions, emptiedProjects };
|
|
320
|
+
}
|
|
321
|
+
/** Applies exactly the still-present sessions in a previewed purge plan, in one transaction. */
|
|
322
|
+
applyPurgePlan(plan, purgedAt = new Date().toISOString()) {
|
|
323
|
+
const sessionIdentity = this.db.prepare('SELECT tool, native_id FROM sessions WHERE id = ?');
|
|
324
|
+
const tombstone = this.db.prepare('INSERT OR IGNORE INTO purged_transcripts (tool, native_id, purged_at) VALUES (?, ?, ?)');
|
|
325
|
+
const deleteRollup = this.db.prepare('DELETE FROM session_rollups WHERE session_id = ?');
|
|
326
|
+
const deleteMemories = this.db.prepare('DELETE FROM memories WHERE session_id = ?');
|
|
327
|
+
const deleteSession = this.db.prepare('DELETE FROM sessions WHERE id = ?');
|
|
328
|
+
const countProjectSessions = this.db.prepare('SELECT COUNT(*) AS count FROM sessions WHERE project_id = ?');
|
|
329
|
+
const deleteProject = this.db.prepare('DELETE FROM projects WHERE id = ?');
|
|
330
|
+
const appliedSessions = [];
|
|
331
|
+
const emptiedProjects = [];
|
|
332
|
+
const apply = this.db.transaction(() => {
|
|
333
|
+
for (const s of plan.sessions) {
|
|
334
|
+
const identity = sessionIdentity.get(s.id);
|
|
335
|
+
if (!identity) {
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
if (identity.tool !== s.tool || identity.native_id !== s.nativeId) {
|
|
339
|
+
throw new Error(`Purge plan session id ${s.id} no longer matches the previewed session.`);
|
|
340
|
+
}
|
|
341
|
+
tombstone.run(identity.tool, identity.native_id, purgedAt);
|
|
342
|
+
deleteRollup.run(s.id);
|
|
343
|
+
deleteMemories.run(s.id);
|
|
344
|
+
deleteSession.run(s.id);
|
|
345
|
+
appliedSessions.push(s);
|
|
346
|
+
}
|
|
347
|
+
for (const p of plan.emptiedProjects) {
|
|
348
|
+
const remaining = countProjectSessions.get(p.id);
|
|
349
|
+
if (remaining.count === 0 && deleteProject.run(p.id).changes > 0) {
|
|
350
|
+
emptiedProjects.push(p);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
apply();
|
|
355
|
+
// "Revocation = deletion" isn't true of the file on disk until the
|
|
356
|
+
// WAL is reclaimed too - a deleted row's page can sit in
|
|
357
|
+
// elepha.db-wal, readable to anything with filesystem access, until a
|
|
358
|
+
// checkpoint overwrites it. TRUNCATE both checkpoints and shrinks the
|
|
359
|
+
// file back to zero, rather than leaving a large reusable-but-still-
|
|
360
|
+
// populated WAL behind.
|
|
361
|
+
this.db.pragma('wal_checkpoint(TRUNCATE)');
|
|
362
|
+
return { ...plan, sessions: appliedSessions, emptiedProjects };
|
|
363
|
+
}
|
|
364
|
+
/** Plans and applies a scope immediately. Existing callers retain the same behavior and signature. */
|
|
365
|
+
purge(scope, purgedAt = new Date().toISOString()) {
|
|
366
|
+
return this.applyPurgePlan(this.planPurge(scope), purgedAt);
|
|
367
|
+
}
|
|
368
|
+
listMemoriesForSession(sessionId) {
|
|
369
|
+
return this.turns.listMemoriesForSession(sessionId);
|
|
370
|
+
}
|
|
371
|
+
listRecentMemories(projectId, limit = 20) {
|
|
372
|
+
return this.turns.listRecentMemories(projectId, limit);
|
|
373
|
+
}
|
|
374
|
+
/** Dogfooding instrumentation - see ./stats.ts. Not part of the served-memory surface. */
|
|
375
|
+
getStats(sinceIso) {
|
|
376
|
+
const byTool = this.db
|
|
377
|
+
.prepare(`SELECT tool, COUNT(DISTINCT session_id) as sessions, COUNT(*) as turns
|
|
378
|
+
FROM memories WHERE turn_started_at >= ? GROUP BY tool`)
|
|
379
|
+
.all(sinceIso);
|
|
380
|
+
const perSessionCounts = this.db.prepare(`SELECT COUNT(*) as cnt FROM memories WHERE turn_started_at >= ? GROUP BY session_id`).all(sinceIso).map((r) => r.cnt);
|
|
381
|
+
const perSessionPending = this.db
|
|
382
|
+
.prepare(`SELECT SUM(json_array_length(pending_items)) as cnt FROM memories WHERE turn_started_at >= ? GROUP BY session_id`)
|
|
383
|
+
.all(sinceIso).map((r) => r.cnt);
|
|
384
|
+
const byProject = this.db
|
|
385
|
+
.prepare(`SELECT m.project_id as project_id, COALESCE(p.display_name, p.path) as project,
|
|
386
|
+
COUNT(*) as memories, SUM(json_array_length(m.pending_items)) as open_pending_items
|
|
387
|
+
FROM memories m JOIN projects p ON p.id = m.project_id
|
|
388
|
+
WHERE m.turn_started_at >= ?
|
|
389
|
+
GROUP BY m.project_id
|
|
390
|
+
ORDER BY memories DESC`)
|
|
391
|
+
.all(sinceIso);
|
|
392
|
+
const noise = this.db
|
|
393
|
+
.prepare(`SELECT
|
|
394
|
+
SUM(CASE WHEN decisions = '[]' AND pending_items = '[]' THEN 1 ELSE 0 END) as count,
|
|
395
|
+
COUNT(*) as total
|
|
396
|
+
FROM memories WHERE turn_started_at >= ?`)
|
|
397
|
+
.get(sinceIso);
|
|
398
|
+
const filesTouchedZero = this.db
|
|
399
|
+
.prepare(`SELECT tool,
|
|
400
|
+
SUM(CASE WHEN files_touched = '[]' THEN 1 ELSE 0 END) as zero_paths,
|
|
401
|
+
COUNT(*) as total
|
|
402
|
+
FROM memories WHERE turn_started_at >= ? GROUP BY tool`)
|
|
403
|
+
.all(sinceIso);
|
|
404
|
+
const byStatus = this.db
|
|
405
|
+
.prepare(`SELECT summarizer_status, COUNT(*) as count FROM memories WHERE turn_started_at >= ? GROUP BY summarizer_status`)
|
|
406
|
+
.all(sinceIso);
|
|
407
|
+
return {
|
|
408
|
+
since: sinceIso,
|
|
409
|
+
totalMemories: noise.total,
|
|
410
|
+
byTool,
|
|
411
|
+
memoriesPerSession: minMedianMax(perSessionCounts),
|
|
412
|
+
pendingItemsPerSession: minMedianMax(perSessionPending),
|
|
413
|
+
byProject,
|
|
414
|
+
noise,
|
|
415
|
+
byStatus,
|
|
416
|
+
filesTouchedZero,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
sessionsForProjectIds(projectIds) {
|
|
420
|
+
return projectIds.length === 0
|
|
421
|
+
? []
|
|
422
|
+
: this.db
|
|
423
|
+
.prepare(`SELECT * FROM sessions WHERE project_id IN (${projectIds.map(() => '?').join(',')})`)
|
|
424
|
+
.all(...projectIds)
|
|
425
|
+
.map((row) => hydrateSessionRow(row));
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
//# sourceMappingURL=memory-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../src/storage/memory-store.ts"],"names":[],"mappings":"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"}
|