htpx-cli 0.1.0 → 0.1.1
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 +21 -0
- package/README.md +4 -0
- package/dist/cli/commands/debug-dump.d.ts +27 -0
- package/dist/cli/commands/debug-dump.d.ts.map +1 -0
- package/dist/cli/commands/debug-dump.js +104 -0
- package/dist/cli/commands/debug-dump.js.map +1 -0
- package/dist/cli/commands/intercept.d.ts.map +1 -1
- package/dist/cli/commands/intercept.js +20 -2
- package/dist/cli/commands/intercept.js.map +1 -1
- package/dist/cli/commands/restart.d.ts +3 -0
- package/dist/cli/commands/restart.d.ts.map +1 -0
- package/dist/cli/commands/restart.js +40 -0
- package/dist/cli/commands/restart.js.map +1 -0
- package/dist/cli/commands/tui.d.ts.map +1 -1
- package/dist/cli/commands/tui.js +17 -1
- package/dist/cli/commands/tui.js.map +1 -1
- package/dist/cli/index.js +9 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/daemon/control.d.ts +4 -0
- package/dist/daemon/control.d.ts.map +1 -1
- package/dist/daemon/control.js +12 -3
- package/dist/daemon/control.js.map +1 -1
- package/dist/daemon/index.js +35 -12
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/proxy.d.ts +3 -0
- package/dist/daemon/proxy.d.ts.map +1 -1
- package/dist/daemon/proxy.js +14 -1
- package/dist/daemon/proxy.js.map +1 -1
- package/dist/daemon/storage.d.ts +9 -1
- package/dist/daemon/storage.d.ts.map +1 -1
- package/dist/daemon/storage.js +32 -1
- package/dist/daemon/storage.js.map +1 -1
- package/dist/shared/daemon.d.ts +20 -1
- package/dist/shared/daemon.d.ts.map +1 -1
- package/dist/shared/daemon.js +54 -1
- package/dist/shared/daemon.js.map +1 -1
- package/dist/shared/logger.d.ts +31 -0
- package/dist/shared/logger.d.ts.map +1 -0
- package/dist/shared/logger.js +121 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/project.d.ts +1 -0
- package/dist/shared/project.d.ts.map +1 -1
- package/dist/shared/project.js +1 -0
- package/dist/shared/project.js.map +1 -1
- package/dist/shared/types.d.ts +1 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/version.d.ts +5 -0
- package/dist/shared/version.d.ts.map +1 -0
- package/dist/shared/version.js +21 -0
- package/dist/shared/version.js.map +1 -0
- package/package.json +1 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Michael Ford
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# htpx
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/htpx-cli)
|
|
4
|
+
[](https://github.com/mtford90/htpx/actions/workflows/ci.yml)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
3
7
|
A terminal-based HTTP interception toolkit with project-scoped isolation and a lazygit-style TUI.
|
|
4
8
|
|
|
5
9
|
Capture HTTP/HTTPS traffic through a MITM proxy and inspect it in an interactive terminal interface. No browser extensions, no separate apps—just your terminal.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
interface DebugDump {
|
|
3
|
+
timestamp: string;
|
|
4
|
+
htpxVersion: string;
|
|
5
|
+
system: {
|
|
6
|
+
platform: string;
|
|
7
|
+
release: string;
|
|
8
|
+
nodeVersion: string;
|
|
9
|
+
};
|
|
10
|
+
daemon: {
|
|
11
|
+
running: boolean;
|
|
12
|
+
pid?: number;
|
|
13
|
+
proxyPort?: number;
|
|
14
|
+
};
|
|
15
|
+
htpxDir: {
|
|
16
|
+
exists: boolean;
|
|
17
|
+
files: string[];
|
|
18
|
+
};
|
|
19
|
+
recentLogs: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Collect debug information for a project.
|
|
23
|
+
*/
|
|
24
|
+
export declare function collectDebugInfo(projectRoot: string | undefined): DebugDump;
|
|
25
|
+
export declare const debugDumpCommand: Command;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=debug-dump.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-dump.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/debug-dump.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,UAAU,SAAS;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,MAAM,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,EAAE;QACP,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CA6D3E;AAaD,eAAO,MAAM,gBAAgB,SA8BzB,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as os from "node:os";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { Command } from "commander";
|
|
5
|
+
import { findProjectRoot, getHtpxPaths, readDaemonPid, isProcessRunning, } from "../../shared/project.js";
|
|
6
|
+
import { readProxyPort } from "../../shared/project.js";
|
|
7
|
+
import { getHtpxVersion } from "../../shared/version.js";
|
|
8
|
+
/**
|
|
9
|
+
* Collect debug information for a project.
|
|
10
|
+
*/
|
|
11
|
+
export function collectDebugInfo(projectRoot) {
|
|
12
|
+
const htpxVersion = getHtpxVersion();
|
|
13
|
+
const dump = {
|
|
14
|
+
timestamp: new Date().toISOString(),
|
|
15
|
+
htpxVersion,
|
|
16
|
+
system: {
|
|
17
|
+
platform: os.platform(),
|
|
18
|
+
release: os.release(),
|
|
19
|
+
nodeVersion: process.version,
|
|
20
|
+
},
|
|
21
|
+
daemon: {
|
|
22
|
+
running: false,
|
|
23
|
+
},
|
|
24
|
+
htpxDir: {
|
|
25
|
+
exists: false,
|
|
26
|
+
files: [],
|
|
27
|
+
},
|
|
28
|
+
recentLogs: [],
|
|
29
|
+
};
|
|
30
|
+
if (!projectRoot) {
|
|
31
|
+
return dump;
|
|
32
|
+
}
|
|
33
|
+
const paths = getHtpxPaths(projectRoot);
|
|
34
|
+
// Check .htpx directory
|
|
35
|
+
if (fs.existsSync(paths.htpxDir)) {
|
|
36
|
+
dump.htpxDir.exists = true;
|
|
37
|
+
try {
|
|
38
|
+
dump.htpxDir.files = fs.readdirSync(paths.htpxDir);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Ignore errors reading directory
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Check daemon status
|
|
45
|
+
const pid = readDaemonPid(projectRoot);
|
|
46
|
+
if (pid && isProcessRunning(pid)) {
|
|
47
|
+
dump.daemon.running = true;
|
|
48
|
+
dump.daemon.pid = pid;
|
|
49
|
+
const proxyPort = readProxyPort(projectRoot);
|
|
50
|
+
if (proxyPort) {
|
|
51
|
+
dump.daemon.proxyPort = proxyPort;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Read recent logs
|
|
55
|
+
if (fs.existsSync(paths.logFile)) {
|
|
56
|
+
try {
|
|
57
|
+
const content = fs.readFileSync(paths.logFile, "utf-8");
|
|
58
|
+
const lines = content.trim().split("\n");
|
|
59
|
+
dump.recentLogs = lines.slice(-200); // Last 200 lines
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Ignore errors reading log file
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return dump;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Generate a filename for the debug dump.
|
|
69
|
+
*/
|
|
70
|
+
function generateDumpFilename() {
|
|
71
|
+
const timestamp = new Date()
|
|
72
|
+
.toISOString()
|
|
73
|
+
.replace(/:/g, "-")
|
|
74
|
+
.replace(/\.\d{3}Z$/, "");
|
|
75
|
+
return `debug-dump-${timestamp}.json`;
|
|
76
|
+
}
|
|
77
|
+
export const debugDumpCommand = new Command("debug-dump")
|
|
78
|
+
.description("Collect diagnostic information for debugging")
|
|
79
|
+
.action(() => {
|
|
80
|
+
const projectRoot = findProjectRoot();
|
|
81
|
+
if (!projectRoot) {
|
|
82
|
+
console.error("Not in a project directory (no .htpx or .git found)");
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
const paths = getHtpxPaths(projectRoot);
|
|
86
|
+
const dump = collectDebugInfo(projectRoot);
|
|
87
|
+
// Write dump to file
|
|
88
|
+
const filename = generateDumpFilename();
|
|
89
|
+
const filepath = path.join(paths.htpxDir, filename);
|
|
90
|
+
try {
|
|
91
|
+
// Ensure .htpx directory exists
|
|
92
|
+
if (!fs.existsSync(paths.htpxDir)) {
|
|
93
|
+
fs.mkdirSync(paths.htpxDir, { recursive: true });
|
|
94
|
+
}
|
|
95
|
+
fs.writeFileSync(filepath, JSON.stringify(dump, null, 2), "utf-8");
|
|
96
|
+
console.log(`Debug dump written to: ${filepath}`);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
const message = err instanceof Error ? err.message : "Unknown error";
|
|
100
|
+
console.error(`Failed to write debug dump: ${message}`);
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=debug-dump.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-dump.js","sourceRoot":"","sources":["../../../src/cli/commands/debug-dump.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,eAAe,EACf,YAAY,EACZ,aAAa,EACb,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAsBzD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAA+B;IAC9D,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,MAAM,IAAI,GAAc;QACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,WAAW;QACX,MAAM,EAAE;YACN,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;YACvB,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE;YACrB,WAAW,EAAE,OAAO,CAAC,OAAO;SAC7B;QACD,MAAM,EAAE;YACN,OAAO,EAAE,KAAK;SACf;QACD,OAAO,EAAE;YACP,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,EAAE;SACV;QACD,UAAU,EAAE,EAAE;KACf,CAAC;IAEF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAExC,wBAAwB;IACxB,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,GAAG,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IACvC,IAAI,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;QAEtB,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QACpC,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB;IAC3B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE;SACzB,WAAW,EAAE;SACb,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC5B,OAAO,cAAc,SAAS,OAAO,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC;KACtD,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IAEtC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE3C,qBAAqB;IACrB,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,gCAAgC;QAChC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intercept.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/intercept.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"intercept.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/intercept.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAIlE;AAED,eAAO,MAAM,gBAAgB,SAqEzB,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { Command } from "commander";
|
|
|
2
2
|
import { findOrCreateProjectRoot, ensureHtpxDir, getHtpxPaths } from "../../shared/project.js";
|
|
3
3
|
import { startDaemon } from "../../shared/daemon.js";
|
|
4
4
|
import { ControlClient } from "../../daemon/control.js";
|
|
5
|
+
import { parseVerbosity } from "../../shared/logger.js";
|
|
5
6
|
/**
|
|
6
7
|
* Format environment variable exports for shell evaluation.
|
|
7
8
|
* Each line is a shell export statement.
|
|
@@ -14,15 +15,32 @@ export function formatEnvVars(vars) {
|
|
|
14
15
|
export const interceptCommand = new Command("intercept")
|
|
15
16
|
.description("Output environment variables to intercept HTTP traffic")
|
|
16
17
|
.option("-l, --label <label>", "Label for this session")
|
|
17
|
-
.
|
|
18
|
+
.option("--no-restart", "Do not auto-restart daemon on version mismatch")
|
|
19
|
+
.action(async (options, command) => {
|
|
18
20
|
const label = options.label;
|
|
21
|
+
const autoRestart = options.restart;
|
|
22
|
+
const globalOpts = command.optsWithGlobals();
|
|
23
|
+
const verbosity = globalOpts.verbose ?? 0;
|
|
24
|
+
const logLevel = parseVerbosity(verbosity);
|
|
19
25
|
// Find project root (auto-creates .htpx if needed)
|
|
20
26
|
const projectRoot = findOrCreateProjectRoot();
|
|
21
27
|
ensureHtpxDir(projectRoot);
|
|
22
28
|
const paths = getHtpxPaths(projectRoot);
|
|
23
29
|
try {
|
|
24
30
|
// Start daemon if not already running
|
|
25
|
-
const proxyPort = await startDaemon(projectRoot
|
|
31
|
+
const proxyPort = await startDaemon(projectRoot, {
|
|
32
|
+
logLevel,
|
|
33
|
+
autoRestart,
|
|
34
|
+
onVersionMismatch: (running, cli) => {
|
|
35
|
+
if (autoRestart) {
|
|
36
|
+
console.log(`# htpx: restarting daemon (version mismatch: ${running} -> ${cli})`);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
console.log(`# htpx warning: daemon version mismatch (running: ${running}, CLI: ${cli})`);
|
|
40
|
+
console.log(`# Use 'htpx restart' to update.`);
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
});
|
|
26
44
|
const proxyUrl = `http://127.0.0.1:${proxyPort}`;
|
|
27
45
|
// Register session with daemon
|
|
28
46
|
const client = new ControlClient(paths.controlSocketFile);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intercept.js","sourceRoot":"","sources":["../../../src/cli/commands/intercept.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAA4B;IACxD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,GAAG,KAAK,KAAK,GAAG,CAAC;SACjD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;KACrD,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;KACvD,MAAM,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"intercept.js","sourceRoot":"","sources":["../../../src/cli/commands/intercept.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAA4B;IACxD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,GAAG,KAAK,KAAK,GAAG,CAAC;SACjD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;KACrD,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;KACvD,MAAM,CAAC,cAAc,EAAE,gDAAgD,CAAC;KACxE,MAAM,CAAC,KAAK,EAAE,OAA6C,EAAE,OAAgB,EAAE,EAAE;IAChF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IACpC,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAA0B,CAAC;IACrE,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE3C,mDAAmD;IACnD,MAAM,WAAW,GAAG,uBAAuB,EAAE,CAAC;IAC9C,aAAa,CAAC,WAAW,CAAC,CAAC;IAE3B,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAExC,IAAI,CAAC;QACH,sCAAsC;QACtC,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE;YAC/C,QAAQ;YACR,WAAW;YACX,iBAAiB,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;gBAClC,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CAAC,gDAAgD,OAAO,OAAO,GAAG,GAAG,CAAC,CAAC;gBACpF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CACT,qDAAqD,OAAO,UAAU,GAAG,GAAG,CAC7E,CAAC;oBACF,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,oBAAoB,SAAS,EAAE,CAAC;QAEjD,+BAA+B;QAC/B,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAElE,8BAA8B;QAC9B,MAAM,OAAO,GAA2B;YACtC,UAAU,EAAE,QAAQ;YACpB,WAAW,EAAE,QAAQ;YACrB,0BAA0B;YAC1B,aAAa,EAAE,KAAK,CAAC,UAAU;YAC/B,kBAAkB,EAAE,KAAK,CAAC,UAAU;YACpC,UAAU;YACV,mBAAmB,EAAE,KAAK,CAAC,UAAU;YACrC,wBAAwB;YACxB,eAAe,EAAE,OAAO,CAAC,EAAE;SAC5B,CAAC;QAEF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;QAChC,CAAC;QAED,2BAA2B;QAC3B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QAEpC,4DAA4D;QAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/restart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,cAAc,SAqCvB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { findProjectRoot } from "../../shared/project.js";
|
|
3
|
+
import { isDaemonRunning, restartDaemon, startDaemon, getDaemonVersion, } from "../../shared/daemon.js";
|
|
4
|
+
import { parseVerbosity } from "../../shared/logger.js";
|
|
5
|
+
import { getHtpxVersion } from "../../shared/version.js";
|
|
6
|
+
export const restartCommand = new Command("restart")
|
|
7
|
+
.description("Restart the daemon")
|
|
8
|
+
.action(async (_, command) => {
|
|
9
|
+
const globalOpts = command.optsWithGlobals();
|
|
10
|
+
const verbosity = globalOpts.verbose ?? 0;
|
|
11
|
+
const logLevel = parseVerbosity(verbosity);
|
|
12
|
+
const projectRoot = findProjectRoot();
|
|
13
|
+
if (!projectRoot) {
|
|
14
|
+
console.error("Not in a project directory (no .htpx or .git found)");
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const cliVersion = getHtpxVersion();
|
|
19
|
+
if (await isDaemonRunning(projectRoot)) {
|
|
20
|
+
const daemonVersion = await getDaemonVersion(projectRoot);
|
|
21
|
+
const versionInfo = daemonVersion && daemonVersion !== cliVersion
|
|
22
|
+
? ` (${daemonVersion} -> ${cliVersion})`
|
|
23
|
+
: "";
|
|
24
|
+
console.log(`Restarting daemon${versionInfo}...`);
|
|
25
|
+
const port = await restartDaemon(projectRoot, logLevel);
|
|
26
|
+
console.log(`Daemon restarted on port ${port}`);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
console.log("Daemon not running, starting...");
|
|
30
|
+
const port = await startDaemon(projectRoot, { logLevel });
|
|
31
|
+
console.log(`Daemon started on port ${port}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
const message = err instanceof Error ? err.message : "Unknown error";
|
|
36
|
+
console.error(`Failed to restart daemon: ${message}`);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=restart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../src/cli/commands/restart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EACL,eAAe,EACf,aAAa,EACb,WAAW,EACX,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,oBAAoB,CAAC;KACjC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,OAAgB,EAAE,EAAE;IACpC,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAA0B,CAAC;IACrE,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE3C,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IAEtC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;QAEpC,IAAI,MAAM,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC;YACvC,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC1D,MAAM,WAAW,GACf,aAAa,IAAI,aAAa,KAAK,UAAU;gBAC3C,CAAC,CAAC,KAAK,aAAa,OAAO,UAAU,GAAG;gBACxC,CAAC,CAAC,EAAE,CAAC;YAET,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,KAAK,CAAC,CAAC;YAClD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/tui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/tui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,UAAU,SAwCnB,CAAC"}
|
package/dist/cli/commands/tui.js
CHANGED
|
@@ -2,11 +2,22 @@ import { Command } from "commander";
|
|
|
2
2
|
import { render } from "ink";
|
|
3
3
|
import React from "react";
|
|
4
4
|
import { App } from "../tui/App.js";
|
|
5
|
+
import { findProjectRoot } from "../../shared/project.js";
|
|
6
|
+
import { createLogger, parseVerbosity } from "../../shared/logger.js";
|
|
5
7
|
export const tuiCommand = new Command("tui")
|
|
6
8
|
.description("Browse captured HTTP traffic")
|
|
7
9
|
.option("-l, --label <label>", "Filter by session label")
|
|
8
10
|
.option("--ci", "CI mode: render once and exit after a short delay (for testing)")
|
|
9
|
-
.action((options) => {
|
|
11
|
+
.action((options, command) => {
|
|
12
|
+
const globalOpts = command.optsWithGlobals();
|
|
13
|
+
const verbosity = globalOpts.verbose ?? 0;
|
|
14
|
+
const logLevel = parseVerbosity(verbosity);
|
|
15
|
+
const projectRoot = findProjectRoot();
|
|
16
|
+
// Log TUI startup
|
|
17
|
+
if (projectRoot) {
|
|
18
|
+
const logger = createLogger("tui", projectRoot, logLevel);
|
|
19
|
+
logger.info("TUI started", { label: options.label });
|
|
20
|
+
}
|
|
10
21
|
const { waitUntilExit, unmount } = render(React.createElement(App, { label: options.label }));
|
|
11
22
|
// In CI mode, exit after a short delay to allow initial render
|
|
12
23
|
if (options.ci) {
|
|
@@ -15,6 +26,11 @@ export const tuiCommand = new Command("tui")
|
|
|
15
26
|
}, 500);
|
|
16
27
|
}
|
|
17
28
|
void waitUntilExit().then(() => {
|
|
29
|
+
// Log TUI exit
|
|
30
|
+
if (projectRoot) {
|
|
31
|
+
const logger = createLogger("tui", projectRoot, logLevel);
|
|
32
|
+
logger.info("TUI exited");
|
|
33
|
+
}
|
|
18
34
|
// Print curl command if one was exported
|
|
19
35
|
const curl = globalThis["__htpxCurl"];
|
|
20
36
|
if (typeof curl === "string") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../../../src/cli/commands/tui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../../../src/cli/commands/tui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;KACxD,MAAM,CAAC,MAAM,EAAE,iEAAiE,CAAC;KACjF,MAAM,CAAC,CAAC,OAAyC,EAAE,OAAgB,EAAE,EAAE;IACtE,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAA0B,CAAC;IACrE,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IAEtC,kBAAkB;IAClB,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAE9F,+DAA+D;IAC/D,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;QACf,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED,KAAK,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAC7B,eAAe;QACf,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5B,CAAC;QAED,yCAAyC;QACzC,MAAM,IAAI,GAAI,UAAsC,CAAC,YAAY,CAAC,CAAC;QACnE,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,20 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { program } from "commander";
|
|
3
3
|
import { clearCommand } from "./commands/clear.js";
|
|
4
|
+
import { debugDumpCommand } from "./commands/debug-dump.js";
|
|
4
5
|
import { initCommand } from "./commands/init.js";
|
|
5
6
|
import { interceptCommand } from "./commands/intercept.js";
|
|
6
7
|
import { projectCommand } from "./commands/project.js";
|
|
8
|
+
import { restartCommand } from "./commands/restart.js";
|
|
7
9
|
import { tuiCommand } from "./commands/tui.js";
|
|
8
10
|
import { statusCommand } from "./commands/status.js";
|
|
9
11
|
import { stopCommand } from "./commands/stop.js";
|
|
10
|
-
program
|
|
12
|
+
program
|
|
13
|
+
.name("htpx")
|
|
14
|
+
.description("Terminal HTTP interception toolkit")
|
|
15
|
+
.version("0.1.0")
|
|
16
|
+
.option("-v, --verbose", "increase verbosity (use -vv or -vvv for more)", (_, prev) => prev + 1, 0);
|
|
11
17
|
program.addCommand(clearCommand);
|
|
18
|
+
program.addCommand(debugDumpCommand);
|
|
12
19
|
program.addCommand(initCommand);
|
|
13
20
|
program.addCommand(interceptCommand);
|
|
14
21
|
program.addCommand(projectCommand);
|
|
22
|
+
program.addCommand(restartCommand);
|
|
15
23
|
program.addCommand(tuiCommand);
|
|
16
24
|
program.addCommand(statusCommand);
|
|
17
25
|
program.addCommand(stopCommand);
|
|
18
26
|
program.parse();
|
|
19
|
-
// test
|
|
20
27
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,oCAAoC,CAAC;KACjD,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CACL,eAAe,EACf,+CAA+C,EAC/C,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,EAC7B,CAAC,CACF,CAAC;AAEJ,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAEhC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/daemon/control.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import type { RequestRepository } from "./storage.js";
|
|
2
2
|
import type { CapturedRequest, DaemonStatus, Session } from "../shared/types.js";
|
|
3
|
+
import { type LogLevel } from "../shared/logger.js";
|
|
3
4
|
export interface ControlServerOptions {
|
|
4
5
|
socketPath: string;
|
|
5
6
|
storage: RequestRepository;
|
|
6
7
|
proxyPort: number;
|
|
8
|
+
version: string;
|
|
9
|
+
projectRoot?: string;
|
|
10
|
+
logLevel?: LogLevel;
|
|
7
11
|
}
|
|
8
12
|
export interface ControlServer {
|
|
9
13
|
close: () => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../src/daemon/control.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../src/daemon/control.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAgB,KAAK,QAAQ,EAAe,MAAM,qBAAqB,CAAC;AAE/E,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAmBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAwJhF;AAiCD;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAK;gBAEV,UAAU,EAAE,MAAM;IAI9B;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA6C9E;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAS9B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAIrC;;OAEG;IACG,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrE;;OAEG;IACG,YAAY,CAAC,OAAO,CAAC,EAAE;QAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAI9B;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAI7D;;OAEG;IACG,aAAa,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAItF;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAGrC"}
|
package/dist/daemon/control.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import * as net from "node:net";
|
|
2
2
|
import * as fs from "node:fs";
|
|
3
|
+
import { createLogger } from "../shared/logger.js";
|
|
3
4
|
/**
|
|
4
5
|
* Create a Unix socket control server for daemon communication.
|
|
5
6
|
*/
|
|
6
7
|
export function createControlServer(options) {
|
|
7
|
-
const { socketPath, storage, proxyPort } = options;
|
|
8
|
+
const { socketPath, storage, proxyPort, version, projectRoot, logLevel } = options;
|
|
9
|
+
// Create logger if projectRoot is provided
|
|
10
|
+
const logger = projectRoot
|
|
11
|
+
? createLogger("control", projectRoot, logLevel)
|
|
12
|
+
: undefined;
|
|
8
13
|
// Remove existing socket file if it exists
|
|
9
14
|
if (fs.existsSync(socketPath)) {
|
|
10
15
|
fs.unlinkSync(socketPath);
|
|
@@ -21,6 +26,7 @@ export function createControlServer(options) {
|
|
|
21
26
|
proxyPort,
|
|
22
27
|
sessionCount: sessions.length,
|
|
23
28
|
requestCount,
|
|
29
|
+
version,
|
|
24
30
|
};
|
|
25
31
|
},
|
|
26
32
|
/**
|
|
@@ -89,10 +95,14 @@ export function createControlServer(options) {
|
|
|
89
95
|
buffer = buffer.slice(newlineIndex + 1);
|
|
90
96
|
try {
|
|
91
97
|
const message = JSON.parse(messageStr);
|
|
98
|
+
logger?.debug("Control message received", { type: message.method });
|
|
92
99
|
const response = handleMessage(message, handlers);
|
|
93
100
|
socket.write(JSON.stringify(response) + "\n");
|
|
94
101
|
}
|
|
95
102
|
catch (err) {
|
|
103
|
+
logger?.error("Control message parse error", {
|
|
104
|
+
error: err instanceof Error ? err.message : "Unknown error",
|
|
105
|
+
});
|
|
96
106
|
const errorResponse = {
|
|
97
107
|
id: "unknown",
|
|
98
108
|
error: {
|
|
@@ -105,8 +115,7 @@ export function createControlServer(options) {
|
|
|
105
115
|
}
|
|
106
116
|
});
|
|
107
117
|
socket.on("error", (err) => {
|
|
108
|
-
|
|
109
|
-
console.error("Control socket error:", err.message);
|
|
118
|
+
logger?.error("Control socket error", { error: err.message });
|
|
110
119
|
});
|
|
111
120
|
});
|
|
112
121
|
server.listen(socketPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/daemon/control.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/daemon/control.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/index.js
CHANGED
|
@@ -6,6 +6,8 @@ import { RequestRepository } from "./storage.js";
|
|
|
6
6
|
import { createProxy } from "./proxy.js";
|
|
7
7
|
import { createControlServer } from "./control.js";
|
|
8
8
|
import { getHtpxPaths, ensureHtpxDir, writeProxyPort, writeDaemonPid, removeDaemonPid, } from "../shared/project.js";
|
|
9
|
+
import { createLogger, isValidLogLevel } from "../shared/logger.js";
|
|
10
|
+
import { getHtpxVersion } from "../shared/version.js";
|
|
9
11
|
/**
|
|
10
12
|
* Daemon entry point.
|
|
11
13
|
* Expected to be spawned as a background process with PROJECT_ROOT env var set.
|
|
@@ -18,10 +20,14 @@ async function main() {
|
|
|
18
20
|
}
|
|
19
21
|
// Ensure .htpx directory exists
|
|
20
22
|
ensureHtpxDir(projectRoot);
|
|
23
|
+
// Parse log level from environment
|
|
24
|
+
const envLogLevel = process.env["HTPX_LOG_LEVEL"];
|
|
25
|
+
const logLevel = envLogLevel && isValidLogLevel(envLogLevel) ? envLogLevel : "warn";
|
|
26
|
+
const logger = createLogger("daemon", projectRoot, logLevel);
|
|
21
27
|
const paths = getHtpxPaths(projectRoot);
|
|
22
28
|
// Generate CA certificate if it doesn't exist
|
|
23
29
|
if (!fs.existsSync(paths.caCertFile) || !fs.existsSync(paths.caKeyFile)) {
|
|
24
|
-
|
|
30
|
+
logger.info("Generating CA certificate");
|
|
25
31
|
const ca = await generateCACertificate({
|
|
26
32
|
subject: { commonName: "htpx Local CA - DO NOT TRUST" },
|
|
27
33
|
});
|
|
@@ -31,36 +37,50 @@ async function main() {
|
|
|
31
37
|
fs.chmodSync(paths.caKeyFile, 0o600);
|
|
32
38
|
}
|
|
33
39
|
// Initialise storage
|
|
34
|
-
const storage = new RequestRepository(paths.databaseFile);
|
|
40
|
+
const storage = new RequestRepository(paths.databaseFile, projectRoot, logLevel);
|
|
35
41
|
// Find a free port for the proxy
|
|
36
42
|
const proxyPort = await findFreePort();
|
|
43
|
+
// Ensure daemon session exists (handles restarts gracefully)
|
|
44
|
+
const DAEMON_SESSION_ID = "daemon";
|
|
45
|
+
storage.ensureSession(DAEMON_SESSION_ID, "daemon", process.pid);
|
|
37
46
|
// Start the proxy server
|
|
38
|
-
|
|
47
|
+
logger.info("Starting proxy", { port: proxyPort });
|
|
39
48
|
const proxy = await createProxy({
|
|
40
49
|
port: proxyPort,
|
|
41
50
|
caKeyPath: paths.caKeyFile,
|
|
42
51
|
caCertPath: paths.caCertFile,
|
|
43
52
|
storage,
|
|
44
|
-
sessionId:
|
|
53
|
+
sessionId: DAEMON_SESSION_ID,
|
|
54
|
+
projectRoot,
|
|
55
|
+
logLevel,
|
|
45
56
|
});
|
|
46
57
|
// Write proxy port to file
|
|
47
58
|
writeProxyPort(projectRoot, proxy.port);
|
|
48
59
|
// Start control server
|
|
49
|
-
|
|
60
|
+
const daemonVersion = getHtpxVersion();
|
|
61
|
+
logger.info("Starting control server", {
|
|
62
|
+
socketPath: paths.controlSocketFile,
|
|
63
|
+
version: daemonVersion,
|
|
64
|
+
});
|
|
50
65
|
const controlServer = createControlServer({
|
|
51
66
|
socketPath: paths.controlSocketFile,
|
|
52
67
|
storage,
|
|
53
68
|
proxyPort: proxy.port,
|
|
69
|
+
version: daemonVersion,
|
|
70
|
+
projectRoot,
|
|
71
|
+
logLevel,
|
|
54
72
|
});
|
|
55
73
|
// Write PID file
|
|
56
74
|
writeDaemonPid(projectRoot, process.pid);
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
75
|
+
logger.info("Daemon started", {
|
|
76
|
+
pid: process.pid,
|
|
77
|
+
proxyPort: proxy.port,
|
|
78
|
+
controlSocket: paths.controlSocketFile,
|
|
79
|
+
caCert: paths.caCertFile,
|
|
80
|
+
});
|
|
61
81
|
// Handle graceful shutdown
|
|
62
82
|
const shutdown = async (signal) => {
|
|
63
|
-
|
|
83
|
+
logger.info("Received shutdown signal", { signal });
|
|
64
84
|
try {
|
|
65
85
|
await controlServer.close();
|
|
66
86
|
await proxy.stop();
|
|
@@ -70,11 +90,13 @@ async function main() {
|
|
|
70
90
|
if (fs.existsSync(paths.proxyPortFile)) {
|
|
71
91
|
fs.unlinkSync(paths.proxyPortFile);
|
|
72
92
|
}
|
|
73
|
-
|
|
93
|
+
logger.info("Shutdown complete");
|
|
74
94
|
process.exit(0);
|
|
75
95
|
}
|
|
76
96
|
catch (err) {
|
|
77
|
-
|
|
97
|
+
logger.error("Error during shutdown", {
|
|
98
|
+
error: err instanceof Error ? err.message : String(err),
|
|
99
|
+
});
|
|
78
100
|
process.exit(1);
|
|
79
101
|
}
|
|
80
102
|
};
|
|
@@ -101,6 +123,7 @@ async function findFreePort() {
|
|
|
101
123
|
});
|
|
102
124
|
}
|
|
103
125
|
main().catch((err) => {
|
|
126
|
+
// Can't use logger here as we may not have initialised it yet
|
|
104
127
|
console.error("Daemon error:", err);
|
|
105
128
|
process.exit(1);
|
|
106
129
|
});
|
package/dist/daemon/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,cAAc,EACd,eAAe,GAChB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"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"}
|