sequant 1.2.5 → 1.3.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.
Files changed (67) hide show
  1. package/README.md +18 -0
  2. package/dist/bin/cli.js +10 -0
  3. package/dist/bin/cli.js.map +1 -1
  4. package/dist/src/commands/doctor.d.ts.map +1 -1
  5. package/dist/src/commands/doctor.js +33 -1
  6. package/dist/src/commands/doctor.js.map +1 -1
  7. package/dist/src/commands/doctor.test.js +84 -1
  8. package/dist/src/commands/doctor.test.js.map +1 -1
  9. package/dist/src/commands/init.d.ts.map +1 -1
  10. package/dist/src/commands/init.js +8 -2
  11. package/dist/src/commands/init.js.map +1 -1
  12. package/dist/src/commands/init.test.js +2 -1
  13. package/dist/src/commands/init.test.js.map +1 -1
  14. package/dist/src/commands/logs.d.ts +2 -0
  15. package/dist/src/commands/logs.d.ts.map +1 -1
  16. package/dist/src/commands/logs.js +41 -0
  17. package/dist/src/commands/logs.js.map +1 -1
  18. package/dist/src/commands/run.d.ts +20 -0
  19. package/dist/src/commands/run.d.ts.map +1 -1
  20. package/dist/src/commands/run.js +38 -4
  21. package/dist/src/commands/run.js.map +1 -1
  22. package/dist/src/commands/run.test.js +166 -1
  23. package/dist/src/commands/run.test.js.map +1 -1
  24. package/dist/src/commands/stats.d.ts +16 -0
  25. package/dist/src/commands/stats.d.ts.map +1 -0
  26. package/dist/src/commands/stats.js +271 -0
  27. package/dist/src/commands/stats.js.map +1 -0
  28. package/dist/src/commands/stats.test.d.ts +7 -0
  29. package/dist/src/commands/stats.test.d.ts.map +1 -0
  30. package/dist/src/commands/stats.test.js +218 -0
  31. package/dist/src/commands/stats.test.js.map +1 -0
  32. package/dist/src/commands/update.d.ts.map +1 -1
  33. package/dist/src/commands/update.js +15 -3
  34. package/dist/src/commands/update.js.map +1 -1
  35. package/dist/src/lib/settings.d.ts +17 -0
  36. package/dist/src/lib/settings.d.ts.map +1 -1
  37. package/dist/src/lib/settings.js +9 -0
  38. package/dist/src/lib/settings.js.map +1 -1
  39. package/dist/src/lib/system.d.ts +26 -0
  40. package/dist/src/lib/system.d.ts.map +1 -1
  41. package/dist/src/lib/system.js +72 -1
  42. package/dist/src/lib/system.js.map +1 -1
  43. package/dist/src/lib/workflow/log-rotation.d.ts +138 -0
  44. package/dist/src/lib/workflow/log-rotation.d.ts.map +1 -0
  45. package/dist/src/lib/workflow/log-rotation.js +232 -0
  46. package/dist/src/lib/workflow/log-rotation.js.map +1 -0
  47. package/dist/src/lib/workflow/log-rotation.test.d.ts +7 -0
  48. package/dist/src/lib/workflow/log-rotation.test.d.ts.map +1 -0
  49. package/dist/src/lib/workflow/log-rotation.test.js +248 -0
  50. package/dist/src/lib/workflow/log-rotation.test.js.map +1 -0
  51. package/dist/src/lib/workflow/log-writer.d.ts +6 -0
  52. package/dist/src/lib/workflow/log-writer.d.ts.map +1 -1
  53. package/dist/src/lib/workflow/log-writer.js +12 -0
  54. package/dist/src/lib/workflow/log-writer.js.map +1 -1
  55. package/dist/src/lib/workflow/log-writer.test.js +4 -1
  56. package/dist/src/lib/workflow/log-writer.test.js.map +1 -1
  57. package/dist/src/lib/workflow/run-log-schema.d.ts +6 -0
  58. package/dist/src/lib/workflow/run-log-schema.d.ts.map +1 -1
  59. package/dist/src/lib/workflow/run-log-schema.js +1 -0
  60. package/dist/src/lib/workflow/run-log-schema.js.map +1 -1
  61. package/dist/src/lib/workflow/types.d.ts +1 -1
  62. package/dist/src/lib/workflow/types.d.ts.map +1 -1
  63. package/dist/src/lib/workflow/types.js.map +1 -1
  64. package/package.json +2 -1
  65. package/templates/skills/fullsolve/SKILL.md +17 -0
  66. package/templates/skills/spec/references/recommended-workflow.md +92 -0
  67. package/templates/skills/test/SKILL.md +73 -6
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/lib/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,0CAA0C;AAC1C,eAAO,MAAM,aAAa,2BAA2B,CAAC;AAEtD,sCAAsC;AACtC,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,UAAU,EAAE,OAAO,CAAC;IACpB,qCAAqC;IACrC,WAAW,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,GAAG,EAAE,WAAW,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,eAY9B,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC,CAoB5D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3E;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAEtD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3D"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/lib/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,0CAA0C;AAC1C,eAAO,MAAM,aAAa,2BAA2B,CAAC;AAEtD,sCAAsC;AACtC,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,UAAU,EAAE,OAAO,CAAC;IACpB,qCAAqC;IACrC,WAAW,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,4BAA4B;IAC5B,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,GAAG,EAAE,WAAW,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,gBAIvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,eAa9B,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC,CAoB5D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3E;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAEtD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3D"}
@@ -16,6 +16,14 @@ import { dirname } from "path";
16
16
  export const SETTINGS_PATH = ".sequant/settings.json";
17
17
  /** Current settings schema version */
18
18
  export const SETTINGS_VERSION = "1.0";
19
+ /**
20
+ * Default rotation settings
21
+ */
22
+ export const DEFAULT_ROTATION_SETTINGS = {
23
+ enabled: true,
24
+ maxSizeMB: 10,
25
+ maxFiles: 100,
26
+ };
19
27
  /**
20
28
  * Default settings
21
29
  */
@@ -30,6 +38,7 @@ export const DEFAULT_SETTINGS = {
30
38
  qualityLoop: false,
31
39
  maxIterations: 3,
32
40
  smartTests: true,
41
+ rotation: DEFAULT_ROTATION_SETTINGS,
33
42
  },
34
43
  };
35
44
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/lib/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,0CAA0C;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAEtD,sCAAsC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAkCtC;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,OAAO,EAAE,gBAAgB;IACzB,GAAG,EAAE;QACH,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,eAAe;QACxB,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,KAAK;QAClB,aAAa,EAAE,CAAC;QAChB,UAAU,EAAE,IAAI;KACjB;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA6B,CAAC;QAE/D,iDAAiD;QACjD,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,gBAAgB,CAAC,OAAO;YACnD,GAAG,EAAE;gBACH,GAAG,gBAAgB,CAAC,GAAG;gBACvB,GAAG,MAAM,CAAC,GAAG;aACd;SACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,gBAAgB,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAyB;IAC1D,MAAM,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IACxC,MAAM,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,YAAY,CAAC,gBAAgB,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/lib/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,0CAA0C;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAEtD,sCAAsC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAgDtC;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAqB;IACzD,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE,GAAG;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,OAAO,EAAE,gBAAgB;IACzB,GAAG,EAAE;QACH,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,eAAe;QACxB,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,KAAK;QAClB,aAAa,EAAE,CAAC;QAChB,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,yBAAyB;KACpC;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA6B,CAAC;QAE/D,iDAAiD;QACjD,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,gBAAgB,CAAC,OAAO;YACnD,GAAG,EAAE;gBACH,GAAG,gBAAgB,CAAC,GAAG;gBACvB,GAAG,MAAM,CAAC,GAAG;aACd;SACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,gBAAgB,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAyB;IAC1D,MAAM,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IACxC,MAAM,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,YAAY,CAAC,gBAAgB,CAAC,CAAC;AACvC,CAAC"}
@@ -21,4 +21,30 @@ export declare function isNativeWindows(): boolean;
21
21
  * Get platform-specific install hint for a package
22
22
  */
23
23
  export declare function getInstallHint(pkg: string): string;
24
+ /**
25
+ * MCP server information for Sequant integrations
26
+ */
27
+ export interface McpServerInfo {
28
+ name: string;
29
+ purpose: string;
30
+ skills: string[];
31
+ installUrl: string;
32
+ }
33
+ /**
34
+ * Optional MCP servers that enhance Sequant functionality
35
+ */
36
+ export declare const OPTIONAL_MCP_SERVERS: McpServerInfo[];
37
+ /**
38
+ * Get the path to Claude Desktop config file
39
+ */
40
+ export declare function getClaudeConfigPath(): string;
41
+ /**
42
+ * Read configured MCP servers from Claude Desktop config
43
+ */
44
+ export declare function getConfiguredMcpServers(): string[];
45
+ /**
46
+ * Check which optional MCP servers are configured
47
+ * Returns an object with server names as keys and configured status as values
48
+ */
49
+ export declare function checkOptionalMcpServers(): Record<string, boolean>;
24
50
  //# sourceMappingURL=system.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../src/lib/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOlD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAO3C;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAc/B;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAsBlD"}
1
+ {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../src/lib/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOlD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAO3C;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAa/B;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAsBlD;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,EAqB/C,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAY5C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,CAYlD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAejE"}
@@ -2,6 +2,7 @@
2
2
  * System utility functions for checking prerequisites
3
3
  */
4
4
  import { execSync } from "child_process";
5
+ import fs from "fs";
5
6
  /**
6
7
  * Check if a command exists on the system
7
8
  */
@@ -34,7 +35,6 @@ export function isWSL() {
34
35
  return false;
35
36
  }
36
37
  try {
37
- const fs = require("fs");
38
38
  const procVersion = fs.readFileSync("/proc/version", "utf8");
39
39
  return (procVersion.toLowerCase().includes("microsoft") ||
40
40
  procVersion.toLowerCase().includes("wsl"));
@@ -72,4 +72,75 @@ export function getInstallHint(pkg) {
72
72
  }
73
73
  return pkgHints[platform] || pkgHints["linux"] || `Install ${pkg}`;
74
74
  }
75
+ /**
76
+ * Optional MCP servers that enhance Sequant functionality
77
+ */
78
+ export const OPTIONAL_MCP_SERVERS = [
79
+ {
80
+ name: "chrome-devtools",
81
+ purpose: "Browser automation for UI testing",
82
+ skills: ["/test", "/testgen", "/loop"],
83
+ installUrl: "https://github.com/anthropics/anthropic-quickstarts/tree/main/mcp-chrome-devtools",
84
+ },
85
+ {
86
+ name: "context7",
87
+ purpose: "External library documentation lookup",
88
+ skills: ["/exec", "/fullsolve"],
89
+ installUrl: "https://github.com/upstash/context7",
90
+ },
91
+ {
92
+ name: "sequential-thinking",
93
+ purpose: "Complex multi-step reasoning",
94
+ skills: ["/fullsolve"],
95
+ installUrl: "https://github.com/anthropics/anthropic-quickstarts/tree/main/mcp-sequential-thinking",
96
+ },
97
+ ];
98
+ /**
99
+ * Get the path to Claude Desktop config file
100
+ */
101
+ export function getClaudeConfigPath() {
102
+ const platform = process.platform;
103
+ const home = process.env.HOME || process.env.USERPROFILE || "";
104
+ if (platform === "darwin") {
105
+ return `${home}/Library/Application Support/Claude/claude_desktop_config.json`;
106
+ }
107
+ else if (platform === "win32") {
108
+ return `${process.env.APPDATA}\\Claude\\claude_desktop_config.json`;
109
+ }
110
+ else {
111
+ // Linux
112
+ return `${home}/.config/claude/claude_desktop_config.json`;
113
+ }
114
+ }
115
+ /**
116
+ * Read configured MCP servers from Claude Desktop config
117
+ */
118
+ export function getConfiguredMcpServers() {
119
+ const configPath = getClaudeConfigPath();
120
+ try {
121
+ const content = fs.readFileSync(configPath, "utf8");
122
+ const config = JSON.parse(content);
123
+ const servers = config.mcpServers || {};
124
+ return Object.keys(servers);
125
+ }
126
+ catch {
127
+ // Config file doesn't exist or is invalid
128
+ return [];
129
+ }
130
+ }
131
+ /**
132
+ * Check which optional MCP servers are configured
133
+ * Returns an object with server names as keys and configured status as values
134
+ */
135
+ export function checkOptionalMcpServers() {
136
+ const configuredServers = getConfiguredMcpServers();
137
+ const result = {};
138
+ for (const server of OPTIONAL_MCP_SERVERS) {
139
+ // Check for various naming conventions
140
+ const found = configuredServers.some((configured) => configured.toLowerCase().includes(server.name.toLowerCase()) ||
141
+ server.name.toLowerCase().includes(configured.toLowerCase()));
142
+ result[server.name] = found;
143
+ }
144
+ return result;
145
+ }
75
146
  //# sourceMappingURL=system.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/lib/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,QAAQ,CAAC,cAAc,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,QAAQ,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK;IACnB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAC7D,OAAO,CACL,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC/C,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC1C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,MAAM,KAAK,GAA2C;QACpD,EAAE,EAAE;YACF,MAAM,EAAE,iBAAiB;YACzB,KAAK,EAAE,sCAAsC;YAC7C,KAAK,EAAE,0CAA0C;SAClD;QACD,EAAE,EAAE;YACF,MAAM,EAAE,iBAAiB;YACzB,KAAK,EAAE,+CAA+C;YACtD,KAAK,EAAE,mDAAmD;SAC3D;KACF,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,WAAW,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/lib/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,QAAQ,CAAC,cAAc,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,QAAQ,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK;IACnB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAC7D,OAAO,CACL,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC/C,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC1C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,MAAM,KAAK,GAA2C;QACpD,EAAE,EAAE;YACF,MAAM,EAAE,iBAAiB;YACzB,KAAK,EAAE,sCAAsC;YAC7C,KAAK,EAAE,0CAA0C;SAClD;QACD,EAAE,EAAE;YACF,MAAM,EAAE,iBAAiB;YACzB,KAAK,EAAE,+CAA+C;YACtD,KAAK,EAAE,mDAAmD;SAC3D;KACF,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,WAAW,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC;AACrE,CAAC;AAYD;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAoB;IACnD;QACE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,mCAAmC;QAC5C,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC;QACtC,UAAU,EACR,mFAAmF;KACtF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,uCAAuC;QAChD,MAAM,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;QAC/B,UAAU,EAAE,qCAAqC;KAClD;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,8BAA8B;QACvC,MAAM,EAAE,CAAC,YAAY,CAAC;QACtB,UAAU,EACR,uFAAuF;KAC1F;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAE/D,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,GAAG,IAAI,gEAAgE,CAAC;IACjF,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,sCAAsC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,QAAQ;QACR,OAAO,GAAG,IAAI,4CAA4C,CAAC;IAC7D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QACxC,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,iBAAiB,GAAG,uBAAuB,EAAE,CAAC;IACpD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,MAAM,IAAI,oBAAoB,EAAE,CAAC;QAC1C,uCAAuC;QACvC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAClC,CAAC,UAAU,EAAE,EAAE,CACb,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAC/D,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Log rotation management for workflow run logs
3
+ *
4
+ * Implements automatic log rotation based on size and file count thresholds.
5
+ * Deletes oldest logs first until within limits.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { rotateIfNeeded, getLogStats, manualRotate } from './log-rotation';
10
+ *
11
+ * // Auto-rotate after a run
12
+ * await rotateIfNeeded('.sequant/logs');
13
+ *
14
+ * // Get statistics
15
+ * const stats = await getLogStats('.sequant/logs');
16
+ * console.log(`${stats.fileCount} files, ${stats.totalSizeMB.toFixed(2)}MB`);
17
+ *
18
+ * // Manual rotation with dry-run
19
+ * const result = await manualRotate('.sequant/logs', { dryRun: true });
20
+ * console.log(`Would delete ${result.deletedCount} files`);
21
+ * ```
22
+ */
23
+ /**
24
+ * Rotation settings
25
+ */
26
+ export interface RotationSettings {
27
+ /** Enable automatic rotation (default: true) */
28
+ enabled: boolean;
29
+ /** Maximum total size in MB before rotation (default: 10) */
30
+ maxSizeMB: number;
31
+ /** Maximum file count before rotation (default: 100) */
32
+ maxFiles: number;
33
+ }
34
+ /**
35
+ * Default rotation settings
36
+ */
37
+ export declare const DEFAULT_ROTATION_SETTINGS: RotationSettings;
38
+ /**
39
+ * Log directory statistics
40
+ */
41
+ export interface LogStats {
42
+ /** Total size in bytes */
43
+ totalSizeBytes: number;
44
+ /** Total size in megabytes */
45
+ totalSizeMB: number;
46
+ /** Number of log files */
47
+ fileCount: number;
48
+ /** Oldest log file */
49
+ oldestFile: string | null;
50
+ /** Newest log file */
51
+ newestFile: string | null;
52
+ /** Whether size threshold is exceeded */
53
+ exceedsSizeThreshold: boolean;
54
+ /** Whether file count threshold is exceeded */
55
+ exceedsCountThreshold: boolean;
56
+ }
57
+ /**
58
+ * Result of a rotation operation
59
+ */
60
+ export interface RotationResult {
61
+ /** Files that were deleted (or would be in dry-run) */
62
+ deletedFiles: string[];
63
+ /** Number of files deleted */
64
+ deletedCount: number;
65
+ /** Bytes reclaimed (or would be in dry-run) */
66
+ bytesReclaimed: number;
67
+ /** Whether rotation was performed */
68
+ rotated: boolean;
69
+ /** Error message if rotation failed */
70
+ error?: string;
71
+ }
72
+ /**
73
+ * File info for sorting by age
74
+ */
75
+ interface LogFileInfo {
76
+ filename: string;
77
+ filePath: string;
78
+ mtime: Date;
79
+ size: number;
80
+ }
81
+ /**
82
+ * Get list of log files with metadata, sorted by modification time (oldest first)
83
+ */
84
+ export declare function getLogFiles(logDir: string): LogFileInfo[];
85
+ /**
86
+ * Get statistics about the log directory
87
+ *
88
+ * @param logDir - Path to log directory
89
+ * @param settings - Rotation settings for threshold comparison
90
+ * @returns Log directory statistics
91
+ */
92
+ export declare function getLogStats(logDir: string, settings?: RotationSettings): LogStats;
93
+ /**
94
+ * Calculate which files need to be deleted to meet thresholds
95
+ *
96
+ * Applies a 10% buffer (stops at 90% of threshold) to prevent
97
+ * immediate re-rotation on next run.
98
+ *
99
+ * @param logDir - Path to log directory
100
+ * @param settings - Rotation settings
101
+ * @returns List of files to delete (oldest first)
102
+ */
103
+ export declare function getFilesToDelete(logDir: string, settings: RotationSettings): LogFileInfo[];
104
+ /**
105
+ * Rotate logs if needed (automatic rotation)
106
+ *
107
+ * Called after LogWriter.finalize() to clean up old logs.
108
+ *
109
+ * @param logDir - Path to log directory
110
+ * @param settings - Rotation settings
111
+ * @returns Rotation result
112
+ */
113
+ export declare function rotateIfNeeded(logDir: string, settings?: RotationSettings): RotationResult;
114
+ /**
115
+ * Options for manual rotation
116
+ */
117
+ export interface ManualRotateOptions {
118
+ /** Dry run - don't actually delete files */
119
+ dryRun?: boolean;
120
+ /** Custom rotation settings */
121
+ settings?: RotationSettings;
122
+ }
123
+ /**
124
+ * Manual rotation triggered by CLI command
125
+ *
126
+ * Supports dry-run mode to preview what would be deleted.
127
+ *
128
+ * @param logDir - Path to log directory
129
+ * @param options - Manual rotation options
130
+ * @returns Rotation result
131
+ */
132
+ export declare function manualRotate(logDir: string, options?: ManualRotateOptions): RotationResult;
133
+ /**
134
+ * Format bytes for human-readable display
135
+ */
136
+ export declare function formatBytes(bytes: number): string;
137
+ export {};
138
+ //# sourceMappingURL=log-rotation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-rotation.d.ts","sourceRoot":"","sources":["../../../../src/lib/workflow/log-rotation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,gBAIvC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,0BAA0B;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,sBAAsB;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yCAAyC;IACzC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,+CAA+C;IAC/C,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,IAAI,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AASD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,CAwBzD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,gBAA4C,GACrD,QAAQ,CA2BV;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,GACzB,WAAW,EAAE,CAqCf;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,gBAA4C,GACrD,cAAc,CA+ChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,mBAAwB,GAChC,cAAc,CAyBhB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD"}
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Log rotation management for workflow run logs
3
+ *
4
+ * Implements automatic log rotation based on size and file count thresholds.
5
+ * Deletes oldest logs first until within limits.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { rotateIfNeeded, getLogStats, manualRotate } from './log-rotation';
10
+ *
11
+ * // Auto-rotate after a run
12
+ * await rotateIfNeeded('.sequant/logs');
13
+ *
14
+ * // Get statistics
15
+ * const stats = await getLogStats('.sequant/logs');
16
+ * console.log(`${stats.fileCount} files, ${stats.totalSizeMB.toFixed(2)}MB`);
17
+ *
18
+ * // Manual rotation with dry-run
19
+ * const result = await manualRotate('.sequant/logs', { dryRun: true });
20
+ * console.log(`Would delete ${result.deletedCount} files`);
21
+ * ```
22
+ */
23
+ import * as fs from "fs";
24
+ import * as path from "path";
25
+ import * as os from "os";
26
+ /**
27
+ * Default rotation settings
28
+ */
29
+ export const DEFAULT_ROTATION_SETTINGS = {
30
+ enabled: true,
31
+ maxSizeMB: 10,
32
+ maxFiles: 100,
33
+ };
34
+ /**
35
+ * Resolve a path, replacing ~ with home directory
36
+ */
37
+ function resolvePath(logPath) {
38
+ return logPath.replace("~", os.homedir());
39
+ }
40
+ /**
41
+ * Get list of log files with metadata, sorted by modification time (oldest first)
42
+ */
43
+ export function getLogFiles(logDir) {
44
+ const resolved = resolvePath(logDir);
45
+ if (!fs.existsSync(resolved)) {
46
+ return [];
47
+ }
48
+ const files = fs
49
+ .readdirSync(resolved)
50
+ .filter((f) => f.startsWith("run-") && f.endsWith(".json"));
51
+ const fileInfos = files.map((filename) => {
52
+ const filePath = path.join(resolved, filename);
53
+ const stats = fs.statSync(filePath);
54
+ return {
55
+ filename,
56
+ filePath,
57
+ mtime: stats.mtime,
58
+ size: stats.size,
59
+ };
60
+ });
61
+ // Sort by modification time, oldest first
62
+ return fileInfos.sort((a, b) => a.mtime.getTime() - b.mtime.getTime());
63
+ }
64
+ /**
65
+ * Get statistics about the log directory
66
+ *
67
+ * @param logDir - Path to log directory
68
+ * @param settings - Rotation settings for threshold comparison
69
+ * @returns Log directory statistics
70
+ */
71
+ export function getLogStats(logDir, settings = DEFAULT_ROTATION_SETTINGS) {
72
+ const files = getLogFiles(logDir);
73
+ if (files.length === 0) {
74
+ return {
75
+ totalSizeBytes: 0,
76
+ totalSizeMB: 0,
77
+ fileCount: 0,
78
+ oldestFile: null,
79
+ newestFile: null,
80
+ exceedsSizeThreshold: false,
81
+ exceedsCountThreshold: false,
82
+ };
83
+ }
84
+ const totalSizeBytes = files.reduce((sum, f) => sum + f.size, 0);
85
+ const totalSizeMB = totalSizeBytes / (1024 * 1024);
86
+ return {
87
+ totalSizeBytes,
88
+ totalSizeMB,
89
+ fileCount: files.length,
90
+ oldestFile: files[0].filename,
91
+ newestFile: files[files.length - 1].filename,
92
+ exceedsSizeThreshold: totalSizeMB > settings.maxSizeMB,
93
+ exceedsCountThreshold: files.length > settings.maxFiles,
94
+ };
95
+ }
96
+ /**
97
+ * Calculate which files need to be deleted to meet thresholds
98
+ *
99
+ * Applies a 10% buffer (stops at 90% of threshold) to prevent
100
+ * immediate re-rotation on next run.
101
+ *
102
+ * @param logDir - Path to log directory
103
+ * @param settings - Rotation settings
104
+ * @returns List of files to delete (oldest first)
105
+ */
106
+ export function getFilesToDelete(logDir, settings) {
107
+ const files = getLogFiles(logDir);
108
+ if (files.length === 0) {
109
+ return [];
110
+ }
111
+ const stats = getLogStats(logDir, settings);
112
+ // Check if rotation is needed
113
+ if (!stats.exceedsSizeThreshold && !stats.exceedsCountThreshold) {
114
+ return [];
115
+ }
116
+ // Target thresholds with 10% buffer (stop at 90%)
117
+ const targetSizeBytes = settings.maxSizeMB * 1024 * 1024 * 0.9;
118
+ const targetCount = Math.floor(settings.maxFiles * 0.9);
119
+ const toDelete = [];
120
+ let currentSize = stats.totalSizeBytes;
121
+ let currentCount = stats.fileCount;
122
+ // Delete oldest files first until under thresholds
123
+ for (const file of files) {
124
+ const sizeOk = currentSize <= targetSizeBytes;
125
+ const countOk = currentCount <= targetCount;
126
+ if (sizeOk && countOk) {
127
+ break;
128
+ }
129
+ toDelete.push(file);
130
+ currentSize -= file.size;
131
+ currentCount--;
132
+ }
133
+ return toDelete;
134
+ }
135
+ /**
136
+ * Rotate logs if needed (automatic rotation)
137
+ *
138
+ * Called after LogWriter.finalize() to clean up old logs.
139
+ *
140
+ * @param logDir - Path to log directory
141
+ * @param settings - Rotation settings
142
+ * @returns Rotation result
143
+ */
144
+ export function rotateIfNeeded(logDir, settings = DEFAULT_ROTATION_SETTINGS) {
145
+ if (!settings.enabled) {
146
+ return {
147
+ deletedFiles: [],
148
+ deletedCount: 0,
149
+ bytesReclaimed: 0,
150
+ rotated: false,
151
+ };
152
+ }
153
+ const resolved = resolvePath(logDir);
154
+ const toDelete = getFilesToDelete(logDir, settings);
155
+ if (toDelete.length === 0) {
156
+ return {
157
+ deletedFiles: [],
158
+ deletedCount: 0,
159
+ bytesReclaimed: 0,
160
+ rotated: false,
161
+ };
162
+ }
163
+ let bytesReclaimed = 0;
164
+ const deletedFiles = [];
165
+ for (const file of toDelete) {
166
+ try {
167
+ fs.unlinkSync(file.filePath);
168
+ deletedFiles.push(file.filename);
169
+ bytesReclaimed += file.size;
170
+ }
171
+ catch (err) {
172
+ return {
173
+ deletedFiles,
174
+ deletedCount: deletedFiles.length,
175
+ bytesReclaimed,
176
+ rotated: deletedFiles.length > 0,
177
+ error: `Failed to delete ${file.filename}: ${err instanceof Error ? err.message : String(err)}`,
178
+ };
179
+ }
180
+ }
181
+ return {
182
+ deletedFiles,
183
+ deletedCount: deletedFiles.length,
184
+ bytesReclaimed,
185
+ rotated: true,
186
+ };
187
+ }
188
+ /**
189
+ * Manual rotation triggered by CLI command
190
+ *
191
+ * Supports dry-run mode to preview what would be deleted.
192
+ *
193
+ * @param logDir - Path to log directory
194
+ * @param options - Manual rotation options
195
+ * @returns Rotation result
196
+ */
197
+ export function manualRotate(logDir, options = {}) {
198
+ const settings = options.settings ?? DEFAULT_ROTATION_SETTINGS;
199
+ const toDelete = getFilesToDelete(logDir, settings);
200
+ if (toDelete.length === 0) {
201
+ return {
202
+ deletedFiles: [],
203
+ deletedCount: 0,
204
+ bytesReclaimed: 0,
205
+ rotated: false,
206
+ };
207
+ }
208
+ // Dry run - just report what would be deleted
209
+ if (options.dryRun) {
210
+ return {
211
+ deletedFiles: toDelete.map((f) => f.filename),
212
+ deletedCount: toDelete.length,
213
+ bytesReclaimed: toDelete.reduce((sum, f) => sum + f.size, 0),
214
+ rotated: false,
215
+ };
216
+ }
217
+ // Actual deletion
218
+ return rotateIfNeeded(logDir, settings);
219
+ }
220
+ /**
221
+ * Format bytes for human-readable display
222
+ */
223
+ export function formatBytes(bytes) {
224
+ if (bytes < 1024) {
225
+ return `${bytes} B`;
226
+ }
227
+ if (bytes < 1024 * 1024) {
228
+ return `${(bytes / 1024).toFixed(1)} KB`;
229
+ }
230
+ return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
231
+ }
232
+ //# sourceMappingURL=log-rotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-rotation.js","sourceRoot":"","sources":["../../../../src/lib/workflow/log-rotation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for log rotation
3
+ *
4
+ * Tests the log rotation system that manages disk space usage.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=log-rotation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-rotation.test.d.ts","sourceRoot":"","sources":["../../../../src/lib/workflow/log-rotation.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}