@fentz26/envcp 1.1.0 → 1.2.0-exp.8d5b91b
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/README.md +65 -421
- package/VERSION +1 -0
- package/dist/adapters/base.d.ts +31 -3
- package/dist/adapters/base.d.ts.map +1 -1
- package/dist/adapters/base.js +235 -26
- package/dist/adapters/base.js.map +1 -1
- package/dist/adapters/gemini.d.ts +1 -1
- package/dist/adapters/gemini.d.ts.map +1 -1
- package/dist/adapters/gemini.js +12 -7
- package/dist/adapters/gemini.js.map +1 -1
- package/dist/adapters/openai.d.ts +1 -1
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +14 -9
- package/dist/adapters/openai.js.map +1 -1
- package/dist/adapters/rest.d.ts +3 -1
- package/dist/adapters/rest.d.ts.map +1 -1
- package/dist/adapters/rest.js +99 -15
- package/dist/adapters/rest.js.map +1 -1
- package/dist/cli/index.js +678 -138
- package/dist/cli/index.js.map +1 -1
- package/dist/config/config-guard.d.ts.map +1 -1
- package/dist/config/config-guard.js +3 -2
- package/dist/config/config-guard.js.map +1 -1
- package/dist/config/config-hmac.d.ts +5 -0
- package/dist/config/config-hmac.d.ts.map +1 -0
- package/dist/config/config-hmac.js +29 -0
- package/dist/config/config-hmac.js.map +1 -0
- package/dist/config/manager.d.ts +20 -2
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +103 -26
- package/dist/config/manager.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +8 -4
- package/dist/mcp/server.js.map +1 -1
- package/dist/server/unified.d.ts +4 -1
- package/dist/server/unified.d.ts.map +1 -1
- package/dist/server/unified.js +108 -39
- package/dist/server/unified.js.map +1 -1
- package/dist/service/config.d.ts +21 -0
- package/dist/service/config.d.ts.map +1 -0
- package/dist/service/config.js +94 -0
- package/dist/service/config.js.map +1 -0
- package/dist/service/generators.d.ts +14 -0
- package/dist/service/generators.d.ts.map +1 -0
- package/dist/service/generators.js +92 -0
- package/dist/service/generators.js.map +1 -0
- package/dist/service/index.d.ts +23 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +215 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/platform.d.ts +5 -0
- package/dist/service/platform.d.ts.map +1 -0
- package/dist/service/platform.js +25 -0
- package/dist/service/platform.js.map +1 -0
- package/dist/storage/index.d.ts +52 -10
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +350 -31
- package/dist/storage/index.js.map +1 -1
- package/dist/types.d.ts +574 -14
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +79 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/crypto.d.ts +9 -0
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js +88 -19
- package/dist/utils/crypto.js.map +1 -1
- package/dist/utils/fs.d.ts +1 -0
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +12 -0
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/hsm.d.ts +82 -0
- package/dist/utils/hsm.d.ts.map +1 -0
- package/dist/utils/hsm.js +344 -0
- package/dist/utils/hsm.js.map +1 -0
- package/dist/utils/http.d.ts.map +1 -1
- package/dist/utils/http.js +14 -4
- package/dist/utils/http.js.map +1 -1
- package/dist/utils/keychain.d.ts.map +1 -1
- package/dist/utils/keychain.js +0 -8
- package/dist/utils/keychain.js.map +1 -1
- package/dist/utils/lock.d.ts +1 -1
- package/dist/utils/lock.d.ts.map +1 -1
- package/dist/utils/lock.js +4 -2
- package/dist/utils/lock.js.map +1 -1
- package/dist/utils/lockout.d.ts +56 -0
- package/dist/utils/lockout.d.ts.map +1 -0
- package/dist/utils/lockout.js +209 -0
- package/dist/utils/lockout.js.map +1 -0
- package/dist/utils/prompt.d.ts +13 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +124 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/secure-memory.d.ts +20 -0
- package/dist/utils/secure-memory.d.ts.map +1 -0
- package/dist/utils/secure-memory.js +122 -0
- package/dist/utils/secure-memory.js.map +1 -0
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +14 -4
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/update-checker.d.ts +1 -1
- package/dist/utils/update-checker.d.ts.map +1 -1
- package/dist/utils/update-checker.js +7 -5
- package/dist/utils/update-checker.js.map +1 -1
- package/dist/vault/index.d.ts +2 -0
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +12 -2
- package/dist/vault/index.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/package.json +18 -9
- package/scripts/sync-version.js +88 -0
- package/scripts/install.sh +0 -54
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
export function buildServeArgs(config) {
|
|
2
|
+
const args = ['serve'];
|
|
3
|
+
args.push('--mode', config.server.mode);
|
|
4
|
+
args.push('--port', String(config.server.port));
|
|
5
|
+
args.push('--host', config.server.host);
|
|
6
|
+
if (config.server.api_key) {
|
|
7
|
+
args.push('--api-key', config.server.api_key);
|
|
8
|
+
}
|
|
9
|
+
return args;
|
|
10
|
+
}
|
|
11
|
+
export function generateSystemdUnit(ctx) {
|
|
12
|
+
const args = buildServeArgs(ctx.config).join(' ');
|
|
13
|
+
const restart = ctx.config.restart_on_failure ? 'on-failure' : 'no';
|
|
14
|
+
return `[Unit]
|
|
15
|
+
Description=EnvCP secure environment variable server
|
|
16
|
+
After=network.target
|
|
17
|
+
|
|
18
|
+
[Service]
|
|
19
|
+
Type=simple
|
|
20
|
+
WorkingDirectory=${ctx.workingDirectory}
|
|
21
|
+
ExecStart=${ctx.nodePath} ${ctx.execPath} ${args}
|
|
22
|
+
Restart=${restart}
|
|
23
|
+
RestartSec=5
|
|
24
|
+
StandardOutput=append:${ctx.logFile}
|
|
25
|
+
StandardError=append:${ctx.errorLogFile}
|
|
26
|
+
Environment=NODE_ENV=production
|
|
27
|
+
Environment=ENVCP_LOG_LEVEL=${ctx.config.log_level}
|
|
28
|
+
|
|
29
|
+
[Install]
|
|
30
|
+
WantedBy=default.target
|
|
31
|
+
`;
|
|
32
|
+
}
|
|
33
|
+
export function generateLaunchdPlist(ctx) {
|
|
34
|
+
const args = buildServeArgs(ctx.config);
|
|
35
|
+
const programArgs = [ctx.nodePath, ctx.execPath, ...args]
|
|
36
|
+
.map((a) => ` <string>${escapeXml(a)}</string>`)
|
|
37
|
+
.join('\n');
|
|
38
|
+
const keepAlive = ctx.config.restart_on_failure
|
|
39
|
+
? '<true/>'
|
|
40
|
+
: '<false/>';
|
|
41
|
+
const runAtLoad = ctx.config.autostart ? '<true/>' : '<false/>';
|
|
42
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
43
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
44
|
+
<plist version="1.0">
|
|
45
|
+
<dict>
|
|
46
|
+
<key>Label</key>
|
|
47
|
+
<string>com.envcp</string>
|
|
48
|
+
<key>ProgramArguments</key>
|
|
49
|
+
<array>
|
|
50
|
+
${programArgs}
|
|
51
|
+
</array>
|
|
52
|
+
<key>WorkingDirectory</key>
|
|
53
|
+
<string>${escapeXml(ctx.workingDirectory)}</string>
|
|
54
|
+
<key>RunAtLoad</key>
|
|
55
|
+
${runAtLoad}
|
|
56
|
+
<key>KeepAlive</key>
|
|
57
|
+
${keepAlive}
|
|
58
|
+
<key>StandardOutPath</key>
|
|
59
|
+
<string>${escapeXml(ctx.logFile)}</string>
|
|
60
|
+
<key>StandardErrorPath</key>
|
|
61
|
+
<string>${escapeXml(ctx.errorLogFile)}</string>
|
|
62
|
+
<key>EnvironmentVariables</key>
|
|
63
|
+
<dict>
|
|
64
|
+
<key>NODE_ENV</key>
|
|
65
|
+
<string>production</string>
|
|
66
|
+
<key>ENVCP_LOG_LEVEL</key>
|
|
67
|
+
<string>${escapeXml(ctx.config.log_level)}</string>
|
|
68
|
+
</dict>
|
|
69
|
+
</dict>
|
|
70
|
+
</plist>
|
|
71
|
+
`;
|
|
72
|
+
}
|
|
73
|
+
export function generateWindowsWrapperScript(ctx) {
|
|
74
|
+
const args = buildServeArgs(ctx.config)
|
|
75
|
+
.map((a) => (a.includes(' ') ? `"${a}"` : a))
|
|
76
|
+
.join(' ');
|
|
77
|
+
return `@echo off
|
|
78
|
+
set "NODE_ENV=production"
|
|
79
|
+
set "ENVCP_LOG_LEVEL=${ctx.config.log_level}"
|
|
80
|
+
cd /d "${ctx.workingDirectory}"
|
|
81
|
+
"${ctx.nodePath}" "${ctx.execPath}" ${args} >> "${ctx.logFile}" 2>> "${ctx.errorLogFile}"
|
|
82
|
+
`;
|
|
83
|
+
}
|
|
84
|
+
function escapeXml(s) {
|
|
85
|
+
return s
|
|
86
|
+
.replace(/&/g, '&')
|
|
87
|
+
.replace(/</g, '<')
|
|
88
|
+
.replace(/>/g, '>')
|
|
89
|
+
.replace(/"/g, '"')
|
|
90
|
+
.replace(/'/g, ''');
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=generators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generators.js","sourceRoot":"","sources":["../../src/service/generators.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAqB;IACvD,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;IACpE,OAAO;;;;;;mBAMU,GAAG,CAAC,gBAAgB;YAC3B,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,IAAI;UACtC,OAAO;;wBAEO,GAAG,CAAC,OAAO;uBACZ,GAAG,CAAC,YAAY;;8BAET,GAAG,CAAC,MAAM,CAAC,SAAS;;;;CAIjD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAqB;IACxD,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;SACtD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;SAClD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,kBAAkB;QAC7C,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,UAAU,CAAC;IACf,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IAEhE,OAAO;;;;;;;;EAQP,WAAW;;;YAGD,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC;;IAEvC,SAAS;;IAET,SAAS;;YAED,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;;YAEtB,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;;;;;;cAMzB,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;;;;CAI5C,CAAC;AACF,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,GAAqB;IAChE,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;SACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC5C,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO;;uBAEc,GAAG,CAAC,MAAM,CAAC,SAAS;SAClC,GAAG,CAAC,gBAAgB;GAC1B,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,QAAQ,KAAK,IAAI,QAAQ,GAAG,CAAC,OAAO,UAAU,GAAG,CAAC,YAAY;CACtF,CAAC;AACF,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export * from './config.js';
|
|
2
|
+
export * from './generators.js';
|
|
3
|
+
export * from './platform.js';
|
|
4
|
+
export interface InstallOptions {
|
|
5
|
+
configPath?: string;
|
|
6
|
+
execPath?: string;
|
|
7
|
+
nodePath?: string;
|
|
8
|
+
workingDirectory?: string;
|
|
9
|
+
now?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface ServiceResult {
|
|
12
|
+
ok: boolean;
|
|
13
|
+
message: string;
|
|
14
|
+
stdout?: string;
|
|
15
|
+
stderr?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function installService(opts?: InstallOptions): Promise<ServiceResult>;
|
|
18
|
+
export declare function uninstallService(): Promise<ServiceResult>;
|
|
19
|
+
export declare function startService(): Promise<ServiceResult>;
|
|
20
|
+
export declare function stopService(): Promise<ServiceResult>;
|
|
21
|
+
export declare function statusService(): Promise<ServiceResult>;
|
|
22
|
+
export declare function logsService(follow?: boolean): Promise<ServiceResult>;
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAqBA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAE9B,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA0BD,wBAAsB,cAAc,CAClC,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,aAAa,CAAC,CA6DxB;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAwB/D;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC,CAU3D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC,CAU1D;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,CAc5D;AAED,wBAAsB,WAAW,CAAC,MAAM,UAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CA+BxE"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { spawn, spawnSync } from 'child_process';
|
|
4
|
+
import { ensureDir, pathExists } from '../utils/fs.js';
|
|
5
|
+
import { getServiceConfigPath, getServiceHome, getServiceLogPath, getServiceErrorLogPath, loadServiceConfig, saveServiceConfig, } from './config.js';
|
|
6
|
+
import { generateSystemdUnit, generateLaunchdPlist, generateWindowsWrapperScript, } from './generators.js';
|
|
7
|
+
import { detectPlatform, getUnitInstallPath } from './platform.js';
|
|
8
|
+
export * from './config.js';
|
|
9
|
+
export * from './generators.js';
|
|
10
|
+
export * from './platform.js';
|
|
11
|
+
async function buildContext(config, opts) {
|
|
12
|
+
const execPath = opts.execPath || resolveExecPath();
|
|
13
|
+
const nodePath = opts.nodePath || process.execPath;
|
|
14
|
+
const workingDirectory = opts.workingDirectory || config.working_directory || process.cwd();
|
|
15
|
+
return {
|
|
16
|
+
execPath,
|
|
17
|
+
nodePath,
|
|
18
|
+
workingDirectory,
|
|
19
|
+
logFile: getServiceLogPath(),
|
|
20
|
+
errorLogFile: getServiceErrorLogPath(),
|
|
21
|
+
config,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function resolveExecPath() {
|
|
25
|
+
const scriptUrl = new URL(import.meta.url);
|
|
26
|
+
const here = path.dirname(scriptUrl.pathname);
|
|
27
|
+
return path.resolve(here, '..', 'cli.js');
|
|
28
|
+
}
|
|
29
|
+
export async function installService(opts = {}) {
|
|
30
|
+
const platform = detectPlatform();
|
|
31
|
+
const config = await loadServiceConfig(opts.configPath);
|
|
32
|
+
const ctx = await buildContext(config, opts);
|
|
33
|
+
await ensureDir(getServiceHome());
|
|
34
|
+
const unitPath = getUnitInstallPath(platform);
|
|
35
|
+
await ensureDir(path.dirname(unitPath));
|
|
36
|
+
let body;
|
|
37
|
+
if (platform === 'linux')
|
|
38
|
+
body = generateSystemdUnit(ctx);
|
|
39
|
+
else if (platform === 'macos')
|
|
40
|
+
body = generateLaunchdPlist(ctx);
|
|
41
|
+
else
|
|
42
|
+
body = generateWindowsWrapperScript(ctx);
|
|
43
|
+
await fs.writeFile(unitPath, body, { mode: 0o600 });
|
|
44
|
+
// Save config file if it doesn't already exist, so the service has something to read
|
|
45
|
+
const cfgPath = opts.configPath || getServiceConfigPath();
|
|
46
|
+
if (!(await pathExists(cfgPath))) {
|
|
47
|
+
await saveServiceConfig(config, cfgPath);
|
|
48
|
+
}
|
|
49
|
+
if (platform === 'linux') {
|
|
50
|
+
const reload = runCommand('systemctl', ['--user', 'daemon-reload']);
|
|
51
|
+
if (!reload.ok)
|
|
52
|
+
return reload;
|
|
53
|
+
if (config.autostart) {
|
|
54
|
+
const enable = runCommand('systemctl', ['--user', 'enable', 'envcp.service']);
|
|
55
|
+
if (!enable.ok)
|
|
56
|
+
return enable;
|
|
57
|
+
}
|
|
58
|
+
if (opts.now) {
|
|
59
|
+
return runCommand('systemctl', ['--user', 'start', 'envcp.service']);
|
|
60
|
+
}
|
|
61
|
+
return { ok: true, message: `Installed systemd unit at ${unitPath}` };
|
|
62
|
+
}
|
|
63
|
+
if (platform === 'macos') {
|
|
64
|
+
if (opts.now) {
|
|
65
|
+
return runCommand('launchctl', ['load', '-w', unitPath]);
|
|
66
|
+
}
|
|
67
|
+
return { ok: true, message: `Installed launchd plist at ${unitPath}` };
|
|
68
|
+
}
|
|
69
|
+
// Windows: register a Scheduled Task to run at logon (no admin required)
|
|
70
|
+
if (opts.now || config.autostart) {
|
|
71
|
+
const taskCmd = [
|
|
72
|
+
'/Create',
|
|
73
|
+
'/TN',
|
|
74
|
+
'EnvCP',
|
|
75
|
+
'/TR',
|
|
76
|
+
`"${unitPath}"`,
|
|
77
|
+
'/SC',
|
|
78
|
+
'ONLOGON',
|
|
79
|
+
'/F',
|
|
80
|
+
];
|
|
81
|
+
const result = runCommand('schtasks', taskCmd);
|
|
82
|
+
if (!result.ok)
|
|
83
|
+
return result;
|
|
84
|
+
if (opts.now) {
|
|
85
|
+
return runCommand('schtasks', ['/Run', '/TN', 'EnvCP']);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { ok: true, message: `Installed service wrapper at ${unitPath}` };
|
|
89
|
+
}
|
|
90
|
+
export async function uninstallService() {
|
|
91
|
+
const platform = detectPlatform();
|
|
92
|
+
const unitPath = getUnitInstallPath(platform);
|
|
93
|
+
if (platform === 'linux') {
|
|
94
|
+
runCommand('systemctl', ['--user', 'stop', 'envcp.service']);
|
|
95
|
+
runCommand('systemctl', ['--user', 'disable', 'envcp.service']);
|
|
96
|
+
if (await pathExists(unitPath))
|
|
97
|
+
await fs.unlink(unitPath);
|
|
98
|
+
runCommand('systemctl', ['--user', 'daemon-reload']);
|
|
99
|
+
return { ok: true, message: 'Uninstalled systemd unit' };
|
|
100
|
+
}
|
|
101
|
+
if (platform === 'macos') {
|
|
102
|
+
if (await pathExists(unitPath)) {
|
|
103
|
+
runCommand('launchctl', ['unload', '-w', unitPath]);
|
|
104
|
+
await fs.unlink(unitPath);
|
|
105
|
+
}
|
|
106
|
+
return { ok: true, message: 'Uninstalled launchd plist' };
|
|
107
|
+
}
|
|
108
|
+
runCommand('schtasks', ['/End', '/TN', 'EnvCP']);
|
|
109
|
+
runCommand('schtasks', ['/Delete', '/TN', 'EnvCP', '/F']);
|
|
110
|
+
if (await pathExists(unitPath))
|
|
111
|
+
await fs.unlink(unitPath);
|
|
112
|
+
return { ok: true, message: 'Uninstalled scheduled task' };
|
|
113
|
+
}
|
|
114
|
+
export async function startService() {
|
|
115
|
+
const platform = detectPlatform();
|
|
116
|
+
if (platform === 'linux') {
|
|
117
|
+
return runCommand('systemctl', ['--user', 'start', 'envcp.service']);
|
|
118
|
+
}
|
|
119
|
+
if (platform === 'macos') {
|
|
120
|
+
const unitPath = getUnitInstallPath('macos');
|
|
121
|
+
return runCommand('launchctl', ['load', '-w', unitPath]);
|
|
122
|
+
}
|
|
123
|
+
return runCommand('schtasks', ['/Run', '/TN', 'EnvCP']);
|
|
124
|
+
}
|
|
125
|
+
export async function stopService() {
|
|
126
|
+
const platform = detectPlatform();
|
|
127
|
+
if (platform === 'linux') {
|
|
128
|
+
return runCommand('systemctl', ['--user', 'stop', 'envcp.service']);
|
|
129
|
+
}
|
|
130
|
+
if (platform === 'macos') {
|
|
131
|
+
const unitPath = getUnitInstallPath('macos');
|
|
132
|
+
return runCommand('launchctl', ['unload', '-w', unitPath]);
|
|
133
|
+
}
|
|
134
|
+
return runCommand('schtasks', ['/End', '/TN', 'EnvCP']);
|
|
135
|
+
}
|
|
136
|
+
export async function statusService() {
|
|
137
|
+
const platform = detectPlatform();
|
|
138
|
+
if (platform === 'linux') {
|
|
139
|
+
return runCommand('systemctl', [
|
|
140
|
+
'--user',
|
|
141
|
+
'status',
|
|
142
|
+
'envcp.service',
|
|
143
|
+
'--no-pager',
|
|
144
|
+
]);
|
|
145
|
+
}
|
|
146
|
+
if (platform === 'macos') {
|
|
147
|
+
return runCommand('launchctl', ['list', 'com.envcp']);
|
|
148
|
+
}
|
|
149
|
+
return runCommand('schtasks', ['/Query', '/TN', 'EnvCP', '/V', '/FO', 'LIST']);
|
|
150
|
+
}
|
|
151
|
+
export async function logsService(follow = false) {
|
|
152
|
+
const platform = detectPlatform();
|
|
153
|
+
if (platform === 'linux') {
|
|
154
|
+
const args = [
|
|
155
|
+
'--user',
|
|
156
|
+
'-u',
|
|
157
|
+
'envcp.service',
|
|
158
|
+
'--no-pager',
|
|
159
|
+
];
|
|
160
|
+
if (follow)
|
|
161
|
+
args.push('-f');
|
|
162
|
+
return runCommand('journalctl', args, follow);
|
|
163
|
+
}
|
|
164
|
+
// macOS and Windows: tail the file-based log
|
|
165
|
+
const logFile = getServiceLogPath();
|
|
166
|
+
if (!(await pathExists(logFile))) {
|
|
167
|
+
return {
|
|
168
|
+
ok: false,
|
|
169
|
+
message: `No log file at ${logFile}`,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
if (follow) {
|
|
173
|
+
const p = platform;
|
|
174
|
+
const cmd = p === 'windows' ? 'powershell' : 'tail';
|
|
175
|
+
const args = p === 'windows'
|
|
176
|
+
? ['-Command', `Get-Content -Path '${logFile}' -Wait -Tail 100`]
|
|
177
|
+
: ['-f', logFile];
|
|
178
|
+
return runCommand(cmd, args, true);
|
|
179
|
+
}
|
|
180
|
+
const data = await fs.readFile(logFile, 'utf-8');
|
|
181
|
+
return { ok: true, message: 'ok', stdout: data };
|
|
182
|
+
}
|
|
183
|
+
function runCommand(cmd, args, stream = false) {
|
|
184
|
+
if (stream) {
|
|
185
|
+
const child = spawn(cmd, args, { stdio: 'inherit' });
|
|
186
|
+
return {
|
|
187
|
+
ok: true,
|
|
188
|
+
message: `streaming ${cmd} ${args.join(' ')} (pid ${child.pid ?? 'n/a'})`,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
let result;
|
|
192
|
+
try {
|
|
193
|
+
result = spawnSync(cmd, args, { encoding: 'utf-8' });
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
197
|
+
return { ok: false, message: `Failed to execute ${cmd}: ${msg}` };
|
|
198
|
+
}
|
|
199
|
+
if (result.error) {
|
|
200
|
+
return {
|
|
201
|
+
ok: false,
|
|
202
|
+
message: `Failed to execute ${cmd}: ${result.error.message}`,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
const ok = (result.status ?? 1) === 0;
|
|
206
|
+
return {
|
|
207
|
+
ok,
|
|
208
|
+
message: ok
|
|
209
|
+
? `${cmd} ${args.join(' ')} succeeded`
|
|
210
|
+
: `${cmd} ${args.join(' ')} exited ${result.status}`,
|
|
211
|
+
stdout: result.stdout,
|
|
212
|
+
stderr: result.stderr,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type Platform = 'linux' | 'macos' | 'windows';
|
|
2
|
+
export declare function detectPlatform(): Platform;
|
|
3
|
+
export declare function getServiceName(): string;
|
|
4
|
+
export declare function getUnitInstallPath(platform: Platform): string;
|
|
5
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/service/platform.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAErD,wBAAgB,cAAc,IAAI,QAAQ,CAKzC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAU7D"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as os from 'os';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
export function detectPlatform() {
|
|
4
|
+
const p = os.platform();
|
|
5
|
+
if (p === 'darwin')
|
|
6
|
+
return 'macos';
|
|
7
|
+
if (p === 'win32')
|
|
8
|
+
return 'windows';
|
|
9
|
+
return 'linux';
|
|
10
|
+
}
|
|
11
|
+
export function getServiceName() {
|
|
12
|
+
return 'envcp';
|
|
13
|
+
}
|
|
14
|
+
export function getUnitInstallPath(platform) {
|
|
15
|
+
const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
|
|
16
|
+
switch (platform) {
|
|
17
|
+
case 'linux':
|
|
18
|
+
return path.join(home, '.config', 'systemd', 'user', 'envcp.service');
|
|
19
|
+
case 'macos':
|
|
20
|
+
return path.join(home, 'Library', 'LaunchAgents', 'com.envcp.plist');
|
|
21
|
+
case 'windows':
|
|
22
|
+
return path.join(home, '.envcp', 'envcp-service.bat');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/service/platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAI7B,MAAM,UAAU,cAAc;IAC5B,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IACxB,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IACnC,IAAI,CAAC,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IACpC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAkB;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IACzE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;QACxE,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;QACvE,KAAK,SAAS;YACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -1,11 +1,4 @@
|
|
|
1
|
-
import { Variable, OperationLog } from '../types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Manages encrypted or plaintext storage of named secret variables.
|
|
4
|
-
* Uses atomic writes (tmp → rename) and file locking to prevent corruption
|
|
5
|
-
* under concurrent access. Automatically rotates backups on every write.
|
|
6
|
-
*
|
|
7
|
-
* @security All file paths are verified with `lstat` to reject symlink attacks.
|
|
8
|
-
*/
|
|
1
|
+
import { Variable, OperationLog, AuditConfig } from '../types.js';
|
|
9
2
|
export declare class StorageManager {
|
|
10
3
|
private storePath;
|
|
11
4
|
readonly encrypted: boolean;
|
|
@@ -30,12 +23,61 @@ export declare class StorageManager {
|
|
|
30
23
|
count?: number;
|
|
31
24
|
backups?: number;
|
|
32
25
|
}>;
|
|
26
|
+
destroy(): void;
|
|
33
27
|
}
|
|
28
|
+
export interface LogFilter {
|
|
29
|
+
date?: string;
|
|
30
|
+
operation?: string;
|
|
31
|
+
variable?: string;
|
|
32
|
+
source?: string;
|
|
33
|
+
success?: boolean;
|
|
34
|
+
tail?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve the absolute directory to store audit logs in.
|
|
38
|
+
*
|
|
39
|
+
* Honors `audit.log_path` with these forms:
|
|
40
|
+
* - unset → default `<projectPath>/.envcp/logs` (backward compatible)
|
|
41
|
+
* - "project:REL" → `<projectPath>/REL`
|
|
42
|
+
* - starts with `~` → expanded against $HOME (or projectPath if unavailable)
|
|
43
|
+
* - absolute path → used as-is
|
|
44
|
+
* - relative path → treated as project-relative
|
|
45
|
+
*
|
|
46
|
+
* Rejects `..` traversal in the `project:` form.
|
|
47
|
+
*/
|
|
48
|
+
export declare function resolveLogPath(audit: AuditConfig | undefined, projectPath: string): string;
|
|
34
49
|
export declare class LogManager {
|
|
35
50
|
private logDir;
|
|
36
|
-
|
|
51
|
+
private auditConfig;
|
|
52
|
+
private hmacKey;
|
|
53
|
+
private lastHmac;
|
|
54
|
+
private chainIndex;
|
|
55
|
+
private chainLoaded;
|
|
56
|
+
constructor(logDir: string, auditConfig?: AuditConfig);
|
|
37
57
|
init(): Promise<void>;
|
|
58
|
+
private loadLastChainState;
|
|
59
|
+
private loadOrCreateHmacKey;
|
|
60
|
+
private signEntry;
|
|
61
|
+
verifyEntry(entry: OperationLog): boolean;
|
|
62
|
+
verifyLogChain(date?: string): Promise<{
|
|
63
|
+
valid: boolean;
|
|
64
|
+
entries: number;
|
|
65
|
+
tampered: number[];
|
|
66
|
+
}>;
|
|
67
|
+
private applyFieldFilter;
|
|
68
|
+
pruneOldLogs(retainDays?: number): Promise<void>;
|
|
38
69
|
log(entry: OperationLog): Promise<void>;
|
|
39
|
-
getLogs(
|
|
70
|
+
getLogs(filter?: LogFilter): Promise<OperationLog[]>;
|
|
71
|
+
private execChattr;
|
|
72
|
+
setAppendOnly(filePath: string): Promise<boolean>;
|
|
73
|
+
setImmutable(filePath: string): Promise<boolean>;
|
|
74
|
+
removeAppendOnly(filePath: string): Promise<boolean>;
|
|
75
|
+
removeImmutable(filePath: string): Promise<boolean>;
|
|
76
|
+
protectLogFiles(): Promise<{
|
|
77
|
+
protected: string[];
|
|
78
|
+
failed: string[];
|
|
79
|
+
}>;
|
|
80
|
+
getLogDates(): Promise<string[]>;
|
|
81
|
+
destroy(): void;
|
|
40
82
|
}
|
|
41
83
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"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"}
|