@posthog/agent 2.1.125 → 2.1.137

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 (33) hide show
  1. package/dist/adapters/claude/conversion/tool-use-to-acp.d.ts +14 -28
  2. package/dist/adapters/claude/conversion/tool-use-to-acp.js +116 -164
  3. package/dist/adapters/claude/conversion/tool-use-to-acp.js.map +1 -1
  4. package/dist/adapters/claude/permissions/permission-options.js +33 -0
  5. package/dist/adapters/claude/permissions/permission-options.js.map +1 -1
  6. package/dist/adapters/claude/tools.js +21 -11
  7. package/dist/adapters/claude/tools.js.map +1 -1
  8. package/dist/agent.js +1251 -640
  9. package/dist/agent.js.map +1 -1
  10. package/dist/posthog-api.js +2 -2
  11. package/dist/posthog-api.js.map +1 -1
  12. package/dist/server/agent-server.js +1295 -684
  13. package/dist/server/agent-server.js.map +1 -1
  14. package/dist/server/bin.cjs +1278 -669
  15. package/dist/server/bin.cjs.map +1 -1
  16. package/package.json +2 -2
  17. package/src/adapters/base-acp-agent.ts +6 -3
  18. package/src/adapters/claude/UPSTREAM.md +63 -0
  19. package/src/adapters/claude/claude-agent.ts +682 -421
  20. package/src/adapters/claude/conversion/sdk-to-acp.ts +249 -85
  21. package/src/adapters/claude/conversion/tool-use-to-acp.ts +174 -149
  22. package/src/adapters/claude/hooks.ts +53 -1
  23. package/src/adapters/claude/permissions/permission-handlers.ts +39 -21
  24. package/src/adapters/claude/session/commands.ts +13 -9
  25. package/src/adapters/claude/session/mcp-config.ts +2 -5
  26. package/src/adapters/claude/session/options.ts +58 -6
  27. package/src/adapters/claude/session/settings.ts +326 -0
  28. package/src/adapters/claude/tools.ts +1 -0
  29. package/src/adapters/claude/types.ts +38 -0
  30. package/src/execution-mode.ts +26 -10
  31. package/src/server/agent-server.test.ts +41 -1
  32. package/src/session-log-writer.ts +1 -36
  33. package/src/utils/common.ts +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posthog/agent",
3
- "version": "2.1.125",
3
+ "version": "2.1.137",
4
4
  "repository": "https://github.com/PostHog/twig",
5
5
  "description": "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
6
6
  "exports": {
@@ -65,7 +65,6 @@
65
65
  "devDependencies": {
66
66
  "@types/bun": "latest",
67
67
  "@types/tar": "^6.1.13",
68
- "minimatch": "^10.0.3",
69
68
  "msw": "^2.12.7",
70
69
  "tsup": "^8.5.1",
71
70
  "tsx": "^4.20.6",
@@ -88,6 +87,7 @@
88
87
  "commander": "^14.0.2",
89
88
  "hono": "^4.11.7",
90
89
  "jsonwebtoken": "^9.0.2",
90
+ "minimatch": "^10.0.3",
91
91
  "tar": "^7.5.0",
92
92
  "uuid": "13.0.0",
93
93
  "yoga-wasm-web": "^0.3.3",
@@ -23,12 +23,14 @@ import {
23
23
  isAnthropicModel,
24
24
  } from "../gateway-models.js";
25
25
  import { Logger } from "../utils/logger.js";
26
+ import type { SettingsManager } from "./claude/session/settings.js";
26
27
 
27
28
  export interface BaseSession {
28
29
  notificationHistory: SessionNotification[];
29
30
  cancelled: boolean;
30
31
  interruptReason?: string;
31
32
  abortController: AbortController;
33
+ settingsManager: SettingsManager;
32
34
  }
33
35
 
34
36
  export abstract class BaseAcpAgent implements Agent {
@@ -47,18 +49,18 @@ export abstract class BaseAcpAgent implements Agent {
47
49
  abstract initialize(request: InitializeRequest): Promise<InitializeResponse>;
48
50
  abstract newSession(params: NewSessionRequest): Promise<NewSessionResponse>;
49
51
  abstract prompt(params: PromptRequest): Promise<PromptResponse>;
50
- protected abstract interruptSession(): Promise<void>;
52
+ protected abstract interrupt(): Promise<void>;
51
53
 
52
54
  async cancel(params: CancelNotification): Promise<void> {
53
55
  if (this.sessionId !== params.sessionId) {
54
- throw new Error("Session not found");
56
+ throw new Error("Session ID mismatch");
55
57
  }
56
58
  this.session.cancelled = true;
57
59
  const meta = params._meta as { interruptReason?: string } | undefined;
58
60
  if (meta?.interruptReason) {
59
61
  this.session.interruptReason = meta.interruptReason;
60
62
  }
61
- await this.interruptSession();
63
+ await this.interrupt();
62
64
  }
63
65
 
64
66
  async closeSession(): Promise<void> {
@@ -68,6 +70,7 @@ export abstract class BaseAcpAgent implements Agent {
68
70
  // while the query waits on an API call that will never abort.
69
71
  this.session.abortController.abort();
70
72
  await this.cancel({ sessionId: this.sessionId });
73
+ this.session.settingsManager.dispose();
71
74
  this.logger.info("Closed session", { sessionId: this.sessionId });
72
75
  } catch (err) {
73
76
  this.logger.warn("Failed to close session", {
@@ -0,0 +1,63 @@
1
+ # Upstream Sync
2
+
3
+ Fork of `@anthropic-ai/claude-agent-acp`. Upstream repo: https://github.com/anthropics/claude-code
4
+
5
+ ## Fork Point
6
+
7
+ - **Forked**: v0.10.9, commit `5411e0f4`, Dec 2 2025
8
+ - **Last sync**: v0.19.2, March 2 2026
9
+ - **SDK**: `@anthropic-ai/claude-agent-sdk` 0.2.63, `@agentclientprotocol/sdk` ^0.14.0
10
+
11
+ ## File Mapping
12
+
13
+ | Twig | Upstream |
14
+ |---|---|
15
+ | `conversion/tool-use-to-acp.ts` | `tools.ts` |
16
+ | `conversion/sdk-to-acp.ts` | inline in `acp-agent.ts` |
17
+ | `conversion/acp-to-sdk.ts` | inline in `acp-agent.ts` |
18
+ | `claude-agent.ts` | `acp-agent.ts` |
19
+ | `permissions/*` | inline in `acp-agent.ts` |
20
+ | `session/options.ts` | inline in `acp-agent.ts` |
21
+ | `session/commands.ts` | inline in `acp-agent.ts` |
22
+ | `hooks.ts` | `tools.ts` |
23
+ | `types.ts` | inline |
24
+
25
+ ## Twig-Only Code (Do Not Sync)
26
+
27
+ - PostHog analytics (`_posthog/*` ext notifications, `_posthog/usage_update`)
28
+ - Process lifecycle (spawn wrappers, PID tracking, `onProcessSpawned`/`onProcessExited`)
29
+ - Plan mode (`plan/`, EnterPlanMode/ExitPlanMode handlers, plan validation)
30
+ - Gateway models (`session/models.ts`, `base-acp-agent.ts`, `fetchGatewayModels`)
31
+ - AskUserQuestion handler (`questions/`, `CLAUDE_CODE_ENABLE_ASK_USER_QUESTION_TOOL`)
32
+ - Execution modes and tool allowlists (`tools.ts`, `TwigExecutionMode`)
33
+ - MCP metadata caching (`mcp/`)
34
+ - Branch naming in system prompt
35
+ - `broadcastUserMessage` in prompt()
36
+ - `interruptReason` on cancel
37
+ - `SYSTEM_REMINDER` stripping from Read tool results
38
+ - WebFetch `resourceLink` content enrichment
39
+ - `customTitle` in listSessions (Twig is ahead of upstream here)
40
+ - SettingsManager `PreToolUse` hook for permission rules
41
+ - `ensureLocalSettings` / `clearStatsigCache`
42
+ - `ELECTRON_RUN_AS_NODE` / `ENABLE_TOOL_SEARCH` env vars
43
+
44
+ ## Intentional Divergences
45
+
46
+ | Area | Upstream | Twig | Reason |
47
+ |---|---|---|---|
48
+ | AskUserQuestion | Always disallowed | Enabled via env var + permission handler | Twig supports structured questions |
49
+ | Model resolution | `initializationResult.models` from SDK | `fetchGatewayModels()` from gateway API | Different model backend |
50
+ | permissionMode | Hardcoded `"default"` | Reads from `meta.permissionMode` | More flexible mode selection |
51
+ | Session storage | `this.sessions[sessionId]` (multi) | `this.session` (single) | Architectural choice |
52
+ | ExitPlanMode denial | `interrupt: true` | `interrupt: false` | Better UX — lets Claude refine plan |
53
+ | bypassPermissions | `updatedPermissions` with `destination: "session"` | No `updatedPermissions` | Different permission persistence |
54
+ | Auth methods | Always returns `claude-login` auth method | Returns empty `authMethods` | Auth handled externally |
55
+
56
+ ## Next Sync
57
+
58
+ 1. Check upstream changelog since v0.19.2
59
+ 2. Diff upstream source against Twig using the file mapping above
60
+ 3. Port in phases: bug fixes first, then features
61
+ 4. After each phase: `pnpm --filter agent typecheck && pnpm --filter agent build && pnpm lint`
62
+ 5. After all phases: `pnpm typecheck && pnpm test`
63
+ 6. Update this file