@stackmemoryai/stackmemory 0.2.3 → 0.2.6

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 (187) hide show
  1. package/README.md +108 -0
  2. package/dist/index.js +382 -0
  3. package/dist/src/analytics/api/analytics-api.d.ts +24 -0
  4. package/dist/src/analytics/api/analytics-api.d.ts.map +1 -0
  5. package/dist/src/analytics/api/analytics-api.js +279 -0
  6. package/dist/src/analytics/api/analytics-api.js.map +1 -0
  7. package/dist/src/analytics/core/analytics-service.d.ts +23 -0
  8. package/dist/src/analytics/core/analytics-service.d.ts.map +1 -0
  9. package/dist/src/analytics/core/analytics-service.js +160 -0
  10. package/dist/src/analytics/core/analytics-service.js.map +1 -0
  11. package/dist/src/analytics/index.d.ts +12 -0
  12. package/dist/src/analytics/index.d.ts.map +1 -0
  13. package/dist/src/analytics/index.js +11 -0
  14. package/dist/src/analytics/index.js.map +1 -0
  15. package/dist/src/analytics/queries/metrics-queries.d.ts +11 -0
  16. package/dist/src/analytics/queries/metrics-queries.d.ts.map +1 -0
  17. package/dist/src/analytics/queries/metrics-queries.js +179 -0
  18. package/dist/src/analytics/queries/metrics-queries.js.map +1 -0
  19. package/dist/src/analytics/types/metrics.d.ts +60 -0
  20. package/dist/src/analytics/types/metrics.d.ts.map +1 -0
  21. package/dist/src/analytics/types/metrics.js +2 -0
  22. package/dist/src/analytics/types/metrics.js.map +1 -0
  23. package/dist/src/cli/analytics-viewer.d.ts +3 -0
  24. package/dist/src/cli/analytics-viewer.d.ts.map +1 -0
  25. package/dist/src/cli/analytics-viewer.js +89 -0
  26. package/dist/src/cli/analytics-viewer.js.map +1 -0
  27. package/dist/src/cli/browser-test.d.ts +6 -0
  28. package/dist/src/cli/browser-test.d.ts.map +1 -0
  29. package/dist/src/cli/browser-test.js +32 -0
  30. package/dist/src/cli/browser-test.js.map +1 -0
  31. package/dist/src/cli/cli.js +233 -1
  32. package/dist/src/cli/cli.js.map +1 -1
  33. package/dist/src/cli/commands/projects.d.ts +8 -0
  34. package/dist/src/cli/commands/projects.d.ts.map +1 -0
  35. package/dist/src/cli/commands/projects.js +220 -0
  36. package/dist/src/cli/commands/projects.js.map +1 -0
  37. package/dist/src/cli/index.d.ts +7 -0
  38. package/dist/src/cli/index.d.ts.map +1 -0
  39. package/dist/src/cli/index.js +704 -0
  40. package/dist/src/cli/index.js.map +1 -0
  41. package/dist/src/cli/project-commands.d.ts +8 -0
  42. package/dist/src/cli/project-commands.d.ts.map +1 -0
  43. package/dist/src/cli/project-commands.js +212 -0
  44. package/dist/src/cli/project-commands.js.map +1 -0
  45. package/dist/src/cli/utils/viewer.d.ts +3 -0
  46. package/dist/src/cli/utils/viewer.d.ts.map +1 -0
  47. package/dist/src/cli/utils/viewer.js +89 -0
  48. package/dist/src/cli/utils/viewer.js.map +1 -0
  49. package/dist/src/core/context/frame-manager.d.ts +106 -0
  50. package/dist/src/core/context/frame-manager.d.ts.map +1 -0
  51. package/dist/src/core/context/frame-manager.js +387 -0
  52. package/dist/src/core/context/frame-manager.js.map +1 -0
  53. package/dist/src/core/logger.test.js +1 -1
  54. package/dist/src/core/logger.test.js.map +1 -1
  55. package/dist/src/core/monitoring/error-handler.d.ts +46 -0
  56. package/dist/src/core/monitoring/error-handler.d.ts.map +1 -0
  57. package/dist/src/core/monitoring/error-handler.js +212 -0
  58. package/dist/src/core/monitoring/error-handler.js.map +1 -0
  59. package/dist/src/core/monitoring/logger.d.ts +24 -0
  60. package/dist/src/core/monitoring/logger.d.ts.map +1 -0
  61. package/dist/src/core/monitoring/logger.js +121 -0
  62. package/dist/src/core/monitoring/logger.js.map +1 -0
  63. package/dist/src/core/monitoring/metrics.d.ts +7 -0
  64. package/dist/src/core/monitoring/metrics.d.ts.map +1 -0
  65. package/dist/src/core/monitoring/metrics.js +13 -0
  66. package/dist/src/core/monitoring/metrics.js.map +1 -0
  67. package/dist/src/core/monitoring/progress-tracker.d.ts +95 -0
  68. package/dist/src/core/monitoring/progress-tracker.d.ts.map +1 -0
  69. package/dist/src/core/monitoring/progress-tracker.js +178 -0
  70. package/dist/src/core/monitoring/progress-tracker.js.map +1 -0
  71. package/dist/src/core/progress-tracker.d.ts +95 -0
  72. package/dist/src/core/progress-tracker.d.ts.map +1 -0
  73. package/dist/src/core/progress-tracker.js +178 -0
  74. package/dist/src/core/progress-tracker.js.map +1 -0
  75. package/dist/src/core/project-manager.d.ts +130 -0
  76. package/dist/src/core/project-manager.d.ts.map +1 -0
  77. package/dist/src/core/project-manager.js +582 -0
  78. package/dist/src/core/project-manager.js.map +1 -0
  79. package/dist/src/core/projects/project-manager.d.ts +130 -0
  80. package/dist/src/core/projects/project-manager.d.ts.map +1 -0
  81. package/dist/src/core/projects/project-manager.js +591 -0
  82. package/dist/src/core/projects/project-manager.js.map +1 -0
  83. package/dist/src/core/update-checker.d.ts +38 -0
  84. package/dist/src/core/update-checker.d.ts.map +1 -0
  85. package/dist/src/core/update-checker.js +156 -0
  86. package/dist/src/core/update-checker.js.map +1 -0
  87. package/dist/src/core/utils/update-checker.d.ts +38 -0
  88. package/dist/src/core/utils/update-checker.d.ts.map +1 -0
  89. package/dist/src/core/utils/update-checker.js +156 -0
  90. package/dist/src/core/utils/update-checker.js.map +1 -0
  91. package/dist/src/features/analytics/api/analytics-api.d.ts +24 -0
  92. package/dist/src/features/analytics/api/analytics-api.d.ts.map +1 -0
  93. package/dist/src/features/analytics/api/analytics-api.js +289 -0
  94. package/dist/src/features/analytics/api/analytics-api.js.map +1 -0
  95. package/dist/src/features/analytics/core/analytics-service.d.ts +23 -0
  96. package/dist/src/features/analytics/core/analytics-service.d.ts.map +1 -0
  97. package/dist/src/features/analytics/core/analytics-service.js +160 -0
  98. package/dist/src/features/analytics/core/analytics-service.js.map +1 -0
  99. package/dist/src/features/analytics/index.d.ts +12 -0
  100. package/dist/src/features/analytics/index.d.ts.map +1 -0
  101. package/dist/src/features/analytics/index.js +11 -0
  102. package/dist/src/features/analytics/index.js.map +1 -0
  103. package/dist/src/features/analytics/queries/metrics-queries.d.ts +11 -0
  104. package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +1 -0
  105. package/dist/src/features/analytics/queries/metrics-queries.js +183 -0
  106. package/dist/src/features/analytics/queries/metrics-queries.js.map +1 -0
  107. package/dist/src/features/analytics/types/metrics.d.ts +60 -0
  108. package/dist/src/features/analytics/types/metrics.d.ts.map +1 -0
  109. package/dist/src/features/analytics/types/metrics.js +2 -0
  110. package/dist/src/features/analytics/types/metrics.js.map +1 -0
  111. package/dist/src/features/browser/browser-mcp.d.ts +94 -0
  112. package/dist/src/features/browser/browser-mcp.d.ts.map +1 -0
  113. package/dist/src/features/browser/browser-mcp.js +456 -0
  114. package/dist/src/features/browser/browser-mcp.js.map +1 -0
  115. package/dist/src/features/tasks/pebbles-task-store.d.ts +117 -0
  116. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -0
  117. package/dist/src/features/tasks/pebbles-task-store.js +335 -0
  118. package/dist/src/features/tasks/pebbles-task-store.js.map +1 -0
  119. package/dist/src/features/tasks/task-aware-context.d.ts +103 -0
  120. package/dist/src/features/tasks/task-aware-context.d.ts.map +1 -0
  121. package/dist/src/features/tasks/task-aware-context.js +412 -0
  122. package/dist/src/features/tasks/task-aware-context.js.map +1 -0
  123. package/dist/src/index.d.ts +4 -4
  124. package/dist/src/index.d.ts.map +1 -1
  125. package/dist/src/index.js +4 -4
  126. package/dist/src/index.js.map +1 -1
  127. package/dist/src/integrations/browser-mcp.d.ts +94 -0
  128. package/dist/src/integrations/browser-mcp.d.ts.map +1 -0
  129. package/dist/src/integrations/browser-mcp.js +431 -0
  130. package/dist/src/integrations/browser-mcp.js.map +1 -0
  131. package/dist/src/integrations/linear/auth.d.ts +99 -0
  132. package/dist/src/integrations/linear/auth.d.ts.map +1 -0
  133. package/dist/src/integrations/linear/auth.js +319 -0
  134. package/dist/src/integrations/linear/auth.js.map +1 -0
  135. package/dist/src/integrations/linear/auto-sync.d.ts +77 -0
  136. package/dist/src/integrations/linear/auto-sync.d.ts.map +1 -0
  137. package/dist/src/integrations/linear/auto-sync.js +268 -0
  138. package/dist/src/integrations/linear/auto-sync.js.map +1 -0
  139. package/dist/src/integrations/linear/client.d.ts +86 -0
  140. package/dist/src/integrations/linear/client.d.ts.map +1 -0
  141. package/dist/src/integrations/linear/client.js +277 -0
  142. package/dist/src/integrations/linear/client.js.map +1 -0
  143. package/dist/src/integrations/linear/config.d.ts +51 -0
  144. package/dist/src/integrations/linear/config.d.ts.map +1 -0
  145. package/dist/src/integrations/linear/config.js +103 -0
  146. package/dist/src/integrations/linear/config.js.map +1 -0
  147. package/dist/src/integrations/linear/sync.d.ts +97 -0
  148. package/dist/src/integrations/linear/sync.d.ts.map +1 -0
  149. package/dist/src/integrations/linear/sync.js +391 -0
  150. package/dist/src/integrations/linear/sync.js.map +1 -0
  151. package/dist/src/integrations/mcp/server.d.ts +40 -0
  152. package/dist/src/integrations/mcp/server.d.ts.map +1 -0
  153. package/dist/src/integrations/mcp/server.js +828 -0
  154. package/dist/src/integrations/mcp/server.js.map +1 -0
  155. package/dist/src/mcp/mcp-server.d.ts +2 -0
  156. package/dist/src/mcp/mcp-server.d.ts.map +1 -1
  157. package/dist/src/mcp/mcp-server.js +16 -0
  158. package/dist/src/mcp/mcp-server.js.map +1 -1
  159. package/dist/src/railway/index.d.ts +7 -0
  160. package/dist/src/railway/index.d.ts.map +1 -0
  161. package/dist/src/railway/index.js +401 -0
  162. package/dist/src/railway/index.js.map +1 -0
  163. package/dist/src/runway/auth/auth-middleware.d.ts +66 -0
  164. package/dist/src/runway/auth/auth-middleware.d.ts.map +1 -0
  165. package/dist/src/runway/auth/auth-middleware.js +337 -0
  166. package/dist/src/runway/auth/auth-middleware.js.map +1 -0
  167. package/dist/src/runway/server/runway-mcp-server.d.ts +46 -0
  168. package/dist/src/runway/server/runway-mcp-server.d.ts.map +1 -0
  169. package/dist/src/runway/server/runway-mcp-server.js +601 -0
  170. package/dist/src/runway/server/runway-mcp-server.js.map +1 -0
  171. package/dist/src/runway.bak/auth/auth-middleware.d.ts +66 -0
  172. package/dist/src/runway.bak/auth/auth-middleware.d.ts.map +1 -0
  173. package/dist/src/runway.bak/auth/auth-middleware.js +337 -0
  174. package/dist/src/runway.bak/auth/auth-middleware.js.map +1 -0
  175. package/dist/src/runway.bak/server/runway-mcp-server.d.ts +46 -0
  176. package/dist/src/runway.bak/server/runway-mcp-server.d.ts.map +1 -0
  177. package/dist/src/runway.bak/server/runway-mcp-server.js +601 -0
  178. package/dist/src/runway.bak/server/runway-mcp-server.js.map +1 -0
  179. package/dist/src/servers/production/auth-middleware.d.ts +66 -0
  180. package/dist/src/servers/production/auth-middleware.d.ts.map +1 -0
  181. package/dist/src/servers/production/auth-middleware.js +346 -0
  182. package/dist/src/servers/production/auth-middleware.js.map +1 -0
  183. package/dist/src/servers/railway/index.d.ts +7 -0
  184. package/dist/src/servers/railway/index.d.ts.map +1 -0
  185. package/dist/src/servers/railway/index.js +401 -0
  186. package/dist/src/servers/railway/index.js.map +1 -0
  187. package/package.json +27 -5
@@ -0,0 +1,431 @@
1
+ /**
2
+ * Browser MCP Integration for StackMemory
3
+ * Provides browser automation capabilities through MCP
4
+ */
5
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
+ import { CallToolRequestSchema, ListToolsRequestSchema, McpError, ErrorCode, } from '@modelcontextprotocol/sdk/types.js';
7
+ import puppeteer from 'puppeteer';
8
+ import { logger } from '../core/logger.js';
9
+ export class BrowserMCPIntegration {
10
+ config;
11
+ sessions = new Map();
12
+ server;
13
+ maxSessions = 5;
14
+ sessionTimeout = 30 * 60 * 1000; // 30 minutes
15
+ constructor(config = {}) {
16
+ this.config = config;
17
+ this.startCleanupInterval();
18
+ }
19
+ /**
20
+ * Initialize the Browser MCP server
21
+ */
22
+ async initialize(mcpServer) {
23
+ this.server = mcpServer || new Server({
24
+ name: 'stackmemory-browser',
25
+ version: '1.0.0',
26
+ }, {
27
+ capabilities: {
28
+ tools: {},
29
+ },
30
+ });
31
+ this.setupHandlers();
32
+ logger.info('Browser MCP integration initialized');
33
+ }
34
+ /**
35
+ * Set up MCP request handlers
36
+ */
37
+ setupHandlers() {
38
+ if (!this.server)
39
+ return;
40
+ // List available browser tools
41
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
42
+ tools: [
43
+ {
44
+ name: 'browser_navigate',
45
+ description: 'Navigate to a URL in the browser',
46
+ inputSchema: {
47
+ type: 'object',
48
+ properties: {
49
+ url: { type: 'string', description: 'URL to navigate to' },
50
+ sessionId: { type: 'string', description: 'Optional session ID' },
51
+ },
52
+ required: ['url'],
53
+ },
54
+ },
55
+ {
56
+ name: 'browser_screenshot',
57
+ description: 'Take a screenshot of the current page',
58
+ inputSchema: {
59
+ type: 'object',
60
+ properties: {
61
+ sessionId: { type: 'string', description: 'Session ID' },
62
+ fullPage: { type: 'boolean', description: 'Capture full page' },
63
+ selector: { type: 'string', description: 'CSS selector to screenshot' },
64
+ },
65
+ required: ['sessionId'],
66
+ },
67
+ },
68
+ {
69
+ name: 'browser_click',
70
+ description: 'Click an element on the page',
71
+ inputSchema: {
72
+ type: 'object',
73
+ properties: {
74
+ sessionId: { type: 'string', description: 'Session ID' },
75
+ selector: { type: 'string', description: 'CSS selector to click' },
76
+ },
77
+ required: ['sessionId', 'selector'],
78
+ },
79
+ },
80
+ {
81
+ name: 'browser_type',
82
+ description: 'Type text into an input field',
83
+ inputSchema: {
84
+ type: 'object',
85
+ properties: {
86
+ sessionId: { type: 'string', description: 'Session ID' },
87
+ selector: { type: 'string', description: 'CSS selector of input' },
88
+ text: { type: 'string', description: 'Text to type' },
89
+ },
90
+ required: ['sessionId', 'selector', 'text'],
91
+ },
92
+ },
93
+ {
94
+ name: 'browser_evaluate',
95
+ description: 'Execute JavaScript in the browser context',
96
+ inputSchema: {
97
+ type: 'object',
98
+ properties: {
99
+ sessionId: { type: 'string', description: 'Session ID' },
100
+ script: { type: 'string', description: 'JavaScript code to execute' },
101
+ },
102
+ required: ['sessionId', 'script'],
103
+ },
104
+ },
105
+ {
106
+ name: 'browser_wait',
107
+ description: 'Wait for an element or condition',
108
+ inputSchema: {
109
+ type: 'object',
110
+ properties: {
111
+ sessionId: { type: 'string', description: 'Session ID' },
112
+ selector: { type: 'string', description: 'CSS selector to wait for' },
113
+ timeout: { type: 'number', description: 'Timeout in milliseconds' },
114
+ },
115
+ required: ['sessionId'],
116
+ },
117
+ },
118
+ {
119
+ name: 'browser_get_content',
120
+ description: 'Get the text content of the page or element',
121
+ inputSchema: {
122
+ type: 'object',
123
+ properties: {
124
+ sessionId: { type: 'string', description: 'Session ID' },
125
+ selector: { type: 'string', description: 'CSS selector (optional)' },
126
+ },
127
+ required: ['sessionId'],
128
+ },
129
+ },
130
+ {
131
+ name: 'browser_close',
132
+ description: 'Close a browser session',
133
+ inputSchema: {
134
+ type: 'object',
135
+ properties: {
136
+ sessionId: { type: 'string', description: 'Session ID to close' },
137
+ },
138
+ required: ['sessionId'],
139
+ },
140
+ },
141
+ ],
142
+ }));
143
+ // Handle tool calls
144
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
145
+ const { name, arguments: args } = request.params;
146
+ try {
147
+ switch (name) {
148
+ case 'browser_navigate':
149
+ return await this.navigate(String(args.url), args.sessionId);
150
+ case 'browser_screenshot':
151
+ return await this.screenshot(String(args.sessionId), args.fullPage, args.selector);
152
+ case 'browser_click':
153
+ return await this.click(String(args.sessionId), String(args.selector));
154
+ case 'browser_type':
155
+ return await this.type(String(args.sessionId), String(args.selector), String(args.text));
156
+ case 'browser_evaluate':
157
+ return await this.evaluate(String(args.sessionId), String(args.script));
158
+ case 'browser_wait':
159
+ return await this.waitFor(String(args.sessionId), args.selector, args.timeout);
160
+ case 'browser_get_content':
161
+ return await this.getContent(String(args.sessionId), args.selector);
162
+ case 'browser_close':
163
+ return await this.closeSession(String(args.sessionId));
164
+ default:
165
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
166
+ }
167
+ }
168
+ catch (error) {
169
+ logger.error('Browser MCP tool error', error);
170
+ throw new McpError(ErrorCode.InternalError, error.message);
171
+ }
172
+ });
173
+ }
174
+ /**
175
+ * Navigate to a URL
176
+ */
177
+ async navigate(url, sessionId) {
178
+ const session = await this.getOrCreateSession(sessionId);
179
+ await session.page.goto(url, { waitUntil: 'networkidle2' });
180
+ session.url = url;
181
+ session.lastActivity = new Date();
182
+ logger.info(`Browser navigated to ${url}`, { sessionId: session.id });
183
+ return {
184
+ content: [
185
+ {
186
+ type: 'text',
187
+ text: `Navigated to ${url}`,
188
+ },
189
+ ],
190
+ sessionId: session.id,
191
+ url,
192
+ };
193
+ }
194
+ /**
195
+ * Take a screenshot
196
+ */
197
+ async screenshot(sessionId, fullPage = false, selector) {
198
+ const session = this.getSession(sessionId);
199
+ if (!session) {
200
+ throw new Error(`Session ${sessionId} not found`);
201
+ }
202
+ let screenshot;
203
+ if (selector) {
204
+ const element = await session.page.$(selector);
205
+ if (!element) {
206
+ throw new Error(`Element ${selector} not found`);
207
+ }
208
+ screenshot = Buffer.from(await element.screenshot());
209
+ }
210
+ else {
211
+ screenshot = Buffer.from(await session.page.screenshot({ fullPage }));
212
+ }
213
+ session.lastActivity = new Date();
214
+ return {
215
+ content: [
216
+ {
217
+ type: 'image',
218
+ data: screenshot.toString('base64'),
219
+ },
220
+ ],
221
+ sessionId: session.id,
222
+ };
223
+ }
224
+ /**
225
+ * Click an element
226
+ */
227
+ async click(sessionId, selector) {
228
+ const session = this.getSession(sessionId);
229
+ if (!session) {
230
+ throw new Error(`Session ${sessionId} not found`);
231
+ }
232
+ await session.page.click(selector);
233
+ session.lastActivity = new Date();
234
+ return {
235
+ content: [
236
+ {
237
+ type: 'text',
238
+ text: `Clicked element: ${selector}`,
239
+ },
240
+ ],
241
+ sessionId: session.id,
242
+ };
243
+ }
244
+ /**
245
+ * Type text into an input
246
+ */
247
+ async type(sessionId, selector, text) {
248
+ const session = this.getSession(sessionId);
249
+ if (!session) {
250
+ throw new Error(`Session ${sessionId} not found`);
251
+ }
252
+ await session.page.type(selector, text);
253
+ session.lastActivity = new Date();
254
+ return {
255
+ content: [
256
+ {
257
+ type: 'text',
258
+ text: `Typed "${text}" into ${selector}`,
259
+ },
260
+ ],
261
+ sessionId: session.id,
262
+ };
263
+ }
264
+ /**
265
+ * Execute JavaScript in page context
266
+ */
267
+ async evaluate(sessionId, script) {
268
+ const session = this.getSession(sessionId);
269
+ if (!session) {
270
+ throw new Error(`Session ${sessionId} not found`);
271
+ }
272
+ const result = await session.page.evaluate(script);
273
+ session.lastActivity = new Date();
274
+ return {
275
+ content: [
276
+ {
277
+ type: 'text',
278
+ text: JSON.stringify(result, null, 2),
279
+ },
280
+ ],
281
+ sessionId: session.id,
282
+ result,
283
+ };
284
+ }
285
+ /**
286
+ * Wait for element or timeout
287
+ */
288
+ async waitFor(sessionId, selector, timeout = 5000) {
289
+ const session = this.getSession(sessionId);
290
+ if (!session) {
291
+ throw new Error(`Session ${sessionId} not found`);
292
+ }
293
+ if (selector) {
294
+ await session.page.waitForSelector(selector, { timeout });
295
+ }
296
+ else {
297
+ await new Promise(resolve => setTimeout(resolve, timeout));
298
+ }
299
+ session.lastActivity = new Date();
300
+ return {
301
+ content: [
302
+ {
303
+ type: 'text',
304
+ text: selector ? `Element ${selector} found` : `Waited ${timeout}ms`,
305
+ },
306
+ ],
307
+ sessionId: session.id,
308
+ };
309
+ }
310
+ /**
311
+ * Get page content
312
+ */
313
+ async getContent(sessionId, selector) {
314
+ const session = this.getSession(sessionId);
315
+ if (!session) {
316
+ throw new Error(`Session ${sessionId} not found`);
317
+ }
318
+ let content;
319
+ if (selector) {
320
+ content = await session.page.$eval(selector, (el) => el.textContent || '');
321
+ }
322
+ else {
323
+ content = await session.page.content();
324
+ }
325
+ session.lastActivity = new Date();
326
+ return {
327
+ content: [
328
+ {
329
+ type: 'text',
330
+ text: content,
331
+ },
332
+ ],
333
+ sessionId: session.id,
334
+ };
335
+ }
336
+ /**
337
+ * Get or create a browser session
338
+ */
339
+ async getOrCreateSession(sessionId) {
340
+ if (sessionId) {
341
+ const existing = this.sessions.get(sessionId);
342
+ if (existing) {
343
+ existing.lastActivity = new Date();
344
+ return existing;
345
+ }
346
+ }
347
+ // Clean up old sessions if at max
348
+ if (this.sessions.size >= this.maxSessions) {
349
+ const oldest = Array.from(this.sessions.values())
350
+ .sort((a, b) => a.lastActivity.getTime() - b.lastActivity.getTime())[0];
351
+ await this.closeSession(oldest.id);
352
+ }
353
+ // Create new session
354
+ const browser = await puppeteer.launch({
355
+ headless: this.config.headless ?? true,
356
+ defaultViewport: this.config.defaultViewport || { width: 1280, height: 720 },
357
+ userDataDir: this.config.userDataDir,
358
+ executablePath: this.config.executablePath,
359
+ args: ['--no-sandbox', '--disable-setuid-sandbox'], // For Railway/Docker
360
+ });
361
+ const page = await browser.newPage();
362
+ const id = sessionId || `session-${Date.now()}`;
363
+ const session = {
364
+ id,
365
+ browser,
366
+ page,
367
+ createdAt: new Date(),
368
+ lastActivity: new Date(),
369
+ };
370
+ this.sessions.set(id, session);
371
+ logger.info(`Created browser session ${id}`);
372
+ return session;
373
+ }
374
+ /**
375
+ * Get existing session
376
+ */
377
+ getSession(sessionId) {
378
+ return this.sessions.get(sessionId);
379
+ }
380
+ /**
381
+ * Close a browser session
382
+ */
383
+ async closeSession(sessionId) {
384
+ const session = this.sessions.get(sessionId);
385
+ if (!session) {
386
+ return {
387
+ content: [
388
+ {
389
+ type: 'text',
390
+ text: `Session ${sessionId} not found`,
391
+ },
392
+ ],
393
+ };
394
+ }
395
+ await session.browser.close();
396
+ this.sessions.delete(sessionId);
397
+ logger.info(`Closed browser session ${sessionId}`);
398
+ return {
399
+ content: [
400
+ {
401
+ type: 'text',
402
+ text: `Session ${sessionId} closed`,
403
+ },
404
+ ],
405
+ };
406
+ }
407
+ /**
408
+ * Clean up inactive sessions
409
+ */
410
+ startCleanupInterval() {
411
+ setInterval(async () => {
412
+ const now = Date.now();
413
+ for (const [id, session] of this.sessions.entries()) {
414
+ const inactiveTime = now - session.lastActivity.getTime();
415
+ if (inactiveTime > this.sessionTimeout) {
416
+ logger.info(`Cleaning up inactive session ${id}`);
417
+ await this.closeSession(id);
418
+ }
419
+ }
420
+ }, 60000); // Check every minute
421
+ }
422
+ /**
423
+ * Close all sessions
424
+ */
425
+ async cleanup() {
426
+ for (const sessionId of this.sessions.keys()) {
427
+ await this.closeSession(sessionId);
428
+ }
429
+ }
430
+ }
431
+ //# sourceMappingURL=browser-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-mcp.js","sourceRoot":"","sources":["../../../src/integrations/browser-mcp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAEnE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,QAAQ,EACR,SAAS,GACV,MAAM,oCAAoC,CAAC;AAC5C,OAAO,SAA4B,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAmB3C,MAAM,OAAO,qBAAqB;IAOtB;IANF,QAAQ,GAAgC,IAAI,GAAG,EAAE,CAAC;IAClD,MAAM,CAAU;IAChB,WAAW,GAAG,CAAC,CAAC;IAChB,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;IAEtD,YACU,SAKJ,EAAE;QALE,WAAM,GAAN,MAAM,CAKR;QAEN,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,SAAkB;QACjC,IAAI,CAAC,MAAM,GAAG,SAAS,IAAI,IAAI,MAAM,CACnC;YACE,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,OAAO;SACjB,EACD;YACE,YAAY,EAAE;gBACZ,KAAK,EAAE,EAAE;aACV;SACF,CACF,CAAC;QAEF,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,+BAA+B;QAC/B,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACjE,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,kBAAkB;oBACxB,WAAW,EAAE,kCAAkC;oBAC/C,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;4BAC1D,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE;yBAClE;wBACD,QAAQ,EAAE,CAAC,KAAK,CAAC;qBAClB;iBACF;gBACD;oBACE,IAAI,EAAE,oBAAoB;oBAC1B,WAAW,EAAE,uCAAuC;oBACpD,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;4BACxD,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE;4BAC/D,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;yBACxE;wBACD,QAAQ,EAAE,CAAC,WAAW,CAAC;qBACxB;iBACF;gBACD;oBACE,IAAI,EAAE,eAAe;oBACrB,WAAW,EAAE,8BAA8B;oBAC3C,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;4BACxD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;yBACnE;wBACD,QAAQ,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;qBACpC;iBACF;gBACD;oBACE,IAAI,EAAE,cAAc;oBACpB,WAAW,EAAE,+BAA+B;oBAC5C,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;4BACxD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;4BAClE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE;yBACtD;wBACD,QAAQ,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC;qBAC5C;iBACF;gBACD;oBACE,IAAI,EAAE,kBAAkB;oBACxB,WAAW,EAAE,2CAA2C;oBACxD,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;4BACxD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;yBACtE;wBACD,QAAQ,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;qBAClC;iBACF;gBACD;oBACE,IAAI,EAAE,cAAc;oBACpB,WAAW,EAAE,kCAAkC;oBAC/C,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;4BACxD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE;4BACrE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;yBACpE;wBACD,QAAQ,EAAE,CAAC,WAAW,CAAC;qBACxB;iBACF;gBACD;oBACE,IAAI,EAAE,qBAAqB;oBAC3B,WAAW,EAAE,6CAA6C;oBAC1D,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;4BACxD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;yBACrE;wBACD,QAAQ,EAAE,CAAC,WAAW,CAAC;qBACxB;iBACF;gBACD;oBACE,IAAI,EAAE,eAAe;oBACrB,WAAW,EAAE,yBAAyB;oBACtC,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE;yBAClE;wBACD,QAAQ,EAAE,CAAC,WAAW,CAAC;qBACxB;iBACF;aACF;SACF,CAAC,CAAC,CAAC;QAEJ,oBAAoB;QACpB,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACrE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YAEjD,IAAI,CAAC;gBACH,QAAQ,IAAI,EAAE,CAAC;oBACb,KAAK,kBAAkB;wBACrB,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAmB,CAAC,CAAC;oBAEzE,KAAK,oBAAoB;wBACvB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,QAAmB,EAAE,IAAI,CAAC,QAAkB,CAAC,CAAC;oBAE1G,KAAK,eAAe;wBAClB,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAEzE,KAAK,cAAc;wBACjB,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBAE3F,KAAK,kBAAkB;wBACrB,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;oBAE1E,KAAK,cAAc;wBACjB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,QAAkB,EAAE,IAAI,CAAC,OAAiB,CAAC,CAAC;oBAErG,KAAK,qBAAqB;wBACxB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,QAAkB,CAAC,CAAC;oBAEhF,KAAK,eAAe;wBAClB,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;oBAEzD;wBACE,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,iBAAiB,IAAI,EAAE,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;gBAC9C,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,SAAkB;QACpD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAEzD,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;QAClB,OAAO,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;QAElC,MAAM,CAAC,IAAI,CAAC,wBAAwB,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAEtE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,gBAAgB,GAAG,EAAE;iBAC5B;aACF;YACD,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,GAAG;SACJ,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU,CACtB,SAAiB,EACjB,QAAQ,GAAG,KAAK,EAChB,QAAiB;QAEjB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,YAAY,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,UAAkB,CAAC;QAEvB,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,WAAW,QAAQ,YAAY,CAAC,CAAC;YACnD,CAAC;YACD,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;QAElC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;iBACpC;aACF;YACD,SAAS,EAAE,OAAO,CAAC,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,QAAgB;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,YAAY,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;QAElC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,oBAAoB,QAAQ,EAAE;iBACrC;aACF;YACD,SAAS,EAAE,OAAO,CAAC,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,QAAgB,EAAE,IAAY;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,YAAY,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;QAElC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,UAAU,IAAI,UAAU,QAAQ,EAAE;iBACzC;aACF;YACD,SAAS,EAAE,OAAO,CAAC,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,MAAc;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,YAAY,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnD,OAAO,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;QAElC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC;aACF;YACD,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO,CACnB,SAAiB,EACjB,QAAiB,EACjB,OAAO,GAAG,IAAI;QAEd,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,YAAY,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;QAElC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,QAAQ,QAAQ,CAAC,CAAC,CAAC,UAAU,OAAO,IAAI;iBACrE;aACF;YACD,SAAS,EAAE,OAAO,CAAC,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,QAAiB;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,YAAY,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,OAAe,CAAC;QAEpB,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACzC,CAAC;QAED,OAAO,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;QAElC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,OAAO;iBACd;aACF;YACD,SAAS,EAAE,OAAO,CAAC,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAAC,SAAkB;QACjD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;gBACnC,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;iBAC9C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1E,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC;QAED,qBAAqB;QACrB,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC;YACrC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI;YACtC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;YAC5E,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;YAC1C,IAAI,EAAE,CAAC,cAAc,EAAE,0BAA0B,CAAC,EAAE,qBAAqB;SAC1E,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,SAAS,IAAI,WAAW,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAEhD,MAAM,OAAO,GAAmB;YAC9B,EAAE;YACF,OAAO;YACP,IAAI;YACJ,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,YAAY,EAAE,IAAI,IAAI,EAAE;SACzB,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;QAE7C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,SAAiB;QAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,SAAiB;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,WAAW,SAAS,YAAY;qBACvC;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEhC,MAAM,CAAC,IAAI,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC;QAEnD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,WAAW,SAAS,SAAS;iBACpC;aACF;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,WAAW,CAAC,KAAK,IAAI,EAAE;YACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEvB,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;gBACpD,MAAM,YAAY,GAAG,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;gBAE1D,IAAI,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;oBACvC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,CAAC,CAAC;oBAClD,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,qBAAqB;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Linear OAuth Authentication Setup
3
+ * Handles initial OAuth flow and token management for Linear integration
4
+ */
5
+ export interface LinearAuthConfig {
6
+ clientId: string;
7
+ clientSecret: string;
8
+ redirectUri: string;
9
+ scopes: string[];
10
+ }
11
+ export interface LinearTokens {
12
+ accessToken: string;
13
+ refreshToken?: string;
14
+ expiresAt: number;
15
+ scope: string[];
16
+ }
17
+ export interface LinearAuthResult {
18
+ accessToken: string;
19
+ refreshToken?: string;
20
+ expiresIn: number;
21
+ scope: string;
22
+ tokenType: string;
23
+ }
24
+ export declare class LinearAuthManager {
25
+ private configPath;
26
+ private tokensPath;
27
+ private config?;
28
+ constructor(projectRoot: string);
29
+ /**
30
+ * Check if Linear integration is configured
31
+ */
32
+ isConfigured(): boolean;
33
+ /**
34
+ * Save OAuth application configuration
35
+ */
36
+ saveConfig(config: LinearAuthConfig): void;
37
+ /**
38
+ * Load OAuth configuration
39
+ */
40
+ loadConfig(): LinearAuthConfig | null;
41
+ /**
42
+ * Generate OAuth authorization URL with PKCE
43
+ */
44
+ generateAuthUrl(state?: string): {
45
+ url: string;
46
+ codeVerifier: string;
47
+ };
48
+ /**
49
+ * Exchange authorization code for access token
50
+ */
51
+ exchangeCodeForToken(authCode: string, codeVerifier: string): Promise<LinearTokens>;
52
+ /**
53
+ * Refresh access token using refresh token
54
+ */
55
+ refreshAccessToken(): Promise<LinearTokens>;
56
+ /**
57
+ * Get valid access token (refresh if needed)
58
+ */
59
+ getValidToken(): Promise<string>;
60
+ /**
61
+ * Save tokens to file
62
+ */
63
+ private saveTokens;
64
+ /**
65
+ * Load tokens from file
66
+ */
67
+ loadTokens(): LinearTokens | null;
68
+ /**
69
+ * Clear stored tokens and config
70
+ */
71
+ clearAuth(): void;
72
+ }
73
+ /**
74
+ * Default Linear OAuth scopes for task management
75
+ */
76
+ export declare const DEFAULT_LINEAR_SCOPES: string[];
77
+ /**
78
+ * Linear OAuth setup helper
79
+ */
80
+ export declare class LinearOAuthSetup {
81
+ private authManager;
82
+ constructor(projectRoot: string);
83
+ /**
84
+ * Interactive setup for Linear OAuth
85
+ */
86
+ setupInteractive(): Promise<{
87
+ authUrl: string;
88
+ instructions: string[];
89
+ }>;
90
+ /**
91
+ * Complete OAuth flow with authorization code
92
+ */
93
+ completeAuth(authCode: string): Promise<boolean>;
94
+ /**
95
+ * Test the Linear connection
96
+ */
97
+ testConnection(): Promise<boolean>;
98
+ }
99
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/integrations/linear/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAC,CAAmB;gBAEtB,WAAW,EAAE,MAAM;IAM/B;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAM1C;;OAEG;IACH,UAAU,IAAI,gBAAgB,GAAG,IAAI;IAerC;;OAEG;IACH,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;IA8BtE;;OAEG;IACG,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC;IA8CxB;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC;IA8CjD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAiBtC;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;IACH,UAAU,IAAI,YAAY,GAAG,IAAI;IAcjC;;OAEG;IACH,SAAS,IAAI,IAAI;CASlB;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,UAIjC,CAAC;AAEF;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAoB;gBAE3B,WAAW,EAAE,MAAM;IAI/B;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC;QAChC,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;IAgDF;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBtD;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAgCzC"}