@posthog/agent 2.1.22 → 2.1.29

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.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as AcpConnection, a as AcpConnectionConfig, b as Agent, c as AgentAdapter, C as CodexProcessOptions, I as InProcessAcpConnection, O as OtelLogConfig, d as OtelLogWriter, S as SessionContext, e as SessionLogWriter, f as SessionLogWriterOptions, g as createAcpConnection } from './agent-LrKyX9KN.js';
1
+ export { A as AcpConnection, a as AcpConnectionConfig, b as Agent, c as AgentAdapter, C as CodexProcessOptions, I as InProcessAcpConnection, O as OtelLogConfig, d as OtelLogWriter, S as SessionContext, e as SessionLogWriter, f as SessionLogWriterOptions, g as createAcpConnection } from './agent-DcBmoTR4.js';
2
2
  import { McpServerConfig } from '@anthropic-ai/claude-agent-sdk';
3
3
  import { L as Logger } from './logger-DDBiMOOD.js';
4
4
  export { a as LoggerConfig } from './logger-DDBiMOOD.js';
package/dist/index.js CHANGED
@@ -1174,7 +1174,7 @@ import { v7 as uuidv7 } from "uuid";
1174
1174
  // package.json
1175
1175
  var package_default = {
1176
1176
  name: "@posthog/agent",
1177
- version: "2.1.22",
1177
+ version: "2.1.29",
1178
1178
  repository: "https://github.com/PostHog/twig",
1179
1179
  description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
1180
1180
  exports: {
@@ -4292,19 +4292,36 @@ var PostHogAPIClient = class {
4292
4292
  };
4293
4293
 
4294
4294
  // src/session-log-writer.ts
4295
- var SessionLogWriter = class {
4295
+ var SessionLogWriter = class _SessionLogWriter {
4296
+ static FLUSH_DEBOUNCE_MS = 500;
4297
+ static FLUSH_MAX_INTERVAL_MS = 5e3;
4298
+ static MAX_FLUSH_RETRIES = 10;
4299
+ static MAX_RETRY_DELAY_MS = 3e4;
4296
4300
  posthogAPI;
4297
4301
  pendingEntries = /* @__PURE__ */ new Map();
4298
4302
  flushTimeouts = /* @__PURE__ */ new Map();
4303
+ lastFlushAttemptTime = /* @__PURE__ */ new Map();
4304
+ retryCounts = /* @__PURE__ */ new Map();
4299
4305
  sessions = /* @__PURE__ */ new Map();
4306
+ messageCounts = /* @__PURE__ */ new Map();
4300
4307
  logger;
4301
4308
  constructor(options = {}) {
4302
4309
  this.posthogAPI = options.posthogAPI;
4303
4310
  this.logger = options.logger ?? new Logger({ debug: false, prefix: "[SessionLogWriter]" });
4304
4311
  }
4305
4312
  async flushAll() {
4313
+ const sessionIds = [...this.sessions.keys()];
4314
+ const pendingCounts = sessionIds.map((id) => ({
4315
+ id,
4316
+ pending: this.pendingEntries.get(id)?.length ?? 0,
4317
+ messages: this.messageCounts.get(id) ?? 0
4318
+ }));
4319
+ this.logger.info("flushAll called", {
4320
+ sessions: sessionIds.length,
4321
+ pending: pendingCounts
4322
+ });
4306
4323
  const flushPromises = [];
4307
- for (const sessionId of this.sessions.keys()) {
4324
+ for (const sessionId of sessionIds) {
4308
4325
  flushPromises.push(this.flush(sessionId));
4309
4326
  }
4310
4327
  await Promise.all(flushPromises);
@@ -4313,7 +4330,12 @@ var SessionLogWriter = class {
4313
4330
  if (this.sessions.has(sessionId)) {
4314
4331
  return;
4315
4332
  }
4333
+ this.logger.info("Session registered", {
4334
+ sessionId,
4335
+ taskId: context.taskId
4336
+ });
4316
4337
  this.sessions.set(sessionId, { context });
4338
+ this.lastFlushAttemptTime.set(sessionId, Date.now());
4317
4339
  }
4318
4340
  isRegistered(sessionId) {
4319
4341
  return this.sessions.has(sessionId);
@@ -4321,8 +4343,16 @@ var SessionLogWriter = class {
4321
4343
  appendRawLine(sessionId, line) {
4322
4344
  const session = this.sessions.get(sessionId);
4323
4345
  if (!session) {
4346
+ this.logger.warn("appendRawLine called for unregistered session", {
4347
+ sessionId
4348
+ });
4324
4349
  return;
4325
4350
  }
4351
+ const count = (this.messageCounts.get(sessionId) ?? 0) + 1;
4352
+ this.messageCounts.set(sessionId, count);
4353
+ if (count % 10 === 1) {
4354
+ this.logger.info("Messages received", { count, sessionId });
4355
+ }
4326
4356
  try {
4327
4357
  const message = JSON.parse(line);
4328
4358
  const timestamp = (/* @__PURE__ */ new Date()).toISOString();
@@ -4358,24 +4388,56 @@ var SessionLogWriter = class {
4358
4388
  }
4359
4389
  async flush(sessionId) {
4360
4390
  const session = this.sessions.get(sessionId);
4361
- if (!session) return;
4391
+ if (!session) {
4392
+ this.logger.warn("flush: no session found", { sessionId });
4393
+ return;
4394
+ }
4362
4395
  this.emitCoalescedMessage(sessionId, session);
4363
4396
  const pending = this.pendingEntries.get(sessionId);
4364
- if (!this.posthogAPI || !pending?.length) return;
4397
+ if (!this.posthogAPI || !pending?.length) {
4398
+ this.logger.info("flush: nothing to persist", {
4399
+ sessionId,
4400
+ hasPosthogAPI: !!this.posthogAPI,
4401
+ pendingCount: pending?.length ?? 0
4402
+ });
4403
+ return;
4404
+ }
4365
4405
  this.pendingEntries.delete(sessionId);
4366
4406
  const timeout = this.flushTimeouts.get(sessionId);
4367
4407
  if (timeout) {
4368
4408
  clearTimeout(timeout);
4369
4409
  this.flushTimeouts.delete(sessionId);
4370
4410
  }
4411
+ this.lastFlushAttemptTime.set(sessionId, Date.now());
4371
4412
  try {
4372
4413
  await this.posthogAPI.appendTaskRunLog(
4373
4414
  session.context.taskId,
4374
4415
  session.context.runId,
4375
4416
  pending
4376
4417
  );
4418
+ this.retryCounts.set(sessionId, 0);
4419
+ this.logger.info("Flushed session logs", {
4420
+ sessionId,
4421
+ entryCount: pending.length
4422
+ });
4377
4423
  } catch (error) {
4378
- this.logger.error("Failed to persist session logs:", error);
4424
+ const retryCount = (this.retryCounts.get(sessionId) ?? 0) + 1;
4425
+ this.retryCounts.set(sessionId, retryCount);
4426
+ if (retryCount >= _SessionLogWriter.MAX_FLUSH_RETRIES) {
4427
+ this.logger.error(
4428
+ `Dropping ${pending.length} session log entries after ${retryCount} failed flush attempts`,
4429
+ { sessionId, error }
4430
+ );
4431
+ this.retryCounts.set(sessionId, 0);
4432
+ } else {
4433
+ this.logger.error(
4434
+ `Failed to persist session logs (attempt ${retryCount}/${_SessionLogWriter.MAX_FLUSH_RETRIES}):`,
4435
+ error
4436
+ );
4437
+ const currentPending = this.pendingEntries.get(sessionId) ?? [];
4438
+ this.pendingEntries.set(sessionId, [...pending, ...currentPending]);
4439
+ this.scheduleFlush(sessionId);
4440
+ }
4379
4441
  }
4380
4442
  }
4381
4443
  isAgentMessageChunk(message) {
@@ -4421,7 +4483,21 @@ var SessionLogWriter = class {
4421
4483
  scheduleFlush(sessionId) {
4422
4484
  const existing = this.flushTimeouts.get(sessionId);
4423
4485
  if (existing) clearTimeout(existing);
4424
- const timeout = setTimeout(() => this.flush(sessionId), 500);
4486
+ const retryCount = this.retryCounts.get(sessionId) ?? 0;
4487
+ const lastAttempt = this.lastFlushAttemptTime.get(sessionId) ?? 0;
4488
+ const elapsed = Date.now() - lastAttempt;
4489
+ let delay2;
4490
+ if (retryCount > 0) {
4491
+ delay2 = Math.min(
4492
+ _SessionLogWriter.FLUSH_DEBOUNCE_MS * 2 ** retryCount,
4493
+ _SessionLogWriter.MAX_RETRY_DELAY_MS
4494
+ );
4495
+ } else if (elapsed >= _SessionLogWriter.FLUSH_MAX_INTERVAL_MS) {
4496
+ delay2 = 0;
4497
+ } else {
4498
+ delay2 = _SessionLogWriter.FLUSH_DEBOUNCE_MS;
4499
+ }
4500
+ const timeout = setTimeout(() => this.flush(sessionId), delay2);
4425
4501
  this.flushTimeouts.set(sessionId, timeout);
4426
4502
  }
4427
4503
  };