elepha 0.1.0 → 0.2.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/package.json +1 -2
- package/dist/install/daemon-service.js +0 -309
- package/dist/install/daemon-service.js.map +0 -1
- package/dist/mcp/tools/get-context.js +0 -3
- package/dist/mcp/tools/get-context.js.map +0 -1
- package/dist/mcp/tools/list-projects.js +0 -3
- package/dist/mcp/tools/list-projects.js.map +0 -1
- package/dist/mcp/tools/save-memory.js +0 -3
- package/dist/mcp/tools/save-memory.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "elepha",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Local memory layer for developers switching between AI coding CLIs",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude-code",
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
"coding-agent",
|
|
9
9
|
"ai-memory",
|
|
10
10
|
"agent-memory",
|
|
11
|
-
"agent-memory",
|
|
12
11
|
"session-memory",
|
|
13
12
|
"session-history",
|
|
14
13
|
"context-management",
|
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, realpathSync, statSync, unlinkSync } from 'node:fs';
|
|
2
|
-
import { homedir } from 'node:os';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { DAEMON_BOOTOUT_DEADLINE_MS, DAEMON_HEALTH_CHECK_DEADLINE_MS, DAEMON_HEALTH_CHECK_POLL_MS, DAEMON_OUTPUT_MAX_CHARS, DAEMON_STATE_CHECK_ATTEMPTS, DAEMON_STDERR_TAIL_CHARS, PLIST_PATH, PLIST_THROTTLE_INTERVAL_SECONDS, PLIST_UMASK, PRIVATE_DIR_MODE, PRIVATE_FILE_MODE, } from '../config/constants.js';
|
|
5
|
-
import { elephaPaths, elephaServiceLabel } from '../config/paths.js';
|
|
6
|
-
import { clearHeartbeat, HEARTBEAT_STALE_MS, isPidAlive, readHeartbeat } from '../daemon/heartbeat.js';
|
|
7
|
-
import { launchctl } from '../security/subprocess-allowlist.js';
|
|
8
|
-
import { atomicWrite, readJson } from '../util/fs.js';
|
|
9
|
-
import { launcherHash } from './launcher.js';
|
|
10
|
-
const PLIST_PROPAGATED_ENV = [
|
|
11
|
-
'ELEPHA_HOME',
|
|
12
|
-
'ELEPHA_DB_PATH',
|
|
13
|
-
'ELEPHA_ENV_FILE',
|
|
14
|
-
'CLAUDE_CONFIG_DIR',
|
|
15
|
-
'CODEX_HOME',
|
|
16
|
-
'ELEPHA_CLAUDE_MCP_PATH',
|
|
17
|
-
];
|
|
18
|
-
const defaultDaemonHealthCheckRuntime = {
|
|
19
|
-
now: () => Date.now(),
|
|
20
|
-
sleep(milliseconds) {
|
|
21
|
-
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, milliseconds);
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
export function defaultDaemonServicePaths(home = homedir()) {
|
|
25
|
-
const elepha = elephaPaths(home);
|
|
26
|
-
const label = elephaServiceLabel();
|
|
27
|
-
return {
|
|
28
|
-
home,
|
|
29
|
-
label,
|
|
30
|
-
launcher: elepha.launcher,
|
|
31
|
-
plist: elepha.launchAgent,
|
|
32
|
-
state: elepha.installState,
|
|
33
|
-
transaction: elepha.installTransaction,
|
|
34
|
-
heartbeat: elepha.heartbeat,
|
|
35
|
-
stdout: elepha.stdout,
|
|
36
|
-
stderr: elepha.stderr,
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
export function serviceDomain(uid = process.getuid?.()) {
|
|
40
|
-
if (typeof uid !== 'number') {
|
|
41
|
-
throw new Error('launchd requires a numeric user id');
|
|
42
|
-
}
|
|
43
|
-
return `gui/${uid}`;
|
|
44
|
-
}
|
|
45
|
-
export function serviceTarget(uid = process.getuid?.(), label = elephaServiceLabel()) {
|
|
46
|
-
return `${serviceDomain(uid)}/${label}`;
|
|
47
|
-
}
|
|
48
|
-
function xml(value) {
|
|
49
|
-
return value.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>');
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Absolute, symlink-free form of an install path. The plist hash is compared
|
|
53
|
-
* against the manifest on every install, so a path must render identically
|
|
54
|
-
* whether the installing shell expressed it relative, through a symlink, or
|
|
55
|
-
* physically; otherwise each shell triggers a spurious rewrite and restart.
|
|
56
|
-
* A leaf that does not exist yet resolves through its nearest existing
|
|
57
|
-
* ancestor, which is what it will resolve to once created.
|
|
58
|
-
*/
|
|
59
|
-
export function physicalInstallPath(candidate) {
|
|
60
|
-
const absolute = path.resolve(candidate);
|
|
61
|
-
try {
|
|
62
|
-
return realpathSync(absolute);
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
const parent = path.dirname(absolute);
|
|
66
|
-
return parent === absolute ? absolute : path.join(physicalInstallPath(parent), path.basename(absolute));
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* The launchd process starts with a minimal environment. Propagate only
|
|
71
|
-
* location overrides needed to keep an explicitly isolated install together;
|
|
72
|
-
* secrets remain in the daemon's isolated .env file and never enter a plist.
|
|
73
|
-
* Values are rendered physical and absolute so the plist hash does not depend
|
|
74
|
-
* on how the installing shell spelled them.
|
|
75
|
-
*/
|
|
76
|
-
export function managedPlistEnvironment(environment = process.env) {
|
|
77
|
-
return PLIST_PROPAGATED_ENV.flatMap((key) => {
|
|
78
|
-
const value = environment[key]?.trim();
|
|
79
|
-
return value ? [[key, physicalInstallPath(value)]] : [];
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
/** Deterministic plist with no Node/package/repository path. */
|
|
83
|
-
export function renderDaemonPlist(paths, environment = process.env) {
|
|
84
|
-
const string = (value) => `<string>${xml(value)}</string>`;
|
|
85
|
-
const physical = (value) => string(physicalInstallPath(value));
|
|
86
|
-
const overrides = managedPlistEnvironment(environment)
|
|
87
|
-
.map(([key, value]) => `<key>${xml(key)}</key>${string(value)}`)
|
|
88
|
-
.join('');
|
|
89
|
-
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
90
|
-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
91
|
-
<plist version="1.0"><dict>
|
|
92
|
-
<key>Label</key>${string(paths.label)}
|
|
93
|
-
<key>ProgramArguments</key><array>${physical(paths.launcher)}${string('start')}</array>
|
|
94
|
-
<key>WorkingDirectory</key>${physical(paths.home)}
|
|
95
|
-
<key>RunAtLoad</key><true/>
|
|
96
|
-
<key>KeepAlive</key><dict><key>SuccessfulExit</key><false/></dict>
|
|
97
|
-
<key>ThrottleInterval</key><integer>${PLIST_THROTTLE_INTERVAL_SECONDS}</integer>
|
|
98
|
-
<key>ProcessType</key>${string('Background')}
|
|
99
|
-
<key>Umask</key><integer>${PLIST_UMASK}</integer>
|
|
100
|
-
<key>StandardOutPath</key>${physical(paths.stdout)}
|
|
101
|
-
<key>StandardErrorPath</key>${physical(paths.stderr)}
|
|
102
|
-
<key>EnvironmentVariables</key><dict><key>HOME</key>${physical(paths.home)}<key>PATH</key>${string(PLIST_PATH)}<key>ELEPHA_SERVICE</key>${string('1')}${overrides}</dict>
|
|
103
|
-
</dict></plist>
|
|
104
|
-
`;
|
|
105
|
-
}
|
|
106
|
-
export function readServiceManifest(file) {
|
|
107
|
-
const manifest = readJson(file);
|
|
108
|
-
return manifest?.version === 1 ? manifest : undefined;
|
|
109
|
-
}
|
|
110
|
-
export function serviceArtifactsMatch(paths) {
|
|
111
|
-
const manifest = readServiceManifest(paths.state);
|
|
112
|
-
if (!manifest || !existsSync(paths.launcher) || !existsSync(paths.plist)) {
|
|
113
|
-
return false;
|
|
114
|
-
}
|
|
115
|
-
return (launcherHash(readFileSync(paths.launcher, 'utf8')) === manifest.launcherHash &&
|
|
116
|
-
launcherHash(readFileSync(paths.plist, 'utf8')) === manifest.plistHash &&
|
|
117
|
-
(statSync(paths.launcher).mode & 0o777) === manifest.launcherMode &&
|
|
118
|
-
(statSync(paths.plist).mode & 0o777) === manifest.plistMode);
|
|
119
|
-
}
|
|
120
|
-
export class DaemonService {
|
|
121
|
-
paths;
|
|
122
|
-
executor;
|
|
123
|
-
uid;
|
|
124
|
-
healthCheck;
|
|
125
|
-
lastBootstrapAttempt;
|
|
126
|
-
constructor(paths = defaultDaemonServicePaths(), executor = { run: launchctl }, uid = process.getuid?.(), healthCheck = defaultDaemonHealthCheckRuntime) {
|
|
127
|
-
this.paths = paths;
|
|
128
|
-
this.executor = executor;
|
|
129
|
-
this.uid = uid;
|
|
130
|
-
this.healthCheck = healthCheck;
|
|
131
|
-
}
|
|
132
|
-
target() {
|
|
133
|
-
return serviceTarget(this.uid, this.paths.label);
|
|
134
|
-
}
|
|
135
|
-
isLoaded() {
|
|
136
|
-
return this.executor.run(['print', this.target()]).status === 0;
|
|
137
|
-
}
|
|
138
|
-
isDisabled() {
|
|
139
|
-
const result = this.executor.run(['print-disabled', serviceDomain(this.uid)]);
|
|
140
|
-
return result.status === 0 && new RegExp(`\\"${this.paths.label}\\"\\s*=>\\s*true`).test(result.stdout);
|
|
141
|
-
}
|
|
142
|
-
state() {
|
|
143
|
-
return { loaded: this.isLoaded(), disabled: this.isDisabled() };
|
|
144
|
-
}
|
|
145
|
-
reachesDisabledOrAbsent() {
|
|
146
|
-
return this.isDisabled() || !this.isLoaded();
|
|
147
|
-
}
|
|
148
|
-
waitFor(condition) {
|
|
149
|
-
// launchctl applies these per-user state changes synchronously in the
|
|
150
|
-
// normal case. Re-reading a bounded number of times still covers the
|
|
151
|
-
// short propagation window without turning lifecycle calls into an
|
|
152
|
-
// unbounded wait.
|
|
153
|
-
for (let attempt = 0; attempt < DAEMON_STATE_CHECK_ATTEMPTS; attempt++) {
|
|
154
|
-
if (condition()) {
|
|
155
|
-
return true;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
return false;
|
|
159
|
-
}
|
|
160
|
-
boundedOutput(output) {
|
|
161
|
-
const sanitized = output.replace(/\p{Cc}/gu, ' ').trim();
|
|
162
|
-
if (sanitized.length <= DAEMON_OUTPUT_MAX_CHARS) {
|
|
163
|
-
return sanitized;
|
|
164
|
-
}
|
|
165
|
-
return `[${sanitized.length - DAEMON_OUTPUT_MAX_CHARS} older characters omitted] ${sanitized.slice(-DAEMON_OUTPUT_MAX_CHARS)}`;
|
|
166
|
-
}
|
|
167
|
-
formatLaunchctlResult(args, result) {
|
|
168
|
-
const stderr = this.boundedOutput(result.stderr);
|
|
169
|
-
const stdout = this.boundedOutput(result.stdout);
|
|
170
|
-
return `launchctl ${args.join(' ')} (status ${result.status}; stderr: ${stderr || 'no stderr'}; stdout: ${stdout || 'no stdout'})`;
|
|
171
|
-
}
|
|
172
|
-
launchctlFailure(args, result, details = []) {
|
|
173
|
-
return new Error(`${this.formatLaunchctlResult(args, result)} failed${details.length > 0 ? `; ${details.join('; ')}` : ''}`);
|
|
174
|
-
}
|
|
175
|
-
stop() {
|
|
176
|
-
if (!this.isLoaded()) {
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
const result = this.executor.run(['bootout', this.target()]);
|
|
180
|
-
const deadline = this.healthCheck.now() + DAEMON_BOOTOUT_DEADLINE_MS;
|
|
181
|
-
while (this.isLoaded()) {
|
|
182
|
-
const remaining = deadline - this.healthCheck.now();
|
|
183
|
-
if (remaining <= 0) {
|
|
184
|
-
if (result.status !== 0) {
|
|
185
|
-
throw new Error('launchctl bootout failed');
|
|
186
|
-
}
|
|
187
|
-
throw new Error('launchctl bootout did not unload the service within 20s');
|
|
188
|
-
}
|
|
189
|
-
this.healthCheck.sleep(Math.min(DAEMON_HEALTH_CHECK_POLL_MS, remaining));
|
|
190
|
-
}
|
|
191
|
-
clearHeartbeat(this.paths.heartbeat);
|
|
192
|
-
}
|
|
193
|
-
disable() {
|
|
194
|
-
if (this.isDisabled()) {
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
const result = this.executor.run(['disable', this.target()]);
|
|
198
|
-
// A preceding bootout can make `launchctl disable` report a nonzero
|
|
199
|
-
// target lookup even though the effective safe state is already absent.
|
|
200
|
-
// State, not that idempotent mutation exit, is the contract.
|
|
201
|
-
if (!this.waitFor(() => this.reachesDisabledOrAbsent())) {
|
|
202
|
-
throw this.launchctlFailure(['disable', this.target()], result);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
enable() {
|
|
206
|
-
const result = this.executor.run(['enable', this.target()]);
|
|
207
|
-
if (result.status !== 0 || this.isDisabled()) {
|
|
208
|
-
throw this.launchctlFailure(['enable', this.target()], result);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
bootstrap() {
|
|
212
|
-
const target = this.target();
|
|
213
|
-
const args = ['bootstrap', serviceDomain(this.uid), this.paths.plist];
|
|
214
|
-
const before = this.executor.run(['print', target]);
|
|
215
|
-
if (before.status === 0) {
|
|
216
|
-
this.lastBootstrapAttempt = { args, print: before };
|
|
217
|
-
return;
|
|
218
|
-
}
|
|
219
|
-
const result = this.executor.run(args);
|
|
220
|
-
const print = this.executor.run(['print', target]);
|
|
221
|
-
this.lastBootstrapAttempt = { args, result, print };
|
|
222
|
-
if (result.status !== 0 || print.status !== 0) {
|
|
223
|
-
throw this.launchctlFailure(args, result, [
|
|
224
|
-
`post-bootstrap ${this.formatLaunchctlResult(['print', target], print)} ${print.status === 0 ? 'found service' : 'did not find service'}`,
|
|
225
|
-
]);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
writeArtifacts(launcher, backend) {
|
|
229
|
-
const plist = renderDaemonPlist(this.paths);
|
|
230
|
-
atomicWrite(this.paths.launcher, launcher, PRIVATE_DIR_MODE);
|
|
231
|
-
atomicWrite(this.paths.plist, plist, PRIVATE_FILE_MODE);
|
|
232
|
-
const manifest = {
|
|
233
|
-
version: 1,
|
|
234
|
-
backend,
|
|
235
|
-
launcherHash: launcherHash(launcher),
|
|
236
|
-
launcherMode: PRIVATE_DIR_MODE,
|
|
237
|
-
plistHash: launcherHash(plist),
|
|
238
|
-
plistMode: PRIVATE_FILE_MODE,
|
|
239
|
-
};
|
|
240
|
-
atomicWrite(this.paths.state, `${JSON.stringify(manifest)}\n`, PRIVATE_FILE_MODE);
|
|
241
|
-
}
|
|
242
|
-
removeArtifacts() {
|
|
243
|
-
for (const file of [this.paths.state, this.paths.plist, this.paths.launcher]) {
|
|
244
|
-
if (existsSync(file)) {
|
|
245
|
-
unlinkSync(file);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
healthyHeartbeat() {
|
|
250
|
-
const heartbeat = readHeartbeat(this.paths.heartbeat);
|
|
251
|
-
return (!!heartbeat &&
|
|
252
|
-
isPidAlive(heartbeat.pid) &&
|
|
253
|
-
this.healthCheck.now() - new Date(heartbeat.updatedAt).getTime() < HEARTBEAT_STALE_MS);
|
|
254
|
-
}
|
|
255
|
-
/** Wait for launchd's launcher and daemon to produce a fresh healthy heartbeat. */
|
|
256
|
-
waitForHealthyHeartbeat() {
|
|
257
|
-
const deadline = this.healthCheck.now() + DAEMON_HEALTH_CHECK_DEADLINE_MS;
|
|
258
|
-
while (true) {
|
|
259
|
-
if (this.healthyHeartbeat()) {
|
|
260
|
-
return true;
|
|
261
|
-
}
|
|
262
|
-
const remaining = deadline - this.healthCheck.now();
|
|
263
|
-
if (remaining <= 0) {
|
|
264
|
-
return false;
|
|
265
|
-
}
|
|
266
|
-
this.healthCheck.sleep(Math.min(DAEMON_HEALTH_CHECK_POLL_MS, remaining));
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
heartbeatFailure() {
|
|
270
|
-
const bootstrap = this.lastBootstrapAttempt;
|
|
271
|
-
const bootstrapDetail = bootstrap
|
|
272
|
-
? bootstrap.result
|
|
273
|
-
? this.formatLaunchctlResult(bootstrap.args, bootstrap.result)
|
|
274
|
-
: `launchctl ${bootstrap.args.join(' ')} skipped because the service was already loaded`
|
|
275
|
-
: 'launchctl bootstrap was not attempted';
|
|
276
|
-
const printDetail = bootstrap
|
|
277
|
-
? `post-bootstrap ${this.formatLaunchctlResult(['print', this.target()], bootstrap.print)} ${bootstrap.print.status === 0 ? 'found service' : 'did not find service'}`
|
|
278
|
-
: `post-bootstrap launchctl print ${this.target()} was not recorded`;
|
|
279
|
-
let stderrTail = 'no daemon stderr log';
|
|
280
|
-
if (existsSync(this.paths.stderr)) {
|
|
281
|
-
try {
|
|
282
|
-
const stderr = readFileSync(this.paths.stderr, 'utf8');
|
|
283
|
-
stderrTail = this.boundedOutput(stderr.slice(-DAEMON_STDERR_TAIL_CHARS)) || 'empty daemon stderr log';
|
|
284
|
-
}
|
|
285
|
-
catch (error) {
|
|
286
|
-
stderrTail = `unreadable daemon stderr log: ${this.boundedOutput(String(error)) || 'unknown error'}`;
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
return new Error(`capture service did not produce a healthy heartbeat within ${DAEMON_HEALTH_CHECK_DEADLINE_MS / 1000}s; ${bootstrapDetail}; ${printDetail}; daemon stderr log tail: ${stderrTail}`);
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
/** Called after consent mutations; absent service is intentionally a no-op. */
|
|
293
|
-
export function reconcileCaptureService(service, approvedRoots) {
|
|
294
|
-
if (!serviceArtifactsMatch(service.paths)) {
|
|
295
|
-
return 'not installed';
|
|
296
|
-
}
|
|
297
|
-
if (approvedRoots === 0) {
|
|
298
|
-
service.stop();
|
|
299
|
-
service.disable();
|
|
300
|
-
return 'awaiting consent';
|
|
301
|
-
}
|
|
302
|
-
service.enable();
|
|
303
|
-
service.bootstrap();
|
|
304
|
-
if (!service.waitForHealthyHeartbeat()) {
|
|
305
|
-
throw service.heartbeatFailure();
|
|
306
|
-
}
|
|
307
|
-
return 'active';
|
|
308
|
-
}
|
|
309
|
-
//# sourceMappingURL=daemon-service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-service.js","sourceRoot":"","sources":["../../src/install/daemon-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-context.js","sourceRoot":"","sources":["../../../src/mcp/tools/get-context.ts"],"names":[],"mappings":"AAAA,uDAAuD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list-projects.js","sourceRoot":"","sources":["../../../src/mcp/tools/list-projects.ts"],"names":[],"mappings":"AAAA,kBAAkB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"save-memory.js","sourceRoot":"","sources":["../../../src/mcp/tools/save-memory.ts"],"names":[],"mappings":"AAAA,4BAA4B"}
|