browserclaw-agent 0.1.0 → 0.1.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 (52) hide show
  1. package/dist/agent-loop.d.ts +23 -15
  2. package/dist/agent-loop.d.ts.map +1 -1
  3. package/dist/agent-loop.js +55 -32
  4. package/dist/agent-loop.js.map +1 -1
  5. package/dist/config.d.ts +10 -2
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +29 -16
  8. package/dist/config.js.map +1 -1
  9. package/dist/index.d.ts +7 -16
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +3 -12
  12. package/dist/index.js.map +1 -1
  13. package/dist/lesson-store.d.ts +11 -0
  14. package/dist/lesson-store.d.ts.map +1 -0
  15. package/dist/lesson-store.js +323 -0
  16. package/dist/lesson-store.js.map +1 -0
  17. package/dist/llm.d.ts.map +1 -1
  18. package/dist/llm.js +37 -24
  19. package/dist/llm.js.map +1 -1
  20. package/dist/port-probe.d.ts +8 -0
  21. package/dist/port-probe.d.ts.map +1 -0
  22. package/dist/port-probe.js +22 -0
  23. package/dist/port-probe.js.map +1 -0
  24. package/dist/prompt-log.d.ts +17 -0
  25. package/dist/prompt-log.d.ts.map +1 -0
  26. package/dist/prompt-log.js +28 -0
  27. package/dist/prompt-log.js.map +1 -0
  28. package/dist/routes.d.ts +3 -0
  29. package/dist/routes.d.ts.map +1 -0
  30. package/dist/routes.js +227 -0
  31. package/dist/routes.js.map +1 -0
  32. package/dist/server.d.ts +2 -0
  33. package/dist/server.d.ts.map +1 -0
  34. package/dist/server.js +121 -0
  35. package/dist/server.js.map +1 -0
  36. package/dist/session-manager.d.ts +40 -0
  37. package/dist/session-manager.d.ts.map +1 -0
  38. package/dist/session-manager.js +635 -0
  39. package/dist/session-manager.js.map +1 -0
  40. package/dist/skill-generator.d.ts +5 -0
  41. package/dist/skill-generator.d.ts.map +1 -0
  42. package/dist/skill-generator.js +173 -0
  43. package/dist/skill-generator.js.map +1 -0
  44. package/dist/skill-store.d.ts +7 -0
  45. package/dist/skill-store.d.ts.map +1 -0
  46. package/dist/skill-store.js +85 -0
  47. package/dist/skill-store.js.map +1 -0
  48. package/dist/trajectory-store.d.ts +20 -0
  49. package/dist/trajectory-store.d.ts.map +1 -0
  50. package/dist/trajectory-store.js +61 -0
  51. package/dist/trajectory-store.js.map +1 -0
  52. package/package.json +6 -14
@@ -0,0 +1,635 @@
1
+ import { BrowserClaw } from 'browserclaw';
2
+ import { isPortFree } from './port-probe.js';
3
+ import { HttpError } from './types.js';
4
+ import { runAgentLoop } from './agent-loop.js';
5
+ import { generateSkill, generateSkillTags, mergeSkills } from './skill-generator.js';
6
+ import { judgeRun } from './judge.js';
7
+ import { moderatePrompt } from './content-policy.js';
8
+ import { logPrompt } from './prompt-log.js';
9
+ import { requireEnvInt, USER_RESPONSE_TIMEOUT_MS, USER_INTERJECTION_ENABLED, MAX_INTERJECTIONS_PER_RUN, INTERJECTION_MIN_INTERVAL_MS, } from './config.js';
10
+ import { getLLMCallCount, resetLLMCallCount, runWithLlmConfig } from './llm.js';
11
+ import { extractDomain, getSkillForDomain, getSkillsForDomains, saveSkill } from './skill-store.js';
12
+ import { saveLesson, extractDomainLessons, getLesson } from './lesson-store.js';
13
+ import { saveTrajectory, TRAJECTORY_STATUS } from './trajectory-store.js';
14
+ import { logger } from './logger.js';
15
+ const MAX_SESSIONS = requireEnvInt('MAX_SESSIONS');
16
+ const SESSION_IDLE_TIMEOUT_MS = requireEnvInt('SESSION_IDLE_TIMEOUT_MS');
17
+ const BASE_CDP_PORT = 9222;
18
+ const MIN_STEPS_FOR_SKILL = 3;
19
+ const MIN_STEPS_FOR_LESSON = 3;
20
+ const AUTO_CLOSE_DELAY_MS = 10_000;
21
+ const NON_ACTION_TYPES = new Set(['done', 'wait', 'fail', 'ask_user']);
22
+ const sessions = new Map();
23
+ let cleanupInterval = null;
24
+ const CDP_PORT_SEARCH_LIMIT = 100;
25
+ async function nextAvailableCdpPort() {
26
+ for (let port = BASE_CDP_PORT; port < BASE_CDP_PORT + CDP_PORT_SEARCH_LIMIT; port++) {
27
+ if (await isPortFree(port)) {
28
+ // Purge any stale session entries claiming this port — their Chrome died silently.
29
+ for (const [id, s] of sessions) {
30
+ if (s.cdpPort === port) {
31
+ logger.warn({ sessionId: id, port }, 'Evicting stale session — CDP port is actually free');
32
+ sessions.delete(id);
33
+ }
34
+ }
35
+ return port;
36
+ }
37
+ }
38
+ throw new HttpError(503, 'No free CDP ports available');
39
+ }
40
+ function getManagedSession(sessionId) {
41
+ const session = sessions.get(sessionId);
42
+ if (!session)
43
+ throw new HttpError(404, `Session ${sessionId} not found`);
44
+ return session;
45
+ }
46
+ export function emitSSE(sessionId, event, data) {
47
+ const managed = sessions.get(sessionId);
48
+ if (!managed)
49
+ return;
50
+ const payload = `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
51
+ for (const client of managed.sseClients) {
52
+ client.write(payload);
53
+ }
54
+ }
55
+ export function addSSEClient(sessionId, res) {
56
+ const managed = getManagedSession(sessionId);
57
+ managed.sseClients.add(res);
58
+ res.on('close', () => {
59
+ managed.sseClients.delete(res);
60
+ if (managed.sseClients.size === 0 && managed.status === 'running') {
61
+ setTimeout(() => {
62
+ const current = sessions.get(sessionId);
63
+ if (current?.sseClients.size === 0 && current.status === 'running') {
64
+ logger.info({ sessionId }, 'Closing session — all clients disconnected');
65
+ void closeSession(sessionId);
66
+ }
67
+ }, 5_000);
68
+ }
69
+ });
70
+ }
71
+ export function startCleanupLoop() {
72
+ cleanupInterval = setInterval(() => {
73
+ const now = Date.now();
74
+ const toClose = [];
75
+ for (const [id, session] of sessions) {
76
+ const idle = now - session.lastActivityAt.getTime();
77
+ if (idle > SESSION_IDLE_TIMEOUT_MS && session.status !== 'waiting_for_user') {
78
+ toClose.push(id);
79
+ }
80
+ }
81
+ void (async () => {
82
+ for (const id of toClose) {
83
+ logger.info({ sessionId: id }, 'Closing idle session');
84
+ await closeSession(id);
85
+ }
86
+ })();
87
+ }, 5_000);
88
+ }
89
+ export function stopCleanupLoop() {
90
+ if (cleanupInterval !== null)
91
+ clearInterval(cleanupInterval);
92
+ }
93
+ export async function createSession(prompt, url, headless, ip, skipModeration, llmConfig, skipPostprocessing) {
94
+ if (sessions.size >= MAX_SESSIONS) {
95
+ throw new HttpError(429, `Maximum concurrent sessions (${String(MAX_SESSIONS)}) reached`);
96
+ }
97
+ const existingSessions = [...sessions.values()].filter((s) => s.ip === ip);
98
+ for (const existing of existingSessions) {
99
+ logger.info({ sessionId: existing.id, ip }, 'Closing existing session — new session requested');
100
+ await closeSession(existing.id);
101
+ }
102
+ if (skipModeration !== true) {
103
+ const aiCheck = await moderatePrompt(prompt);
104
+ if (!aiCheck.allowed) {
105
+ throw new HttpError(422, aiCheck.reason ?? 'Prompt blocked by content policy.');
106
+ }
107
+ }
108
+ const cdpPort = await nextAvailableCdpPort();
109
+ let browser;
110
+ try {
111
+ browser = await BrowserClaw.launch({
112
+ headless,
113
+ noSandbox: process.platform === 'linux',
114
+ cdpPort,
115
+ ssrfPolicy: {
116
+ dangerouslyAllowPrivateNetwork: process.env.SSRF_ALLOW_PRIVATE === 'true',
117
+ },
118
+ chromeArgs: [
119
+ '--disable-blink-features=AutomationControlled',
120
+ '--disable-downloads',
121
+ '--disable-file-system',
122
+ ...(headless === true ? [] : ['--start-maximized']),
123
+ ],
124
+ });
125
+ }
126
+ catch (err) {
127
+ logger.error({ cdpPort, err }, 'BrowserClaw.launch failed — a Chrome process may be orphaned on this CDP port');
128
+ throw err;
129
+ }
130
+ let page;
131
+ try {
132
+ page = await browser.currentPage();
133
+ if (url !== undefined)
134
+ await page.goto(url);
135
+ }
136
+ catch (err) {
137
+ logger.error({ url, err }, 'Failed to open URL — stopping orphaned Chrome');
138
+ await browser.stop().catch((stopErr) => {
139
+ logger.error({ url, err: stopErr }, 'Failed to stop orphaned Chrome');
140
+ });
141
+ throw err;
142
+ }
143
+ const now = new Date();
144
+ const id = crypto.randomUUID().replace(/-/g, '');
145
+ const managed = {
146
+ id,
147
+ prompt,
148
+ ip,
149
+ browser,
150
+ page,
151
+ cdpPort,
152
+ status: 'pending',
153
+ createdAt: now,
154
+ lastActivityAt: now,
155
+ sseClients: new Set(),
156
+ domain: url !== undefined ? extractDomain(url) : null,
157
+ result: null,
158
+ skill: null,
159
+ skillTags: [],
160
+ domainSkills: [],
161
+ abortController: new AbortController(),
162
+ llmConfig,
163
+ skipPostprocessing: skipPostprocessing === true,
164
+ pendingUserResponse: null,
165
+ userMessageQueue: [],
166
+ interjectionNonce: crypto.randomUUID().replace(/-/g, ''),
167
+ interjectionsReceived: 0,
168
+ lastInterjectionAt: null,
169
+ };
170
+ sessions.set(id, managed);
171
+ logger.info({ sessionId: id, cdpPort }, 'Created session');
172
+ void logPrompt({
173
+ timestamp: now.toISOString(),
174
+ session_id: id,
175
+ ip,
176
+ prompt,
177
+ url,
178
+ status: 'started',
179
+ });
180
+ void startAgentLoop(id).catch((err) => {
181
+ logger.error({ sessionId: id, err }, 'Agent loop failed');
182
+ });
183
+ return {
184
+ session: {
185
+ id,
186
+ prompt,
187
+ created_at: now.toISOString(),
188
+ last_activity_at: now.toISOString(),
189
+ status: 'pending',
190
+ },
191
+ };
192
+ }
193
+ async function startAgentLoop(sessionId) {
194
+ const managed = getManagedSession(sessionId);
195
+ managed.status = 'running';
196
+ const emitter = (event, data) => {
197
+ managed.lastActivityAt = new Date();
198
+ emitSSE(sessionId, event, data);
199
+ };
200
+ let skillsLoadedCount = 0;
201
+ let skillOutcome = 'none';
202
+ try {
203
+ // Fetch domain skill if we have a domain
204
+ let domainSkill = null;
205
+ if (managed.domain !== null) {
206
+ try {
207
+ const fetchStart = Date.now();
208
+ domainSkill = await getSkillForDomain(managed.domain);
209
+ const fetchMs = Date.now() - fetchStart;
210
+ if (domainSkill) {
211
+ skillsLoadedCount = 1;
212
+ logger.info({ domain: managed.domain, fetchMs, title: domainSkill.skill.title }, 'Found domain skill');
213
+ emitter('skills_loaded', {
214
+ count: 1,
215
+ domain: managed.domain,
216
+ title: domainSkill.skill.title,
217
+ run_count: domainSkill.run_count,
218
+ fetch_ms: fetchMs,
219
+ });
220
+ }
221
+ }
222
+ catch (err) {
223
+ logger.error({ domain: managed.domain, err }, 'Failed to fetch domain skill');
224
+ }
225
+ }
226
+ // All LLM work (agent loop + skill gen + judging) runs inside the BYOK
227
+ // config scope when the user provides their own key.
228
+ const runAllLlmWork = async () => {
229
+ resetLLMCallCount();
230
+ const waitForUser = () => waitForUserResponse(sessionId);
231
+ const pageHolder = { page: managed.page };
232
+ const userChatHooks = USER_INTERJECTION_ENABLED
233
+ ? { drainMessages: () => drainUserMessages(sessionId), nonce: managed.interjectionNonce }
234
+ : undefined;
235
+ const result = await runAgentLoop(managed.prompt, pageHolder, emitter, managed.abortController.signal, waitForUser, managed.browser, domainSkill, undefined, userChatHooks, { getLesson });
236
+ const llmCalls = getLLMCallCount();
237
+ // Sync back the page reference in case the agent switched tabs
238
+ managed.page = pageHolder.page;
239
+ managed.result = result;
240
+ managed.status = result.success ? 'completed' : 'failed';
241
+ // Capture domain from first navigate action if not set
242
+ if (managed.domain === null) {
243
+ const nav = result.steps.find((s) => s.action.action === 'navigate' && s.action.url !== undefined && s.action.url !== '');
244
+ if (nav?.action.url !== undefined && nav.action.url !== '') {
245
+ managed.domain = extractDomain(nav.action.url);
246
+ }
247
+ else if (result.final_url !== undefined && result.final_url !== '') {
248
+ managed.domain = extractDomain(result.final_url);
249
+ }
250
+ }
251
+ await saveTrajectory({
252
+ session_id: sessionId,
253
+ prompt: managed.prompt,
254
+ status: result.success ? TRAJECTORY_STATUS.completed : TRAJECTORY_STATUS.failed,
255
+ steps: result.steps,
256
+ answer: result.answer,
257
+ error: result.error,
258
+ duration_ms: result.duration_ms,
259
+ saved_at: new Date().toISOString(),
260
+ });
261
+ // Save lessons from every run (both success and failure).
262
+ // skipPostprocessing runs don't contribute to the shared catalog.
263
+ if (!managed.skipPostprocessing && result.steps.length >= MIN_STEPS_FOR_LESSON) {
264
+ try {
265
+ const domainLessons = extractDomainLessons(result.steps, result.success);
266
+ if (domainLessons.length > 0) {
267
+ await saveLesson(managed.prompt, domainLessons);
268
+ logger.info({ prompt: managed.prompt, lessons: domainLessons.length, success: result.success }, 'Saved task lessons');
269
+ }
270
+ }
271
+ catch (err) {
272
+ logger.error({ err }, 'Failed to save task lessons');
273
+ }
274
+ }
275
+ if (result.success) {
276
+ if (!managed.skipPostprocessing) {
277
+ skillOutcome = await tryGenerateSkill(managed, emitter, domainSkill);
278
+ await aggregateDomainSkills(managed, domainSkill, emitter);
279
+ }
280
+ emitter('completed', {
281
+ steps_completed: result.steps.length,
282
+ duration_ms: result.duration_ms,
283
+ llm_calls: llmCalls,
284
+ answer: result.answer,
285
+ domain: managed.domain,
286
+ skills_used: skillsLoadedCount > 0,
287
+ skills_loaded: skillsLoadedCount,
288
+ skill_outcome: skillOutcome,
289
+ });
290
+ }
291
+ else {
292
+ emitter('failed', {
293
+ step: result.steps.length,
294
+ error: result.error,
295
+ llm_calls: llmCalls,
296
+ });
297
+ }
298
+ void logPrompt({
299
+ timestamp: new Date().toISOString(),
300
+ session_id: sessionId,
301
+ ip: managed.ip,
302
+ prompt: managed.prompt,
303
+ url: result.final_url ?? '',
304
+ status: result.success ? 'completed' : 'failed',
305
+ steps: result.steps.length,
306
+ duration_ms: result.duration_ms,
307
+ error: result.error,
308
+ domain: managed.domain ?? undefined,
309
+ skills_loaded: skillsLoadedCount,
310
+ skill_outcome: skillOutcome,
311
+ });
312
+ };
313
+ if (managed.llmConfig) {
314
+ await runWithLlmConfig(managed.llmConfig, runAllLlmWork);
315
+ }
316
+ else {
317
+ await runAllLlmWork();
318
+ }
319
+ }
320
+ catch (err) {
321
+ managed.status = 'failed';
322
+ const message = err instanceof Error ? err.message : 'Agent loop crashed';
323
+ logger.error({ sessionId, crashed: true }, 'Agent loop crashed');
324
+ emitter('failed', { step: 0, error: message });
325
+ }
326
+ setTimeout(() => {
327
+ closeSession(sessionId).catch((err) => {
328
+ logger.error({ sessionId, err }, 'Auto-close failed');
329
+ });
330
+ }, AUTO_CLOSE_DELAY_MS);
331
+ }
332
+ async function aggregateDomainSkills(managed, initialDomainSkill, emitter) {
333
+ const result = managed.result;
334
+ if (!result)
335
+ return;
336
+ // Collect all unique domains from step URLs + final URL
337
+ const visitedDomains = new Set();
338
+ for (const step of result.steps) {
339
+ if (step.url !== undefined && step.url !== '') {
340
+ const d = extractDomain(step.url);
341
+ if (d !== '')
342
+ visitedDomains.add(d);
343
+ }
344
+ if (step.action.url !== undefined && step.action.url !== '') {
345
+ const d = extractDomain(step.action.url);
346
+ if (d !== '')
347
+ visitedDomains.add(d);
348
+ }
349
+ }
350
+ if (result.final_url !== undefined && result.final_url !== '') {
351
+ const d = extractDomain(result.final_url);
352
+ if (d !== '')
353
+ visitedDomains.add(d);
354
+ }
355
+ if (managed.domain !== null) {
356
+ visitedDomains.add(managed.domain);
357
+ }
358
+ if (visitedDomains.size === 0)
359
+ return;
360
+ const entries = [];
361
+ // If we generated a skill this run, add it as 'generated'
362
+ if (managed.domain !== null && managed.skill !== null) {
363
+ entries.push({
364
+ domain: managed.domain,
365
+ skill: managed.skill,
366
+ source: 'generated',
367
+ tags: managed.skillTags,
368
+ run_count: 1,
369
+ });
370
+ visitedDomains.delete(managed.domain);
371
+ }
372
+ // For the initial domain, if skill was loaded from catalog but NOT regenerated (e.g. validated),
373
+ // add it as 'catalog'
374
+ if (initialDomainSkill && !entries.some((e) => e.domain === initialDomainSkill.domain)) {
375
+ entries.push({
376
+ domain: initialDomainSkill.domain,
377
+ skill: initialDomainSkill.skill,
378
+ source: 'catalog',
379
+ tags: initialDomainSkill.tags,
380
+ run_count: initialDomainSkill.run_count,
381
+ });
382
+ visitedDomains.delete(initialDomainSkill.domain);
383
+ }
384
+ // Fetch catalog skills for remaining visited domains
385
+ if (visitedDomains.size > 0) {
386
+ try {
387
+ const catalogSkills = await getSkillsForDomains([...visitedDomains]);
388
+ for (const [domain, catalogSkill] of catalogSkills) {
389
+ entries.push({
390
+ domain,
391
+ skill: catalogSkill.skill,
392
+ source: 'catalog',
393
+ tags: catalogSkill.tags,
394
+ run_count: catalogSkill.run_count,
395
+ });
396
+ }
397
+ }
398
+ catch (err) {
399
+ logger.error({ err: err instanceof Error ? err.message : err }, 'Failed to fetch catalog skills for visited domains');
400
+ }
401
+ }
402
+ managed.domainSkills = entries;
403
+ if (entries.length > 0) {
404
+ emitter('domain_skills', { skills: entries, count: entries.length });
405
+ }
406
+ }
407
+ async function tryGenerateSkill(managed, emitter, existing) {
408
+ const result = managed.result;
409
+ if (!result)
410
+ return 'none';
411
+ const actionSteps = result.steps.filter((s) => !NON_ACTION_TYPES.has(s.action.action));
412
+ if (actionSteps.length < MIN_STEPS_FOR_SKILL)
413
+ return 'none';
414
+ // Judge the run before generating a skill — prevent bad runs from becoming skills
415
+ const verdict = await judgeRun(managed.prompt, result);
416
+ if (!verdict.success) {
417
+ logger.info({ reasoning: verdict.reasoning }, 'Judge rejected run — skipping skill generation');
418
+ emitter('judge_rejected', { reasoning: verdict.reasoning });
419
+ // Save failure notes on existing skill so future runs know about this failure mode
420
+ if (existing && managed.domain !== null) {
421
+ try {
422
+ const failureNotes = [...(existing.skill.failure_notes ?? [])];
423
+ failureNotes.push(`[${new Date().toISOString().slice(0, 10)}] ${verdict.reasoning.slice(0, 200)}`);
424
+ // Keep only the last 5 failure notes
425
+ const trimmedNotes = failureNotes.slice(-5);
426
+ const updatedSkill = { ...existing.skill, failure_notes: trimmedNotes };
427
+ await saveSkill(managed.domain, updatedSkill, existing.tags, existing.run_count);
428
+ logger.info({ domain: managed.domain, notes_count: trimmedNotes.length }, 'Saved failure notes on skill');
429
+ }
430
+ catch (err) {
431
+ logger.warn({ err: err instanceof Error ? err.message : err }, 'Failed to save failure notes');
432
+ }
433
+ }
434
+ return 'none';
435
+ }
436
+ try {
437
+ const skill = await generateSkill(managed.prompt, result);
438
+ managed.skill = skill;
439
+ emitter('skill_generated', { skill });
440
+ if (managed.domain !== null) {
441
+ try {
442
+ const tags = await generateSkillTags(managed.prompt, skill);
443
+ managed.skillTags = tags;
444
+ if (existing) {
445
+ const oldSteps = existing.skill.steps.length;
446
+ const newSteps = skill.steps.length;
447
+ if (newSteps < oldSteps) {
448
+ // Fewer steps — improved (more efficient)
449
+ await saveSkill(managed.domain, skill, tags);
450
+ logger.info({ domain: managed.domain, oldSteps, newSteps }, 'Skill improved');
451
+ emitter('skill_improved', {
452
+ domain: managed.domain,
453
+ title: skill.title,
454
+ previous_steps: oldSteps,
455
+ new_steps: newSteps,
456
+ });
457
+ return 'improved';
458
+ }
459
+ else if (newSteps > oldSteps * 1.5) {
460
+ // Significantly more steps — merge skills to incorporate new learnings
461
+ const merged = await mergeSkills(existing.skill, managed.prompt, result);
462
+ managed.skill = merged;
463
+ await saveSkill(managed.domain, merged, tags);
464
+ logger.info({ domain: managed.domain, oldSteps, newSteps, mergedSteps: merged.steps.length }, 'Skill refined');
465
+ emitter('skill_refined', {
466
+ domain: managed.domain,
467
+ title: merged.title,
468
+ previous_steps: oldSteps,
469
+ run_steps: newSteps,
470
+ merged_steps: merged.steps.length,
471
+ new_tips: merged.tips.length - existing.skill.tips.length,
472
+ });
473
+ return 'refined';
474
+ }
475
+ else {
476
+ // Similar step count — validated
477
+ const runCount = existing.run_count + 1;
478
+ await saveSkill(managed.domain, existing.skill, existing.tags, runCount);
479
+ logger.info({ domain: managed.domain, title: existing.skill.title, runCount }, 'Skill validated');
480
+ emitter('skill_validated', {
481
+ domain: managed.domain,
482
+ title: existing.skill.title,
483
+ steps: oldSteps,
484
+ run_count: runCount,
485
+ });
486
+ return 'validated';
487
+ }
488
+ }
489
+ else {
490
+ await saveSkill(managed.domain, skill, tags);
491
+ emitter('skill_saved', { domain: managed.domain, title: skill.title, tags });
492
+ return 'saved';
493
+ }
494
+ }
495
+ catch {
496
+ logger.error({ domain: managed.domain, save_failed: true }, 'Failed to save skill');
497
+ }
498
+ }
499
+ return 'none';
500
+ }
501
+ catch {
502
+ logger.error({ sessionId: managed.id, skill_generation_failed: true }, 'Skill generation failed');
503
+ return 'none';
504
+ }
505
+ }
506
+ export function getSession(sessionId) {
507
+ const managed = getManagedSession(sessionId);
508
+ return {
509
+ id: managed.id,
510
+ prompt: managed.prompt,
511
+ created_at: managed.createdAt.toISOString(),
512
+ last_activity_at: managed.lastActivityAt.toISOString(),
513
+ status: managed.status,
514
+ };
515
+ }
516
+ export function getSessionResult(sessionId) {
517
+ const managed = getManagedSession(sessionId);
518
+ return { result: managed.result, skill: managed.skill, domain_skills: managed.domainSkills };
519
+ }
520
+ export function waitForUserResponse(sessionId) {
521
+ const managed = getManagedSession(sessionId);
522
+ managed.status = 'waiting_for_user';
523
+ return new Promise((resolve, reject) => {
524
+ const timeout = setTimeout(() => {
525
+ managed.pendingUserResponse = null;
526
+ managed.status = 'running';
527
+ reject(new Error('User response timed out'));
528
+ }, USER_RESPONSE_TIMEOUT_MS);
529
+ managed.pendingUserResponse = {
530
+ resolve: (text) => {
531
+ clearTimeout(timeout);
532
+ managed.pendingUserResponse = null;
533
+ managed.status = 'running';
534
+ managed.lastActivityAt = new Date();
535
+ resolve(text);
536
+ },
537
+ reject: (err) => {
538
+ clearTimeout(timeout);
539
+ managed.pendingUserResponse = null;
540
+ managed.status = 'running';
541
+ reject(err);
542
+ },
543
+ };
544
+ });
545
+ }
546
+ /**
547
+ * Accept a user message. When the flag is off, preserves the legacy behavior —
548
+ * only accepts replies while the agent is blocked on ask_user. When on, always
549
+ * enqueues (subject to rate limit + hard cap); if the agent is blocked on
550
+ * ask_user, additionally resolves the waiting promise so existing callers keep
551
+ * working unchanged.
552
+ */
553
+ export function enqueueUserMessage(sessionId, text) {
554
+ const managed = getManagedSession(sessionId);
555
+ if (!USER_INTERJECTION_ENABLED) {
556
+ if (managed.pendingUserResponse === null) {
557
+ throw new HttpError(409, 'Session is not waiting for user input');
558
+ }
559
+ managed.pendingUserResponse.resolve(text);
560
+ return;
561
+ }
562
+ // Direct reply to an ask_user: unblock the agent loop via the existing
563
+ // `user_response` history path. Skip the interjection queue — otherwise the
564
+ // same text is processed twice (once as the reply that unblocks the step,
565
+ // again as a "USER INTERJECTION" injected into the next step's prompt).
566
+ if (managed.pendingUserResponse !== null) {
567
+ managed.lastActivityAt = new Date();
568
+ managed.pendingUserResponse.resolve(text);
569
+ return;
570
+ }
571
+ if (managed.interjectionsReceived >= MAX_INTERJECTIONS_PER_RUN) {
572
+ throw new HttpError(429, `Too many messages (cap: ${String(MAX_INTERJECTIONS_PER_RUN)} per run)`);
573
+ }
574
+ if (managed.lastInterjectionAt !== null) {
575
+ const elapsed = Date.now() - managed.lastInterjectionAt.getTime();
576
+ if (elapsed < INTERJECTION_MIN_INTERVAL_MS) {
577
+ throw new HttpError(429, `Rate limit — wait ${String(Math.ceil((INTERJECTION_MIN_INTERVAL_MS - elapsed) / 1000))}s before sending again`);
578
+ }
579
+ }
580
+ const now = new Date();
581
+ managed.userMessageQueue.push({ text, receivedAt: now });
582
+ managed.interjectionsReceived += 1;
583
+ managed.lastInterjectionAt = now;
584
+ managed.lastActivityAt = now;
585
+ }
586
+ /**
587
+ * Drain and return all pending user messages. Called by the agent loop at the
588
+ * top of each step.
589
+ */
590
+ export function drainUserMessages(sessionId) {
591
+ const managed = getManagedSession(sessionId);
592
+ const drained = managed.userMessageQueue;
593
+ managed.userMessageQueue = [];
594
+ return drained;
595
+ }
596
+ export function getInterjectionNonce(sessionId) {
597
+ return getManagedSession(sessionId).interjectionNonce;
598
+ }
599
+ /**
600
+ * Legacy export — preserved so existing route handlers that imported it keep
601
+ * compiling while we migrate them. Prefer `enqueueUserMessage`.
602
+ * @deprecated use enqueueUserMessage
603
+ */
604
+ export function resolveUserResponse(sessionId, text) {
605
+ enqueueUserMessage(sessionId, text);
606
+ }
607
+ export async function closeSession(sessionId) {
608
+ const session = sessions.get(sessionId);
609
+ if (!session)
610
+ return;
611
+ if (session.pendingUserResponse !== null) {
612
+ session.pendingUserResponse.reject(new Error('Session closed'));
613
+ }
614
+ session.abortController.abort();
615
+ sessions.delete(sessionId);
616
+ for (const client of session.sseClients) {
617
+ client.end();
618
+ }
619
+ try {
620
+ await session.browser.stop();
621
+ }
622
+ catch (err) {
623
+ logger.error({ sessionId, err }, 'Failed to stop browser');
624
+ }
625
+ logger.info({ sessionId }, 'Closed session');
626
+ }
627
+ export async function closeAllSessions() {
628
+ for (const id of sessions.keys()) {
629
+ await closeSession(id);
630
+ }
631
+ }
632
+ export function sessionCount() {
633
+ return sessions.size;
634
+ }
635
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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"}