@overlordai/worker 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/dist/ansi-stripper.d.ts +11 -0
  2. package/dist/ansi-stripper.d.ts.map +1 -0
  3. package/dist/ansi-stripper.js +19 -0
  4. package/dist/ansi-stripper.js.map +1 -0
  5. package/dist/capability-detector.d.ts +5 -0
  6. package/dist/capability-detector.d.ts.map +1 -0
  7. package/dist/capability-detector.js +43 -0
  8. package/dist/capability-detector.js.map +1 -0
  9. package/dist/config.d.ts +27 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +144 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/executor/base.executor.d.ts +55 -0
  14. package/dist/executor/base.executor.d.ts.map +1 -0
  15. package/dist/executor/base.executor.js +30 -0
  16. package/dist/executor/base.executor.js.map +1 -0
  17. package/dist/executor/claude.executor.d.ts +23 -0
  18. package/dist/executor/claude.executor.d.ts.map +1 -0
  19. package/dist/executor/claude.executor.js +106 -0
  20. package/dist/executor/claude.executor.js.map +1 -0
  21. package/dist/executor/codex.executor.d.ts +20 -0
  22. package/dist/executor/codex.executor.d.ts.map +1 -0
  23. package/dist/executor/codex.executor.js +51 -0
  24. package/dist/executor/codex.executor.js.map +1 -0
  25. package/dist/executor/cursor.executor.d.ts +19 -0
  26. package/dist/executor/cursor.executor.d.ts.map +1 -0
  27. package/dist/executor/cursor.executor.js +46 -0
  28. package/dist/executor/cursor.executor.js.map +1 -0
  29. package/dist/executor/custom.executor.d.ts +21 -0
  30. package/dist/executor/custom.executor.d.ts.map +1 -0
  31. package/dist/executor/custom.executor.js +57 -0
  32. package/dist/executor/custom.executor.js.map +1 -0
  33. package/dist/executor/executor.factory.d.ts +9 -0
  34. package/dist/executor/executor.factory.d.ts.map +1 -0
  35. package/dist/executor/executor.factory.js +29 -0
  36. package/dist/executor/executor.factory.js.map +1 -0
  37. package/dist/git-operations.d.ts +23 -0
  38. package/dist/git-operations.d.ts.map +1 -0
  39. package/dist/git-operations.js +94 -0
  40. package/dist/git-operations.js.map +1 -0
  41. package/dist/hardware.d.ts +14 -0
  42. package/dist/hardware.d.ts.map +1 -0
  43. package/dist/hardware.js +92 -0
  44. package/dist/hardware.js.map +1 -0
  45. package/dist/healthz.d.ts +14 -0
  46. package/dist/healthz.d.ts.map +1 -0
  47. package/dist/healthz.js +104 -0
  48. package/dist/healthz.js.map +1 -0
  49. package/dist/jwt-manager.d.ts +23 -0
  50. package/dist/jwt-manager.d.ts.map +1 -0
  51. package/dist/jwt-manager.js +169 -0
  52. package/dist/jwt-manager.js.map +1 -0
  53. package/dist/lease-manager.d.ts +17 -0
  54. package/dist/lease-manager.d.ts.map +1 -0
  55. package/dist/lease-manager.js +62 -0
  56. package/dist/lease-manager.js.map +1 -0
  57. package/dist/main.d.ts +3 -0
  58. package/dist/main.d.ts.map +1 -0
  59. package/dist/main.js +497 -0
  60. package/dist/main.js.map +1 -0
  61. package/dist/orphan-reaper.d.ts +6 -0
  62. package/dist/orphan-reaper.d.ts.map +1 -0
  63. package/dist/orphan-reaper.js +148 -0
  64. package/dist/orphan-reaper.js.map +1 -0
  65. package/dist/pipeline-parser.d.ts +14 -0
  66. package/dist/pipeline-parser.d.ts.map +1 -0
  67. package/dist/pipeline-parser.js +183 -0
  68. package/dist/pipeline-parser.js.map +1 -0
  69. package/dist/pipeline-runner.d.ts +120 -0
  70. package/dist/pipeline-runner.d.ts.map +1 -0
  71. package/dist/pipeline-runner.js +568 -0
  72. package/dist/pipeline-runner.js.map +1 -0
  73. package/dist/project-mutex.d.ts +14 -0
  74. package/dist/project-mutex.d.ts.map +1 -0
  75. package/dist/project-mutex.js +25 -0
  76. package/dist/project-mutex.js.map +1 -0
  77. package/dist/pty-manager.d.ts +50 -0
  78. package/dist/pty-manager.d.ts.map +1 -0
  79. package/dist/pty-manager.js +203 -0
  80. package/dist/pty-manager.js.map +1 -0
  81. package/dist/ringbuffer.d.ts +22 -0
  82. package/dist/ringbuffer.d.ts.map +1 -0
  83. package/dist/ringbuffer.js +57 -0
  84. package/dist/ringbuffer.js.map +1 -0
  85. package/dist/safe-env.d.ts +6 -0
  86. package/dist/safe-env.d.ts.map +1 -0
  87. package/dist/safe-env.js +19 -0
  88. package/dist/safe-env.js.map +1 -0
  89. package/dist/stage-detector.d.ts +62 -0
  90. package/dist/stage-detector.d.ts.map +1 -0
  91. package/dist/stage-detector.js +140 -0
  92. package/dist/stage-detector.js.map +1 -0
  93. package/dist/task-handler.d.ts +56 -0
  94. package/dist/task-handler.d.ts.map +1 -0
  95. package/dist/task-handler.js +296 -0
  96. package/dist/task-handler.js.map +1 -0
  97. package/dist/tunnel-manager.d.ts +34 -0
  98. package/dist/tunnel-manager.d.ts.map +1 -0
  99. package/dist/tunnel-manager.js +165 -0
  100. package/dist/tunnel-manager.js.map +1 -0
  101. package/dist/worker-client.d.ts +62 -0
  102. package/dist/worker-client.d.ts.map +1 -0
  103. package/dist/worker-client.js +303 -0
  104. package/dist/worker-client.js.map +1 -0
  105. package/dist/workspace-manager.d.ts +51 -0
  106. package/dist/workspace-manager.d.ts.map +1 -0
  107. package/dist/workspace-manager.js +276 -0
  108. package/dist/workspace-manager.js.map +1 -0
  109. package/package.json +30 -0
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CursorExecutor = void 0;
4
+ const protocol_1 = require("@overlordai/protocol");
5
+ const base_executor_js_1 = require("./base.executor.js");
6
+ /**
7
+ * Executor for Cursor Agent CLI.
8
+ *
9
+ * Uses --yolo flag for fully automated mode.
10
+ */
11
+ class CursorExecutor extends base_executor_js_1.AgentExecutor {
12
+ agentType = protocol_1.AgentType.CURSOR;
13
+ getStartCommand() {
14
+ return 'cursor';
15
+ }
16
+ buildArgs(_config, _workspacePath) {
17
+ return ['--yolo'];
18
+ }
19
+ detectPrompt(cleanOutput) {
20
+ // Match Cursor Agent's ? prompt at end of output
21
+ return /\?\s*$/.test(cleanOutput.trimEnd());
22
+ }
23
+ detectStageComplete(cleanOutput, stage) {
24
+ if (cleanOutput.includes(`${protocol_1.STAGE_DONE_SENTINEL}${stage}]]`)) {
25
+ return true;
26
+ }
27
+ return false;
28
+ }
29
+ detectAuthError(cleanOutput) {
30
+ if (/Authentication failed|Please log in/i.test(cleanOutput)) {
31
+ return { detected: true, failureType: 'auth_failure' };
32
+ }
33
+ if (/Rate limit exceeded/i.test(cleanOutput)) {
34
+ return { detected: true, failureType: 'rate_limit' };
35
+ }
36
+ if (/command not found|ENOENT/i.test(cleanOutput)) {
37
+ return { detected: true, failureType: 'binary_missing' };
38
+ }
39
+ return null;
40
+ }
41
+ formatCommand(stage) {
42
+ return stage.command ?? stage.name;
43
+ }
44
+ }
45
+ exports.CursorExecutor = CursorExecutor;
46
+ //# sourceMappingURL=cursor.executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.executor.js","sourceRoot":"","sources":["../../src/executor/cursor.executor.ts"],"names":[],"mappings":";;;AAAA,mDAAsE;AAEtE,yDAAmD;AAGnD;;;;GAIG;AACH,MAAa,cAAe,SAAQ,gCAAa;IACtC,SAAS,GAAG,oBAAS,CAAC,MAAM,CAAC;IAEtC,eAAe;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,SAAS,CAAC,OAAuB,EAAE,cAAsB;QACvD,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,YAAY,CAAC,WAAmB;QAC9B,iDAAiD;QACjD,OAAO,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,mBAAmB,CAAC,WAAmB,EAAE,KAAa;QACpD,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,8BAAmB,GAAG,KAAK,IAAI,CAAC,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,eAAe,CAAC,WAAmB;QACjC,IAAI,sCAAsC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;QACzD,CAAC;QACD,IAAI,sBAAsB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;QACvD,CAAC;QACD,IAAI,2BAA2B,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAClD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,KAAkB;QAC9B,OAAO,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC;IACrC,CAAC;CACF;AAvCD,wCAuCC"}
@@ -0,0 +1,21 @@
1
+ import { AgentType } from '@overlordai/protocol';
2
+ import type { ConfigSnapshot, StageConfig } from '@overlordai/protocol';
3
+ import { AgentExecutor } from './base.executor.js';
4
+ import type { AuthErrorResult } from './base.executor.js';
5
+ /**
6
+ * Executor for custom/user-provided agent CLIs.
7
+ *
8
+ * The custom executor uses the configSnapshot's customCommand field
9
+ * to determine which CLI binary to invoke. This allows projects to
10
+ * integrate arbitrary agent tooling into the Overlord pipeline.
11
+ */
12
+ export declare class CustomExecutor extends AgentExecutor {
13
+ readonly agentType = AgentType.CUSTOM;
14
+ getStartCommand(): string;
15
+ buildArgs(config: ConfigSnapshot, _workspacePath: string): string[];
16
+ detectPrompt(cleanOutput: string): boolean;
17
+ detectStageComplete(cleanOutput: string, stage: string): boolean;
18
+ detectAuthError(cleanOutput: string): AuthErrorResult | null;
19
+ formatCommand(stage: StageConfig): string;
20
+ }
21
+ //# sourceMappingURL=custom.executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom.executor.d.ts","sourceRoot":"","sources":["../../src/executor/custom.executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAuB,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,aAAa;IAC/C,QAAQ,CAAC,SAAS,oBAAoB;IAEtC,eAAe,IAAI,MAAM;IAMzB,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE;IAanE,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAK1C,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAOhE,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAa5D,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM;CAG1C"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomExecutor = void 0;
4
+ const protocol_1 = require("@overlordai/protocol");
5
+ const base_executor_js_1 = require("./base.executor.js");
6
+ /**
7
+ * Executor for custom/user-provided agent CLIs.
8
+ *
9
+ * The custom executor uses the configSnapshot's customCommand field
10
+ * to determine which CLI binary to invoke. This allows projects to
11
+ * integrate arbitrary agent tooling into the Overlord pipeline.
12
+ */
13
+ class CustomExecutor extends base_executor_js_1.AgentExecutor {
14
+ agentType = protocol_1.AgentType.CUSTOM;
15
+ getStartCommand() {
16
+ // The actual command is determined at spawn time via buildArgs / config.
17
+ // Default to 'sh' as a safe fallback; the real command comes from config.
18
+ return 'sh';
19
+ }
20
+ buildArgs(config, _workspacePath) {
21
+ // For custom executors, the command and arguments are fully
22
+ // specified in the config snapshot's agentCommand field.
23
+ const args = [];
24
+ if (config.agentCommand) {
25
+ // When agentCommand is set, we run: sh -c "<agentCommand>"
26
+ args.push('-c', config.agentCommand);
27
+ }
28
+ return args;
29
+ }
30
+ detectPrompt(cleanOutput) {
31
+ // Generic prompt detection: look for common shell prompt patterns
32
+ return /[$#>❯]\s*$/.test(cleanOutput.trimEnd());
33
+ }
34
+ detectStageComplete(cleanOutput, stage) {
35
+ if (cleanOutput.includes(`${protocol_1.STAGE_DONE_SENTINEL}${stage}]]`)) {
36
+ return true;
37
+ }
38
+ return false;
39
+ }
40
+ detectAuthError(cleanOutput) {
41
+ if (/Authentication failed|Unauthorized|403 Forbidden/i.test(cleanOutput)) {
42
+ return { detected: true, failureType: 'auth_failure' };
43
+ }
44
+ if (/Rate limit|too many requests|429/i.test(cleanOutput)) {
45
+ return { detected: true, failureType: 'rate_limit' };
46
+ }
47
+ if (/command not found|ENOENT|No such file/i.test(cleanOutput)) {
48
+ return { detected: true, failureType: 'binary_missing' };
49
+ }
50
+ return null;
51
+ }
52
+ formatCommand(stage) {
53
+ return stage.command ?? stage.name;
54
+ }
55
+ }
56
+ exports.CustomExecutor = CustomExecutor;
57
+ //# sourceMappingURL=custom.executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom.executor.js","sourceRoot":"","sources":["../../src/executor/custom.executor.ts"],"names":[],"mappings":";;;AAAA,mDAAsE;AAEtE,yDAAmD;AAGnD;;;;;;GAMG;AACH,MAAa,cAAe,SAAQ,gCAAa;IACtC,SAAS,GAAG,oBAAS,CAAC,MAAM,CAAC;IAEtC,eAAe;QACb,yEAAyE;QACzE,0EAA0E;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,MAAsB,EAAE,cAAsB;QACtD,4DAA4D;QAC5D,yDAAyD;QACzD,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,2DAA2D;YAC3D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,CAAC,WAAmB;QAC9B,kEAAkE;QAClE,OAAO,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,mBAAmB,CAAC,WAAmB,EAAE,KAAa;QACpD,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,8BAAmB,GAAG,KAAK,IAAI,CAAC,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,eAAe,CAAC,WAAmB;QACjC,IAAI,mDAAmD,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;QACzD,CAAC;QACD,IAAI,mCAAmC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;QACvD,CAAC;QACD,IAAI,wCAAwC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,KAAkB;QAC9B,OAAO,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC;IACrC,CAAC;CACF;AAlDD,wCAkDC"}
@@ -0,0 +1,9 @@
1
+ import { AgentType } from '@overlordai/protocol';
2
+ import type { AgentExecutor } from './base.executor.js';
3
+ /**
4
+ * Factory to create the appropriate AgentExecutor based on AgentType.
5
+ */
6
+ export declare class ExecutorFactory {
7
+ static create(agentType: AgentType): AgentExecutor;
8
+ }
9
+ //# sourceMappingURL=executor.factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.factory.d.ts","sourceRoot":"","sources":["../../src/executor/executor.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMxD;;GAEG;AACH,qBAAa,eAAe;IAC1B,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,aAAa;CAcnD"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExecutorFactory = void 0;
4
+ const protocol_1 = require("@overlordai/protocol");
5
+ const claude_executor_js_1 = require("./claude.executor.js");
6
+ const cursor_executor_js_1 = require("./cursor.executor.js");
7
+ const codex_executor_js_1 = require("./codex.executor.js");
8
+ const custom_executor_js_1 = require("./custom.executor.js");
9
+ /**
10
+ * Factory to create the appropriate AgentExecutor based on AgentType.
11
+ */
12
+ class ExecutorFactory {
13
+ static create(agentType) {
14
+ switch (agentType) {
15
+ case protocol_1.AgentType.CLAUDE:
16
+ return new claude_executor_js_1.ClaudeExecutor();
17
+ case protocol_1.AgentType.CURSOR:
18
+ return new cursor_executor_js_1.CursorExecutor();
19
+ case protocol_1.AgentType.CODEX:
20
+ return new codex_executor_js_1.CodexExecutor();
21
+ case protocol_1.AgentType.CUSTOM:
22
+ return new custom_executor_js_1.CustomExecutor();
23
+ default:
24
+ throw new Error(`Unsupported agent type: ${String(agentType)}. Supported types: ${Object.values(protocol_1.AgentType).join(', ')}`);
25
+ }
26
+ }
27
+ }
28
+ exports.ExecutorFactory = ExecutorFactory;
29
+ //# sourceMappingURL=executor.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.factory.js","sourceRoot":"","sources":["../../src/executor/executor.factory.ts"],"names":[],"mappings":";;;AAAA,mDAAiD;AAEjD,6DAAsD;AACtD,6DAAsD;AACtD,2DAAoD;AACpD,6DAAsD;AAEtD;;GAEG;AACH,MAAa,eAAe;IAC1B,MAAM,CAAC,MAAM,CAAC,SAAoB;QAChC,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,oBAAS,CAAC,MAAM;gBACnB,OAAO,IAAI,mCAAc,EAAE,CAAC;YAC9B,KAAK,oBAAS,CAAC,MAAM;gBACnB,OAAO,IAAI,mCAAc,EAAE,CAAC;YAC9B,KAAK,oBAAS,CAAC,KAAK;gBAClB,OAAO,IAAI,iCAAa,EAAE,CAAC;YAC7B,KAAK,oBAAS,CAAC,MAAM;gBACnB,OAAO,IAAI,mCAAc,EAAE,CAAC;YAC9B;gBACE,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,SAAS,CAAC,sBAAsB,MAAM,CAAC,MAAM,CAAC,oBAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7H,CAAC;IACH,CAAC;CACF;AAfD,0CAeC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Wraps git CLI commands via child_process.execFileSync.
3
+ * Every method is synchronous and throws on non-zero exit.
4
+ */
5
+ export declare class GitOperations {
6
+ private sshKeyPath?;
7
+ constructor(sshKeyPath?: string);
8
+ /** Build environment with optional SSH key override. */
9
+ private buildEnv;
10
+ /** git clone --bare <repoUrl> <targetDir> */
11
+ cloneBare(repoUrl: string, targetDir: string): void;
12
+ /** git fetch origin (run inside bare repo) */
13
+ fetch(bareDir: string): void;
14
+ /** git worktree add <worktreePath> -b <branch> <startPoint> */
15
+ addWorktree(bareDir: string, worktreePath: string, branch: string, startPoint: string): void;
16
+ /** git worktree remove <worktreePath> --force */
17
+ removeWorktree(bareDir: string, worktreePath: string): void;
18
+ /** git worktree prune */
19
+ pruneWorktrees(bareDir: string): void;
20
+ /** git config --local <key> <value> */
21
+ setLocalConfig(worktreePath: string, key: string, value: string): void;
22
+ }
23
+ //# sourceMappingURL=git-operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-operations.d.ts","sourceRoot":"","sources":["../src/git-operations.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,UAAU,CAAC,EAAE,MAAM;IAI/B,wDAAwD;IACxD,OAAO,CAAC,QAAQ;IAQhB,6CAA6C;IAC7C,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IASnD,8CAA8C;IAC9C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAU5B,+DAA+D;IAC/D,WAAW,CACT,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,IAAI;IAUP,iDAAiD;IACjD,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAU3D,yBAAyB;IACzB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAUrC,uCAAuC;IACvC,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;CASvE"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.GitOperations = void 0;
7
+ const node_child_process_1 = require("node:child_process");
8
+ const pino_1 = __importDefault(require("pino"));
9
+ const safe_env_js_1 = require("./safe-env.js");
10
+ const logger = (0, pino_1.default)({ name: 'git-operations' });
11
+ const EXEC_TIMEOUT = 120_000; // 2 minutes
12
+ /**
13
+ * Wraps git CLI commands via child_process.execFileSync.
14
+ * Every method is synchronous and throws on non-zero exit.
15
+ */
16
+ class GitOperations {
17
+ sshKeyPath;
18
+ constructor(sshKeyPath) {
19
+ this.sshKeyPath = sshKeyPath;
20
+ }
21
+ /** Build environment with optional SSH key override. */
22
+ buildEnv() {
23
+ const env = (0, safe_env_js_1.buildSafeEnv)();
24
+ if (this.sshKeyPath) {
25
+ env.GIT_SSH_COMMAND = `ssh -i ${quote(this.sshKeyPath)} -o IdentitiesOnly=yes`;
26
+ }
27
+ return env;
28
+ }
29
+ /** git clone --bare <repoUrl> <targetDir> */
30
+ cloneBare(repoUrl, targetDir) {
31
+ logger.info({ repoUrl, targetDir }, 'Cloning bare repository');
32
+ (0, node_child_process_1.execFileSync)('git', ['clone', '--bare', repoUrl, targetDir], {
33
+ timeout: EXEC_TIMEOUT,
34
+ stdio: 'pipe',
35
+ env: this.buildEnv(),
36
+ });
37
+ }
38
+ /** git fetch origin (run inside bare repo) */
39
+ fetch(bareDir) {
40
+ logger.info({ bareDir }, 'Fetching origin');
41
+ (0, node_child_process_1.execFileSync)('git', ['fetch', 'origin'], {
42
+ cwd: bareDir,
43
+ timeout: EXEC_TIMEOUT,
44
+ stdio: 'pipe',
45
+ env: this.buildEnv(),
46
+ });
47
+ }
48
+ /** git worktree add <worktreePath> -b <branch> <startPoint> */
49
+ addWorktree(bareDir, worktreePath, branch, startPoint) {
50
+ logger.info({ bareDir, worktreePath, branch, startPoint }, 'Adding worktree');
51
+ (0, node_child_process_1.execFileSync)('git', ['worktree', 'add', worktreePath, '-b', branch, startPoint], {
52
+ cwd: bareDir,
53
+ timeout: EXEC_TIMEOUT,
54
+ stdio: 'pipe',
55
+ env: this.buildEnv(),
56
+ });
57
+ }
58
+ /** git worktree remove <worktreePath> --force */
59
+ removeWorktree(bareDir, worktreePath) {
60
+ logger.info({ bareDir, worktreePath }, 'Removing worktree');
61
+ (0, node_child_process_1.execFileSync)('git', ['worktree', 'remove', worktreePath, '--force'], {
62
+ cwd: bareDir,
63
+ timeout: EXEC_TIMEOUT,
64
+ stdio: 'pipe',
65
+ env: this.buildEnv(),
66
+ });
67
+ }
68
+ /** git worktree prune */
69
+ pruneWorktrees(bareDir) {
70
+ logger.info({ bareDir }, 'Pruning worktrees');
71
+ (0, node_child_process_1.execFileSync)('git', ['worktree', 'prune'], {
72
+ cwd: bareDir,
73
+ timeout: EXEC_TIMEOUT,
74
+ stdio: 'pipe',
75
+ env: this.buildEnv(),
76
+ });
77
+ }
78
+ /** git config --local <key> <value> */
79
+ setLocalConfig(worktreePath, key, value) {
80
+ logger.debug({ worktreePath, key }, 'Setting local git config');
81
+ (0, node_child_process_1.execFileSync)('git', ['config', '--local', key, value], {
82
+ cwd: worktreePath,
83
+ timeout: EXEC_TIMEOUT,
84
+ stdio: 'pipe',
85
+ env: this.buildEnv(),
86
+ });
87
+ }
88
+ }
89
+ exports.GitOperations = GitOperations;
90
+ /** Shell-quote a single argument (simple single-quote wrapping). */
91
+ function quote(s) {
92
+ return `'${s.replace(/'/g, "'\\''")}'`;
93
+ }
94
+ //# sourceMappingURL=git-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-operations.js","sourceRoot":"","sources":["../src/git-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface HardwareInfo {
2
+ os: string;
3
+ cpuCores: number;
4
+ memoryGb: number;
5
+ diskUsage: number;
6
+ }
7
+ export interface RuntimeMetrics {
8
+ cpuUsage: number;
9
+ memoryUsage: number;
10
+ diskUsage: number;
11
+ }
12
+ export declare function collectHardwareInfo(): HardwareInfo;
13
+ export declare function collectRuntimeMetrics(): RuntimeMetrics;
14
+ //# sourceMappingURL=hardware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hardware.d.ts","sourceRoot":"","sources":["../src/hardware.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,mBAAmB,IAAI,YAAY,CASlD;AAED,wBAAgB,qBAAqB,IAAI,cAAc,CAuBtD"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.collectHardwareInfo = collectHardwareInfo;
40
+ exports.collectRuntimeMetrics = collectRuntimeMetrics;
41
+ const os = __importStar(require("node:os"));
42
+ const fs = __importStar(require("node:fs"));
43
+ const pino_1 = __importDefault(require("pino"));
44
+ const log = (0, pino_1.default)({ name: 'hardware-info' });
45
+ function collectHardwareInfo() {
46
+ const info = {
47
+ os: os.type(),
48
+ cpuCores: os.cpus().length,
49
+ memoryGb: Math.round((os.totalmem() / (1024 * 1024 * 1024)) * 100) / 100,
50
+ diskUsage: getDiskUsage(),
51
+ };
52
+ log.info(info, 'Hardware info collected');
53
+ return info;
54
+ }
55
+ function collectRuntimeMetrics() {
56
+ const totalMem = os.totalmem();
57
+ const freeMem = os.freemem();
58
+ const memoryUsage = Math.round(((totalMem - freeMem) / totalMem) * 100) / 100;
59
+ // Note: os.cpus().times values are cumulative since boot, so this computes
60
+ // a boot-average CPU usage rather than instantaneous usage. This is acceptable
61
+ // for the heartbeat use case where we need a rough utilization indicator.
62
+ const cpus = os.cpus();
63
+ let totalIdle = 0;
64
+ let totalTick = 0;
65
+ for (const cpu of cpus) {
66
+ const times = cpu.times;
67
+ totalIdle += times.idle;
68
+ totalTick += times.user + times.nice + times.sys + times.idle + times.irq;
69
+ }
70
+ const cpuUsage = totalTick > 0 ? Math.round(((totalTick - totalIdle) / totalTick) * 100) / 100 : 0;
71
+ return {
72
+ cpuUsage,
73
+ memoryUsage,
74
+ diskUsage: getDiskUsage(),
75
+ };
76
+ }
77
+ function getDiskUsage() {
78
+ try {
79
+ const rootPath = os.platform() === 'win32' ? 'C:\\' : '/';
80
+ const stats = fs.statfsSync(rootPath);
81
+ const totalBytes = stats.bsize * stats.blocks;
82
+ const freeBytes = stats.bsize * stats.bfree;
83
+ if (totalBytes === 0)
84
+ return 0;
85
+ return Math.round(((totalBytes - freeBytes) / totalBytes) * 100) / 100;
86
+ }
87
+ catch (err) {
88
+ log.warn({ err }, 'Failed to get disk usage');
89
+ return 0;
90
+ }
91
+ }
92
+ //# sourceMappingURL=hardware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hardware.js","sourceRoot":"","sources":["../src/hardware.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,kDASC;AAED,sDAuBC;AArDD,4CAA8B;AAC9B,4CAA8B;AAC9B,gDAAwB;AAExB,MAAM,GAAG,GAAG,IAAA,cAAI,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;AAe5C,SAAgB,mBAAmB;IACjC,MAAM,IAAI,GAAiB;QACzB,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE;QACb,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM;QAC1B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;QACxE,SAAS,EAAE,YAAY,EAAE;KAC1B,CAAC;IACF,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,qBAAqB;IACnC,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAE9E,2EAA2E;IAC3E,+EAA+E;IAC/E,0EAA0E;IAC1E,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IACvB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;QACxB,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC;QACxB,SAAS,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC;IAC5E,CAAC;IACD,MAAM,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnG,OAAO;QACL,QAAQ;QACR,WAAW;QACX,SAAS,EAAE,YAAY,EAAE;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1D,MAAM,KAAK,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC5C,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACzE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,0BAA0B,CAAC,CAAC;QAC9C,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface HealthzStatus {
2
+ wsConnected: boolean;
3
+ activeTasks: number;
4
+ jwtRemainingMs: number;
5
+ }
6
+ export type HealthzStatusProvider = () => HealthzStatus;
7
+ export declare class HealthzServer {
8
+ private server;
9
+ private statusProvider;
10
+ constructor(statusProvider: HealthzStatusProvider);
11
+ start(): void;
12
+ stop(): void;
13
+ }
14
+ //# sourceMappingURL=healthz.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"healthz.d.ts","sourceRoot":"","sources":["../src/healthz.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,qBAAqB,GAAG,MAAM,aAAa,CAAC;AAExD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,cAAc,CAAwB;gBAElC,cAAc,EAAE,qBAAqB;IAIjD,KAAK,IAAI,IAAI;IA+Cb,IAAI,IAAI,IAAI;CAOb"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.HealthzServer = void 0;
40
+ const http = __importStar(require("node:http"));
41
+ const pino_1 = __importDefault(require("pino"));
42
+ const log = (0, pino_1.default)({ name: 'healthz' });
43
+ const HEALTHZ_PORT = 9100;
44
+ const HEALTHZ_HOST = '127.0.0.1';
45
+ class HealthzServer {
46
+ server = null;
47
+ statusProvider;
48
+ constructor(statusProvider) {
49
+ this.statusProvider = statusProvider;
50
+ }
51
+ start() {
52
+ this.server = http.createServer((req, res) => {
53
+ if (req.method === 'GET' && req.url === '/healthz') {
54
+ const status = this.statusProvider();
55
+ // Determine health status based on JWT validity and WS connection
56
+ const jwtValid = status.jwtRemainingMs > 0;
57
+ let healthStatus;
58
+ if (!jwtValid) {
59
+ healthStatus = 'unhealthy';
60
+ }
61
+ else if (!status.wsConnected) {
62
+ healthStatus = 'degraded';
63
+ }
64
+ else {
65
+ healthStatus = 'healthy';
66
+ }
67
+ const httpStatus = healthStatus === 'unhealthy' ? 503 : 200;
68
+ const body = JSON.stringify({
69
+ status: healthStatus,
70
+ wsConnected: status.wsConnected,
71
+ jwtValid,
72
+ activeTasks: status.activeTasks,
73
+ jwtRemainingMs: status.jwtRemainingMs,
74
+ uptime: process.uptime(),
75
+ timestamp: new Date().toISOString(),
76
+ });
77
+ res.writeHead(httpStatus, {
78
+ 'Content-Type': 'application/json',
79
+ 'Cache-Control': 'no-cache',
80
+ });
81
+ res.end(body);
82
+ }
83
+ else {
84
+ res.writeHead(404);
85
+ res.end('Not Found');
86
+ }
87
+ });
88
+ this.server.listen(HEALTHZ_PORT, HEALTHZ_HOST, () => {
89
+ log.info({ host: HEALTHZ_HOST, port: HEALTHZ_PORT }, 'Healthz server started');
90
+ });
91
+ this.server.on('error', (err) => {
92
+ log.error({ err }, 'Healthz server error');
93
+ });
94
+ }
95
+ stop() {
96
+ if (this.server) {
97
+ this.server.close();
98
+ this.server = null;
99
+ log.info('Healthz server stopped');
100
+ }
101
+ }
102
+ }
103
+ exports.HealthzServer = HealthzServer;
104
+ //# sourceMappingURL=healthz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"healthz.js","sourceRoot":"","sources":["../src/healthz.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,gDAAwB;AAExB,MAAM,GAAG,GAAG,IAAA,cAAI,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;AAEtC,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,WAAW,CAAC;AAUjC,MAAa,aAAa;IAChB,MAAM,GAAuB,IAAI,CAAC;IAClC,cAAc,CAAwB;IAE9C,YAAY,cAAqC;QAC/C,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC3C,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;gBACnD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;gBAErC,kEAAkE;gBAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC;gBAC3C,IAAI,YAAkD,CAAC;gBACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,YAAY,GAAG,WAAW,CAAC;gBAC7B,CAAC;qBAAM,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;oBAC/B,YAAY,GAAG,UAAU,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACN,YAAY,GAAG,SAAS,CAAC;gBAC3B,CAAC;gBAED,MAAM,UAAU,GAAG,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;oBAC1B,MAAM,EAAE,YAAY;oBACpB,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,QAAQ;oBACR,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,cAAc,EAAE,MAAM,CAAC,cAAc;oBACrC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;oBACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;gBAEH,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE;oBACxB,cAAc,EAAE,kBAAkB;oBAClC,eAAe,EAAE,UAAU;iBAC5B,CAAC,CAAC;gBACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE;YAClD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,wBAAwB,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC9B,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,sBAAsB,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;CACF;AA9DD,sCA8DC"}
@@ -0,0 +1,23 @@
1
+ export interface JwtPayload {
2
+ sub: string;
3
+ machineId: string;
4
+ iat: number;
5
+ exp: number;
6
+ [key: string]: unknown;
7
+ }
8
+ export declare class JwtManager {
9
+ private jwt;
10
+ private payload;
11
+ private jwtPath;
12
+ constructor(dataDir: string);
13
+ load(): boolean;
14
+ save(jwt: string): void;
15
+ getToken(): string;
16
+ getPayload(): JwtPayload | null;
17
+ needsRenewal(): boolean;
18
+ isExpired(): boolean;
19
+ refresh(overlordHost: string, machineId: string): Promise<string>;
20
+ private decodePayload;
21
+ private httpPost;
22
+ }
23
+ //# sourceMappingURL=jwt-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-manager.d.ts","sourceRoot":"","sources":["../src/jwt-manager.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM;IAI3B,IAAI,IAAI,OAAO;IA4Bf,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOvB,QAAQ,IAAI,MAAM;IAIlB,UAAU,IAAI,UAAU,GAAG,IAAI;IAI/B,YAAY,IAAI,OAAO;IAMvB,SAAS,IAAI,OAAO;IAKd,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBvE,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,QAAQ;CAoCjB"}