@hexidecibel/companion 0.0.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 (109) hide show
  1. package/dist/__tests__/task-parser.test.d.ts +2 -0
  2. package/dist/__tests__/task-parser.test.d.ts.map +1 -0
  3. package/dist/__tests__/task-parser.test.js +79 -0
  4. package/dist/__tests__/task-parser.test.js.map +1 -0
  5. package/dist/anthropic-usage.d.ts +5 -0
  6. package/dist/anthropic-usage.d.ts.map +1 -0
  7. package/dist/anthropic-usage.js +112 -0
  8. package/dist/anthropic-usage.js.map +1 -0
  9. package/dist/cert-generator.d.ts +15 -0
  10. package/dist/cert-generator.d.ts.map +1 -0
  11. package/dist/cert-generator.js +298 -0
  12. package/dist/cert-generator.js.map +1 -0
  13. package/dist/config.d.ts +4 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +122 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/encryption.d.ts +28 -0
  18. package/dist/encryption.d.ts.map +1 -0
  19. package/dist/encryption.js +95 -0
  20. package/dist/encryption.js.map +1 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +211 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/input-injector.d.ts +21 -0
  26. package/dist/input-injector.d.ts.map +1 -0
  27. package/dist/input-injector.js +126 -0
  28. package/dist/input-injector.js.map +1 -0
  29. package/dist/mdns.d.ts +11 -0
  30. package/dist/mdns.d.ts.map +1 -0
  31. package/dist/mdns.js +93 -0
  32. package/dist/mdns.js.map +1 -0
  33. package/dist/parser.d.ts +43 -0
  34. package/dist/parser.d.ts.map +1 -0
  35. package/dist/parser.js +800 -0
  36. package/dist/parser.js.map +1 -0
  37. package/dist/push.d.ts +38 -0
  38. package/dist/push.d.ts.map +1 -0
  39. package/dist/push.js +359 -0
  40. package/dist/push.js.map +1 -0
  41. package/dist/qr-server.d.ts +13 -0
  42. package/dist/qr-server.d.ts.map +1 -0
  43. package/dist/qr-server.js +421 -0
  44. package/dist/qr-server.js.map +1 -0
  45. package/dist/scaffold/generator.d.ts +11 -0
  46. package/dist/scaffold/generator.d.ts.map +1 -0
  47. package/dist/scaffold/generator.js +206 -0
  48. package/dist/scaffold/generator.js.map +1 -0
  49. package/dist/scaffold/templates/index.d.ts +5 -0
  50. package/dist/scaffold/templates/index.d.ts.map +1 -0
  51. package/dist/scaffold/templates/index.js +22 -0
  52. package/dist/scaffold/templates/index.js.map +1 -0
  53. package/dist/scaffold/templates/node-express.d.ts +3 -0
  54. package/dist/scaffold/templates/node-express.d.ts.map +1 -0
  55. package/dist/scaffold/templates/node-express.js +218 -0
  56. package/dist/scaffold/templates/node-express.js.map +1 -0
  57. package/dist/scaffold/templates/python-fastapi.d.ts +3 -0
  58. package/dist/scaffold/templates/python-fastapi.d.ts.map +1 -0
  59. package/dist/scaffold/templates/python-fastapi.js +302 -0
  60. package/dist/scaffold/templates/python-fastapi.js.map +1 -0
  61. package/dist/scaffold/templates/react-mui-website.d.ts +3 -0
  62. package/dist/scaffold/templates/react-mui-website.d.ts.map +1 -0
  63. package/dist/scaffold/templates/react-mui-website.js +405 -0
  64. package/dist/scaffold/templates/react-mui-website.js.map +1 -0
  65. package/dist/scaffold/templates/react-typescript.d.ts +3 -0
  66. package/dist/scaffold/templates/react-typescript.d.ts.map +1 -0
  67. package/dist/scaffold/templates/react-typescript.js +275 -0
  68. package/dist/scaffold/templates/react-typescript.js.map +1 -0
  69. package/dist/scaffold/types.d.ts +55 -0
  70. package/dist/scaffold/types.d.ts.map +1 -0
  71. package/dist/scaffold/types.js +3 -0
  72. package/dist/scaffold/types.js.map +1 -0
  73. package/dist/subagent-watcher.d.ts +24 -0
  74. package/dist/subagent-watcher.d.ts.map +1 -0
  75. package/dist/subagent-watcher.js +307 -0
  76. package/dist/subagent-watcher.js.map +1 -0
  77. package/dist/tls.d.ts +10 -0
  78. package/dist/tls.d.ts.map +1 -0
  79. package/dist/tls.js +77 -0
  80. package/dist/tls.js.map +1 -0
  81. package/dist/tmux-manager.d.ts +71 -0
  82. package/dist/tmux-manager.d.ts.map +1 -0
  83. package/dist/tmux-manager.js +243 -0
  84. package/dist/tmux-manager.js.map +1 -0
  85. package/dist/tool-config.d.ts +33 -0
  86. package/dist/tool-config.d.ts.map +1 -0
  87. package/dist/tool-config.js +211 -0
  88. package/dist/tool-config.js.map +1 -0
  89. package/dist/types.d.ts +218 -0
  90. package/dist/types.d.ts.map +1 -0
  91. package/dist/types.js +3 -0
  92. package/dist/types.js.map +1 -0
  93. package/dist/watcher.d.ts +63 -0
  94. package/dist/watcher.d.ts.map +1 -0
  95. package/dist/watcher.js +596 -0
  96. package/dist/watcher.js.map +1 -0
  97. package/dist/watcher.test.d.ts +2 -0
  98. package/dist/watcher.test.d.ts.map +1 -0
  99. package/dist/watcher.test.js +110 -0
  100. package/dist/watcher.test.js.map +1 -0
  101. package/dist/websocket.d.ts +62 -0
  102. package/dist/websocket.d.ts.map +1 -0
  103. package/dist/websocket.js +1695 -0
  104. package/dist/websocket.js.map +1 -0
  105. package/package.json +71 -0
  106. package/scripts/build.sh +23 -0
  107. package/scripts/install-remote.sh +18 -0
  108. package/scripts/install.sh +558 -0
  109. package/scripts/uninstall.sh +113 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=task-parser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-parser.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/task-parser.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const parser_1 = require("../parser");
4
+ describe('extractTasks', () => {
5
+ const mockJsonlWithTasks = `
6
+ {"type":"assistant","message":{"content":[{"type":"tool_use","id":"toolu_01","name":"TaskCreate","input":{"subject":"Fix login bug","description":"The login button doesn't work on mobile","activeForm":"Fixing login bug"}}]},"timestamp":"2026-01-28T10:00:00.000Z","uuid":"msg1"}
7
+ {"type":"assistant","message":{"content":[{"type":"tool_result","tool_use_id":"toolu_01","content":"Task created with ID: 1"}]},"timestamp":"2026-01-28T10:00:01.000Z","uuid":"msg2"}
8
+ {"type":"assistant","message":{"content":[{"type":"tool_use","id":"toolu_02","name":"TaskCreate","input":{"subject":"Add tests","description":"Write unit tests for auth module"}}]},"timestamp":"2026-01-28T10:00:02.000Z","uuid":"msg3"}
9
+ {"type":"assistant","message":{"content":[{"type":"tool_result","tool_use_id":"toolu_02","content":"Task created with ID: 2"}]},"timestamp":"2026-01-28T10:00:03.000Z","uuid":"msg4"}
10
+ {"type":"assistant","message":{"content":[{"type":"tool_use","id":"toolu_03","name":"TaskUpdate","input":{"taskId":"1","status":"in_progress","activeForm":"Working on login fix"}}]},"timestamp":"2026-01-28T10:00:04.000Z","uuid":"msg5"}
11
+ {"type":"assistant","message":{"content":[{"type":"tool_result","tool_use_id":"toolu_03","content":"Task updated"}]},"timestamp":"2026-01-28T10:00:05.000Z","uuid":"msg6"}
12
+ {"type":"assistant","message":{"content":[{"type":"tool_use","id":"toolu_04","name":"TaskUpdate","input":{"taskId":"1","status":"completed"}}]},"timestamp":"2026-01-28T10:00:06.000Z","uuid":"msg7"}
13
+ {"type":"assistant","message":{"content":[{"type":"tool_result","tool_use_id":"toolu_04","content":"Task updated"}]},"timestamp":"2026-01-28T10:00:07.000Z","uuid":"msg8"}
14
+ `.trim();
15
+ it('should extract tasks from JSONL content', () => {
16
+ const tasks = (0, parser_1.extractTasks)(mockJsonlWithTasks);
17
+ expect(tasks).toHaveLength(2);
18
+ });
19
+ it('should parse task subject and description', () => {
20
+ const tasks = (0, parser_1.extractTasks)(mockJsonlWithTasks);
21
+ const task1 = tasks.find(t => t.subject === 'Fix login bug');
22
+ expect(task1).toBeDefined();
23
+ expect(task1?.description).toBe("The login button doesn't work on mobile");
24
+ });
25
+ it('should apply status updates in order', () => {
26
+ const tasks = (0, parser_1.extractTasks)(mockJsonlWithTasks);
27
+ const task1 = tasks.find(t => t.subject === 'Fix login bug');
28
+ const task2 = tasks.find(t => t.subject === 'Add tests');
29
+ // Task 1 was updated to completed
30
+ expect(task1?.status).toBe('completed');
31
+ // Task 2 was never updated, should be pending
32
+ expect(task2?.status).toBe('pending');
33
+ });
34
+ it('should track activeForm from latest update', () => {
35
+ const tasks = (0, parser_1.extractTasks)(mockJsonlWithTasks);
36
+ const task1 = tasks.find(t => t.subject === 'Fix login bug');
37
+ // Last update didn't have activeForm, but previous one did
38
+ // Actually the completed update clears activeForm
39
+ expect(task1?.activeForm).toBeUndefined();
40
+ });
41
+ it('should extract task IDs from tool results', () => {
42
+ const tasks = (0, parser_1.extractTasks)(mockJsonlWithTasks);
43
+ expect(tasks[0].id).toBe('1');
44
+ expect(tasks[1].id).toBe('2');
45
+ });
46
+ it('should return empty array for content without tasks', () => {
47
+ const noTasks = `
48
+ {"type":"assistant","message":{"content":[{"type":"text","text":"Hello!"}]},"timestamp":"2026-01-28T10:00:00.000Z","uuid":"msg1"}
49
+ {"type":"user","message":{"content":"Hi"},"timestamp":"2026-01-28T10:00:01.000Z","uuid":"msg2"}
50
+ `.trim();
51
+ const tasks = (0, parser_1.extractTasks)(noTasks);
52
+ expect(tasks).toHaveLength(0);
53
+ });
54
+ it('should handle blockedBy relationships', () => {
55
+ const withBlocking = `
56
+ {"type":"assistant","message":{"content":[{"type":"tool_use","id":"toolu_01","name":"TaskCreate","input":{"subject":"Task A","description":"First task"}}]},"timestamp":"2026-01-28T10:00:00.000Z","uuid":"msg1"}
57
+ {"type":"assistant","message":{"content":[{"type":"tool_result","tool_use_id":"toolu_01","content":"Task created with ID: 1"}]},"timestamp":"2026-01-28T10:00:01.000Z","uuid":"msg2"}
58
+ {"type":"assistant","message":{"content":[{"type":"tool_use","id":"toolu_02","name":"TaskCreate","input":{"subject":"Task B","description":"Second task"}}]},"timestamp":"2026-01-28T10:00:02.000Z","uuid":"msg3"}
59
+ {"type":"assistant","message":{"content":[{"type":"tool_result","tool_use_id":"toolu_02","content":"Task created with ID: 2"}]},"timestamp":"2026-01-28T10:00:03.000Z","uuid":"msg4"}
60
+ {"type":"assistant","message":{"content":[{"type":"tool_use","id":"toolu_03","name":"TaskUpdate","input":{"taskId":"2","addBlockedBy":["1"]}}]},"timestamp":"2026-01-28T10:00:04.000Z","uuid":"msg5"}
61
+ {"type":"assistant","message":{"content":[{"type":"tool_result","tool_use_id":"toolu_03","content":"Task updated"}]},"timestamp":"2026-01-28T10:00:05.000Z","uuid":"msg6"}
62
+ `.trim();
63
+ const tasks = (0, parser_1.extractTasks)(withBlocking);
64
+ const taskB = tasks.find(t => t.subject === 'Task B');
65
+ expect(taskB?.blockedBy).toEqual(['1']);
66
+ });
67
+ it('should handle deleted tasks', () => {
68
+ const withDeleted = `
69
+ {"type":"assistant","message":{"content":[{"type":"tool_use","id":"toolu_01","name":"TaskCreate","input":{"subject":"To Delete","description":"This will be deleted"}}]},"timestamp":"2026-01-28T10:00:00.000Z","uuid":"msg1"}
70
+ {"type":"assistant","message":{"content":[{"type":"tool_result","tool_use_id":"toolu_01","content":"Task created with ID: 1"}]},"timestamp":"2026-01-28T10:00:01.000Z","uuid":"msg2"}
71
+ {"type":"assistant","message":{"content":[{"type":"tool_use","id":"toolu_02","name":"TaskUpdate","input":{"taskId":"1","status":"deleted"}}]},"timestamp":"2026-01-28T10:00:02.000Z","uuid":"msg3"}
72
+ {"type":"assistant","message":{"content":[{"type":"tool_result","tool_use_id":"toolu_02","content":"Task deleted"}]},"timestamp":"2026-01-28T10:00:03.000Z","uuid":"msg4"}
73
+ `.trim();
74
+ const tasks = (0, parser_1.extractTasks)(withDeleted);
75
+ // Deleted tasks should not be included
76
+ expect(tasks).toHaveLength(0);
77
+ });
78
+ });
79
+ //# sourceMappingURL=task-parser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-parser.test.js","sourceRoot":"","sources":["../../src/__tests__/task-parser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ApiUsageStats } from './types';
2
+ export declare function fetchAnthropicUsage(adminApiKey: string, startDate: Date, endDate: Date): Promise<ApiUsageStats>;
3
+ export declare function fetchTodayUsage(adminApiKey: string): Promise<ApiUsageStats>;
4
+ export declare function fetchMonthUsage(adminApiKey: string): Promise<ApiUsageStats>;
5
+ //# sourceMappingURL=anthropic-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-usage.d.ts","sourceRoot":"","sources":["../src/anthropic-usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,aAAa,EAAE,MAAM,SAAS,CAAC;AA6BhE,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,IAAI,EACf,OAAO,EAAE,IAAI,GACZ,OAAO,CAAC,aAAa,CAAC,CAoFxB;AAED,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAIjF;AAED,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAIjF"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchAnthropicUsage = fetchAnthropicUsage;
4
+ exports.fetchTodayUsage = fetchTodayUsage;
5
+ exports.fetchMonthUsage = fetchMonthUsage;
6
+ // Approximate pricing per million tokens (USD) - update as needed
7
+ const PRICING = {
8
+ 'claude-opus-4-5-20251101': { input: 15, output: 75, cacheWrite: 18.75, cacheRead: 1.5 },
9
+ 'claude-sonnet-4-5-20251101': { input: 3, output: 15, cacheWrite: 3.75, cacheRead: 0.3 },
10
+ 'claude-sonnet-4-20250514': { input: 3, output: 15, cacheWrite: 3.75, cacheRead: 0.3 },
11
+ 'claude-3-5-sonnet-20241022': { input: 3, output: 15, cacheWrite: 3.75, cacheRead: 0.3 },
12
+ 'claude-3-5-haiku-20241022': { input: 0.8, output: 4, cacheWrite: 1, cacheRead: 0.08 },
13
+ 'claude-3-opus-20240229': { input: 15, output: 75, cacheWrite: 18.75, cacheRead: 1.5 },
14
+ 'claude-3-sonnet-20240229': { input: 3, output: 15, cacheWrite: 3.75, cacheRead: 0.3 },
15
+ 'claude-3-haiku-20240307': { input: 0.25, output: 1.25, cacheWrite: 0.3, cacheRead: 0.03 },
16
+ };
17
+ function getModelPricing(model) {
18
+ // Try exact match first
19
+ if (PRICING[model])
20
+ return PRICING[model];
21
+ // Try partial match (model names often have date suffixes)
22
+ for (const [key, value] of Object.entries(PRICING)) {
23
+ if (model.includes(key.split('-').slice(0, -1).join('-'))) {
24
+ return value;
25
+ }
26
+ }
27
+ // Default to Sonnet pricing as fallback
28
+ return { input: 3, output: 15, cacheWrite: 3.75, cacheRead: 0.3 };
29
+ }
30
+ async function fetchAnthropicUsage(adminApiKey, startDate, endDate) {
31
+ const stats = {
32
+ periodStart: startDate.toISOString(),
33
+ periodEnd: endDate.toISOString(),
34
+ totalInputTokens: 0,
35
+ totalOutputTokens: 0,
36
+ totalCacheCreationTokens: 0,
37
+ totalCacheReadTokens: 0,
38
+ byModel: {},
39
+ estimatedCostUsd: 0,
40
+ };
41
+ let hasMore = true;
42
+ let page;
43
+ while (hasMore) {
44
+ const url = new URL('https://api.anthropic.com/v1/organizations/usage_report/messages');
45
+ url.searchParams.set('starting_at', startDate.toISOString());
46
+ url.searchParams.set('ending_at', endDate.toISOString());
47
+ url.searchParams.set('bucket_width', '1d');
48
+ url.searchParams.set('group_by[]', 'model');
49
+ if (page) {
50
+ url.searchParams.set('page', page);
51
+ }
52
+ const response = await fetch(url.toString(), {
53
+ headers: {
54
+ 'anthropic-version': '2023-06-01',
55
+ 'x-api-key': adminApiKey,
56
+ 'User-Agent': 'Companion/1.0.0',
57
+ },
58
+ });
59
+ if (!response.ok) {
60
+ const errorText = await response.text();
61
+ throw new Error(`Anthropic API error: ${response.status} - ${errorText}`);
62
+ }
63
+ const data = await response.json();
64
+ for (const bucket of data.data) {
65
+ const model = bucket.model || 'unknown';
66
+ const uncachedInput = bucket.uncached_input_tokens || 0;
67
+ const cacheCreation = bucket.cache_creation_input_tokens || 0;
68
+ const cacheRead = bucket.cache_read_input_tokens || 0;
69
+ const output = bucket.output_tokens || 0;
70
+ // Total input = uncached + cache creation (cache reads are "free" comparatively)
71
+ const totalInput = uncachedInput + cacheCreation;
72
+ stats.totalInputTokens += totalInput;
73
+ stats.totalOutputTokens += output;
74
+ stats.totalCacheCreationTokens += cacheCreation;
75
+ stats.totalCacheReadTokens += cacheRead;
76
+ if (!stats.byModel[model]) {
77
+ stats.byModel[model] = {
78
+ inputTokens: 0,
79
+ outputTokens: 0,
80
+ cacheCreationTokens: 0,
81
+ cacheReadTokens: 0,
82
+ };
83
+ }
84
+ stats.byModel[model].inputTokens += totalInput;
85
+ stats.byModel[model].outputTokens += output;
86
+ stats.byModel[model].cacheCreationTokens += cacheCreation;
87
+ stats.byModel[model].cacheReadTokens += cacheRead;
88
+ // Calculate cost
89
+ const pricing = getModelPricing(model);
90
+ stats.estimatedCostUsd += (uncachedInput / 1_000_000) * pricing.input;
91
+ stats.estimatedCostUsd += (cacheCreation / 1_000_000) * pricing.cacheWrite;
92
+ stats.estimatedCostUsd += (cacheRead / 1_000_000) * pricing.cacheRead;
93
+ stats.estimatedCostUsd += (output / 1_000_000) * pricing.output;
94
+ }
95
+ hasMore = data.has_more;
96
+ page = data.next_page;
97
+ }
98
+ // Round cost to 2 decimal places
99
+ stats.estimatedCostUsd = Math.round(stats.estimatedCostUsd * 100) / 100;
100
+ return stats;
101
+ }
102
+ async function fetchTodayUsage(adminApiKey) {
103
+ const now = new Date();
104
+ const startOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate());
105
+ return fetchAnthropicUsage(adminApiKey, startOfDay, now);
106
+ }
107
+ async function fetchMonthUsage(adminApiKey) {
108
+ const now = new Date();
109
+ const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);
110
+ return fetchAnthropicUsage(adminApiKey, startOfMonth, now);
111
+ }
112
+ //# sourceMappingURL=anthropic-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-usage.js","sourceRoot":"","sources":["../src/anthropic-usage.ts"],"names":[],"mappings":";;AA6BA,kDAwFC;AAED,0CAIC;AAED,0CAIC;AA/HD,kEAAkE;AAClE,MAAM,OAAO,GAA6F;IACxG,0BAA0B,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE;IACxF,4BAA4B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;IACxF,0BAA0B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;IACtF,4BAA4B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;IACxF,2BAA2B,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;IACtF,wBAAwB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE;IACtF,0BAA0B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;IACtF,yBAAyB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE;CAC3F,CAAC;AAEF,SAAS,eAAe,CAAC,KAAa;IACpC,wBAAwB;IACxB,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;IAE1C,2DAA2D;IAC3D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC1D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AACpE,CAAC;AAEM,KAAK,UAAU,mBAAmB,CACvC,WAAmB,EACnB,SAAe,EACf,OAAa;IAEb,MAAM,KAAK,GAAkB;QAC3B,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE;QACpC,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE;QAChC,gBAAgB,EAAE,CAAC;QACnB,iBAAiB,EAAE,CAAC;QACpB,wBAAwB,EAAE,CAAC;QAC3B,oBAAoB,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE;QACX,gBAAgB,EAAE,CAAC;KACpB,CAAC;IAEF,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,IAAwB,CAAC;IAE7B,OAAO,OAAO,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,kEAAkE,CAAC,CAAC;QACxF,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACzD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAC3C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,IAAI,EAAE,CAAC;YACT,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC3C,OAAO,EAAE;gBACP,mBAAmB,EAAE,YAAY;gBACjC,WAAW,EAAE,WAAW;gBACxB,YAAY,EAAE,iBAAiB;aAChC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA4B,CAAC;QAE7D,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,SAAS,CAAC;YACxC,MAAM,aAAa,GAAG,MAAM,CAAC,qBAAqB,IAAI,CAAC,CAAC;YACxD,MAAM,aAAa,GAAG,MAAM,CAAC,2BAA2B,IAAI,CAAC,CAAC;YAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,uBAAuB,IAAI,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC;YAEzC,iFAAiF;YACjF,MAAM,UAAU,GAAG,aAAa,GAAG,aAAa,CAAC;YAEjD,KAAK,CAAC,gBAAgB,IAAI,UAAU,CAAC;YACrC,KAAK,CAAC,iBAAiB,IAAI,MAAM,CAAC;YAClC,KAAK,CAAC,wBAAwB,IAAI,aAAa,CAAC;YAChD,KAAK,CAAC,oBAAoB,IAAI,SAAS,CAAC;YAExC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;oBACrB,WAAW,EAAE,CAAC;oBACd,YAAY,EAAE,CAAC;oBACf,mBAAmB,EAAE,CAAC;oBACtB,eAAe,EAAE,CAAC;iBACnB,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,IAAI,UAAU,CAAC;YAC/C,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,IAAI,MAAM,CAAC;YAC5C,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,mBAAmB,IAAI,aAAa,CAAC;YAC1D,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC;YAElD,iBAAiB;YACjB,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YACvC,KAAK,CAAC,gBAAgB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;YACtE,KAAK,CAAC,gBAAgB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;YAC3E,KAAK,CAAC,gBAAgB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;YACtE,KAAK,CAAC,gBAAgB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QAClE,CAAC;QAED,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QACxB,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,iCAAiC;IACjC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAExE,OAAO,KAAK,CAAC;AACf,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,OAAO,mBAAmB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;AAC3D,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IACpE,OAAO,mBAAmB,CAAC,WAAW,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,15 @@
1
+ interface CertPaths {
2
+ certPath: string;
3
+ keyPath: string;
4
+ }
5
+ interface GeneratedCert {
6
+ cert: string;
7
+ key: string;
8
+ }
9
+ export declare function ensureCertsDirectory(certsDir: string): void;
10
+ export declare function certsExist(certPath: string, keyPath: string): boolean;
11
+ export declare function generateSelfSignedCert(commonName?: string): GeneratedCert;
12
+ export declare function generateAndSaveCerts(certPath: string, keyPath: string): CertPaths;
13
+ export declare function getDefaultCertPaths(): CertPaths;
14
+ export {};
15
+ //# sourceMappingURL=cert-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cert-generator.d.ts","sourceRoot":"","sources":["../src/cert-generator.ts"],"names":[],"mappings":"AAIA,UAAU,SAAS;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAK3D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAErE;AAED,wBAAgB,sBAAsB,CACpC,UAAU,GAAE,MAAoB,GAC/B,aAAa,CA0Bf;AAiRD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAcjF;AAED,wBAAgB,mBAAmB,IAAI,SAAS,CAM/C"}
@@ -0,0 +1,298 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ensureCertsDirectory = ensureCertsDirectory;
37
+ exports.certsExist = certsExist;
38
+ exports.generateSelfSignedCert = generateSelfSignedCert;
39
+ exports.generateAndSaveCerts = generateAndSaveCerts;
40
+ exports.getDefaultCertPaths = getDefaultCertPaths;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const crypto = __importStar(require("crypto"));
44
+ function ensureCertsDirectory(certsDir) {
45
+ if (!fs.existsSync(certsDir)) {
46
+ fs.mkdirSync(certsDir, { recursive: true, mode: 0o700 });
47
+ console.log(`Created certificates directory: ${certsDir}`);
48
+ }
49
+ }
50
+ function certsExist(certPath, keyPath) {
51
+ return fs.existsSync(certPath) && fs.existsSync(keyPath);
52
+ }
53
+ function generateSelfSignedCert(commonName = 'companion') {
54
+ // Generate RSA key pair
55
+ const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {
56
+ modulusLength: 2048,
57
+ publicKeyEncoding: { type: 'spki', format: 'pem' },
58
+ privateKeyEncoding: { type: 'pkcs8', format: 'pem' },
59
+ });
60
+ // Create self-signed certificate
61
+ // This is a simplified approach using Node's crypto module
62
+ // For production, you'd want to use a proper X.509 certificate library
63
+ const now = new Date();
64
+ const oneYear = 365 * 24 * 60 * 60 * 1000;
65
+ const notAfter = new Date(now.getTime() + oneYear);
66
+ // Build a minimal self-signed certificate structure
67
+ // Note: This creates a basic certificate. For more robust cert generation,
68
+ // consider using the 'selfsigned' or 'node-forge' packages
69
+ const cert = createMinimalCert(publicKey, privateKey, commonName, now, notAfter);
70
+ return {
71
+ cert,
72
+ key: privateKey,
73
+ };
74
+ }
75
+ function createMinimalCert(publicKey, privateKey, commonName, notBefore, notAfter) {
76
+ // Use crypto.X509Certificate if available (Node 15.6+)
77
+ // Otherwise, create a basic PEM structure
78
+ // For simplicity, we'll use a pre-formed certificate template approach
79
+ // This generates a working self-signed cert using Node's built-in crypto
80
+ const serialNumber = crypto.randomBytes(16).toString('hex');
81
+ // Create certificate using crypto module's certificate generation
82
+ // Note: This requires Node 15.6+ for full X509Certificate support
83
+ try {
84
+ // Generate certificate using crypto.createPrivateKey and sign
85
+ const cert = generateX509Cert(publicKey, privateKey, commonName, notBefore, notAfter, serialNumber);
86
+ return cert;
87
+ }
88
+ catch (err) {
89
+ // Fallback: Generate a basic self-signed cert structure
90
+ console.warn('Using basic certificate generation');
91
+ return generateBasicCert(publicKey, privateKey, commonName);
92
+ }
93
+ }
94
+ function generateX509Cert(publicKey, privateKey, commonName, notBefore, notAfter, serialNumber) {
95
+ // Create certificate request and self-sign it
96
+ // This uses Node's newer crypto APIs
97
+ const certInfo = {
98
+ subject: { CN: commonName },
99
+ issuer: { CN: commonName },
100
+ serial: serialNumber,
101
+ notBefore,
102
+ notAfter,
103
+ publicKey,
104
+ };
105
+ // Sign the certificate data
106
+ const sign = crypto.createSign('SHA256');
107
+ sign.update(JSON.stringify(certInfo));
108
+ const signature = sign.sign(privateKey, 'base64');
109
+ // For a proper X.509 cert, we need ASN.1 encoding
110
+ // Use a simplified approach that creates a working cert
111
+ return createPemCertificate(publicKey, privateKey, commonName, notBefore, notAfter);
112
+ }
113
+ function createPemCertificate(publicKey, privateKey, commonName, notBefore, notAfter) {
114
+ // Generate a proper self-signed X.509 certificate
115
+ // Using OpenSSL-compatible format
116
+ const keyObj = crypto.createPrivateKey(privateKey);
117
+ const pubKeyObj = crypto.createPublicKey(publicKey);
118
+ // Create certificate using forge-style approach
119
+ // Since we can't easily create ASN.1 without external deps,
120
+ // we'll create a certificate that works with Node's TLS
121
+ // For the MVP, return the public key as the cert
122
+ // In production, use the 'selfsigned' npm package
123
+ // Actually create a proper cert using createCertificate from tls
124
+ const fakeCert = generateOpenSSLStyleCert(privateKey, commonName, notBefore, notAfter);
125
+ return fakeCert;
126
+ }
127
+ function generateOpenSSLStyleCert(privateKey, commonName, notBefore, notAfter) {
128
+ // Generate certificate data
129
+ const serial = crypto.randomBytes(8).toString('hex');
130
+ const keyObj = crypto.createPrivateKey(privateKey);
131
+ const pubKeyObj = crypto.createPublicKey(keyObj);
132
+ const publicKeyPem = pubKeyObj.export({ type: 'spki', format: 'pem' });
133
+ // Build basic ASN.1 TBSCertificate structure
134
+ // This is a simplified implementation
135
+ const tbsCert = buildTbsCertificate(publicKeyPem, commonName, serial, notBefore, notAfter);
136
+ // Sign the TBS certificate
137
+ const sign = crypto.createSign('SHA256');
138
+ sign.update(tbsCert);
139
+ const signature = sign.sign(keyObj);
140
+ // Combine into final certificate
141
+ const certDer = buildCertificateDer(tbsCert, signature);
142
+ const certPem = derToPem(certDer, 'CERTIFICATE');
143
+ return certPem;
144
+ }
145
+ function buildTbsCertificate(publicKeyPem, commonName, serial, notBefore, notAfter) {
146
+ // Build minimal ASN.1 DER structure for TBSCertificate
147
+ const version = Buffer.from([0xa0, 0x03, 0x02, 0x01, 0x02]); // Version 3
148
+ const serialNum = asn1Integer(Buffer.from(serial, 'hex'));
149
+ const signatureAlg = asn1Sequence([
150
+ asn1ObjectId([2, 16, 840, 1, 101, 3, 4, 2, 1]), // SHA256
151
+ asn1Null(),
152
+ ]);
153
+ const issuer = buildName(commonName);
154
+ const validity = buildValidity(notBefore, notAfter);
155
+ const subject = buildName(commonName);
156
+ const subjectPublicKeyInfo = pemToDer(publicKeyPem.replace(/-----[^-]+-----/g, '').replace(/\s/g, ''));
157
+ return asn1Sequence([
158
+ version,
159
+ serialNum,
160
+ signatureAlg,
161
+ issuer,
162
+ validity,
163
+ subject,
164
+ subjectPublicKeyInfo,
165
+ ]);
166
+ }
167
+ function buildCertificateDer(tbsCert, signature) {
168
+ const signatureAlg = asn1Sequence([
169
+ asn1ObjectId([1, 2, 840, 113549, 1, 1, 11]), // sha256WithRSAEncryption
170
+ asn1Null(),
171
+ ]);
172
+ const signatureBits = asn1BitString(signature);
173
+ return asn1Sequence([tbsCert, signatureAlg, signatureBits]);
174
+ }
175
+ function buildName(cn) {
176
+ const cnOid = asn1ObjectId([2, 5, 4, 3]); // Common Name
177
+ const cnValue = asn1PrintableString(cn);
178
+ const rdn = asn1Set([asn1Sequence([cnOid, cnValue])]);
179
+ return asn1Sequence([rdn]);
180
+ }
181
+ function buildValidity(notBefore, notAfter) {
182
+ return asn1Sequence([
183
+ asn1UtcTime(notBefore),
184
+ asn1UtcTime(notAfter),
185
+ ]);
186
+ }
187
+ // ASN.1 encoding helpers
188
+ function asn1Sequence(items) {
189
+ const content = Buffer.concat(items);
190
+ return asn1Tag(0x30, content);
191
+ }
192
+ function asn1Set(items) {
193
+ const content = Buffer.concat(items);
194
+ return asn1Tag(0x31, content);
195
+ }
196
+ function asn1Integer(value) {
197
+ // Add leading zero if high bit set
198
+ const needsPadding = value[0] & 0x80;
199
+ const content = needsPadding ? Buffer.concat([Buffer.from([0]), value]) : value;
200
+ return asn1Tag(0x02, content);
201
+ }
202
+ function asn1BitString(value) {
203
+ const content = Buffer.concat([Buffer.from([0]), value]); // 0 unused bits
204
+ return asn1Tag(0x03, content);
205
+ }
206
+ function asn1ObjectId(oid) {
207
+ const bytes = [];
208
+ bytes.push(oid[0] * 40 + oid[1]);
209
+ for (let i = 2; i < oid.length; i++) {
210
+ const val = oid[i];
211
+ if (val < 128) {
212
+ bytes.push(val);
213
+ }
214
+ else {
215
+ const parts = [];
216
+ let v = val;
217
+ while (v > 0) {
218
+ parts.unshift(v & 0x7f);
219
+ v >>= 7;
220
+ }
221
+ for (let j = 0; j < parts.length - 1; j++) {
222
+ parts[j] |= 0x80;
223
+ }
224
+ bytes.push(...parts);
225
+ }
226
+ }
227
+ return asn1Tag(0x06, Buffer.from(bytes));
228
+ }
229
+ function asn1Null() {
230
+ return Buffer.from([0x05, 0x00]);
231
+ }
232
+ function asn1PrintableString(str) {
233
+ return asn1Tag(0x13, Buffer.from(str, 'ascii'));
234
+ }
235
+ function asn1UtcTime(date) {
236
+ const str = date.getUTCFullYear().toString().slice(-2) +
237
+ (date.getUTCMonth() + 1).toString().padStart(2, '0') +
238
+ date.getUTCDate().toString().padStart(2, '0') +
239
+ date.getUTCHours().toString().padStart(2, '0') +
240
+ date.getUTCMinutes().toString().padStart(2, '0') +
241
+ date.getUTCSeconds().toString().padStart(2, '0') +
242
+ 'Z';
243
+ return asn1Tag(0x17, Buffer.from(str, 'ascii'));
244
+ }
245
+ function asn1Tag(tag, content) {
246
+ const len = content.length;
247
+ let lenBytes;
248
+ if (len < 128) {
249
+ lenBytes = Buffer.from([len]);
250
+ }
251
+ else if (len < 256) {
252
+ lenBytes = Buffer.from([0x81, len]);
253
+ }
254
+ else if (len < 65536) {
255
+ lenBytes = Buffer.from([0x82, (len >> 8) & 0xff, len & 0xff]);
256
+ }
257
+ else {
258
+ throw new Error('Content too long');
259
+ }
260
+ return Buffer.concat([Buffer.from([tag]), lenBytes, content]);
261
+ }
262
+ function pemToDer(base64) {
263
+ return Buffer.from(base64, 'base64');
264
+ }
265
+ function derToPem(der, type) {
266
+ const base64 = der.toString('base64');
267
+ const lines = [];
268
+ for (let i = 0; i < base64.length; i += 64) {
269
+ lines.push(base64.slice(i, i + 64));
270
+ }
271
+ return `-----BEGIN ${type}-----\n${lines.join('\n')}\n-----END ${type}-----\n`;
272
+ }
273
+ function generateBasicCert(publicKey, privateKey, commonName) {
274
+ // Fallback: use the public key as a placeholder
275
+ // This won't work for actual TLS but prevents crashes
276
+ console.warn('Certificate generation fallback - TLS may not work properly');
277
+ console.warn('Consider installing the "selfsigned" package for proper cert generation');
278
+ return publicKey;
279
+ }
280
+ function generateAndSaveCerts(certPath, keyPath) {
281
+ const certsDir = path.dirname(certPath);
282
+ ensureCertsDirectory(certsDir);
283
+ console.log('Generating self-signed TLS certificates...');
284
+ const { cert, key } = generateSelfSignedCert('companion');
285
+ fs.writeFileSync(certPath, cert, { mode: 0o644 });
286
+ fs.writeFileSync(keyPath, key, { mode: 0o600 });
287
+ console.log(`Certificate saved to: ${certPath}`);
288
+ console.log(`Private key saved to: ${keyPath}`);
289
+ return { certPath, keyPath };
290
+ }
291
+ function getDefaultCertPaths() {
292
+ const certsDir = process.env.CERTS_DIR || '/etc/companion/certs';
293
+ return {
294
+ certPath: path.join(certsDir, 'cert.pem'),
295
+ keyPath: path.join(certsDir, 'key.pem'),
296
+ };
297
+ }
298
+ //# sourceMappingURL=cert-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cert-generator.js","sourceRoot":"","sources":["../src/cert-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { DaemonConfig } from './types';
2
+ export declare function loadConfig(): DaemonConfig;
3
+ export declare function saveConfig(config: DaemonConfig): void;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA2BvC,wBAAgB,UAAU,IAAI,YAAY,CAgDzC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAkBrD"}