htpx-cli 0.1.0 → 0.1.2

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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +4 -0
  3. package/dist/cli/commands/debug-dump.d.ts +27 -0
  4. package/dist/cli/commands/debug-dump.d.ts.map +1 -0
  5. package/dist/cli/commands/debug-dump.js +104 -0
  6. package/dist/cli/commands/debug-dump.js.map +1 -0
  7. package/dist/cli/commands/intercept.d.ts.map +1 -1
  8. package/dist/cli/commands/intercept.js +20 -2
  9. package/dist/cli/commands/intercept.js.map +1 -1
  10. package/dist/cli/commands/restart.d.ts +3 -0
  11. package/dist/cli/commands/restart.d.ts.map +1 -0
  12. package/dist/cli/commands/restart.js +40 -0
  13. package/dist/cli/commands/restart.js.map +1 -0
  14. package/dist/cli/commands/tui.d.ts.map +1 -1
  15. package/dist/cli/commands/tui.js +17 -1
  16. package/dist/cli/commands/tui.js.map +1 -1
  17. package/dist/cli/index.js +10 -2
  18. package/dist/cli/index.js.map +1 -1
  19. package/dist/daemon/control.d.ts +4 -0
  20. package/dist/daemon/control.d.ts.map +1 -1
  21. package/dist/daemon/control.js +12 -3
  22. package/dist/daemon/control.js.map +1 -1
  23. package/dist/daemon/index.js +35 -12
  24. package/dist/daemon/index.js.map +1 -1
  25. package/dist/daemon/proxy.d.ts +3 -0
  26. package/dist/daemon/proxy.d.ts.map +1 -1
  27. package/dist/daemon/proxy.js +14 -1
  28. package/dist/daemon/proxy.js.map +1 -1
  29. package/dist/daemon/storage.d.ts +9 -1
  30. package/dist/daemon/storage.d.ts.map +1 -1
  31. package/dist/daemon/storage.js +32 -1
  32. package/dist/daemon/storage.js.map +1 -1
  33. package/dist/shared/daemon.d.ts +20 -1
  34. package/dist/shared/daemon.d.ts.map +1 -1
  35. package/dist/shared/daemon.js +54 -1
  36. package/dist/shared/daemon.js.map +1 -1
  37. package/dist/shared/logger.d.ts +31 -0
  38. package/dist/shared/logger.d.ts.map +1 -0
  39. package/dist/shared/logger.js +121 -0
  40. package/dist/shared/logger.js.map +1 -0
  41. package/dist/shared/project.d.ts +1 -0
  42. package/dist/shared/project.d.ts.map +1 -1
  43. package/dist/shared/project.js +1 -0
  44. package/dist/shared/project.js.map +1 -1
  45. package/dist/shared/types.d.ts +1 -0
  46. package/dist/shared/types.d.ts.map +1 -1
  47. package/dist/shared/version.d.ts +5 -0
  48. package/dist/shared/version.d.ts.map +1 -0
  49. package/dist/shared/version.js +21 -0
  50. package/dist/shared/version.js.map +1 -0
  51. 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
+ [![npm version](https://img.shields.io/npm/v/htpx-cli.svg)](https://www.npmjs.com/package/htpx-cli)
4
+ [![CI](https://github.com/mtford90/htpx/actions/workflows/ci.yml/badge.svg)](https://github.com/mtford90/htpx/actions/workflows/ci.yml)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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":"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"}
@@ -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;AAKpC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAIlE;AAED,eAAO,MAAM,gBAAgB,SAmDzB,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
- .action(async (options) => {
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,OAA2B,EAAE,EAAE;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAE5B,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,CAAC,CAAC;QACjD,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"}
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,3 @@
1
+ import { Command } from "commander";
2
+ export declare const restartCommand: Command;
3
+ //# sourceMappingURL=restart.d.ts.map
@@ -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;AAKpC,eAAO,MAAM,UAAU,SAyBnB,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"}
@@ -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;AAEpC,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,EAAE;IACpD,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,MAAM,CACvC,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CACnD,CAAC;IAEF,+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,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"}
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,28 @@
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.name("htpx").description("Terminal HTTP interception toolkit").version("0.1.0");
12
+ import { getHtpxVersion } from "../shared/version.js";
13
+ program
14
+ .name("htpx")
15
+ .description("Terminal HTTP interception toolkit")
16
+ .version(getHtpxVersion())
17
+ .option("-v, --verbose", "increase verbosity (use -vv or -vvv for more)", (_, prev) => prev + 1, 0);
11
18
  program.addCommand(clearCommand);
19
+ program.addCommand(debugDumpCommand);
12
20
  program.addCommand(initCommand);
13
21
  program.addCommand(interceptCommand);
14
22
  program.addCommand(projectCommand);
23
+ program.addCommand(restartCommand);
15
24
  program.addCommand(tuiCommand);
16
25
  program.addCommand(statusCommand);
17
26
  program.addCommand(stopCommand);
18
27
  program.parse();
19
- // test
20
28
  //# sourceMappingURL=index.js.map
@@ -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,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAExF,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,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,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;AAChB,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;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,oCAAoC,CAAC;KACjD,OAAO,CAAC,cAAc,EAAE,CAAC;KACzB,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"}
@@ -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;AAEjF,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;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,CA+IhF;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"}
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"}
@@ -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
- // Log but don't crash on socket errors
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":"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"}
1
+ {"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/daemon/control.ts"],"names":[],"mappings":"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"}
@@ -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
- console.log("Generating CA certificate...");
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
- console.log(`Starting proxy on port ${proxyPort}...`);
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: "daemon", // Default session for unattributed requests
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
- console.log("Starting control server...");
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
- console.log(`htpx daemon started (PID: ${process.pid})`);
58
- console.log(` Proxy: http://127.0.0.1:${proxy.port}`);
59
- console.log(` Control: ${paths.controlSocketFile}`);
60
- console.log(` CA cert: ${paths.caCertFile}`);
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
- console.log(`\nReceived ${signal}, shutting down...`);
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
- console.log("Shutdown complete");
93
+ logger.info("Shutdown complete");
74
94
  process.exit(0);
75
95
  }
76
96
  catch (err) {
77
- console.error("Error during shutdown:", err);
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
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"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"}