@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,456 @@
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/monitoring/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 =
24
+ mcpServer ||
25
+ new Server({
26
+ name: 'stackmemory-browser',
27
+ version: '1.0.0',
28
+ }, {
29
+ capabilities: {
30
+ tools: {},
31
+ },
32
+ });
33
+ this.setupHandlers();
34
+ logger.info('Browser MCP integration initialized');
35
+ }
36
+ /**
37
+ * Set up MCP request handlers
38
+ */
39
+ setupHandlers() {
40
+ if (!this.server)
41
+ return;
42
+ // List available browser tools
43
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
44
+ tools: [
45
+ {
46
+ name: 'browser_navigate',
47
+ description: 'Navigate to a URL in the browser',
48
+ inputSchema: {
49
+ type: 'object',
50
+ properties: {
51
+ url: { type: 'string', description: 'URL to navigate to' },
52
+ sessionId: { type: 'string', description: 'Optional session ID' },
53
+ },
54
+ required: ['url'],
55
+ },
56
+ },
57
+ {
58
+ name: 'browser_screenshot',
59
+ description: 'Take a screenshot of the current page',
60
+ inputSchema: {
61
+ type: 'object',
62
+ properties: {
63
+ sessionId: { type: 'string', description: 'Session ID' },
64
+ fullPage: { type: 'boolean', description: 'Capture full page' },
65
+ selector: {
66
+ type: 'string',
67
+ description: 'CSS selector to screenshot',
68
+ },
69
+ },
70
+ required: ['sessionId'],
71
+ },
72
+ },
73
+ {
74
+ name: 'browser_click',
75
+ description: 'Click an element on the page',
76
+ inputSchema: {
77
+ type: 'object',
78
+ properties: {
79
+ sessionId: { type: 'string', description: 'Session ID' },
80
+ selector: {
81
+ type: 'string',
82
+ description: 'CSS selector to click',
83
+ },
84
+ },
85
+ required: ['sessionId', 'selector'],
86
+ },
87
+ },
88
+ {
89
+ name: 'browser_type',
90
+ description: 'Type text into an input field',
91
+ inputSchema: {
92
+ type: 'object',
93
+ properties: {
94
+ sessionId: { type: 'string', description: 'Session ID' },
95
+ selector: {
96
+ type: 'string',
97
+ description: 'CSS selector of input',
98
+ },
99
+ text: { type: 'string', description: 'Text to type' },
100
+ },
101
+ required: ['sessionId', 'selector', 'text'],
102
+ },
103
+ },
104
+ {
105
+ name: 'browser_evaluate',
106
+ description: 'Execute JavaScript in the browser context',
107
+ inputSchema: {
108
+ type: 'object',
109
+ properties: {
110
+ sessionId: { type: 'string', description: 'Session ID' },
111
+ script: {
112
+ type: 'string',
113
+ description: 'JavaScript code to execute',
114
+ },
115
+ },
116
+ required: ['sessionId', 'script'],
117
+ },
118
+ },
119
+ {
120
+ name: 'browser_wait',
121
+ description: 'Wait for an element or condition',
122
+ inputSchema: {
123
+ type: 'object',
124
+ properties: {
125
+ sessionId: { type: 'string', description: 'Session ID' },
126
+ selector: {
127
+ type: 'string',
128
+ description: 'CSS selector to wait for',
129
+ },
130
+ timeout: {
131
+ type: 'number',
132
+ description: 'Timeout in milliseconds',
133
+ },
134
+ },
135
+ required: ['sessionId'],
136
+ },
137
+ },
138
+ {
139
+ name: 'browser_get_content',
140
+ description: 'Get the text content of the page or element',
141
+ inputSchema: {
142
+ type: 'object',
143
+ properties: {
144
+ sessionId: { type: 'string', description: 'Session ID' },
145
+ selector: {
146
+ type: 'string',
147
+ description: 'CSS selector (optional)',
148
+ },
149
+ },
150
+ required: ['sessionId'],
151
+ },
152
+ },
153
+ {
154
+ name: 'browser_close',
155
+ description: 'Close a browser session',
156
+ inputSchema: {
157
+ type: 'object',
158
+ properties: {
159
+ sessionId: { type: 'string', description: 'Session ID to close' },
160
+ },
161
+ required: ['sessionId'],
162
+ },
163
+ },
164
+ ],
165
+ }));
166
+ // Handle tool calls
167
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
168
+ const { name, arguments: args } = request.params;
169
+ try {
170
+ switch (name) {
171
+ case 'browser_navigate':
172
+ return await this.navigate(String(args.url), args.sessionId);
173
+ case 'browser_screenshot':
174
+ return await this.screenshot(String(args.sessionId), args.fullPage, args.selector);
175
+ case 'browser_click':
176
+ return await this.click(String(args.sessionId), String(args.selector));
177
+ case 'browser_type':
178
+ return await this.type(String(args.sessionId), String(args.selector), String(args.text));
179
+ case 'browser_evaluate':
180
+ return await this.evaluate(String(args.sessionId), String(args.script));
181
+ case 'browser_wait':
182
+ return await this.waitFor(String(args.sessionId), args.selector, args.timeout);
183
+ case 'browser_get_content':
184
+ return await this.getContent(String(args.sessionId), args.selector);
185
+ case 'browser_close':
186
+ return await this.closeSession(String(args.sessionId));
187
+ default:
188
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
189
+ }
190
+ }
191
+ catch (error) {
192
+ logger.error('Browser MCP tool error', error);
193
+ throw new McpError(ErrorCode.InternalError, error.message);
194
+ }
195
+ });
196
+ }
197
+ /**
198
+ * Navigate to a URL
199
+ */
200
+ async navigate(url, sessionId) {
201
+ const session = await this.getOrCreateSession(sessionId);
202
+ await session.page.goto(url, { waitUntil: 'networkidle2' });
203
+ session.url = url;
204
+ session.lastActivity = new Date();
205
+ logger.info(`Browser navigated to ${url}`, { sessionId: session.id });
206
+ return {
207
+ content: [
208
+ {
209
+ type: 'text',
210
+ text: `Navigated to ${url}`,
211
+ },
212
+ ],
213
+ sessionId: session.id,
214
+ url,
215
+ };
216
+ }
217
+ /**
218
+ * Take a screenshot
219
+ */
220
+ async screenshot(sessionId, fullPage = false, selector) {
221
+ const session = this.getSession(sessionId);
222
+ if (!session) {
223
+ throw new Error(`Session ${sessionId} not found`);
224
+ }
225
+ let screenshot;
226
+ if (selector) {
227
+ const element = await session.page.$(selector);
228
+ if (!element) {
229
+ throw new Error(`Element ${selector} not found`);
230
+ }
231
+ screenshot = Buffer.from(await element.screenshot());
232
+ }
233
+ else {
234
+ screenshot = Buffer.from(await session.page.screenshot({ fullPage }));
235
+ }
236
+ session.lastActivity = new Date();
237
+ return {
238
+ content: [
239
+ {
240
+ type: 'image',
241
+ data: screenshot.toString('base64'),
242
+ },
243
+ ],
244
+ sessionId: session.id,
245
+ };
246
+ }
247
+ /**
248
+ * Click an element
249
+ */
250
+ async click(sessionId, selector) {
251
+ const session = this.getSession(sessionId);
252
+ if (!session) {
253
+ throw new Error(`Session ${sessionId} not found`);
254
+ }
255
+ await session.page.click(selector);
256
+ session.lastActivity = new Date();
257
+ return {
258
+ content: [
259
+ {
260
+ type: 'text',
261
+ text: `Clicked element: ${selector}`,
262
+ },
263
+ ],
264
+ sessionId: session.id,
265
+ };
266
+ }
267
+ /**
268
+ * Type text into an input
269
+ */
270
+ async type(sessionId, selector, text) {
271
+ const session = this.getSession(sessionId);
272
+ if (!session) {
273
+ throw new Error(`Session ${sessionId} not found`);
274
+ }
275
+ await session.page.type(selector, text);
276
+ session.lastActivity = new Date();
277
+ return {
278
+ content: [
279
+ {
280
+ type: 'text',
281
+ text: `Typed "${text}" into ${selector}`,
282
+ },
283
+ ],
284
+ sessionId: session.id,
285
+ };
286
+ }
287
+ /**
288
+ * Execute JavaScript in page context
289
+ */
290
+ async evaluate(sessionId, script) {
291
+ const session = this.getSession(sessionId);
292
+ if (!session) {
293
+ throw new Error(`Session ${sessionId} not found`);
294
+ }
295
+ const result = await session.page.evaluate(script);
296
+ session.lastActivity = new Date();
297
+ return {
298
+ content: [
299
+ {
300
+ type: 'text',
301
+ text: JSON.stringify(result, null, 2),
302
+ },
303
+ ],
304
+ sessionId: session.id,
305
+ result,
306
+ };
307
+ }
308
+ /**
309
+ * Wait for element or timeout
310
+ */
311
+ async waitFor(sessionId, selector, timeout = 5000) {
312
+ const session = this.getSession(sessionId);
313
+ if (!session) {
314
+ throw new Error(`Session ${sessionId} not found`);
315
+ }
316
+ if (selector) {
317
+ await session.page.waitForSelector(selector, { timeout });
318
+ }
319
+ else {
320
+ await new Promise((resolve) => setTimeout(resolve, timeout));
321
+ }
322
+ session.lastActivity = new Date();
323
+ return {
324
+ content: [
325
+ {
326
+ type: 'text',
327
+ text: selector ? `Element ${selector} found` : `Waited ${timeout}ms`,
328
+ },
329
+ ],
330
+ sessionId: session.id,
331
+ };
332
+ }
333
+ /**
334
+ * Get page content
335
+ */
336
+ async getContent(sessionId, selector) {
337
+ const session = this.getSession(sessionId);
338
+ if (!session) {
339
+ throw new Error(`Session ${sessionId} not found`);
340
+ }
341
+ let content;
342
+ if (selector) {
343
+ content = await session.page.$eval(selector, (el) => el.textContent || '');
344
+ }
345
+ else {
346
+ content = await session.page.content();
347
+ }
348
+ session.lastActivity = new Date();
349
+ return {
350
+ content: [
351
+ {
352
+ type: 'text',
353
+ text: content,
354
+ },
355
+ ],
356
+ sessionId: session.id,
357
+ };
358
+ }
359
+ /**
360
+ * Get or create a browser session
361
+ */
362
+ async getOrCreateSession(sessionId) {
363
+ if (sessionId) {
364
+ const existing = this.sessions.get(sessionId);
365
+ if (existing) {
366
+ existing.lastActivity = new Date();
367
+ return existing;
368
+ }
369
+ }
370
+ // Clean up old sessions if at max
371
+ if (this.sessions.size >= this.maxSessions) {
372
+ const oldest = Array.from(this.sessions.values()).sort((a, b) => a.lastActivity.getTime() - b.lastActivity.getTime())[0];
373
+ await this.closeSession(oldest.id);
374
+ }
375
+ // Create new session
376
+ const browser = await puppeteer.launch({
377
+ headless: this.config.headless ?? true,
378
+ defaultViewport: this.config.defaultViewport || {
379
+ width: 1280,
380
+ height: 720,
381
+ },
382
+ userDataDir: this.config.userDataDir,
383
+ executablePath: this.config.executablePath,
384
+ args: ['--no-sandbox', '--disable-setuid-sandbox'], // For Railway/Docker
385
+ });
386
+ const page = await browser.newPage();
387
+ const id = sessionId || `session-${Date.now()}`;
388
+ const session = {
389
+ id,
390
+ browser,
391
+ page,
392
+ createdAt: new Date(),
393
+ lastActivity: new Date(),
394
+ };
395
+ this.sessions.set(id, session);
396
+ logger.info(`Created browser session ${id}`);
397
+ return session;
398
+ }
399
+ /**
400
+ * Get existing session
401
+ */
402
+ getSession(sessionId) {
403
+ return this.sessions.get(sessionId);
404
+ }
405
+ /**
406
+ * Close a browser session
407
+ */
408
+ async closeSession(sessionId) {
409
+ const session = this.sessions.get(sessionId);
410
+ if (!session) {
411
+ return {
412
+ content: [
413
+ {
414
+ type: 'text',
415
+ text: `Session ${sessionId} not found`,
416
+ },
417
+ ],
418
+ };
419
+ }
420
+ await session.browser.close();
421
+ this.sessions.delete(sessionId);
422
+ logger.info(`Closed browser session ${sessionId}`);
423
+ return {
424
+ content: [
425
+ {
426
+ type: 'text',
427
+ text: `Session ${sessionId} closed`,
428
+ },
429
+ ],
430
+ };
431
+ }
432
+ /**
433
+ * Clean up inactive sessions
434
+ */
435
+ startCleanupInterval() {
436
+ setInterval(async () => {
437
+ const now = Date.now();
438
+ for (const [id, session] of this.sessions.entries()) {
439
+ const inactiveTime = now - session.lastActivity.getTime();
440
+ if (inactiveTime > this.sessionTimeout) {
441
+ logger.info(`Cleaning up inactive session ${id}`);
442
+ await this.closeSession(id);
443
+ }
444
+ }
445
+ }, 60000); // Check every minute
446
+ }
447
+ /**
448
+ * Close all sessions
449
+ */
450
+ async cleanup() {
451
+ for (const sessionId of this.sessions.keys()) {
452
+ await this.closeSession(sessionId);
453
+ }
454
+ }
455
+ }
456
+ //# sourceMappingURL=browser-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-mcp.js","sourceRoot":"","sources":["../../../../src/features/browser/browser-mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Pebbles Task Storage
3
+ * Git-native JSONL storage with SQLite cache for tasks
4
+ */
5
+ import Database from 'better-sqlite3';
6
+ export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'blocked' | 'cancelled';
7
+ export type TaskPriority = 'low' | 'medium' | 'high' | 'urgent';
8
+ export interface PebblesTask {
9
+ id: string;
10
+ type: 'task_create' | 'task_update' | 'task_complete' | 'task_block';
11
+ timestamp: number;
12
+ parent_id?: string;
13
+ frame_id: string;
14
+ title: string;
15
+ description?: string;
16
+ status: TaskStatus;
17
+ priority: TaskPriority;
18
+ assignee?: string;
19
+ created_at: number;
20
+ started_at?: number;
21
+ completed_at?: number;
22
+ estimated_effort?: number;
23
+ actual_effort?: number;
24
+ depends_on: string[];
25
+ blocks: string[];
26
+ tags: string[];
27
+ external_refs?: {
28
+ linear?: {
29
+ id: string;
30
+ url: string;
31
+ };
32
+ github?: {
33
+ issue: number;
34
+ url: string;
35
+ };
36
+ };
37
+ context_score?: number;
38
+ last_accessed?: number;
39
+ }
40
+ export interface TaskMetrics {
41
+ total_tasks: number;
42
+ by_status: Record<TaskStatus, number>;
43
+ by_priority: Record<TaskPriority, number>;
44
+ completion_rate: number;
45
+ avg_effort_accuracy: number;
46
+ blocked_tasks: number;
47
+ overdue_tasks: number;
48
+ }
49
+ export declare class PebblesTaskStore {
50
+ private db;
51
+ private projectRoot;
52
+ private tasksFile;
53
+ private cacheFile;
54
+ constructor(projectRoot: string, db: Database.Database);
55
+ private initializeCache;
56
+ /**
57
+ * Load existing tasks from JSONL into SQLite cache
58
+ */
59
+ private loadFromJSONL;
60
+ /**
61
+ * Create a new task with content-hash ID
62
+ */
63
+ createTask(options: {
64
+ title: string;
65
+ description?: string;
66
+ priority?: TaskPriority;
67
+ frameId: string;
68
+ parentId?: string;
69
+ dependsOn?: string[];
70
+ tags?: string[];
71
+ estimatedEffort?: number;
72
+ assignee?: string;
73
+ }): string;
74
+ /**
75
+ * Update task status with new event
76
+ */
77
+ updateTaskStatus(taskId: string, newStatus: TaskStatus, _reason?: string): void;
78
+ /**
79
+ * Add dependency relationship
80
+ */
81
+ addDependency(taskId: string, dependsOnId: string): void;
82
+ /**
83
+ * Get current active tasks
84
+ */
85
+ getActiveTasks(frameId?: string): PebblesTask[];
86
+ /**
87
+ * Get task by ID (latest version)
88
+ */
89
+ getTask(taskId: string): PebblesTask | undefined;
90
+ /**
91
+ * Get tasks that are blocking other tasks
92
+ */
93
+ getBlockingTasks(): PebblesTask[];
94
+ /**
95
+ * Get metrics for current project
96
+ */
97
+ getMetrics(): TaskMetrics;
98
+ /**
99
+ * Export tasks for Linear integration (Phase 2)
100
+ */
101
+ exportForLinear(): Array<{
102
+ title: string;
103
+ description?: string;
104
+ priority: number;
105
+ status: string;
106
+ estimate?: number;
107
+ dependencies: string[];
108
+ }>;
109
+ private appendTask;
110
+ private upsertToCache;
111
+ private generateTaskId;
112
+ private hydrateTask;
113
+ private hydrateTasks;
114
+ private mapPriorityToLinear;
115
+ private mapStatusToLinear;
116
+ }
117
+ //# sourceMappingURL=pebbles-task-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pebbles-task-store.d.ts","sourceRoot":"","sources":["../../../../src/features/tasks/pebbles-task-store.ts"],"names":[],"mappings":"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"}