@posthog/agent 2.1.22 → 2.1.35
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/adapters/claude/permissions/permission-options.js +1 -1
- package/dist/adapters/claude/permissions/permission-options.js.map +1 -1
- package/dist/adapters/claude/tools.js +1 -1
- package/dist/adapters/claude/tools.js.map +1 -1
- package/dist/{agent-LrKyX9KN.d.ts → agent-DcBmoTR4.d.ts} +7 -0
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +84 -8
- package/dist/agent.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +84 -8
- package/dist/index.js.map +1 -1
- package/dist/server/agent-server.js +103 -9
- package/dist/server/agent-server.js.map +1 -1
- package/dist/server/bin.cjs +103 -9
- package/dist/server/bin.cjs.map +1 -1
- package/package.json +1 -1
- package/src/adapters/claude/tools.ts +1 -1
- package/src/server/agent-server.ts +21 -1
- package/src/session-log-writer.test.ts +41 -0
- package/src/session-log-writer.ts +91 -5
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-
|
|
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.
|
|
1177
|
+
version: "2.1.35",
|
|
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: {
|
|
@@ -2634,7 +2634,7 @@ var BASH_TOOLS = /* @__PURE__ */ new Set([
|
|
|
2634
2634
|
]);
|
|
2635
2635
|
var SEARCH_TOOLS = /* @__PURE__ */ new Set(["Glob", "Grep", "LS"]);
|
|
2636
2636
|
var WEB_TOOLS = /* @__PURE__ */ new Set(["WebSearch", "WebFetch"]);
|
|
2637
|
-
var AGENT_TOOLS = /* @__PURE__ */ new Set(["Task", "TodoWrite"]);
|
|
2637
|
+
var AGENT_TOOLS = /* @__PURE__ */ new Set(["Task", "TodoWrite", "Skill"]);
|
|
2638
2638
|
var BASE_ALLOWED_TOOLS = [
|
|
2639
2639
|
...READ_TOOLS,
|
|
2640
2640
|
...SEARCH_TOOLS,
|
|
@@ -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
|
|
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)
|
|
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)
|
|
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.
|
|
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
|
|
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
|
};
|