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.
Files changed (290) hide show
  1. package/LICENSE.md +375 -0
  2. package/README.md +135 -0
  3. package/bin/elepha.js +2 -0
  4. package/dist/adapters/base.js +600 -0
  5. package/dist/adapters/base.js.map +1 -0
  6. package/dist/adapters/claude-code.js +260 -0
  7. package/dist/adapters/claude-code.js.map +1 -0
  8. package/dist/adapters/codex.js +499 -0
  9. package/dist/adapters/codex.js.map +1 -0
  10. package/dist/adapters/discriminators.js +39 -0
  11. package/dist/adapters/discriminators.js.map +1 -0
  12. package/dist/adapters/index.js +6 -0
  13. package/dist/adapters/index.js.map +1 -0
  14. package/dist/adapters/internal-command.js +3 -0
  15. package/dist/adapters/internal-command.js.map +1 -0
  16. package/dist/cli/backup-wizard.js +97 -0
  17. package/dist/cli/backup-wizard.js.map +1 -0
  18. package/dist/cli/capture-service.js +80 -0
  19. package/dist/cli/capture-service.js.map +1 -0
  20. package/dist/cli/commands/backfills.js +336 -0
  21. package/dist/cli/commands/backfills.js.map +1 -0
  22. package/dist/cli/commands/backup.js +234 -0
  23. package/dist/cli/commands/backup.js.map +1 -0
  24. package/dist/cli/commands/config.js +66 -0
  25. package/dist/cli/commands/config.js.map +1 -0
  26. package/dist/cli/commands/consent.js +237 -0
  27. package/dist/cli/commands/consent.js.map +1 -0
  28. package/dist/cli/commands/daemon-control.js +76 -0
  29. package/dist/cli/commands/daemon-control.js.map +1 -0
  30. package/dist/cli/commands/doctor.js +31 -0
  31. package/dist/cli/commands/doctor.js.map +1 -0
  32. package/dist/cli/commands/hook.js +24 -0
  33. package/dist/cli/commands/hook.js.map +1 -0
  34. package/dist/cli/commands/import.js +611 -0
  35. package/dist/cli/commands/import.js.map +1 -0
  36. package/dist/cli/commands/init.js +19 -0
  37. package/dist/cli/commands/init.js.map +1 -0
  38. package/dist/cli/commands/inspect.js +54 -0
  39. package/dist/cli/commands/inspect.js.map +1 -0
  40. package/dist/cli/commands/install.js +49 -0
  41. package/dist/cli/commands/install.js.map +1 -0
  42. package/dist/cli/commands/internal.js +16 -0
  43. package/dist/cli/commands/internal.js.map +1 -0
  44. package/dist/cli/commands/mcp.js +12 -0
  45. package/dist/cli/commands/mcp.js.map +1 -0
  46. package/dist/cli/commands/projects.js +26 -0
  47. package/dist/cli/commands/projects.js.map +1 -0
  48. package/dist/cli/commands/purge.js +216 -0
  49. package/dist/cli/commands/purge.js.map +1 -0
  50. package/dist/cli/commands/reingest.js +80 -0
  51. package/dist/cli/commands/reingest.js.map +1 -0
  52. package/dist/cli/commands/rekey.js +58 -0
  53. package/dist/cli/commands/rekey.js.map +1 -0
  54. package/dist/cli/commands/restore.js +376 -0
  55. package/dist/cli/commands/restore.js.map +1 -0
  56. package/dist/cli/commands/rollup.js +130 -0
  57. package/dist/cli/commands/rollup.js.map +1 -0
  58. package/dist/cli/commands/sanitize.js +72 -0
  59. package/dist/cli/commands/sanitize.js.map +1 -0
  60. package/dist/cli/commands/segment.js +153 -0
  61. package/dist/cli/commands/segment.js.map +1 -0
  62. package/dist/cli/commands/self-update.js +26 -0
  63. package/dist/cli/commands/self-update.js.map +1 -0
  64. package/dist/cli/commands/start.js +53 -0
  65. package/dist/cli/commands/start.js.map +1 -0
  66. package/dist/cli/commands/stats.js +42 -0
  67. package/dist/cli/commands/stats.js.map +1 -0
  68. package/dist/cli/commands/status.js +73 -0
  69. package/dist/cli/commands/status.js.map +1 -0
  70. package/dist/cli/commands/uninstall.js +23 -0
  71. package/dist/cli/commands/uninstall.js.map +1 -0
  72. package/dist/cli/config-wizard.js +104 -0
  73. package/dist/cli/config-wizard.js.map +1 -0
  74. package/dist/cli/destructive-op.js +32 -0
  75. package/dist/cli/destructive-op.js.map +1 -0
  76. package/dist/cli/import-wizard.js +89 -0
  77. package/dist/cli/import-wizard.js.map +1 -0
  78. package/dist/cli/index.js +74 -0
  79. package/dist/cli/index.js.map +1 -0
  80. package/dist/cli/init-wizard.js +80 -0
  81. package/dist/cli/init-wizard.js.map +1 -0
  82. package/dist/cli/init.js +159 -0
  83. package/dist/cli/init.js.map +1 -0
  84. package/dist/cli/launcher-probe.js +71 -0
  85. package/dist/cli/launcher-probe.js.map +1 -0
  86. package/dist/cli/project-path.js +16 -0
  87. package/dist/cli/project-path.js.map +1 -0
  88. package/dist/cli/purge-wizard.js +200 -0
  89. package/dist/cli/purge-wizard.js.map +1 -0
  90. package/dist/cli/restore-wizard.js +101 -0
  91. package/dist/cli/restore-wizard.js.map +1 -0
  92. package/dist/cli/shared.js +128 -0
  93. package/dist/cli/shared.js.map +1 -0
  94. package/dist/cli/status.js +22 -0
  95. package/dist/cli/status.js.map +1 -0
  96. package/dist/cli/wordmark.js +15 -0
  97. package/dist/cli/wordmark.js.map +1 -0
  98. package/dist/config/constants.js +115 -0
  99. package/dist/config/constants.js.map +1 -0
  100. package/dist/config/env.js +168 -0
  101. package/dist/config/env.js.map +1 -0
  102. package/dist/config/memory-config.js +63 -0
  103. package/dist/config/memory-config.js.map +1 -0
  104. package/dist/config/paths.js +343 -0
  105. package/dist/config/paths.js.map +1 -0
  106. package/dist/config/settings.js +132 -0
  107. package/dist/config/settings.js.map +1 -0
  108. package/dist/config/version.js +12 -0
  109. package/dist/config/version.js.map +1 -0
  110. package/dist/daemon/failure-window.js +38 -0
  111. package/dist/daemon/failure-window.js.map +1 -0
  112. package/dist/daemon/heartbeat.js +40 -0
  113. package/dist/daemon/heartbeat.js.map +1 -0
  114. package/dist/daemon/index.js +873 -0
  115. package/dist/daemon/index.js.map +1 -0
  116. package/dist/daemon/log-rotation.js +27 -0
  117. package/dist/daemon/log-rotation.js.map +1 -0
  118. package/dist/daemon/readability-guard.js +89 -0
  119. package/dist/daemon/readability-guard.js.map +1 -0
  120. package/dist/daemon/rollup-service.js +239 -0
  121. package/dist/daemon/rollup-service.js.map +1 -0
  122. package/dist/daemon/update-check.js +87 -0
  123. package/dist/daemon/update-check.js.map +1 -0
  124. package/dist/daemon/work-queue.js +28 -0
  125. package/dist/daemon/work-queue.js.map +1 -0
  126. package/dist/discovery/session-projects.js +242 -0
  127. package/dist/discovery/session-projects.js.map +1 -0
  128. package/dist/hooks/codex-trust.js +80 -0
  129. package/dist/hooks/codex-trust.js.map +1 -0
  130. package/dist/hooks/common.js +81 -0
  131. package/dist/hooks/common.js.map +1 -0
  132. package/dist/hooks/hook-log.js +38 -0
  133. package/dist/hooks/hook-log.js.map +1 -0
  134. package/dist/hooks/installer.js +200 -0
  135. package/dist/hooks/installer.js.map +1 -0
  136. package/dist/hooks/session-start.js +321 -0
  137. package/dist/hooks/session-start.js.map +1 -0
  138. package/dist/hooks/user-prompt-submit.js +248 -0
  139. package/dist/hooks/user-prompt-submit.js.map +1 -0
  140. package/dist/install/binary.js +72 -0
  141. package/dist/install/binary.js.map +1 -0
  142. package/dist/install/config-file.js +119 -0
  143. package/dist/install/config-file.js.map +1 -0
  144. package/dist/install/daemon-health.js +48 -0
  145. package/dist/install/daemon-health.js.map +1 -0
  146. package/dist/install/daemon-service.js +309 -0
  147. package/dist/install/daemon-service.js.map +1 -0
  148. package/dist/install/doctor.js +180 -0
  149. package/dist/install/doctor.js.map +1 -0
  150. package/dist/install/health-checks.js +90 -0
  151. package/dist/install/health-checks.js.map +1 -0
  152. package/dist/install/installer.js +411 -0
  153. package/dist/install/installer.js.map +1 -0
  154. package/dist/install/launchd-backend.js +261 -0
  155. package/dist/install/launchd-backend.js.map +1 -0
  156. package/dist/install/launcher.js +224 -0
  157. package/dist/install/launcher.js.map +1 -0
  158. package/dist/install/markers.js +14 -0
  159. package/dist/install/markers.js.map +1 -0
  160. package/dist/install/platform.js +29 -0
  161. package/dist/install/platform.js.map +1 -0
  162. package/dist/install/present-tools.js +16 -0
  163. package/dist/install/present-tools.js.map +1 -0
  164. package/dist/install/self-update.js +120 -0
  165. package/dist/install/self-update.js.map +1 -0
  166. package/dist/install/service-backend.js +36 -0
  167. package/dist/install/service-backend.js.map +1 -0
  168. package/dist/install/service-manifest.js +36 -0
  169. package/dist/install/service-manifest.js.map +1 -0
  170. package/dist/install/status.js +58 -0
  171. package/dist/install/status.js.map +1 -0
  172. package/dist/install/systemd-backend.js +225 -0
  173. package/dist/install/systemd-backend.js.map +1 -0
  174. package/dist/markers.js +5 -0
  175. package/dist/markers.js.map +1 -0
  176. package/dist/mcp/installer.js +131 -0
  177. package/dist/mcp/installer.js.map +1 -0
  178. package/dist/mcp/server.js +81 -0
  179. package/dist/mcp/server.js.map +1 -0
  180. package/dist/mcp/tools/get-context.js +3 -0
  181. package/dist/mcp/tools/get-context.js.map +1 -0
  182. package/dist/mcp/tools/list-projects.js +3 -0
  183. package/dist/mcp/tools/list-projects.js.map +1 -0
  184. package/dist/mcp/tools/save-memory.js +3 -0
  185. package/dist/mcp/tools/save-memory.js.map +1 -0
  186. package/dist/mcp/tools.js +288 -0
  187. package/dist/mcp/tools.js.map +1 -0
  188. package/dist/rendering/raw-turn-renderer.js +85 -0
  189. package/dist/rendering/raw-turn-renderer.js.map +1 -0
  190. package/dist/security/file-permissions.js +15 -0
  191. package/dist/security/file-permissions.js.map +1 -0
  192. package/dist/security/provider-transcript.js +74 -0
  193. package/dist/security/provider-transcript.js.map +1 -0
  194. package/dist/security/sanitize.js +210 -0
  195. package/dist/security/sanitize.js.map +1 -0
  196. package/dist/security/self-ingestion.js +47 -0
  197. package/dist/security/self-ingestion.js.map +1 -0
  198. package/dist/security/sentinel.js +19 -0
  199. package/dist/security/sentinel.js.map +1 -0
  200. package/dist/security/subprocess-allowlist.js +421 -0
  201. package/dist/security/subprocess-allowlist.js.map +1 -0
  202. package/dist/serving/instructions.js +33 -0
  203. package/dist/serving/instructions.js.map +1 -0
  204. package/dist/serving/lexical-recall.js +249 -0
  205. package/dist/serving/lexical-recall.js.map +1 -0
  206. package/dist/serving/session-reader.js +302 -0
  207. package/dist/serving/session-reader.js.map +1 -0
  208. package/dist/storage/backfill-runner.js +34 -0
  209. package/dist/storage/backfill-runner.js.map +1 -0
  210. package/dist/storage/backup.js +46 -0
  211. package/dist/storage/backup.js.map +1 -0
  212. package/dist/storage/candidate-validator.js +77 -0
  213. package/dist/storage/candidate-validator.js.map +1 -0
  214. package/dist/storage/consent-store.js +198 -0
  215. package/dist/storage/consent-store.js.map +1 -0
  216. package/dist/storage/custom-title-backfill.js +68 -0
  217. package/dist/storage/custom-title-backfill.js.map +1 -0
  218. package/dist/storage/db.js +312 -0
  219. package/dist/storage/db.js.map +1 -0
  220. package/dist/storage/external-agent-import-purge.js +182 -0
  221. package/dist/storage/external-agent-import-purge.js.map +1 -0
  222. package/dist/storage/first-prompt-search-backfill.js +76 -0
  223. package/dist/storage/first-prompt-search-backfill.js.map +1 -0
  224. package/dist/storage/first-prompt-search.js +7 -0
  225. package/dist/storage/first-prompt-search.js.map +1 -0
  226. package/dist/storage/injection-store.js +37 -0
  227. package/dist/storage/injection-store.js.map +1 -0
  228. package/dist/storage/memory-store.js +428 -0
  229. package/dist/storage/memory-store.js.map +1 -0
  230. package/dist/storage/project-resolver.js +294 -0
  231. package/dist/storage/project-resolver.js.map +1 -0
  232. package/dist/storage/project-store.js +104 -0
  233. package/dist/storage/project-store.js.map +1 -0
  234. package/dist/storage/rendered-chars-backfill.js +85 -0
  235. package/dist/storage/rendered-chars-backfill.js.map +1 -0
  236. package/dist/storage/resegmentation.js +582 -0
  237. package/dist/storage/resegmentation.js.map +1 -0
  238. package/dist/storage/rollup-store.js +246 -0
  239. package/dist/storage/rollup-store.js.map +1 -0
  240. package/dist/storage/root-commit-backfill.js +32 -0
  241. package/dist/storage/root-commit-backfill.js.map +1 -0
  242. package/dist/storage/sanitize-backfill.js +184 -0
  243. package/dist/storage/sanitize-backfill.js.map +1 -0
  244. package/dist/storage/segmentation.js +87 -0
  245. package/dist/storage/segmentation.js.map +1 -0
  246. package/dist/storage/session-fields-backfill.js +196 -0
  247. package/dist/storage/session-fields-backfill.js.map +1 -0
  248. package/dist/storage/session-read-model.js +130 -0
  249. package/dist/storage/session-read-model.js.map +1 -0
  250. package/dist/storage/session-store.js +200 -0
  251. package/dist/storage/session-store.js.map +1 -0
  252. package/dist/storage/session-title-backfill.js +75 -0
  253. package/dist/storage/session-title-backfill.js.map +1 -0
  254. package/dist/storage/session-title.js +71 -0
  255. package/dist/storage/session-title.js.map +1 -0
  256. package/dist/storage/shown-session-list-store.js +33 -0
  257. package/dist/storage/shown-session-list-store.js.map +1 -0
  258. package/dist/storage/stats.js +30 -0
  259. package/dist/storage/stats.js.map +1 -0
  260. package/dist/storage/turn-store.js +202 -0
  261. package/dist/storage/turn-store.js.map +1 -0
  262. package/dist/storage/ulid.js +17 -0
  263. package/dist/storage/ulid.js.map +1 -0
  264. package/dist/summarizer/anthropic-call.js +76 -0
  265. package/dist/summarizer/anthropic-call.js.map +1 -0
  266. package/dist/summarizer/call-log.js +120 -0
  267. package/dist/summarizer/call-log.js.map +1 -0
  268. package/dist/summarizer/haiku-provider.js +136 -0
  269. package/dist/summarizer/haiku-provider.js.map +1 -0
  270. package/dist/summarizer/pricing.js +8 -0
  271. package/dist/summarizer/pricing.js.map +1 -0
  272. package/dist/summarizer/prompt-cache.js +6 -0
  273. package/dist/summarizer/prompt-cache.js.map +1 -0
  274. package/dist/summarizer/prompt.js +47 -0
  275. package/dist/summarizer/prompt.js.map +1 -0
  276. package/dist/summarizer/provider-config.js +25 -0
  277. package/dist/summarizer/provider-config.js.map +1 -0
  278. package/dist/summarizer/rollup-prompt.js +225 -0
  279. package/dist/summarizer/rollup-prompt.js.map +1 -0
  280. package/dist/summarizer/rollup-provider.js +224 -0
  281. package/dist/summarizer/rollup-provider.js.map +1 -0
  282. package/dist/types/index.js +10 -0
  283. package/dist/types/index.js.map +1 -0
  284. package/dist/util/error.js +5 -0
  285. package/dist/util/error.js.map +1 -0
  286. package/dist/util/fs.js +97 -0
  287. package/dist/util/fs.js.map +1 -0
  288. package/dist/util/relative-time.js +12 -0
  289. package/dist/util/relative-time.js.map +1 -0
  290. package/package.json +81 -0
@@ -0,0 +1,97 @@
1
+ import * as clack from '@clack/prompts';
2
+ import { ProjectResolver } from '../storage/project-resolver.js';
3
+ import { isLiveProjectPath } from './project-path.js';
4
+ import { printTagline } from './wordmark.js';
5
+ function clackPrompts(input, output) {
6
+ const common = { input, output };
7
+ return {
8
+ intro: (title) => clack.intro(title, common),
9
+ select: (options) => clack.select({ ...options, ...common }),
10
+ text: (options) => clack.text({ ...options, ...common }),
11
+ isCancel: clack.isCancel,
12
+ cancel: (message) => clack.cancel(message, common),
13
+ outro: (message) => clack.outro(message, common),
14
+ };
15
+ }
16
+ function projectOptions(store) {
17
+ const sessionCounts = store.sessionCountsByProject();
18
+ const projectsByValue = new Map();
19
+ const options = new ProjectResolver(store.database)
20
+ .list()
21
+ .map((project) => ({ project, canonicalPath: project.gitRoot ?? project.paths[0] }))
22
+ .filter((project) => project.canonicalPath !== undefined && isLiveProjectPath(project.canonicalPath))
23
+ .map(({ project, canonicalPath }) => {
24
+ projectsByValue.set(canonicalPath, project);
25
+ const sessions = project.projectIds.reduce((total, projectId) => total + (sessionCounts.get(projectId) ?? 0), 0);
26
+ const paused = store.consent.isRevokedProjectSet(project.paths);
27
+ return {
28
+ value: canonicalPath,
29
+ label: `${project.displayName}${paused ? ' (paused)' : ''}`,
30
+ hint: `${canonicalPath} · ${sessions} sessions`,
31
+ };
32
+ });
33
+ return { options, projectsByValue };
34
+ }
35
+ function cancelled(prompts) {
36
+ prompts.cancel('Operation cancelled. No backup was written.');
37
+ return 0;
38
+ }
39
+ async function chooseOutput(prompts, defaultOutput) {
40
+ const output = await prompts.text({
41
+ message: 'Where should elepha save the backup?',
42
+ initialValue: defaultOutput,
43
+ validate: (value) => (value?.trim() ? undefined : 'Enter a destination path.'),
44
+ });
45
+ return prompts.isCancel(output) || typeof output !== 'string' ? undefined : output.trim();
46
+ }
47
+ /** Interactive scope and destination selection for `elepha backup`. */
48
+ export async function runBackupWizard(options) {
49
+ const input = options.input ?? process.stdin;
50
+ const output = options.output ?? process.stdout;
51
+ const prompts = options.prompts ?? clackPrompts(input, output);
52
+ printTagline(output);
53
+ prompts.intro('Back up elepha memory');
54
+ const scope = await prompts.select({
55
+ message: 'What should elepha back up?',
56
+ options: [
57
+ { value: 'all', label: 'All memory' },
58
+ { value: 'project', label: 'A specific project' },
59
+ ],
60
+ });
61
+ if (prompts.isCancel(scope)) {
62
+ return cancelled(prompts);
63
+ }
64
+ if (scope === 'all') {
65
+ const destination = await chooseOutput(prompts, options.defaultOutput());
66
+ if (destination === undefined) {
67
+ return cancelled(prompts);
68
+ }
69
+ const written = await options.backupAll(destination);
70
+ prompts.outro(`Backup written to ${written}.`);
71
+ return 0;
72
+ }
73
+ if (scope !== 'project') {
74
+ return cancelled(prompts);
75
+ }
76
+ const { options: projects, projectsByValue } = projectOptions(options.store);
77
+ if (projects.length === 0) {
78
+ prompts.outro('No live projects with captured memory are available.');
79
+ return 0;
80
+ }
81
+ const selected = await prompts.select({ message: 'Which project should elepha back up?', options: projects });
82
+ if (prompts.isCancel(selected)) {
83
+ return cancelled(prompts);
84
+ }
85
+ const project = typeof selected === 'string' ? projectsByValue.get(selected) : undefined;
86
+ if (!project) {
87
+ return cancelled(prompts);
88
+ }
89
+ const destination = await chooseOutput(prompts, options.defaultOutput(project));
90
+ if (destination === undefined) {
91
+ return cancelled(prompts);
92
+ }
93
+ const written = await options.backupProject(project, destination);
94
+ prompts.outro(`Backup written to ${written}.`);
95
+ return 0;
96
+ }
97
+ //# sourceMappingURL=backup-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup-wizard.js","sourceRoot":"","sources":["../../src/cli/backup-wizard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { DAEMON_HEALTH_CHECK_DEADLINE_MS } from '../config/constants.js';
2
+ import { defaultDaemonHealthCheckRuntime, waitForHealthyHeartbeat } from '../install/daemon-health.js';
3
+ import { daemonHealth } from '../install/health-checks.js';
4
+ import { isSupportedPlatform } from '../install/platform.js';
5
+ import { serviceBackend } from '../install/service-backend.js';
6
+ import { errorMessage } from '../util/error.js';
7
+ export const defaultDaemonControlRuntime = {
8
+ ...defaultDaemonHealthCheckRuntime,
9
+ platform: process.platform,
10
+ createService: serviceBackend,
11
+ hasServiceArtifacts: (service) => service.isInstalled(),
12
+ daemonHealth: () => daemonHealth(),
13
+ };
14
+ /** Resolves the installed managed service without printing command-specific guidance. */
15
+ export function resolveCaptureService(runtime = defaultDaemonControlRuntime) {
16
+ if (!isSupportedPlatform(runtime.platform)) {
17
+ return undefined;
18
+ }
19
+ const service = runtime.createService();
20
+ return runtime.hasServiceArtifacts(service) ? service : undefined;
21
+ }
22
+ /** Stops capture before disabling automatic restarts. */
23
+ export function pauseCaptureService(service) {
24
+ const before = service.status();
25
+ if (!before.loaded && before.disabled && !before.unknown) {
26
+ return { changed: false, state: before };
27
+ }
28
+ try {
29
+ service.stop();
30
+ service.disable();
31
+ }
32
+ catch (error) {
33
+ const state = service.status();
34
+ const unknown = state.unknown ? ', unknown: true' : '';
35
+ throw new Error(`Failed to pause capture: ${errorMessage(error)}. Actual service state: loaded: ${state.loaded}, disabled: ${state.disabled}${unknown}. Capture may restart at the next login.`);
36
+ }
37
+ const state = service.status();
38
+ if (!state.disabled || state.unknown) {
39
+ const unknown = state.unknown ? ', unknown: true' : '';
40
+ throw new Error(`Failed to pause capture: the service did not reach a proven disabled state. Actual service state: loaded: ${state.loaded}, disabled: ${state.disabled}${unknown}. Capture may restart at the next login.`);
41
+ }
42
+ return { changed: true, state };
43
+ }
44
+ function isFreshHeartbeat(heartbeat, previous) {
45
+ if (!heartbeat) {
46
+ return false;
47
+ }
48
+ if (!previous || heartbeat.pid !== previous.pid) {
49
+ return true;
50
+ }
51
+ return new Date(heartbeat.startedAt).getTime() > new Date(previous.startedAt).getTime();
52
+ }
53
+ /** Enables capture before starting the managed service. */
54
+ export function resumeCaptureService(service, runtime = defaultDaemonControlRuntime) {
55
+ const before = service.status();
56
+ const initialHealth = runtime.daemonHealth();
57
+ if (before.loaded && !before.disabled && !before.unknown && initialHealth.healthy) {
58
+ return { changed: false, state: before, health: initialHealth };
59
+ }
60
+ if (before.loaded && initialHealth.healthy) {
61
+ service.enable();
62
+ return { changed: true, state: service.status(), health: initialHealth };
63
+ }
64
+ if (!before.loaded && initialHealth.healthy) {
65
+ const pid = initialHealth.heartbeat?.pid ?? 'unknown';
66
+ throw new Error(`Refusing to resume: daemon pid ${pid} is running while the managed service is not loaded; stop that daemon before resuming.`);
67
+ }
68
+ service.enable();
69
+ service.start();
70
+ let health = initialHealth;
71
+ const healthy = waitForHealthyHeartbeat(() => {
72
+ health = runtime.daemonHealth();
73
+ return health.healthy && isFreshHeartbeat(health.heartbeat, initialHealth.heartbeat);
74
+ }, runtime);
75
+ if (!healthy) {
76
+ throw new Error(`Capture daemon did not become healthy within ${DAEMON_HEALTH_CHECK_DEADLINE_MS / 1000}s (${health.state}). Run \`elepha doctor\`.`);
77
+ }
78
+ return { changed: true, state: service.status(), health };
79
+ }
80
+ //# sourceMappingURL=capture-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-service.js","sourceRoot":"","sources":["../../src/cli/capture-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,336 @@
1
+ import { ClaudeCodeAdapter } from '../../adapters/claude-code.js';
2
+ import { CodexAdapter } from '../../adapters/codex.js';
3
+ import { gitRevParseShowToplevel, gitRootCommit } from '../../security/subprocess-allowlist.js';
4
+ import { applyCustomTitleBackfill, planCustomTitleBackfill } from '../../storage/custom-title-backfill.js';
5
+ import { openDb } from '../../storage/db.js';
6
+ import { applyFirstPromptSearchBackfill, planFirstPromptSearchBackfill, } from '../../storage/first-prompt-search-backfill.js';
7
+ import { applyRenderedCharsBackfill, planRenderedCharsBackfill } from '../../storage/rendered-chars-backfill.js';
8
+ import { applyRootCommitBackfill, planRootCommitBackfill } from '../../storage/root-commit-backfill.js';
9
+ import { applySessionFieldsBackfill, planSessionFieldsBackfill } from '../../storage/session-fields-backfill.js';
10
+ import { applySessionTitleBackfill, planSessionTitleBackfill } from '../../storage/session-title-backfill.js';
11
+ import { runDestructiveOp } from '../destructive-op.js';
12
+ export function registerBackfills(program) {
13
+ program
14
+ .command('backfill-root-commits', { hidden: true })
15
+ .description('Fill projects.git_root_commit for legacy project rows when their repository still resolves. No summarizer call; dry-run by default. Unresolvable rows stay NULL and are reported.')
16
+ .option('--apply', 'actually write git_root_commit after the preview (default is a dry run)')
17
+ .action(async (opts) => {
18
+ const db = openDb();
19
+ await runDestructiveOp({
20
+ applyRequested: opts.apply,
21
+ db,
22
+ operationLabel: 'backfill root commits',
23
+ plan: () => planRootCommitBackfill(db, gitRevParseShowToplevel, gitRootCommit),
24
+ describe: printRootCommitPlan,
25
+ isEmpty: (plan) => plan.changes.length === 0,
26
+ confirm: undefined,
27
+ messages: { dryRun: '\nDry run only - nothing was written. Re-run with --apply to store these root commits.' },
28
+ apply: () => {
29
+ const applied = applyRootCommitBackfill(db, gitRevParseShowToplevel, gitRootCommit);
30
+ console.log(`\nFilled git_root_commit for ${applied.changes.length} project(s).`);
31
+ if (applied.projectsUnresolvable > 0) {
32
+ console.log(`${applied.projectsUnresolvable} project(s) stay NULL because their repository cannot be resolved.`);
33
+ }
34
+ if (applied.projectsSkippedConcurrent > 0) {
35
+ console.warn(`${applied.projectsSkippedConcurrent} project(s) changed during the backfill and were left untouched; post-verification will report any remaining resolvable row.`);
36
+ }
37
+ },
38
+ verify: () => {
39
+ const verify = planRootCommitBackfill(db, gitRevParseShowToplevel, gitRootCommit);
40
+ if (verify.changes.length > 0) {
41
+ console.error(`VERIFICATION FAILED: ${verify.changes.length} resolvable project(s) still have no git_root_commit.`);
42
+ process.exitCode = 1;
43
+ return;
44
+ }
45
+ console.log('Verified: every resolvable project has a git_root_commit.');
46
+ if (verify.projectsUnresolvable > 0) {
47
+ console.log(`${verify.projectsUnresolvable} project(s) stay NULL because their repository cannot be resolved.`);
48
+ }
49
+ },
50
+ });
51
+ });
52
+ program
53
+ .command('backfill-rendered-chars', { hidden: true })
54
+ .description('Derive sessions.rendered_chars and sessions.rendered_turns from raw filtered turns on disk. No summarizer call; dry-run by default. ' +
55
+ 'Missing or unreadable transcripts stay NULL and are reported.')
56
+ .option('--apply', 'actually rewrite rendered_chars and rendered_turns after the preview (default is read-only)')
57
+ .action(async (opts) => {
58
+ const db = openDb();
59
+ const adapters = { 'claude-code': new ClaudeCodeAdapter(), codex: new CodexAdapter() };
60
+ await runDestructiveOp({
61
+ applyRequested: opts.apply,
62
+ db,
63
+ operationLabel: 'backfill rendered chars',
64
+ plan: () => planRenderedCharsBackfill(db, adapters),
65
+ describe: printRenderedCharsPlan,
66
+ isEmpty: (plan) => plan.changes.length === 0,
67
+ confirm: undefined,
68
+ messages: { dryRun: '\nDry run only - nothing was written. Re-run with --apply to store these exact counts.' },
69
+ apply: async () => {
70
+ const applied = await applyRenderedCharsBackfill(db, adapters);
71
+ console.log(`\nWrote rendered statistics for ${applied.changes.filter((change) => !change.transcriptMissing).length} session(s).`);
72
+ if (applied.sessionsSkippedConcurrent > 0) {
73
+ console.warn(`${applied.sessionsSkippedConcurrent} session(s) changed during the backfill and were left untouched; post-verification will report any remaining mismatch.`);
74
+ }
75
+ },
76
+ verify: async () => {
77
+ const verify = await planRenderedCharsBackfill(db, adapters);
78
+ const stillPending = verify.changes.filter((change) => !change.transcriptMissing);
79
+ if (stillPending.length > 0) {
80
+ console.error(`VERIFICATION FAILED: ${stillPending.length} readable session(s) still differ from the renderer.`);
81
+ process.exitCode = 1;
82
+ return;
83
+ }
84
+ console.log('Verified: every readable session matches the raw-turn renderer.');
85
+ if (verify.sessionsMissingTranscript > 0) {
86
+ console.log(`${verify.sessionsMissingTranscript} session(s) stay NULL because their transcript is unavailable.`);
87
+ }
88
+ },
89
+ });
90
+ });
91
+ program
92
+ .command('backfill-first-prompt-search', { hidden: true })
93
+ .description("Derive sessions.first_prompt_search from each segment's first stored user turn. No provider call; dry-run by default. " +
94
+ 'Rows stay body-unsearchable by elepha:query until this backfill succeeds; unavailable transcripts stay NULL and are reported.')
95
+ .option('--apply', 'actually write first_prompt_search after the preview (default is a dry run)')
96
+ .action(async (opts) => {
97
+ const db = openDb();
98
+ const adapters = { 'claude-code': new ClaudeCodeAdapter(), codex: new CodexAdapter() };
99
+ await runDestructiveOp({
100
+ applyRequested: opts.apply,
101
+ db,
102
+ operationLabel: 'backfill first prompt search',
103
+ plan: () => planFirstPromptSearchBackfill(db, adapters),
104
+ describe: printFirstPromptSearchPlan,
105
+ isEmpty: (plan) => plan.changes.length === 0,
106
+ confirm: undefined,
107
+ messages: {
108
+ dryRun: '\nDry run only - nothing was written. Re-run with --apply to make these rows body-searchable.',
109
+ },
110
+ apply: async () => {
111
+ const applied = await applyFirstPromptSearchBackfill(db, adapters);
112
+ console.log(`Wrote first_prompt_search for ${applied.changes.filter((change) => !change.transcriptMissing).length} session(s).`);
113
+ },
114
+ verify: async () => {
115
+ const verify = await planFirstPromptSearchBackfill(db, adapters);
116
+ const stillPending = verify.changes.filter((change) => !change.transcriptMissing);
117
+ if (stillPending.length > 0) {
118
+ console.error(`VERIFICATION FAILED: ${stillPending.length} readable session(s) still differ from their first stored prompt.`);
119
+ process.exitCode = 1;
120
+ return;
121
+ }
122
+ console.log('Verified: every readable segment has its derived first_prompt_search.');
123
+ if (verify.sessionsMissingTranscript > 0) {
124
+ console.log(`${verify.sessionsMissingTranscript} session(s) stay body-unsearchable because their transcript is unavailable.`);
125
+ }
126
+ },
127
+ });
128
+ });
129
+ program
130
+ .command('backfill-session-titles', { hidden: true })
131
+ .description('Derive each stored segment title from its ai-title or first real prompt. No provider call; dry-run by default. Missing transcripts stay unchanged and are reported.')
132
+ .option('--apply', 'actually write titles after the preview (default is a dry run)')
133
+ .action(async (opts) => {
134
+ const db = openDb();
135
+ const adapters = { 'claude-code': new ClaudeCodeAdapter(), codex: new CodexAdapter() };
136
+ await runDestructiveOp({
137
+ applyRequested: opts.apply,
138
+ db,
139
+ operationLabel: 'backfill session titles',
140
+ plan: () => planSessionTitleBackfill(db, adapters),
141
+ describe: printSessionTitlePlan,
142
+ isEmpty: (plan) => plan.changes.length === 0,
143
+ confirm: undefined,
144
+ messages: { dryRun: '\nDry run only - nothing was written. Re-run with --apply to store these exact titles.' },
145
+ apply: async () => {
146
+ const applied = await applySessionTitleBackfill(db, adapters);
147
+ console.log(`Wrote titles for ${applied.changes.filter((change) => !change.transcriptMissing).length} session(s).`);
148
+ },
149
+ verify: async () => {
150
+ const verify = await planSessionTitleBackfill(db, adapters);
151
+ const stillPending = verify.changes.filter((change) => !change.transcriptMissing);
152
+ if (stillPending.length > 0) {
153
+ console.error(`VERIFICATION FAILED: ${stillPending.length} readable session(s) still differ from their derived segment title.`);
154
+ process.exitCode = 1;
155
+ return;
156
+ }
157
+ console.log('Verified: every readable segment has its derived stored title.');
158
+ },
159
+ });
160
+ });
161
+ program
162
+ .command('backfill-custom-titles', { hidden: true })
163
+ .description('Capture Claude Code custom-title UI events into sessions.custom_title. Dry-run by default; does not touch turns or rendered_chars.')
164
+ .option('--apply', 'actually write custom_title after the preview (default is a dry run)')
165
+ .action(async (opts) => {
166
+ const db = openDb();
167
+ const adapters = { 'claude-code': new ClaudeCodeAdapter(), codex: new CodexAdapter() };
168
+ await runDestructiveOp({
169
+ applyRequested: opts.apply,
170
+ db,
171
+ operationLabel: 'backfill custom titles',
172
+ plan: () => planCustomTitleBackfill(db, adapters),
173
+ describe: printCustomTitlePlan,
174
+ isEmpty: (plan) => plan.changes.length === 0,
175
+ confirm: undefined,
176
+ messages: { dryRun: '\nDry run only - nothing was written. Re-run with --apply to store these exact titles.' },
177
+ apply: async () => {
178
+ const applied = await applyCustomTitleBackfill(db, adapters);
179
+ console.log(`Wrote custom_title for ${applied.changes.filter((change) => !change.transcriptMissing).length} session(s).`);
180
+ },
181
+ verify: async () => {
182
+ const verify = await planCustomTitleBackfill(db, adapters);
183
+ const stillPending = verify.changes.filter((change) => !change.transcriptMissing);
184
+ if (stillPending.length > 0) {
185
+ console.error(`VERIFICATION FAILED: ${stillPending.length} readable session(s) still differ from their transcript title.`);
186
+ process.exitCode = 1;
187
+ return;
188
+ }
189
+ console.log('Verified: every readable session matches its captured custom title.');
190
+ },
191
+ });
192
+ });
193
+ program
194
+ .command('backfill-session-fields', { hidden: true })
195
+ .description('Re-derive sessions.surface/git_branch/kind/trailing_branch/trailing_files and memories.has_external_content ' +
196
+ 'from transcripts still on disk, for rows written before this capture existed. Structural only - no summarizer call. Dry-run by default.')
197
+ .option('--apply', 'actually rewrite the affected fields (default is a dry run that only prints them)')
198
+ .action(async (opts) => {
199
+ const db = openDb();
200
+ const adapters = { 'claude-code': new ClaudeCodeAdapter(), codex: new CodexAdapter() };
201
+ await runDestructiveOp({
202
+ applyRequested: opts.apply,
203
+ db,
204
+ operationLabel: 'backfill session fields',
205
+ plan: () => planSessionFieldsBackfill(db, adapters),
206
+ describe: printSessionFieldsPlan,
207
+ isEmpty: (plan) => plan.changes.length === 0,
208
+ confirm: undefined,
209
+ messages: { dryRun: '\nDry run only - nothing was written. Re-run with --apply to rewrite these fields.' },
210
+ apply: async () => {
211
+ const applied = await applySessionFieldsBackfill(db, adapters);
212
+ console.log(`Rewrote fields for ${applied.changes.length} session(s).`);
213
+ },
214
+ verify: async () => {
215
+ const verify = await planSessionFieldsBackfill(db, adapters);
216
+ // A session whose transcript is permanently missing is reported every
217
+ // run (see session-fields-backfill.ts) so the operator can see it -
218
+ // that is not a pending change apply() could have applied, so it must
219
+ // not fail verification forever. Only a session whose fields could
220
+ // actually be rewritten but still differ counts as a real failure.
221
+ const stillPending = verify.changes.filter((c) => !c.transcriptMissing);
222
+ if (stillPending.length > 0) {
223
+ console.error(`\nVERIFICATION FAILED: ${stillPending.length} session(s) still show a pending change after apply.`);
224
+ process.exitCode = 1;
225
+ return;
226
+ }
227
+ console.log('Verified: no session shows a pending schema-field change.');
228
+ const missingCount = verify.changes.filter((c) => c.transcriptMissing).length;
229
+ if (missingCount > 0) {
230
+ console.log(`(${missingCount} session(s) have no transcript on disk and stay NULL - not counted as pending.)`);
231
+ }
232
+ },
233
+ });
234
+ });
235
+ }
236
+ function printRootCommitPlan(plan) {
237
+ if (plan.changes.length === 0) {
238
+ console.log(`No resolvable project needs a git_root_commit (${plan.projectsScanned} NULL row(s) scanned).`);
239
+ }
240
+ else {
241
+ console.log('The following project root commits would be written:\n');
242
+ for (const change of plan.changes) {
243
+ console.log(` [${change.projectId}] ${change.path} -> ${change.gitRootCommit}`);
244
+ }
245
+ }
246
+ if (plan.projectsUnresolvable > 0) {
247
+ console.log(`${plan.projectsUnresolvable} project(s) cannot be resolved and will stay NULL.`);
248
+ }
249
+ }
250
+ function printFirstPromptSearchPlan(plan) {
251
+ if (plan.changes.length === 0) {
252
+ console.log(`Every session already has its derived first_prompt_search (${plan.sessionsScanned} scanned).`);
253
+ return;
254
+ }
255
+ console.log('The following first-prompt search documents would be written:\n');
256
+ for (const change of plan.changes) {
257
+ console.log(` [${change.sessionId}] ${change.tool}:${change.nativeId}`);
258
+ if (change.transcriptMissing) {
259
+ console.log(` transcript unavailable; row stays body-unsearchable: ${change.sourcePath}`);
260
+ }
261
+ else {
262
+ console.log(` first_prompt_search: ${change.before ?? 'NULL'} -> ${change.after ?? 'NULL'}`);
263
+ }
264
+ }
265
+ console.log(`\n${plan.changes.length} session(s) of ${plan.sessionsScanned} scanned; ${plan.sessionsMissingTranscript} transcript(s) unavailable and left body-unsearchable.`);
266
+ }
267
+ function printSessionFieldsPlan(plan) {
268
+ if (plan.changes.length === 0) {
269
+ console.log(`No session needs a schema-field update (${plan.sessionsScanned} scanned, ${plan.sessionsMissingTranscript} missing transcript).`);
270
+ return;
271
+ }
272
+ console.log('The following sessions would be updated:\n');
273
+ for (const c of plan.changes) {
274
+ console.log(` [${c.sessionId}] ${c.nativeId} (${c.tool})${c.transcriptMissing ? ' [transcript missing - fields stay NULL]' : ''}`);
275
+ console.log(` surface: ${c.before.surface ?? 'NULL'} -> ${c.after.surface ?? 'NULL'}`);
276
+ console.log(` git_branch: ${c.before.git_branch ?? 'NULL'} -> ${c.after.git_branch ?? 'NULL'}`);
277
+ console.log(` kind: ${c.before.kind ?? 'NULL'} -> ${c.after.kind ?? 'NULL'}`);
278
+ console.log(` trailing_branch: ${c.before.trailing_branch ?? 'NULL'} -> ${c.after.trailing_branch ?? 'NULL'}`);
279
+ if (c.memoryFlagsChanged > 0) {
280
+ console.log(` has_external_content: ${c.memoryFlagsChanged} turn(s) flip`);
281
+ }
282
+ }
283
+ console.log(`\n${plan.changes.length} session(s) of ${plan.sessionsScanned} scanned (${plan.sessionsMissingTranscript} missing transcript, left NULL).`);
284
+ }
285
+ function printRenderedCharsPlan(plan) {
286
+ if (plan.changes.length === 0) {
287
+ console.log(`Every session already has current rendered statistics (${plan.sessionsScanned} scanned).`);
288
+ return;
289
+ }
290
+ console.log('The following rendered statistics would be written:\n');
291
+ for (const change of plan.changes) {
292
+ const result = change.transcriptMissing
293
+ ? 'NULL [transcript unavailable]'
294
+ : `${change.renderedChars} chars, ${change.renderedTurns} turns`;
295
+ console.log(` [${change.sessionId}] ${change.tool}:${change.nativeId} ${change.beforeRenderedChars ?? 'NULL'} chars, ${change.beforeRenderedTurns ?? 'NULL'} turns -> ${result}`);
296
+ if (change.transcriptMissing) {
297
+ console.log(` ${change.sourcePath}`);
298
+ }
299
+ }
300
+ console.log(`\n${plan.changes.length} session(s) of ${plan.sessionsScanned} scanned; ${plan.sessionsMissingTranscript} transcript(s) unavailable and left NULL.`);
301
+ }
302
+ function printCustomTitlePlan(plan) {
303
+ if (plan.changes.length === 0) {
304
+ console.log(`No session needs a custom_title update (${plan.sessionsScanned} scanned).`);
305
+ return;
306
+ }
307
+ console.log('The following session titles would be updated:\n');
308
+ for (const change of plan.changes) {
309
+ console.log(` [${change.sessionId}] ${change.tool}:${change.nativeId}`);
310
+ if (change.transcriptMissing) {
311
+ console.log(` transcript unavailable: ${change.sourcePath}`);
312
+ }
313
+ else {
314
+ console.log(` custom_title: ${change.before ?? 'NULL'} -> ${change.after ?? 'NULL'}`);
315
+ }
316
+ }
317
+ console.log(`\n${plan.changes.length} session(s) of ${plan.sessionsScanned} scanned; ${plan.sessionsMissingTranscript} transcript(s) unavailable.`);
318
+ }
319
+ function printSessionTitlePlan(plan) {
320
+ if (plan.changes.length === 0) {
321
+ console.log(`Every session already has its derived title (${plan.sessionsScanned} scanned).`);
322
+ return;
323
+ }
324
+ console.log('The following segment titles would be written:\n');
325
+ for (const change of plan.changes) {
326
+ console.log(` [${change.sessionId}] ${change.tool}:${change.nativeId}`);
327
+ if (change.transcriptMissing) {
328
+ console.log(` transcript unavailable: ${change.sourcePath}`);
329
+ }
330
+ else {
331
+ console.log(` title: ${change.before ?? 'NULL'} -> ${change.after ?? 'NULL'}`);
332
+ }
333
+ }
334
+ console.log(`\n${plan.changes.length} session(s) of ${plan.sessionsScanned} scanned; ${plan.sessionsMissingTranscript} transcript(s) unavailable.`);
335
+ }
336
+ //# sourceMappingURL=backfills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfills.js","sourceRoot":"","sources":["../../../src/cli/commands/backfills.ts"],"names":[],"mappings":"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"}