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,200 @@
|
|
|
1
|
+
import * as clack from '@clack/prompts';
|
|
2
|
+
import { consentedProject } from '../hooks/common.js';
|
|
3
|
+
import { ProjectResolver } from '../storage/project-resolver.js';
|
|
4
|
+
import { parseSince } from '../storage/stats.js';
|
|
5
|
+
import { isLiveProjectPath } from './project-path.js';
|
|
6
|
+
import { printTagline } from './wordmark.js';
|
|
7
|
+
export const PURGE_HERE_UNCONSENTED = 'The current directory is not within a consented project. Use --project <pathOrName>, or cd into the project you want to purge.';
|
|
8
|
+
export class PurgeHereScopeError extends Error {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(PURGE_HERE_UNCONSENTED);
|
|
11
|
+
this.name = 'PurgeHereScopeError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function print(output, message) {
|
|
15
|
+
output.write(`${message}\n`);
|
|
16
|
+
}
|
|
17
|
+
function clackPrompts(input, output) {
|
|
18
|
+
const common = { input, output };
|
|
19
|
+
return {
|
|
20
|
+
intro: (title) => clack.intro(title, common),
|
|
21
|
+
select: (options) => clack.select({ ...options, ...common }),
|
|
22
|
+
text: (options) => clack.text({ ...options, ...common }),
|
|
23
|
+
confirm: (options) => clack.confirm({ ...options, ...common }),
|
|
24
|
+
isCancel: clack.isCancel,
|
|
25
|
+
cancel: (message) => clack.cancel(message, common),
|
|
26
|
+
outro: (message) => clack.outro(message, common),
|
|
27
|
+
spinner: () => clack.spinner({ output }),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function cancellation(prompts) {
|
|
31
|
+
prompts.cancel('Operation cancelled. No changes were made.');
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
function scopeOptions() {
|
|
35
|
+
return [
|
|
36
|
+
{ value: 'project', label: 'A project' },
|
|
37
|
+
{ value: 'newer-than', label: 'Sessions newer than a date or duration' },
|
|
38
|
+
{ value: 'older-than', label: 'Sessions older than a date or duration' },
|
|
39
|
+
{ value: 'external-agent-imports', label: 'External-agent imports' },
|
|
40
|
+
{ value: 'orphan', label: 'Orphaned or temporary projects' },
|
|
41
|
+
{ value: 'revoked', label: 'Revoked projects' },
|
|
42
|
+
{ value: 'all', label: 'Everything' },
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
function isScopeChoice(value) {
|
|
46
|
+
return (value === 'project' ||
|
|
47
|
+
value === 'newer-than' ||
|
|
48
|
+
value === 'older-than' ||
|
|
49
|
+
value === 'external-agent-imports' ||
|
|
50
|
+
value === 'orphan' ||
|
|
51
|
+
value === 'revoked' ||
|
|
52
|
+
value === 'all');
|
|
53
|
+
}
|
|
54
|
+
function dateOrDuration(value) {
|
|
55
|
+
try {
|
|
56
|
+
parseSince(value ?? '');
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return 'Enter a duration such as 7d, 24h, or 30m, or an ISO date.';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function projectOptions(store) {
|
|
64
|
+
const sessionCounts = store.sessionCountsByProject();
|
|
65
|
+
const projectsByValue = new Map();
|
|
66
|
+
const options = new ProjectResolver(store.database)
|
|
67
|
+
.list()
|
|
68
|
+
.map((project) => ({ project, canonicalPath: project.gitRoot ?? project.paths[0] }))
|
|
69
|
+
.filter((project) => project.canonicalPath !== undefined && isLiveProjectPath(project.canonicalPath))
|
|
70
|
+
.map(({ project, canonicalPath }) => {
|
|
71
|
+
projectsByValue.set(canonicalPath, project);
|
|
72
|
+
const sessions = project.projectIds.reduce((total, projectId) => total + (sessionCounts.get(projectId) ?? 0), 0);
|
|
73
|
+
const revoked = store.consent.isRevokedProjectSet(project.paths);
|
|
74
|
+
return {
|
|
75
|
+
value: canonicalPath,
|
|
76
|
+
label: `${project.displayName}${revoked ? ' (revoked)' : ''}`,
|
|
77
|
+
hint: `${canonicalPath} · ${sessions} sessions`,
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
return { options, projectsByValue };
|
|
81
|
+
}
|
|
82
|
+
export function buildPurgeScope(store, options) {
|
|
83
|
+
const projects = store.listProjects();
|
|
84
|
+
const hereProject = options.here ? consentedProject(store.database, process.cwd()) : undefined;
|
|
85
|
+
if (options.here && hereProject === undefined) {
|
|
86
|
+
throw new PurgeHereScopeError();
|
|
87
|
+
}
|
|
88
|
+
const selectedProjects = options.orphan ? projects.filter((project) => !isLiveProjectPath(project.path)) : [];
|
|
89
|
+
const revokedProjects = options.revoked ? projects.filter((project) => store.consent.isRevoked(project.path)) : [];
|
|
90
|
+
return {
|
|
91
|
+
projectPath: options.here ? undefined : options.project,
|
|
92
|
+
projectIds: hereProject !== undefined
|
|
93
|
+
? hereProject.projectIds
|
|
94
|
+
: options.orphan
|
|
95
|
+
? selectedProjects.map((project) => project.id)
|
|
96
|
+
: options.revoked
|
|
97
|
+
? revokedProjects.map((project) => project.id)
|
|
98
|
+
: undefined,
|
|
99
|
+
newerThan: options.newerThan !== undefined ? parseSince(options.newerThan) : undefined,
|
|
100
|
+
olderThan: options.olderThan !== undefined ? parseSince(options.olderThan) : undefined,
|
|
101
|
+
all: options.all,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
async function confirmPurge(prompts, sessionCount) {
|
|
105
|
+
const confirmed = await prompts.confirm({
|
|
106
|
+
message: `Delete elepha's memory for these ${sessionCount} session(s)? Your Claude Code / Codex history on disk is untouched. A backup is saved first.`,
|
|
107
|
+
initialValue: false,
|
|
108
|
+
});
|
|
109
|
+
if (prompts.isCancel(confirmed) || confirmed !== true) {
|
|
110
|
+
cancellation(prompts);
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
/** Interactive front-end for the existing purge engines. It does not delete or back up data itself. */
|
|
116
|
+
export async function runPurgeWizard(options) {
|
|
117
|
+
const input = options.input ?? process.stdin;
|
|
118
|
+
const output = options.output ?? process.stdout;
|
|
119
|
+
const error = options.error ?? process.stderr;
|
|
120
|
+
if (!input.isTTY) {
|
|
121
|
+
print(error, 'Specify one of --project <pathOrName>, --here, --newer-than/--older-than <durationOrDate>, --external-agent-imports, --orphan, --revoked, or --all.');
|
|
122
|
+
return 1;
|
|
123
|
+
}
|
|
124
|
+
const prompts = options.prompts ?? clackPrompts(input, output);
|
|
125
|
+
printTagline(output);
|
|
126
|
+
prompts.intro('Purge elepha memory');
|
|
127
|
+
const selected = await prompts.select({ message: 'What should elepha forget?', options: scopeOptions() });
|
|
128
|
+
if (prompts.isCancel(selected) || !isScopeChoice(selected)) {
|
|
129
|
+
return cancellation(prompts);
|
|
130
|
+
}
|
|
131
|
+
if (selected === 'external-agent-imports') {
|
|
132
|
+
let cancelled = false;
|
|
133
|
+
const completed = await options.runExternalAgentImports(async (sessionCount) => {
|
|
134
|
+
const confirmed = await confirmPurge(prompts, sessionCount);
|
|
135
|
+
cancelled ||= !confirmed;
|
|
136
|
+
return confirmed;
|
|
137
|
+
});
|
|
138
|
+
if (!completed) {
|
|
139
|
+
return cancelled ? 0 : 1;
|
|
140
|
+
}
|
|
141
|
+
prompts.outro('Purge complete.');
|
|
142
|
+
return 0;
|
|
143
|
+
}
|
|
144
|
+
let value;
|
|
145
|
+
let projectIds;
|
|
146
|
+
if (selected === 'project') {
|
|
147
|
+
const projects = projectOptions(options.store);
|
|
148
|
+
if (projects.options.length === 0) {
|
|
149
|
+
prompts.outro('No projects with captured memory are available to purge.');
|
|
150
|
+
return 0;
|
|
151
|
+
}
|
|
152
|
+
const project = await prompts.select({ message: 'Which project should elepha forget?', options: projects.options });
|
|
153
|
+
if (prompts.isCancel(project) || typeof project !== 'string') {
|
|
154
|
+
return cancellation(prompts);
|
|
155
|
+
}
|
|
156
|
+
const selectedProject = projects.projectsByValue.get(project);
|
|
157
|
+
if (selectedProject === undefined) {
|
|
158
|
+
return cancellation(prompts);
|
|
159
|
+
}
|
|
160
|
+
projectIds = selectedProject.projectIds;
|
|
161
|
+
}
|
|
162
|
+
else if (selected === 'newer-than' || selected === 'older-than') {
|
|
163
|
+
const cutoff = await prompts.text({
|
|
164
|
+
message: selected === 'newer-than'
|
|
165
|
+
? 'Delete sessions last ingested at or after what time?'
|
|
166
|
+
: 'Delete sessions last ingested at or before what time?',
|
|
167
|
+
placeholder: '7d, 24h, or 2026-08-01',
|
|
168
|
+
validate: dateOrDuration,
|
|
169
|
+
});
|
|
170
|
+
if (prompts.isCancel(cutoff) || typeof cutoff !== 'string') {
|
|
171
|
+
return cancellation(prompts);
|
|
172
|
+
}
|
|
173
|
+
value = cutoff;
|
|
174
|
+
}
|
|
175
|
+
const scope = selected === 'project'
|
|
176
|
+
? { projectIds }
|
|
177
|
+
: buildPurgeScope(options.store, {
|
|
178
|
+
newerThan: selected === 'newer-than' ? value : undefined,
|
|
179
|
+
olderThan: selected === 'older-than' ? value : undefined,
|
|
180
|
+
orphan: selected === 'orphan',
|
|
181
|
+
revoked: selected === 'revoked',
|
|
182
|
+
all: selected === 'all',
|
|
183
|
+
});
|
|
184
|
+
const preview = prompts.spinner();
|
|
185
|
+
preview.start('Preparing purge preview…');
|
|
186
|
+
const plan = options.store.planPurge(scope);
|
|
187
|
+
preview.stop();
|
|
188
|
+
let cancelled = false;
|
|
189
|
+
const completed = await options.runPurge(scope, plan, async (purgePlan) => {
|
|
190
|
+
const confirmed = await confirmPurge(prompts, purgePlan.sessions.length);
|
|
191
|
+
cancelled ||= !confirmed;
|
|
192
|
+
return confirmed;
|
|
193
|
+
});
|
|
194
|
+
if (!completed) {
|
|
195
|
+
return cancelled ? 0 : 1;
|
|
196
|
+
}
|
|
197
|
+
prompts.outro(plan.sessions.length === 0 ? 'Nothing was deleted.' : 'Purge complete.');
|
|
198
|
+
return 0;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=purge-wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"purge-wizard.js","sourceRoot":"","sources":["../../src/cli/purge-wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import * as clack from '@clack/prompts';
|
|
3
|
+
import { expandUserPath } from '../config/paths.js';
|
|
4
|
+
import { listFullBackups } from './commands/backup.js';
|
|
5
|
+
import { printTagline } from './wordmark.js';
|
|
6
|
+
const MANUAL_PATH = '__elepha_manual_restore_path__';
|
|
7
|
+
function clackPrompts(input, output) {
|
|
8
|
+
const common = { input, output };
|
|
9
|
+
return {
|
|
10
|
+
intro: (title) => clack.intro(title, common),
|
|
11
|
+
select: (options) => clack.select({ ...options, ...common }),
|
|
12
|
+
text: (options) => clack.text({ ...options, ...common }),
|
|
13
|
+
confirm: (options) => clack.confirm({ ...options, ...common }),
|
|
14
|
+
isCancel: clack.isCancel,
|
|
15
|
+
cancel: (message) => clack.cancel(message, common),
|
|
16
|
+
outro: (message) => clack.outro(message, common),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function print(output, message) {
|
|
20
|
+
output.write(`${message}\n`);
|
|
21
|
+
}
|
|
22
|
+
function cancelled(prompts) {
|
|
23
|
+
prompts.cancel('Operation cancelled. No changes were made.');
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
function humanSize(bytes) {
|
|
27
|
+
const units = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
28
|
+
let value = bytes;
|
|
29
|
+
let unit = 0;
|
|
30
|
+
while (value >= 1_024 && unit < units.length - 1) {
|
|
31
|
+
value /= 1_024;
|
|
32
|
+
unit += 1;
|
|
33
|
+
}
|
|
34
|
+
const precision = unit === 0 || value >= 10 ? 0 : 1;
|
|
35
|
+
return `${value.toFixed(precision).replace(/\.0$/, '')} ${units[unit]}`;
|
|
36
|
+
}
|
|
37
|
+
function backupHint(backup) {
|
|
38
|
+
const date = new Date(backup.mtimeMs)
|
|
39
|
+
.toISOString()
|
|
40
|
+
.replace('T', ' ')
|
|
41
|
+
.replace(/\.\d{3}Z$/, ' UTC');
|
|
42
|
+
return `${humanSize(backup.bytes)} · ${date}`;
|
|
43
|
+
}
|
|
44
|
+
async function promptForPath(prompts) {
|
|
45
|
+
return prompts.text({
|
|
46
|
+
message: 'Which full elepha backup should be restored?',
|
|
47
|
+
placeholder: '/path/to/elepha-full-…db',
|
|
48
|
+
validate: (value) => (value?.trim() ? undefined : 'Enter the backup file path.'),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/** Interactive front-end for restore; validation, preview, snapshot, and replacement stay in the restore operation. */
|
|
52
|
+
export async function runRestoreWizard(options) {
|
|
53
|
+
const input = options.input ?? process.stdin;
|
|
54
|
+
const output = options.output ?? process.stdout;
|
|
55
|
+
const error = options.error ?? process.stderr;
|
|
56
|
+
if (!input.isTTY) {
|
|
57
|
+
print(error, 'Specify a backup file when not running interactively.');
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
const prompts = options.prompts ?? clackPrompts(input, output);
|
|
61
|
+
printTagline(output);
|
|
62
|
+
prompts.intro('Restore elepha memory');
|
|
63
|
+
const backups = [...(options.backups ?? listFullBackups())].sort((a, b) => b.mtimeMs - a.mtimeMs || path.basename(b.path).localeCompare(path.basename(a.path)));
|
|
64
|
+
let selected;
|
|
65
|
+
if (backups.length === 0) {
|
|
66
|
+
selected = await promptForPath(prompts);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
selected = await prompts.select({
|
|
70
|
+
message: 'Which full elepha backup should be restored?',
|
|
71
|
+
options: [
|
|
72
|
+
...backups.map((backup) => ({ value: backup.path, label: path.basename(backup.path), hint: backupHint(backup) })),
|
|
73
|
+
{ value: MANUAL_PATH, label: 'Enter a path manually…' },
|
|
74
|
+
],
|
|
75
|
+
});
|
|
76
|
+
if (selected === MANUAL_PATH) {
|
|
77
|
+
selected = await promptForPath(prompts);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (prompts.isCancel(selected) || typeof selected !== 'string' || !selected.trim()) {
|
|
81
|
+
return cancelled(prompts);
|
|
82
|
+
}
|
|
83
|
+
let wasCancelled = false;
|
|
84
|
+
const result = await options.restore(expandUserPath(selected.trim()), async () => {
|
|
85
|
+
const confirmed = await prompts.confirm({
|
|
86
|
+
message: 'Replace the current elepha database with this backup? A snapshot of the current database is saved first.',
|
|
87
|
+
initialValue: false,
|
|
88
|
+
});
|
|
89
|
+
if (prompts.isCancel(confirmed) || confirmed !== true) {
|
|
90
|
+
wasCancelled = true;
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
return true;
|
|
94
|
+
});
|
|
95
|
+
if (result.cancelled || wasCancelled) {
|
|
96
|
+
return cancelled(prompts);
|
|
97
|
+
}
|
|
98
|
+
prompts.outro('Restore complete.');
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=restore-wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore-wizard.js","sourceRoot":"","sources":["../../src/cli/restore-wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import * as readline from 'node:readline';
|
|
3
|
+
import { CAPTURE_PAUSE_DEADLINE_MS, CAPTURE_PAUSE_POLL_MS } from '../config/constants.js';
|
|
4
|
+
import { daemonHealth } from '../install/health-checks.js';
|
|
5
|
+
import { backupDatabaseAndReport } from '../storage/backup.js';
|
|
6
|
+
import { defaultDbPath } from '../storage/db.js';
|
|
7
|
+
import { errorMessage } from '../util/error.js';
|
|
8
|
+
import { pauseCaptureService, resolveCaptureService, resumeCaptureService } from './capture-service.js';
|
|
9
|
+
export async function confirmYesNo(question) {
|
|
10
|
+
const prompt = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
11
|
+
const answer = await new Promise((resolve) => prompt.question(question, resolve));
|
|
12
|
+
prompt.close();
|
|
13
|
+
return /^(y|yes)$/i.test(answer.trim());
|
|
14
|
+
}
|
|
15
|
+
export function printInstallation(result, action) {
|
|
16
|
+
console.log(`install binary: ${result.bin}`);
|
|
17
|
+
if (result.launcher) {
|
|
18
|
+
console.log(`managed launcher: ${result.launcher}`);
|
|
19
|
+
}
|
|
20
|
+
console.log(`Claude hook: ${result.status.claudeHook}`);
|
|
21
|
+
console.log(`Claude UserPromptSubmit hook: ${result.status.claudeUserPromptSubmitHook}`);
|
|
22
|
+
console.log(`Claude MCP: ${result.status.claudeMcp}`);
|
|
23
|
+
console.log(`Codex hook: ${result.status.codexHook}`);
|
|
24
|
+
console.log(`Codex UserPromptSubmit hook: ${result.status.codexUserPromptSubmitHook}`);
|
|
25
|
+
console.log(`Codex MCP: ${result.status.codexMcp}`);
|
|
26
|
+
if (action === 'install' &&
|
|
27
|
+
(result.status.codexHook !== 'not present' || result.status.codexUserPromptSubmitHook !== 'not present') &&
|
|
28
|
+
(result.status.codexHook !== 'active' || result.status.codexUserPromptSubmitHook !== 'active')) {
|
|
29
|
+
console.log('Codex hooks await approval. Open Codex, run `/hooks`, and approve each elepha hook once.');
|
|
30
|
+
}
|
|
31
|
+
if (result.service) {
|
|
32
|
+
console.log(`daemon service: ${result.service}`);
|
|
33
|
+
}
|
|
34
|
+
if (action === 'install') {
|
|
35
|
+
console.log('\nRun `elepha init` to choose which projects you want elepha to remember');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Refuses an operation only while the daemon has a fresh, healthy heartbeat. */
|
|
39
|
+
export function refuseIfDaemonRunning(operation) {
|
|
40
|
+
const { state, healthy } = daemonHealth();
|
|
41
|
+
if (healthy) {
|
|
42
|
+
console.error(`Refusing ${operation} while the daemon is running (${state}). Stop it and retry.`);
|
|
43
|
+
process.exitCode = 1;
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
if (state.startsWith('STUCK')) {
|
|
47
|
+
console.error(`Daemon appears stuck (${state}); proceeding — it is not writing.`);
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
export function prepareDestructiveApply(db, operation) {
|
|
52
|
+
if (refuseIfDaemonRunning(operation)) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
const dbPath = defaultDbPath();
|
|
56
|
+
if (existsSync(dbPath)) {
|
|
57
|
+
backupDatabaseAndReport(db, dbPath);
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
function sleep(ms) {
|
|
62
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
63
|
+
}
|
|
64
|
+
async function waitForCaptureToStop() {
|
|
65
|
+
const deadline = Date.now() + CAPTURE_PAUSE_DEADLINE_MS;
|
|
66
|
+
while (daemonHealth().healthy) {
|
|
67
|
+
const remaining = deadline - Date.now();
|
|
68
|
+
if (remaining <= 0) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
await sleep(Math.min(CAPTURE_PAUSE_POLL_MS, remaining));
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
/** Runs a destructive operation only after confirming that the capture writer is stopped. */
|
|
76
|
+
export async function withCapturePaused(operation, fn) {
|
|
77
|
+
const health = daemonHealth();
|
|
78
|
+
if (!health.healthy) {
|
|
79
|
+
if (health.state.startsWith('STUCK')) {
|
|
80
|
+
console.error(`Daemon appears stuck (${health.state}); proceeding — it is not writing.`);
|
|
81
|
+
}
|
|
82
|
+
await fn();
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
const service = resolveCaptureService();
|
|
86
|
+
if (!service) {
|
|
87
|
+
console.error(`Refusing ${operation}: a running daemon could not be paused automatically. Stop it and retry.`);
|
|
88
|
+
process.exitCode = 1;
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
let pausedByUs = false;
|
|
92
|
+
try {
|
|
93
|
+
pauseCaptureService(service);
|
|
94
|
+
pausedByUs = await waitForCaptureToStop();
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
console.error(errorMessage(error));
|
|
98
|
+
}
|
|
99
|
+
if (!pausedByUs) {
|
|
100
|
+
console.error(`Refusing ${operation}: a running daemon could not be paused automatically. Stop it and retry.`);
|
|
101
|
+
process.exitCode = 1;
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
console.log('Paused capture…');
|
|
105
|
+
try {
|
|
106
|
+
await fn();
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
resumeCaptureService(service);
|
|
111
|
+
console.log('Capture resumed.');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export function printPurgePlan(plan) {
|
|
115
|
+
if (plan.sessions.length === 0) {
|
|
116
|
+
console.log('Nothing matches this scope. Nothing to purge.');
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const totalTurns = plan.sessions.reduce((sum, s) => sum + s.turnCount, 0);
|
|
120
|
+
const emptiedProjectPaths = new Set(plan.emptiedProjects.map((project) => project.path));
|
|
121
|
+
const projectPaths = [...new Set(plan.sessions.map((session) => session.projectPath))].sort((a, b) => a.localeCompare(b));
|
|
122
|
+
console.log(`In total: ${plan.sessions.length} session(s), ${totalTurns} turn(s).`);
|
|
123
|
+
console.log('\nelepha memory in these projects:');
|
|
124
|
+
for (const projectPath of projectPaths) {
|
|
125
|
+
console.log(` ${projectPath}${emptiedProjectPaths.has(projectPath) ? ' (project entry will be removed — no sessions left)' : ''}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/cli/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function synthesisStatusReport(providerName, callLogEntries) {
|
|
2
|
+
if (!providerName) {
|
|
3
|
+
return {
|
|
4
|
+
line: 'synthesis: capture-only (no provider configured; turn extraction and rollup merge skipped)',
|
|
5
|
+
healthy: true,
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
if (callLogEntries.length === 0) {
|
|
9
|
+
return { line: `synthesis: ${providerName} configured — no calls in last 24h`, healthy: true };
|
|
10
|
+
}
|
|
11
|
+
const okCalls = callLogEntries.filter((entry) => entry.status === 'ok').length;
|
|
12
|
+
const healthy = okCalls / callLogEntries.length >= 0.5;
|
|
13
|
+
const pct = ((100 * okCalls) / callLogEntries.length).toFixed(0);
|
|
14
|
+
let line = `synthesis: ${providerName} configured — ${okCalls}/${callLogEntries.length} calls ok (${pct}%) in last 24h`;
|
|
15
|
+
const lastFailure = [...callLogEntries].reverse().find((entry) => entry.status !== 'ok');
|
|
16
|
+
if (lastFailure) {
|
|
17
|
+
const reason = lastFailure.error ?? lastFailure.status;
|
|
18
|
+
line += ` — last failure ${lastFailure.timestamp} (${reason})`;
|
|
19
|
+
}
|
|
20
|
+
return { line, healthy };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,qBAAqB,CAAC,YAAgC,EAAE,cAAwC;IAC5G,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,OAAO;YACH,IAAI,EAAE,4FAA4F;YAClG,OAAO,EAAE,IAAI;SAChB,CAAC;IACN,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,cAAc,YAAY,oCAAoC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnG,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;IAC/E,MAAM,OAAO,GAAG,OAAO,GAAG,cAAc,CAAC,MAAM,IAAI,GAAG,CAAC;IACvD,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACjE,IAAI,IAAI,GAAG,cAAc,YAAY,iBAAiB,OAAO,IAAI,cAAc,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;IACxH,MAAM,WAAW,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;IACzF,IAAI,WAAW,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,MAAM,CAAC;QACvD,IAAI,IAAI,mBAAmB,WAAW,CAAC,SAAS,KAAK,MAAM,GAAG,CAAC;IACnE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ELEPHA_TAGLINE, ELEPHA_WORDMARK } from '../config/constants.js';
|
|
2
|
+
function print(output, message) {
|
|
3
|
+
output.write(`${message}\n`);
|
|
4
|
+
}
|
|
5
|
+
export function printWordmark(output) {
|
|
6
|
+
const wordmark = output.isTTY && process.env.NO_COLOR === undefined ? `\n\x1b[38;2;0;211;242m${ELEPHA_WORDMARK}\x1b[0m` : `\n${ELEPHA_WORDMARK}`;
|
|
7
|
+
print(output, wordmark);
|
|
8
|
+
}
|
|
9
|
+
export function printTagline(output) {
|
|
10
|
+
const tagline = output.isTTY && process.env.NO_COLOR === undefined
|
|
11
|
+
? `\n\x1b[48;2;230;230;230m\x1b[38;2;26;26;26m${ELEPHA_TAGLINE}\x1b[0m\n`
|
|
12
|
+
: `\n${ELEPHA_TAGLINE}\n`;
|
|
13
|
+
print(output, tagline);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=wordmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wordmark.js","sourceRoot":"","sources":["../../src/cli/wordmark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAOzE,SAAS,KAAK,CAAC,MAAsB,EAAE,OAAe;IAClD,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAsB;IAChD,MAAM,QAAQ,GACV,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,yBAAyB,eAAe,SAAS,CAAC,CAAC,CAAC,KAAK,eAAe,EAAE,CAAC;IACpI,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAsB;IAC/C,MAAM,OAAO,GACT,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS;QAC9C,CAAC,CAAC,8CAA8C,cAAc,WAAW;QACzE,CAAC,CAAC,KAAK,cAAc,IAAI,CAAC;IAClC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// Central registry for elepha's operational constants.
|
|
2
|
+
// CLI, serving, and capture policy
|
|
3
|
+
export const ELEPHA_WORDMARK = `███████╗ ██╗ ███████╗ ██████╗ ██╗ ██╗ █████╗
|
|
4
|
+
██╔════╝ ██║ ██╔════╝ ██╔══██╗ ██║ ██║ ██╔══██╗
|
|
5
|
+
█████╗ ██║ █████╗ ██████╔╝ ███████║ ███████║
|
|
6
|
+
██╔══╝ ██║ ██╔══╝ ██╔═══╝ ██╔══██║ ██╔══██║
|
|
7
|
+
███████╗ ███████╗ ███████╗ ██║ ██║ ██║ ██║ ██║
|
|
8
|
+
╚══════╝ ╚══════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝`;
|
|
9
|
+
export const ELEPHA_TAGLINE = ` · 🐘 elepha · switch tools, keep the context · `;
|
|
10
|
+
export const DOCS_URL = 'https://github.com/elepha-app/elepha#readme';
|
|
11
|
+
export { PACKAGE_VERSION } from './version.js';
|
|
12
|
+
export const BACKUP_KEEP = 5;
|
|
13
|
+
export const USER_BACKUPS_DIR_NAME = 'backups';
|
|
14
|
+
export const CHARS_PER_TOKEN = 4;
|
|
15
|
+
export const SESSION_TOKEN_BUDGET = 20_000;
|
|
16
|
+
export const SESSION_CHAR_BUDGET = SESSION_TOKEN_BUDGET * CHARS_PER_TOKEN;
|
|
17
|
+
export const MAX_GET_SESSION_LAST_N = 500;
|
|
18
|
+
export const GET_SESSION_DEADLINE_MS = 5_000;
|
|
19
|
+
export const AUTO_BRIEF_TOKEN_BUDGET = 4_000;
|
|
20
|
+
export const AUTO_BRIEF_CHAR_BUDGET = AUTO_BRIEF_TOKEN_BUDGET * CHARS_PER_TOKEN;
|
|
21
|
+
export const AUTO_BRIEF_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;
|
|
22
|
+
export const AUTO_BRIEF_NOTIFY_AGE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
23
|
+
export const AUTO_BRIEF_MAX_COMMITS_BEHIND = 20;
|
|
24
|
+
export const DAY_MS = 24 * 60 * 60 * 1000;
|
|
25
|
+
export const RECENT_SESSION_WINDOW_MS = 7 * 24 * 60 * 60 * 1000;
|
|
26
|
+
export const AUTO_BRIEF_AGGREGATE_SESSION_LIMIT = 10;
|
|
27
|
+
export const AUTO_BRIEF_AGGREGATE_FILE_LIMIT = 3;
|
|
28
|
+
export const MCP_LIST_SESSIONS_DEFAULT_LIMIT = 20;
|
|
29
|
+
export const ELEPHA_LIST_DEFAULT_LIMIT = 5;
|
|
30
|
+
export const ELEPHA_LIST_MAX_LIMIT = 100;
|
|
31
|
+
export const REMEMBER_SESSION_RECENCY_CAP = { global: 5_000, here: 5_000 };
|
|
32
|
+
export const REMEMBER_SCAN_BUDGET_MS = 3_000;
|
|
33
|
+
export const REMEMBER_MAX_HITS = 5;
|
|
34
|
+
export const REMEMBER_DISTINCTIVE_TOKEN_FRACTION = 0.005;
|
|
35
|
+
export const REMEMBER_QUERY_FILLER_WORDS = ['a', 'about', 'an', 'and', 'for', 'me', 'of', 'please', 'the', 'to'];
|
|
36
|
+
export const FIRST_PROMPT_SEARCH_CAP = 4_000;
|
|
37
|
+
export const REMEMBER_MATCH_SCORES = {
|
|
38
|
+
title: 12_000,
|
|
39
|
+
exactPhrase: 10_000,
|
|
40
|
+
body: 3_000,
|
|
41
|
+
};
|
|
42
|
+
// Storage and session segmentation
|
|
43
|
+
export const MAX_TITLE_CHARS = 72;
|
|
44
|
+
export const TRAILING_FILES_CAP = 50;
|
|
45
|
+
export const SEGMENT_UNCONDITIONAL_GAP_HOURS = 7 * 24;
|
|
46
|
+
export const SEGMENT_MIN_GAP_HOURS = 4;
|
|
47
|
+
export const SEGMENT_FILE_OVERLAP_THRESHOLD = 0.2;
|
|
48
|
+
export const SEGMENT_FILE_CONTINUITY_THRESHOLD = 0.5;
|
|
49
|
+
// Daemon lifecycle and diagnostics
|
|
50
|
+
export const IDLE_CLOSE_MS = 30 * 60 * 1000;
|
|
51
|
+
export const HEARTBEAT_INTERVAL_MS = 20_000;
|
|
52
|
+
export const HEARTBEAT_STALE_MS = HEARTBEAT_INTERVAL_MS * 3;
|
|
53
|
+
export const SWEEP_INTERVAL_MS = 5 * 60 * 1000;
|
|
54
|
+
export const UPDATE_CHECK_LOOP_INTERVAL_MS = 5 * 60 * 1000;
|
|
55
|
+
export const UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
56
|
+
export const DEFAULT_IDLE_DEBOUNCE_MS = 800;
|
|
57
|
+
export const DEFAULT_MAX_CONCURRENT = 3;
|
|
58
|
+
export const FAILURE_WINDOW_SIZE = 20;
|
|
59
|
+
export const FAILURE_RATE_THRESHOLD = 0.3;
|
|
60
|
+
export const FAILURE_WINDOW_MIN_SAMPLES = 5;
|
|
61
|
+
export const READABILITY_READ_CHUNK_BYTES = 16 * 1024;
|
|
62
|
+
export const READABILITY_FIRST_LINE_CAP_BYTES = 1024 * 1024;
|
|
63
|
+
export const MAX_UNKNOWN_LINE_DISCRIMINATOR_CHARS = 80;
|
|
64
|
+
export const MAX_DAEMON_UNKNOWN_LINE_WARNINGS = 1024;
|
|
65
|
+
export const DAEMON_LOG_ROTATE_MAX_BYTES = 5 * 1024 * 1024;
|
|
66
|
+
export const DAEMON_HEALTH_CHECK_DEADLINE_MS = 60_000;
|
|
67
|
+
export const DAEMON_HEALTH_CHECK_POLL_MS = 250;
|
|
68
|
+
export const CAPTURE_PAUSE_DEADLINE_MS = HEARTBEAT_STALE_MS * 2;
|
|
69
|
+
export const CAPTURE_PAUSE_POLL_MS = DAEMON_HEALTH_CHECK_POLL_MS;
|
|
70
|
+
export const DAEMON_BOOTOUT_DEADLINE_MS = 20_000;
|
|
71
|
+
export const DAEMON_STATE_CHECK_ATTEMPTS = 10;
|
|
72
|
+
export const DAEMON_OUTPUT_MAX_CHARS = 512;
|
|
73
|
+
export const DAEMON_STDERR_TAIL_CHARS = 2048;
|
|
74
|
+
// Hooks
|
|
75
|
+
export const HOOK_WATCHDOG_TIMEOUT_MS = 2_000;
|
|
76
|
+
export const HOOK_PAYLOAD_MAX_CHARS = 64 * 1024;
|
|
77
|
+
export const HOOK_LOG_LINE_MAX_CHARS = 500;
|
|
78
|
+
export const HOOK_LOG_MAX_BYTES = 5 * 1024 * 1024;
|
|
79
|
+
export const INSTALLED_HOOK_TIMEOUT_SECONDS = 5;
|
|
80
|
+
// Synthesis
|
|
81
|
+
export const SUMMARIZER_LOG_RETENTION_DAYS = 30;
|
|
82
|
+
export const MAX_SUMMARIZATION_FIELD_CHARS = 4_000;
|
|
83
|
+
export const MAX_ROLLUP_BATCH_CHARS = 8_000;
|
|
84
|
+
export const MAX_ROLLUP_CARRY_CHARS = 4_000;
|
|
85
|
+
export const TURN_SUMMARIZATION_MAX_TOKENS = 1_024;
|
|
86
|
+
export const TURN_SUMMARIZATION_RETRY_MAX_TOKENS = 4_096;
|
|
87
|
+
export const ROLLUP_MAX_TOKENS = 4_096;
|
|
88
|
+
export const ROLLUP_RETRY_MAX_TOKENS = 8_192;
|
|
89
|
+
export const DEFAULT_ANTHROPIC_MODEL = 'claude-haiku-4-5-20251001';
|
|
90
|
+
export const ANTHROPIC_INPUT_USD_PER_TOKEN = 1 / 1_000_000;
|
|
91
|
+
export const ANTHROPIC_OUTPUT_USD_PER_TOKEN = 5 / 1_000_000;
|
|
92
|
+
export const DECISION_PROVENANCE_OVERLAP_THRESHOLD = 0.5;
|
|
93
|
+
// Transcript and project capture policy
|
|
94
|
+
export const FINGERPRINT_WINDOW_BYTES = 4096;
|
|
95
|
+
export const MAX_TRANSCRIPT_RECORD_BYTES = 64 * 1024 * 1024;
|
|
96
|
+
export const MAX_METADATA_SCAN_BYTES = 4 * 1024 * 1024;
|
|
97
|
+
export const MAX_METADATA_SCAN_LINES = 2_048;
|
|
98
|
+
export const MAX_JSON_VALUE_DEPTH = 64;
|
|
99
|
+
export const MAX_JSON_VALUE_NODES = 100_000;
|
|
100
|
+
export const REFUSED_HOME_PROJECT_ROOTS = ['', 'Documents', 'Desktop', 'Downloads'];
|
|
101
|
+
export const REFUSED_ABSOLUTE_PROJECT_ROOTS = ['/', '/tmp', '/var', '/etc', '/usr'];
|
|
102
|
+
export const TEMPORARY_PROJECT_ROOTS = ['/tmp', '/private/tmp', '/var/folders', '/private/var/folders', '/run/user', '/dev/shm'];
|
|
103
|
+
// Installation and filesystem privacy
|
|
104
|
+
export const PRIVATE_FILE_MODE = 0o600;
|
|
105
|
+
export const PRIVATE_DIR_MODE = 0o700;
|
|
106
|
+
export const PRIVATE_UMASK_MASK = 0o077;
|
|
107
|
+
export const MINIMUM_NODE_MAJOR = 22;
|
|
108
|
+
export const DEFAULT_ELEPHA_SERVICE_LABEL = 'com.elepha.daemon';
|
|
109
|
+
export const PLIST_THROTTLE_INTERVAL_SECONDS = 30;
|
|
110
|
+
export const PLIST_UMASK = 63;
|
|
111
|
+
export const PLIST_PATH = '/usr/bin:/bin:/usr/sbin:/sbin';
|
|
112
|
+
export const SYSTEMD_SERVICE_NAME = 'elepha.service';
|
|
113
|
+
export const SYSTEMD_RESTART_SECONDS = 30;
|
|
114
|
+
export const SYSTEMD_UMASK = '0077';
|
|
115
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"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"}
|