@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,55 @@
1
+ export interface ProjectSpec {
2
+ name: string;
3
+ description: string;
4
+ type: 'frontend' | 'backend' | 'fullstack' | 'library' | 'cli';
5
+ features: string[];
6
+ }
7
+ export interface ScaffoldFile {
8
+ path: string;
9
+ content: string;
10
+ }
11
+ export interface StackTemplate {
12
+ id: string;
13
+ name: string;
14
+ description: string;
15
+ type: 'frontend' | 'backend' | 'fullstack' | 'library' | 'cli';
16
+ icon: string;
17
+ tags: string[];
18
+ files: {
19
+ path: string;
20
+ template: string;
21
+ }[];
22
+ postCreate?: {
23
+ command: string;
24
+ description: string;
25
+ }[];
26
+ recommendedSkills?: string[];
27
+ }
28
+ export interface ProjectConfig {
29
+ name: string;
30
+ description: string;
31
+ location: string;
32
+ stackId: string;
33
+ options: {
34
+ initGit: boolean;
35
+ createGitHubRepo: boolean;
36
+ privateRepo: boolean;
37
+ includeDocker: boolean;
38
+ includeCI: boolean;
39
+ includeLinter: boolean;
40
+ };
41
+ }
42
+ export interface ScaffoldProgress {
43
+ step: string;
44
+ detail?: string;
45
+ progress: number;
46
+ complete: boolean;
47
+ error?: string;
48
+ }
49
+ export interface ScaffoldResult {
50
+ success: boolean;
51
+ projectPath: string;
52
+ filesCreated: string[];
53
+ error?: string;
54
+ }
55
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scaffold/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,KAAK,CAAC;IAC/D,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAGD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,KAAK,CAAC;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CAAC;IAEJ,UAAU,CAAC,EAAE;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;KACrB,EAAE,CAAC;IAEJ,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAGD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,WAAW,EAAE,OAAO,CAAC;QACrB,aAAa,EAAE,OAAO,CAAC;QACvB,SAAS,EAAE,OAAO,CAAC;QACnB,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;CACH;AAGD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scaffold/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import { EventEmitter } from 'events';
2
+ import { SubAgent, AgentTree, ConversationHighlight } from './types';
3
+ export declare class SubAgentWatcher extends EventEmitter {
4
+ private codeHome;
5
+ private watcher;
6
+ private agents;
7
+ private cleanupInterval;
8
+ constructor(codeHome: string);
9
+ private cleanup;
10
+ start(): void;
11
+ stop(): void;
12
+ private handleFileChange;
13
+ private parseSubAgentFile;
14
+ getAgentTree(sessionId?: string): AgentTree;
15
+ getAgentsForSession(sessionId: string): SubAgent[];
16
+ /**
17
+ * Get detailed conversation for a specific sub-agent by parsing its .jsonl file
18
+ */
19
+ getAgentDetail(agentId: string): {
20
+ agent: SubAgent;
21
+ highlights: ConversationHighlight[];
22
+ } | null;
23
+ }
24
+ //# sourceMappingURL=subagent-watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-watcher.d.ts","sourceRoot":"","sources":["../src/subagent-watcher.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AA+BrE,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,MAAM,CAA2C;IACzD,OAAO,CAAC,eAAe,CAA+B;gBAE1C,QAAQ,EAAE,MAAM;IAM5B,OAAO,CAAC,OAAO;IAcf,KAAK,IAAI,IAAI;IA8Bb,IAAI,IAAI,IAAI;IAWZ,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,iBAAiB;IA6FzB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS;IAuD3C,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,EAAE;IAIlD;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;QAC/B,KAAK,EAAE,QAAQ,CAAC;QAChB,UAAU,EAAE,qBAAqB,EAAE,CAAC;KACrC,GAAG,IAAI;CAyCT"}
@@ -0,0 +1,307 @@
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.SubAgentWatcher = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const chokidar = __importStar(require("chokidar"));
40
+ const events_1 = require("events");
41
+ const parser_1 = require("./parser");
42
+ class SubAgentWatcher extends events_1.EventEmitter {
43
+ codeHome;
44
+ watcher = null;
45
+ agents = new Map();
46
+ cleanupInterval = null;
47
+ constructor(codeHome) {
48
+ super();
49
+ this.codeHome = codeHome;
50
+ }
51
+ // Remove agents older than 24 hours from memory
52
+ cleanup() {
53
+ const oneDayAgo = Date.now() - 24 * 60 * 60 * 1000;
54
+ let removed = 0;
55
+ for (const [key, agent] of this.agents.entries()) {
56
+ if (agent.lastActivity < oneDayAgo) {
57
+ this.agents.delete(key);
58
+ removed++;
59
+ }
60
+ }
61
+ if (removed > 0) {
62
+ console.log(`SubAgentWatcher: Cleaned up ${removed} old agents`);
63
+ }
64
+ }
65
+ start() {
66
+ const projectsDir = path.join(this.codeHome, 'projects');
67
+ const pattern = path.join(projectsDir, '**', 'subagents', '*.jsonl');
68
+ console.log(`SubAgentWatcher: Watching for sub-agents in: ${projectsDir}`);
69
+ this.watcher = chokidar.watch(pattern, {
70
+ persistent: true,
71
+ ignoreInitial: false,
72
+ awaitWriteFinish: {
73
+ stabilityThreshold: 100,
74
+ pollInterval: 50,
75
+ },
76
+ depth: 4,
77
+ usePolling: true,
78
+ interval: 200,
79
+ });
80
+ this.watcher.on('add', (filePath) => this.handleFileChange(filePath));
81
+ this.watcher.on('change', (filePath) => this.handleFileChange(filePath));
82
+ this.watcher.on('error', (error) => {
83
+ console.error('SubAgentWatcher error:', error);
84
+ });
85
+ // Run cleanup every hour
86
+ this.cleanupInterval = setInterval(() => this.cleanup(), 60 * 60 * 1000);
87
+ // Also run cleanup on start to clear any stale data
88
+ this.cleanup();
89
+ }
90
+ stop() {
91
+ if (this.watcher) {
92
+ this.watcher.close();
93
+ this.watcher = null;
94
+ }
95
+ if (this.cleanupInterval) {
96
+ clearInterval(this.cleanupInterval);
97
+ this.cleanupInterval = null;
98
+ }
99
+ }
100
+ handleFileChange(filePath) {
101
+ try {
102
+ const agentData = this.parseSubAgentFile(filePath);
103
+ if (!agentData)
104
+ return;
105
+ const key = `${agentData.sessionId}:${agentData.agentId}`;
106
+ const existing = this.agents.get(key);
107
+ const isNew = !existing;
108
+ this.agents.set(key, agentData);
109
+ if (isNew) {
110
+ console.log(`SubAgentWatcher: New agent ${agentData.agentId} (${agentData.slug})`);
111
+ this.emit('agent-started', agentData);
112
+ }
113
+ else if (agentData.isComplete && !existing.isComplete) {
114
+ console.log(`SubAgentWatcher: Agent ${agentData.agentId} completed`);
115
+ this.emit('agent-completed', agentData);
116
+ }
117
+ else {
118
+ this.emit('agent-update', agentData);
119
+ }
120
+ }
121
+ catch (err) {
122
+ console.error(`SubAgentWatcher: Error parsing ${filePath}:`, err);
123
+ }
124
+ }
125
+ parseSubAgentFile(filePath) {
126
+ if (!fs.existsSync(filePath))
127
+ return null;
128
+ const content = fs.readFileSync(filePath, 'utf-8');
129
+ const lines = content.split('\n').filter(line => line.trim());
130
+ if (lines.length === 0)
131
+ return null;
132
+ let agentId = '';
133
+ let slug = '';
134
+ let sessionId = '';
135
+ let startedAt = 0;
136
+ let completedAt;
137
+ let description = '';
138
+ let subagentType = '';
139
+ let messageCount = 0;
140
+ let lastActivity = 0;
141
+ let lastContent = '';
142
+ let isComplete = false;
143
+ for (const line of lines) {
144
+ try {
145
+ const entry = JSON.parse(line);
146
+ if (!agentId && entry.agentId)
147
+ agentId = entry.agentId;
148
+ if (!slug && entry.slug)
149
+ slug = entry.slug;
150
+ if (!sessionId && entry.sessionId)
151
+ sessionId = entry.sessionId;
152
+ const timestamp = entry.timestamp ? new Date(entry.timestamp).getTime() : Date.now();
153
+ if (startedAt === 0)
154
+ startedAt = timestamp;
155
+ lastActivity = timestamp;
156
+ if (entry.type === 'user' && entry.message?.content) {
157
+ messageCount++;
158
+ const content = typeof entry.message.content === 'string'
159
+ ? entry.message.content
160
+ : entry.message.content.map(c => c.text || '').join('');
161
+ if (!description && content) {
162
+ // Use first 100 chars of first user message as description
163
+ description = content.substring(0, 100);
164
+ if (content.length > 100)
165
+ description += '...';
166
+ }
167
+ }
168
+ if (entry.type === 'assistant' && entry.message) {
169
+ messageCount++;
170
+ // Check for stop_reason to determine if complete
171
+ if (entry.message.stop_reason === 'end_turn') {
172
+ isComplete = true;
173
+ completedAt = timestamp;
174
+ }
175
+ // Extract last activity content
176
+ if (entry.message.content) {
177
+ if (typeof entry.message.content === 'string') {
178
+ lastContent = entry.message.content.substring(0, 50);
179
+ }
180
+ else if (Array.isArray(entry.message.content)) {
181
+ for (const block of entry.message.content) {
182
+ if (block.type === 'text' && block.text) {
183
+ lastContent = block.text.substring(0, 50);
184
+ }
185
+ else if (block.type === 'tool_use') {
186
+ lastContent = `Using tool...`;
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
192
+ }
193
+ catch {
194
+ // Skip malformed lines
195
+ }
196
+ }
197
+ if (!agentId || !sessionId)
198
+ return null;
199
+ return {
200
+ agentId,
201
+ slug,
202
+ sessionId,
203
+ filePath,
204
+ startedAt,
205
+ completedAt,
206
+ description,
207
+ subagentType,
208
+ messageCount,
209
+ lastActivity,
210
+ lastContent,
211
+ isComplete,
212
+ };
213
+ }
214
+ getAgentTree(sessionId) {
215
+ const agents = [];
216
+ let runningCount = 0;
217
+ let completedCount = 0;
218
+ // Only show running agents + completed agents from last 2 hours
219
+ const now = Date.now();
220
+ const twoHoursAgo = now - 2 * 60 * 60 * 1000;
221
+ const oneHourAgo = now - 60 * 60 * 1000;
222
+ for (const tracked of this.agents.values()) {
223
+ // Filter by session if specified
224
+ if (sessionId && tracked.sessionId !== sessionId)
225
+ continue;
226
+ // Consider agent completed if explicitly marked OR no activity in 1 hour
227
+ const isStale = tracked.lastActivity < oneHourAgo;
228
+ const isActuallyComplete = tracked.isComplete || isStale;
229
+ const status = isActuallyComplete ? 'completed' : 'running';
230
+ const effectiveCompletedAt = tracked.completedAt || (isStale ? tracked.lastActivity : undefined);
231
+ // Skip old completed agents
232
+ if (status === 'completed' && effectiveCompletedAt && effectiveCompletedAt < twoHoursAgo) {
233
+ continue;
234
+ }
235
+ if (status === 'running')
236
+ runningCount++;
237
+ else
238
+ completedCount++;
239
+ agents.push({
240
+ agentId: tracked.agentId,
241
+ slug: tracked.slug,
242
+ sessionId: tracked.sessionId,
243
+ status,
244
+ startedAt: tracked.startedAt,
245
+ completedAt: effectiveCompletedAt,
246
+ description: tracked.description,
247
+ subagentType: tracked.subagentType,
248
+ messageCount: tracked.messageCount,
249
+ lastActivity: tracked.lastActivity,
250
+ currentActivity: tracked.lastContent,
251
+ });
252
+ }
253
+ // Sort by last activity (most recent first)
254
+ agents.sort((a, b) => b.lastActivity - a.lastActivity);
255
+ return {
256
+ sessionId: sessionId || 'all',
257
+ agents,
258
+ totalAgents: agents.length,
259
+ runningCount,
260
+ completedCount,
261
+ };
262
+ }
263
+ getAgentsForSession(sessionId) {
264
+ return this.getAgentTree(sessionId).agents;
265
+ }
266
+ /**
267
+ * Get detailed conversation for a specific sub-agent by parsing its .jsonl file
268
+ */
269
+ getAgentDetail(agentId) {
270
+ // Find the tracked agent
271
+ let tracked = null;
272
+ for (const t of this.agents.values()) {
273
+ if (t.agentId === agentId) {
274
+ tracked = t;
275
+ break;
276
+ }
277
+ }
278
+ if (!tracked || !fs.existsSync(tracked.filePath)) {
279
+ return null;
280
+ }
281
+ // Parse the agent's conversation file using the existing parser
282
+ const messages = (0, parser_1.parseConversationFile)(tracked.filePath, 200);
283
+ const highlights = (0, parser_1.extractHighlights)(messages);
284
+ // Build the SubAgent info
285
+ const now = Date.now();
286
+ const oneHourAgo = now - 60 * 60 * 1000;
287
+ const isStale = tracked.lastActivity < oneHourAgo;
288
+ const isActuallyComplete = tracked.isComplete || isStale;
289
+ const status = isActuallyComplete ? 'completed' : 'running';
290
+ const agent = {
291
+ agentId: tracked.agentId,
292
+ slug: tracked.slug,
293
+ sessionId: tracked.sessionId,
294
+ status,
295
+ startedAt: tracked.startedAt,
296
+ completedAt: tracked.completedAt || (isStale ? tracked.lastActivity : undefined),
297
+ description: tracked.description,
298
+ subagentType: tracked.subagentType,
299
+ messageCount: tracked.messageCount,
300
+ lastActivity: tracked.lastActivity,
301
+ currentActivity: tracked.lastContent,
302
+ };
303
+ return { agent, highlights };
304
+ }
305
+ }
306
+ exports.SubAgentWatcher = SubAgentWatcher;
307
+ //# sourceMappingURL=subagent-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-watcher.js","sourceRoot":"","sources":["../src/subagent-watcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,mDAAqC;AACrC,mCAAsC;AAEtC,qCAAoE;AA8BpE,MAAa,eAAgB,SAAQ,qBAAY;IACvC,QAAQ,CAAS;IACjB,OAAO,GAA8B,IAAI,CAAC;IAC1C,MAAM,GAAiC,IAAI,GAAG,EAAE,CAAC;IACjD,eAAe,GAA0B,IAAI,CAAC;IAEtD,YAAY,QAAgB;QAC1B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,gDAAgD;IACxC,OAAO;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACnD,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YACjD,IAAI,KAAK,CAAC,YAAY,GAAG,SAAS,EAAE,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACxB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,+BAA+B,OAAO,aAAa,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,KAAK;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAErE,OAAO,CAAC,GAAG,CAAC,gDAAgD,WAAW,EAAE,CAAC,CAAC;QAE3E,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE;YACrC,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,KAAK;YACpB,gBAAgB,EAAE;gBAChB,kBAAkB,EAAE,GAAG;gBACvB,YAAY,EAAE,EAAE;aACjB;YACD,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,GAAG;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,yBAAyB;QACzB,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACzE,oDAAoD;QACpD,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,QAAgB;QACvC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YACnD,IAAI,CAAC,SAAS;gBAAE,OAAO;YAEvB,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC;YAExB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAEhC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,8BAA8B,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC;gBACnF,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;YACxC,CAAC;iBAAM,IAAI,SAAS,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACxD,OAAO,CAAC,GAAG,CAAC,0BAA0B,SAAS,CAAC,OAAO,YAAY,CAAC,CAAC;gBACrE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,kCAAkC,QAAQ,GAAG,EAAE,GAAG,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,QAAgB;QACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAE1C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAE9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEpC,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,WAA+B,CAAC;QACpC,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAuB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEnD,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;oBAAE,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;gBACvD,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI;oBAAE,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;gBAC3C,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS;oBAAE,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;gBAE/D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBAErF,IAAI,SAAS,KAAK,CAAC;oBAAE,SAAS,GAAG,SAAS,CAAC;gBAC3C,YAAY,GAAG,SAAS,CAAC;gBAEzB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;oBACpD,YAAY,EAAE,CAAC;oBACf,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ;wBACvD,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO;wBACvB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAE1D,IAAI,CAAC,WAAW,IAAI,OAAO,EAAE,CAAC;wBAC5B,2DAA2D;wBAC3D,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;wBACxC,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG;4BAAE,WAAW,IAAI,KAAK,CAAC;oBACjD,CAAC;gBACH,CAAC;gBAED,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBAChD,YAAY,EAAE,CAAC;oBAEf,iDAAiD;oBACjD,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;wBAC7C,UAAU,GAAG,IAAI,CAAC;wBAClB,WAAW,GAAG,SAAS,CAAC;oBAC1B,CAAC;oBAED,gCAAgC;oBAChC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;wBAC1B,IAAI,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;4BAC9C,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACvD,CAAC;6BAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;4BAChD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gCAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oCACxC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gCAC5C,CAAC;qCAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oCACrC,WAAW,GAAG,eAAe,CAAC;gCAChC,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAExC,OAAO;YACL,OAAO;YACP,IAAI;YACJ,SAAS;YACT,QAAQ;YACR,SAAS;YACT,WAAW;YACX,WAAW;YACX,YAAY;YACZ,YAAY;YACZ,YAAY;YACZ,WAAW;YACX,UAAU;SACX,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,SAAkB;QAC7B,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,gEAAgE;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC7C,MAAM,UAAU,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAExC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,iCAAiC;YACjC,IAAI,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;gBAAE,SAAS;YAE3D,yEAAyE;YACzE,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,GAAG,UAAU,CAAC;YAClD,MAAM,kBAAkB,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC;YACzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5D,MAAM,oBAAoB,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAEjG,4BAA4B;YAC5B,IAAI,MAAM,KAAK,WAAW,IAAI,oBAAoB,IAAI,oBAAoB,GAAG,WAAW,EAAE,CAAC;gBACzF,SAAS;YACX,CAAC;YAED,IAAI,MAAM,KAAK,SAAS;gBAAE,YAAY,EAAE,CAAC;;gBACpC,cAAc,EAAE,CAAC;YAEtB,MAAM,CAAC,IAAI,CAAC;gBACV,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,MAAM;gBACN,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,WAAW,EAAE,oBAAoB;gBACjC,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,eAAe,EAAE,OAAO,CAAC,WAAW;aACrC,CAAC,CAAC;QACL,CAAC;QAED,4CAA4C;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;QAEvD,OAAO;YACL,SAAS,EAAE,SAAS,IAAI,KAAK;YAC7B,MAAM;YACN,WAAW,EAAE,MAAM,CAAC,MAAM;YAC1B,YAAY;YACZ,cAAc;SACf,CAAC;IACJ,CAAC;IAED,mBAAmB,CAAC,SAAiB;QACnC,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,OAAe;QAI5B,yBAAyB;QACzB,IAAI,OAAO,GAA2B,IAAI,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC1B,OAAO,GAAG,CAAC,CAAC;gBACZ,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,gEAAgE;QAChE,MAAM,QAAQ,GAAG,IAAA,8BAAqB,EAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,IAAA,0BAAiB,EAAC,QAAQ,CAAC,CAAC;QAE/C,0BAA0B;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACxC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,GAAG,UAAU,CAAC;QAClD,MAAM,kBAAkB,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC;QACzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QAE5D,MAAM,KAAK,GAAa;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM;YACN,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;YAChF,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,eAAe,EAAE,OAAO,CAAC,WAAW;SACrC,CAAC;QAEF,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAC/B,CAAC;CACF;AAnSD,0CAmSC"}
package/dist/tls.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import * as https from 'https';
2
+ import * as http from 'http';
3
+ export interface TlsConfig {
4
+ enabled: boolean;
5
+ certPath?: string;
6
+ keyPath?: string;
7
+ }
8
+ export declare function createServer(tlsConfig: TlsConfig, requestHandler?: http.RequestListener): http.Server | https.Server;
9
+ export declare function validateTlsConfig(config: TlsConfig): string[];
10
+ //# sourceMappingURL=tls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tls.d.ts","sourceRoot":"","sources":["../src/tls.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,SAAS,EACpB,cAAc,CAAC,EAAE,IAAI,CAAC,eAAe,GACpC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAoB5B;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE,CAkB7D"}
package/dist/tls.js ADDED
@@ -0,0 +1,77 @@
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.createServer = createServer;
37
+ exports.validateTlsConfig = validateTlsConfig;
38
+ const fs = __importStar(require("fs"));
39
+ const https = __importStar(require("https"));
40
+ const http = __importStar(require("http"));
41
+ function createServer(tlsConfig, requestHandler) {
42
+ if (tlsConfig.enabled && tlsConfig.certPath && tlsConfig.keyPath) {
43
+ if (!fs.existsSync(tlsConfig.certPath)) {
44
+ throw new Error(`TLS certificate not found: ${tlsConfig.certPath}`);
45
+ }
46
+ if (!fs.existsSync(tlsConfig.keyPath)) {
47
+ throw new Error(`TLS key not found: ${tlsConfig.keyPath}`);
48
+ }
49
+ const options = {
50
+ cert: fs.readFileSync(tlsConfig.certPath),
51
+ key: fs.readFileSync(tlsConfig.keyPath),
52
+ };
53
+ console.log('TLS: Creating HTTPS server');
54
+ return https.createServer(options, requestHandler);
55
+ }
56
+ console.log('TLS: Creating HTTP server (no TLS)');
57
+ return http.createServer(requestHandler);
58
+ }
59
+ function validateTlsConfig(config) {
60
+ const errors = [];
61
+ if (config.enabled) {
62
+ if (!config.certPath) {
63
+ errors.push('TLS enabled but no certificate path specified');
64
+ }
65
+ else if (!fs.existsSync(config.certPath)) {
66
+ errors.push(`TLS certificate not found: ${config.certPath}`);
67
+ }
68
+ if (!config.keyPath) {
69
+ errors.push('TLS enabled but no key path specified');
70
+ }
71
+ else if (!fs.existsSync(config.keyPath)) {
72
+ errors.push(`TLS key not found: ${config.keyPath}`);
73
+ }
74
+ }
75
+ return errors;
76
+ }
77
+ //# sourceMappingURL=tls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tls.js","sourceRoot":"","sources":["../src/tls.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,oCAuBC;AAED,8CAkBC;AArDD,uCAAyB;AACzB,6CAA+B;AAC/B,2CAA6B;AAQ7B,SAAgB,YAAY,CAC1B,SAAoB,EACpB,cAAqC;IAErC,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,OAAO,GAAwB;YACnC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC;YACzC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC;SACxC,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;AAC3C,CAAC;AAED,SAAgB,iBAAiB,CAAC,MAAiB;IACjD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC/D,CAAC;aAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,8BAA8B,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,71 @@
1
+ export interface TmuxSessionInfo {
2
+ name: string;
3
+ created: number;
4
+ attached: boolean;
5
+ windows: number;
6
+ workingDir?: string;
7
+ }
8
+ export declare class TmuxManager {
9
+ private sessionPrefix;
10
+ constructor(sessionPrefix?: string);
11
+ /**
12
+ * List all tmux sessions (not filtered by prefix, so user can switch between any sessions)
13
+ */
14
+ listSessions(): Promise<TmuxSessionInfo[]>;
15
+ /**
16
+ * Check if a session exists
17
+ */
18
+ sessionExists(name: string): Promise<boolean>;
19
+ /**
20
+ * Tag an existing tmux session as managed by Companion
21
+ */
22
+ tagSession(name: string): Promise<boolean>;
23
+ /**
24
+ * Check if a tmux session is tagged as managed by Companion
25
+ */
26
+ isTagged(name: string): Promise<boolean>;
27
+ /**
28
+ * Create a new tmux session and start a coding session in it
29
+ */
30
+ createSession(name: string, workingDir: string, startCli?: boolean): Promise<{
31
+ success: boolean;
32
+ error?: string;
33
+ }>;
34
+ /**
35
+ * Kill a tmux session
36
+ */
37
+ killSession(name: string): Promise<{
38
+ success: boolean;
39
+ error?: string;
40
+ }>;
41
+ /**
42
+ * Send input to a specific session
43
+ */
44
+ sendKeys(sessionName: string, keys: string): Promise<boolean>;
45
+ /**
46
+ * Send Enter key to a session
47
+ */
48
+ sendEnter(sessionName: string): Promise<boolean>;
49
+ /**
50
+ * Send Ctrl+C to a session
51
+ */
52
+ sendInterrupt(sessionName: string): Promise<boolean>;
53
+ /**
54
+ * List available directories (for browsing)
55
+ */
56
+ listDirectories(basePath: string): Promise<string[]>;
57
+ /**
58
+ * Get home directory
59
+ */
60
+ getHomeDir(): string;
61
+ /**
62
+ * Capture the current terminal output from a tmux pane.
63
+ * Returns the last N lines of visible output.
64
+ */
65
+ capturePane(sessionName: string, lines?: number): Promise<string>;
66
+ /**
67
+ * Generate a unique session name based on directory
68
+ */
69
+ generateSessionName(workingDir: string): string;
70
+ }
71
+ //# sourceMappingURL=tmux-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux-manager.d.ts","sourceRoot":"","sources":["../src/tmux-manager.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,aAAa,CAAS;gBAElB,aAAa,GAAE,MAAoB;IAI/C;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAwChD;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASnD;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUhD;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW9C;;OAEG;IACG,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,OAAc,GACvB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA0ChD;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAsC9E;;OAEG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBnE;;OAEG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUtD;;OAEG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1D;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAW1D;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;;OAGG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAW5E;;OAEG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;CAMhD"}