@accomplish_ai/agent-core 0.2.0 → 0.2.2

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 (78) hide show
  1. package/README.md +141 -0
  2. package/dist/common/constants.d.ts +1 -1
  3. package/dist/common/constants.d.ts.map +1 -1
  4. package/dist/common/constants.js +1 -1
  5. package/dist/common/constants.js.map +1 -1
  6. package/dist/common/types/index.d.ts +14 -10
  7. package/dist/common/types/index.d.ts.map +1 -1
  8. package/dist/common/types/index.js +4 -10
  9. package/dist/common/types/index.js.map +1 -1
  10. package/dist/common/utils/index.d.ts +3 -3
  11. package/dist/common/utils/index.d.ts.map +1 -1
  12. package/dist/common/utils/index.js +3 -3
  13. package/dist/common/utils/index.js.map +1 -1
  14. package/dist/factories/speech.d.ts.map +1 -1
  15. package/dist/factories/speech.js.map +1 -1
  16. package/dist/index.d.ts +1 -6
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +8 -20
  19. package/dist/index.js.map +1 -1
  20. package/dist/internal/classes/SecureStorage.d.ts.map +1 -1
  21. package/dist/internal/classes/SecureStorage.js +3 -0
  22. package/dist/internal/classes/SecureStorage.js.map +1 -1
  23. package/dist/internal/classes/TaskManager.d.ts +3 -2
  24. package/dist/internal/classes/TaskManager.d.ts.map +1 -1
  25. package/dist/internal/classes/TaskManager.js +34 -1
  26. package/dist/internal/classes/TaskManager.js.map +1 -1
  27. package/dist/storage/index.d.ts +4 -1
  28. package/dist/storage/index.d.ts.map +1 -1
  29. package/dist/storage/index.js +4 -1
  30. package/dist/storage/index.js.map +1 -1
  31. package/dist/types/log-writer.d.ts +2 -15
  32. package/dist/types/log-writer.d.ts.map +1 -1
  33. package/dist/types/skills-manager.d.ts +13 -0
  34. package/dist/types/skills-manager.d.ts.map +1 -1
  35. package/dist/types/speech.d.ts +3 -2
  36. package/dist/types/speech.d.ts.map +1 -1
  37. package/dist/types/storage.d.ts +70 -0
  38. package/dist/types/storage.d.ts.map +1 -1
  39. package/dist/types/task-manager.d.ts +13 -3
  40. package/dist/types/task-manager.d.ts.map +1 -1
  41. package/dist/types.d.ts +0 -17
  42. package/dist/types.d.ts.map +1 -1
  43. package/dist/utils/index.d.ts +16 -13
  44. package/dist/utils/index.d.ts.map +1 -1
  45. package/dist/utils/index.js +13 -13
  46. package/dist/utils/index.js.map +1 -1
  47. package/mcp-tools/dev-browser/server.cjs +144 -0
  48. package/package.json +16 -3
  49. package/mcp-tools/ask-user-question/src/index.ts +0 -183
  50. package/mcp-tools/ask-user-question/tsconfig.json +0 -12
  51. package/mcp-tools/complete-task/src/index.ts +0 -92
  52. package/mcp-tools/dev-browser/src/index.ts +0 -290
  53. package/mcp-tools/dev-browser/src/relay.ts +0 -652
  54. package/mcp-tools/dev-browser/src/types.ts +0 -31
  55. package/mcp-tools/dev-browser/tsconfig.json +0 -36
  56. package/mcp-tools/dev-browser-mcp/src/index.ts +0 -3940
  57. package/mcp-tools/dev-browser-mcp/src/snapshot/compactor.test.ts +0 -86
  58. package/mcp-tools/dev-browser-mcp/src/snapshot/compactor.ts +0 -31
  59. package/mcp-tools/dev-browser-mcp/src/snapshot/differ.test.ts +0 -178
  60. package/mcp-tools/dev-browser-mcp/src/snapshot/differ.ts +0 -167
  61. package/mcp-tools/dev-browser-mcp/src/snapshot/index.ts +0 -19
  62. package/mcp-tools/dev-browser-mcp/src/snapshot/manager.test.ts +0 -247
  63. package/mcp-tools/dev-browser-mcp/src/snapshot/manager.ts +0 -131
  64. package/mcp-tools/dev-browser-mcp/src/snapshot/parser.test.ts +0 -94
  65. package/mcp-tools/dev-browser-mcp/src/snapshot/parser.ts +0 -81
  66. package/mcp-tools/dev-browser-mcp/src/snapshot/priority.test.ts +0 -104
  67. package/mcp-tools/dev-browser-mcp/src/snapshot/priority.ts +0 -84
  68. package/mcp-tools/dev-browser-mcp/src/snapshot/tokens.test.ts +0 -64
  69. package/mcp-tools/dev-browser-mcp/src/snapshot/tokens.ts +0 -36
  70. package/mcp-tools/dev-browser-mcp/src/snapshot/types.ts +0 -89
  71. package/mcp-tools/dev-browser-mcp/tsconfig.json +0 -15
  72. package/mcp-tools/file-permission/src/index.ts +0 -125
  73. package/mcp-tools/file-permission/tsconfig.json +0 -17
  74. package/mcp-tools/report-checkpoint/src/index.ts +0 -127
  75. package/mcp-tools/report-checkpoint/tsconfig.json +0 -12
  76. package/mcp-tools/report-thought/src/index.ts +0 -109
  77. package/mcp-tools/report-thought/tsconfig.json +0 -12
  78. package/mcp-tools/start-task/src/index.ts +0 -86
@@ -1,290 +0,0 @@
1
- import express, { type Express, type Request, type Response } from "express";
2
- import { chromium, type BrowserContext, type Page } from "playwright";
3
- import { mkdirSync } from "fs";
4
- import { join } from "path";
5
- import type { Socket } from "net";
6
- import type {
7
- ServeOptions,
8
- GetPageRequest,
9
- GetPageResponse,
10
- ListPagesResponse,
11
- ServerInfoResponse,
12
- } from "./types";
13
-
14
- export type { ServeOptions, GetPageResponse, ListPagesResponse, ServerInfoResponse };
15
-
16
- export interface DevBrowserServer {
17
- wsEndpoint: string;
18
- port: number;
19
- stop: () => Promise<void>;
20
- }
21
-
22
- async function fetchWithRetry(
23
- url: string,
24
- maxRetries = 5,
25
- delayMs = 500
26
- ): Promise<globalThis.Response> {
27
- let lastError: Error | null = null;
28
- for (let i = 0; i < maxRetries; i++) {
29
- try {
30
- const res = await fetch(url);
31
- if (res.ok) return res;
32
- throw new Error(`HTTP ${res.status}: ${res.statusText}`);
33
- } catch (err) {
34
- lastError = err instanceof Error ? err : new Error(String(err));
35
- if (i < maxRetries - 1) {
36
- await new Promise((resolve) => setTimeout(resolve, delayMs * (i + 1)));
37
- }
38
- }
39
- }
40
- throw new Error(`Failed after ${maxRetries} retries: ${lastError?.message}`);
41
- }
42
-
43
- function withTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {
44
- return Promise.race([
45
- promise,
46
- new Promise<never>((_, reject) =>
47
- setTimeout(() => reject(new Error(`Timeout: ${message}`)), ms)
48
- ),
49
- ]);
50
- }
51
-
52
- export async function serve(options: ServeOptions = {}): Promise<DevBrowserServer> {
53
- const port = options.port ?? parseInt(process.env.DEV_BROWSER_PORT || '9224', 10);
54
- const headless = options.headless ?? false;
55
- const cdpPort = options.cdpPort ?? parseInt(process.env.DEV_BROWSER_CDP_PORT || '9225', 10);
56
- const profileDir = options.profileDir ?? process.env.DEV_BROWSER_PROFILE;
57
- const useSystemChrome = options.useSystemChrome ?? true;
58
-
59
- if (!Number.isFinite(port) || port < 1 || port > 65535) {
60
- throw new Error(`Invalid port: ${port}. Must be a number between 1 and 65535`);
61
- }
62
- if (!Number.isFinite(cdpPort) || cdpPort < 1 || cdpPort > 65535) {
63
- throw new Error(`Invalid cdpPort: ${cdpPort}. Must be a number between 1 and 65535`);
64
- }
65
- if (port === cdpPort) {
66
- throw new Error("port and cdpPort must be different");
67
- }
68
-
69
- const baseProfileDir = profileDir ?? join(process.cwd(), ".browser-data");
70
-
71
- let context: BrowserContext;
72
- let usedSystemChrome = false;
73
-
74
- if (useSystemChrome) {
75
- try {
76
- console.log("Trying to use system Chrome...");
77
- const chromeUserDataDir = join(baseProfileDir, "chrome-profile");
78
- mkdirSync(chromeUserDataDir, { recursive: true });
79
-
80
- context = await chromium.launchPersistentContext(chromeUserDataDir, {
81
- headless,
82
- channel: 'chrome',
83
- ignoreDefaultArgs: ['--enable-automation'],
84
- args: [
85
- `--remote-debugging-port=${cdpPort}`,
86
- '--disable-blink-features=AutomationControlled',
87
- ],
88
- });
89
- usedSystemChrome = true;
90
- console.log("Using system Chrome (fast startup!)");
91
- } catch (chromeError) {
92
- console.log("System Chrome not available, falling back to Playwright Chromium...");
93
- }
94
- }
95
-
96
- if (!usedSystemChrome) {
97
- const playwrightUserDataDir = join(baseProfileDir, "playwright-profile");
98
- mkdirSync(playwrightUserDataDir, { recursive: true });
99
-
100
- console.log("Launching browser with Playwright Chromium...");
101
- context = await chromium.launchPersistentContext(playwrightUserDataDir, {
102
- headless,
103
- ignoreDefaultArgs: ['--enable-automation'],
104
- args: [
105
- `--remote-debugging-port=${cdpPort}`,
106
- '--disable-blink-features=AutomationControlled',
107
- ],
108
- });
109
- console.log("Browser launched with Playwright Chromium");
110
- }
111
-
112
- console.log("Browser launched with persistent profile...");
113
-
114
- context.on('close', () => {
115
- console.log('Browser context closed (user may have closed Chrome). Exiting server...');
116
- process.exit(0);
117
- });
118
-
119
- const cdpResponse = await fetchWithRetry(`http://127.0.0.1:${cdpPort}/json/version`);
120
- const cdpInfo = (await cdpResponse.json()) as { webSocketDebuggerUrl: string };
121
- const wsEndpoint = cdpInfo.webSocketDebuggerUrl;
122
- console.log(`CDP WebSocket endpoint: ${wsEndpoint}`);
123
-
124
- interface PageEntry {
125
- page: Page;
126
- targetId: string;
127
- }
128
-
129
- const registry = new Map<string, PageEntry>();
130
-
131
- async function getTargetId(page: Page): Promise<string> {
132
- const cdpSession = await context.newCDPSession(page);
133
- try {
134
- const { targetInfo } = await cdpSession.send("Target.getTargetInfo");
135
- return targetInfo.targetId;
136
- } finally {
137
- await cdpSession.detach();
138
- }
139
- }
140
-
141
- const app: Express = express();
142
- app.use(express.json());
143
-
144
- app.get("/", (_req: Request, res: Response) => {
145
- const response: ServerInfoResponse = { wsEndpoint };
146
- res.json(response);
147
- });
148
-
149
- app.get("/pages", (_req: Request, res: Response) => {
150
- const response: ListPagesResponse = {
151
- pages: Array.from(registry.keys()),
152
- };
153
- res.json(response);
154
- });
155
-
156
- app.post("/pages", async (req: Request, res: Response) => {
157
- const body = req.body as GetPageRequest;
158
- const { name, viewport } = body;
159
-
160
- if (!name || typeof name !== "string") {
161
- res.status(400).json({ error: "name is required and must be a string" });
162
- return;
163
- }
164
-
165
- if (name.length === 0) {
166
- res.status(400).json({ error: "name cannot be empty" });
167
- return;
168
- }
169
-
170
- if (name.length > 256) {
171
- res.status(400).json({ error: "name must be 256 characters or less" });
172
- return;
173
- }
174
-
175
- let entry = registry.get(name);
176
- if (!entry) {
177
- const page = await withTimeout(context.newPage(), 30000, "Page creation timed out after 30s");
178
-
179
- if (viewport) {
180
- await page.setViewportSize(viewport);
181
- }
182
-
183
- const targetId = await getTargetId(page);
184
- entry = { page, targetId };
185
- registry.set(name, entry);
186
-
187
- page.on("close", () => {
188
- registry.delete(name);
189
- });
190
- }
191
-
192
- const response: GetPageResponse = { wsEndpoint, name, targetId: entry.targetId };
193
- res.json(response);
194
- });
195
-
196
- app.delete("/pages/:name", async (req: Request<{ name: string }>, res: Response) => {
197
- const name = decodeURIComponent(req.params.name);
198
- const entry = registry.get(name);
199
-
200
- if (entry) {
201
- await entry.page.close();
202
- registry.delete(name);
203
- res.json({ success: true });
204
- return;
205
- }
206
-
207
- res.status(404).json({ error: "page not found" });
208
- });
209
-
210
- const server = app.listen(port, () => {
211
- console.log(`HTTP API server running on port ${port}`);
212
- });
213
-
214
- const connections = new Set<Socket>();
215
- server.on("connection", (socket: Socket) => {
216
- connections.add(socket);
217
- socket.on("close", () => connections.delete(socket));
218
- });
219
-
220
- let cleaningUp = false;
221
-
222
- const cleanup = async () => {
223
- if (cleaningUp) return;
224
- cleaningUp = true;
225
-
226
- console.log("\nShutting down...");
227
-
228
- for (const socket of connections) {
229
- socket.destroy();
230
- }
231
- connections.clear();
232
-
233
- for (const entry of registry.values()) {
234
- try {
235
- await entry.page.close();
236
- } catch {
237
- }
238
- }
239
- registry.clear();
240
-
241
- try {
242
- await context.close();
243
- } catch {
244
- }
245
-
246
- server.close();
247
- console.log("Server stopped.");
248
- };
249
-
250
- const syncCleanup = () => {
251
- try {
252
- context.close();
253
- } catch {
254
- }
255
- };
256
-
257
- const signals = ["SIGINT", "SIGTERM", "SIGHUP"] as const;
258
-
259
- const signalHandler = async () => {
260
- await cleanup();
261
- process.exit(0);
262
- };
263
-
264
- const errorHandler = async (err: unknown) => {
265
- console.error("Unhandled error:", err);
266
- await cleanup();
267
- process.exit(1);
268
- };
269
-
270
- signals.forEach((sig) => process.on(sig, signalHandler));
271
- process.on("uncaughtException", errorHandler);
272
- process.on("unhandledRejection", errorHandler);
273
- process.on("exit", syncCleanup);
274
-
275
- const removeHandlers = () => {
276
- signals.forEach((sig) => process.off(sig, signalHandler));
277
- process.off("uncaughtException", errorHandler);
278
- process.off("unhandledRejection", errorHandler);
279
- process.off("exit", syncCleanup);
280
- };
281
-
282
- return {
283
- wsEndpoint,
284
- port,
285
- async stop() {
286
- removeHandlers();
287
- await cleanup();
288
- },
289
- };
290
- }