@keystrokehq/posthog 0.0.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 (51) hide show
  1. package/README.md +237 -0
  2. package/dist/_official/index.d.mts +2 -0
  3. package/dist/_official/index.mjs +3 -0
  4. package/dist/_runtime/index.d.mts +7 -0
  5. package/dist/_runtime/index.mjs +3 -0
  6. package/dist/actions.d.mts +244 -0
  7. package/dist/actions.mjs +129 -0
  8. package/dist/annotations.d.mts +185 -0
  9. package/dist/annotations.mjs +141 -0
  10. package/dist/capture.d.mts +177 -0
  11. package/dist/capture.mjs +241 -0
  12. package/dist/client.d.mts +51 -0
  13. package/dist/client.mjs +200 -0
  14. package/dist/cohorts.d.mts +229 -0
  15. package/dist/cohorts.mjs +185 -0
  16. package/dist/connection.d.mts +2 -0
  17. package/dist/connection.mjs +3 -0
  18. package/dist/dashboards.d.mts +434 -0
  19. package/dist/dashboards.mjs +356 -0
  20. package/dist/decide.d.mts +74 -0
  21. package/dist/decide.mjs +75 -0
  22. package/dist/errors.d.mts +58 -0
  23. package/dist/errors.mjs +120 -0
  24. package/dist/events-management.d.mts +294 -0
  25. package/dist/events-management.mjs +242 -0
  26. package/dist/factory-DYDvHOGb.mjs +8 -0
  27. package/dist/feature-flags.d.mts +416 -0
  28. package/dist/feature-flags.mjs +317 -0
  29. package/dist/index.d.mts +1 -0
  30. package/dist/index.mjs +1 -0
  31. package/dist/insights.d.mts +409 -0
  32. package/dist/insights.mjs +346 -0
  33. package/dist/integration-CsCBBu4d.d.mts +53 -0
  34. package/dist/integration-Doy2Dwli.mjs +30 -0
  35. package/dist/organizations.d.mts +257 -0
  36. package/dist/organizations.mjs +219 -0
  37. package/dist/persons.d.mts +369 -0
  38. package/dist/persons.mjs +345 -0
  39. package/dist/projects.d.mts +348 -0
  40. package/dist/projects.mjs +287 -0
  41. package/dist/schemas.d.mts +351 -0
  42. package/dist/schemas.mjs +302 -0
  43. package/dist/session-recordings.d.mts +391 -0
  44. package/dist/session-recordings.mjs +308 -0
  45. package/dist/surveys.d.mts +287 -0
  46. package/dist/surveys.mjs +208 -0
  47. package/dist/triggers.d.mts +115 -0
  48. package/dist/triggers.mjs +330 -0
  49. package/dist/webhook-management.d.mts +188 -0
  50. package/dist/webhook-management.mjs +152 -0
  51. package/package.json +147 -0
package/README.md ADDED
@@ -0,0 +1,237 @@
1
+ # @keystrokehq/posthog
2
+
3
+ Official [PostHog](https://posthog.com) integration for Keystroke workflows.
4
+
5
+ PostHog is the default product-analytics surface for Keystroke because a
6
+ single vendor covers analytics, feature flags, experiments, session
7
+ replay, and surveys — with a stable REST API and regional US/EU hosts.
8
+
9
+ ## Status
10
+
11
+ This package ships **Pass A** of the PostHog surface:
12
+
13
+ - 170+ typed operations across 14 domains.
14
+ - 12 direct-binding polling triggers.
15
+ - Two-client design that enforces PostHog's token scoping
16
+ (personal-key management vs. project-key capture/decide).
17
+ - 100% Zod v4 input and output parsing.
18
+
19
+ Pass B (tracked separately) adds:
20
+
21
+ - Unsigned webhook triggers (action match, pipeline destination).
22
+ - Experiments, early-access features, notebooks, batch-export
23
+ lifecycle, plugin-config CRUD.
24
+ - Domains, SAML, hedgehog.
25
+
26
+ ## Overview
27
+
28
+ - **Capture / identify** — event capture, batch, identify, alias, group
29
+ identify, set-person-properties (`/capture`, `/batch`).
30
+ - **Decide** — server-side flag evaluation and local-evaluation payload
31
+ download.
32
+ - **Feature flags** — full management CRUD, role access, remote config,
33
+ activity, status.
34
+ - **Persons, cohorts, insights, dashboards, annotations** — full
35
+ management CRUDs + activity feeds.
36
+ - **Session recordings** — list/read/delete, snapshots, playlists.
37
+ - **Surveys** — CRUD, stats, activity.
38
+ - **Events management** — read-only event query, event and property
39
+ definitions.
40
+ - **Actions** — CRUD for server-side action definitions.
41
+ - **Projects / organizations** — teams, members, invites, project
42
+ settings, API-key rotation.
43
+ - **Webhook management** — configure action webhooks and pipeline
44
+ destinations. (Direct-binding webhook triggers follow in Pass B.)
45
+
46
+ ## Public Surface
47
+
48
+ Use explicit subpaths — the package root intentionally exports
49
+ nothing.
50
+
51
+ - `@keystrokehq/posthog/connection`
52
+ - `@keystrokehq/posthog/client`
53
+ - `@keystrokehq/posthog/schemas`
54
+ - `@keystrokehq/posthog/errors`
55
+ - `@keystrokehq/posthog/triggers`
56
+ - `@keystrokehq/posthog/capture`
57
+ - `@keystrokehq/posthog/decide`
58
+ - `@keystrokehq/posthog/feature-flags`
59
+ - `@keystrokehq/posthog/insights`
60
+ - `@keystrokehq/posthog/persons`
61
+ - `@keystrokehq/posthog/cohorts`
62
+ - `@keystrokehq/posthog/annotations`
63
+ - `@keystrokehq/posthog/dashboards`
64
+ - `@keystrokehq/posthog/session-recordings`
65
+ - `@keystrokehq/posthog/surveys`
66
+ - `@keystrokehq/posthog/events-management`
67
+ - `@keystrokehq/posthog/actions`
68
+ - `@keystrokehq/posthog/projects`
69
+ - `@keystrokehq/posthog/organizations`
70
+ - `@keystrokehq/posthog/webhook-management`
71
+
72
+ ## Installation
73
+
74
+ ```bash
75
+ pnpm add @keystrokehq/posthog
76
+ ```
77
+
78
+ ## Credentials
79
+
80
+ PostHog uses two distinct API keys with deliberately different
81
+ scopes. The credential surface keeps both available so each sub-client
82
+ uses the correct token:
83
+
84
+ | Credential | Required | Used by |
85
+ | --------------------------- | -------- | ------------------------------------ |
86
+ | `POSTHOG_PERSONAL_API_KEY` | Yes | Management, read/write, admin |
87
+ | `POSTHOG_PROJECT_API_KEY` | No\* | `/capture`, `/batch`, `/decide` |
88
+ | `POSTHOG_HOST` | Default `https://us.posthog.com` | All requests (used to derive ingest host) |
89
+ | `POSTHOG_PROJECT_ID` | No | Default project for scoped endpoints |
90
+ | `POSTHOG_SCOPES` | No | Informational (UI allow-listing) |
91
+
92
+ \* Capture and decide operations require `POSTHOG_PROJECT_API_KEY`;
93
+ management operations do not.
94
+
95
+ Regional hosts are inferred from `POSTHOG_HOST`:
96
+
97
+ - `https://us.posthog.com` → ingest via `https://us.i.posthog.com`
98
+ - `https://eu.posthog.com` → ingest via `https://eu.i.posthog.com`
99
+ - Self-hosted URLs → ingest to the same host (no rewrite).
100
+
101
+ Use `@keystrokehq/posthog/connection` to import the `posthog`
102
+ credential set.
103
+
104
+ ## Operations
105
+
106
+ ```typescript
107
+ import { Workflow } from '@keystrokehq/core';
108
+ import { z } from 'zod';
109
+ import { captureEvent } from '@keystrokehq/posthog/capture';
110
+ import { decideFeatureFlags } from '@keystrokehq/posthog/decide';
111
+ import { listFeatureFlags } from '@keystrokehq/posthog/feature-flags';
112
+
113
+ export const featureRolloutWorkflow = new Workflow({
114
+ id: 'posthog-feature-rollout',
115
+ name: 'Track feature rollout',
116
+ input: z.object({
117
+ distinctId: z.string(),
118
+ event: z.string(),
119
+ }),
120
+ output: z.object({
121
+ flagsEvaluated: z.number(),
122
+ }),
123
+ run: async (input) => {
124
+ await captureEvent.run({
125
+ event: input.event,
126
+ distinctId: input.distinctId,
127
+ });
128
+
129
+ const decision = await decideFeatureFlags.run({
130
+ distinctId: input.distinctId,
131
+ });
132
+
133
+ await listFeatureFlags.run({ active: true });
134
+
135
+ return {
136
+ flagsEvaluated: Object.keys(decision.featureFlags ?? {}).length,
137
+ };
138
+ },
139
+ });
140
+ ```
141
+
142
+ ## Triggers
143
+
144
+ All Pass-A triggers are polling triggers (PostHog's webhook payloads
145
+ are unsigned; webhook triggers arrive in Pass B). Import the helpers
146
+ from `@keystrokehq/posthog/triggers`:
147
+
148
+ ```typescript
149
+ import {
150
+ newEvent,
151
+ newPerson,
152
+ insightAlert,
153
+ polling,
154
+ } from '@keystrokehq/posthog/triggers';
155
+ ```
156
+
157
+ Each helper returns a `BoundTrigger` that can be dropped into a
158
+ `Workflow`'s `triggers` array:
159
+
160
+ ```typescript
161
+ import { Workflow } from '@keystrokehq/core';
162
+ import { z } from 'zod';
163
+ import { newEvent } from '@keystrokehq/posthog/triggers';
164
+
165
+ export const onSignupWorkflow = new Workflow({
166
+ id: 'posthog-on-signup',
167
+ name: 'Fan-out on signup events',
168
+ triggers: [
169
+ newEvent({
170
+ event: 'user_signed_up',
171
+ schedule: '1m',
172
+ filter: (page) => page.results.length > 0,
173
+ }),
174
+ ],
175
+ input: z.unknown(),
176
+ output: z.object({ processed: z.number() }),
177
+ run: async (payload) => {
178
+ return { processed: (payload as { results: unknown[] }).results.length };
179
+ },
180
+ });
181
+ ```
182
+
183
+ Available polling triggers:
184
+
185
+ | Helper | Use case |
186
+ | ---------------------- | --------------------------------------------- |
187
+ | `newEvent` | New analytics events matching a filter |
188
+ | `newSessionRecording` | New session recordings in a project |
189
+ | `newPerson` | Newly created or identified persons |
190
+ | `newCohortMember` | New members of a cohort |
191
+ | `insightAlert` | Value changes on an insight |
192
+ | `batchExportRun` | Batch export run state transitions |
193
+ | `experimentResult` | Experiment reaches significance |
194
+ | `featureFlagActivity` | Rollout changes on a specific feature flag |
195
+ | `newAnnotation` | Newly created annotations |
196
+ | `pluginFailure` | Pipeline / plugin failure metrics |
197
+ | `surveyResponse` | Survey response count increases |
198
+ | `newSubscription` | New insight/dashboard digest subscriptions |
199
+
200
+ A frozen `polling` namespace re-exports the same helpers for
201
+ authoring ergonomics: `polling.newEvent(...)`.
202
+
203
+ ## Error handling
204
+
205
+ Every client surface throws a `PosthogClientError` (discriminated
206
+ union) on failure. The error carries the HTTP status, provider code,
207
+ request id, and a `retryAfterMs` hint derived from `Retry-After` or
208
+ rate-limit headers. Consumers should switch on `error.type` rather
209
+ than pattern-matching against messages:
210
+
211
+ ```typescript
212
+ import { PosthogClientError } from '@keystrokehq/posthog/errors';
213
+
214
+ try {
215
+ await captureEvent.run({ event: 'ping', distinctId: 'u_1' });
216
+ } catch (error) {
217
+ if (error instanceof PosthogClientError && error.type === 'rate_limit') {
218
+ await sleep(error.retryAfterMs ?? 1_000);
219
+ } else {
220
+ throw error;
221
+ }
222
+ }
223
+ ```
224
+
225
+ ## Source of truth
226
+
227
+ - API reference: <https://posthog.com/docs/api>.
228
+ - PostHog OpenAPI: <https://app.posthog.com/api/schema/>.
229
+ - Scope catalogue: <https://posthog.com/docs/api#personal-api-keys>.
230
+
231
+ Bugs or missing endpoints? Open an issue under `plan/posthog/` in
232
+ the Keystroke monorepo; missing endpoints that belong to Pass B live in
233
+ that plan.
234
+
235
+ ## License
236
+
237
+ MIT — see the repository root.
@@ -0,0 +1,2 @@
1
+ import { i as posthogOfficialIntegration, r as posthogBundle } from "../integration-CsCBBu4d.mjs";
2
+ export { posthogBundle, posthogOfficialIntegration };
@@ -0,0 +1,3 @@
1
+ import { n as posthogBundle, r as posthogOfficialIntegration } from "../integration-Doy2Dwli.mjs";
2
+
3
+ export { posthogBundle, posthogOfficialIntegration };
@@ -0,0 +1,7 @@
1
+ import { n as posthog } from "../integration-CsCBBu4d.mjs";
2
+ import { createOfficialOperationFactory } from "@keystrokehq/integration-authoring/official";
3
+
4
+ //#region src/factory.d.ts
5
+ declare const posthogOperation: ReturnType<typeof createOfficialOperationFactory<typeof posthog>>;
6
+ //#endregion
7
+ export { posthogOperation };
@@ -0,0 +1,3 @@
1
+ import { t as posthogOperation } from "../factory-DYDvHOGb.mjs";
2
+
3
+ export { posthogOperation };
@@ -0,0 +1,244 @@
1
+ import { z } from "zod";
2
+ import * as _keystrokehq_core_credential_set0 from "@keystrokehq/core/credential-set";
3
+ import * as _keystrokehq_core0 from "@keystrokehq/core";
4
+
5
+ //#region src/actions.d.ts
6
+ declare const listActions: _keystrokehq_core0.Operation<z.ZodObject<{
7
+ limit: z.ZodOptional<z.ZodNumber>;
8
+ offset: z.ZodOptional<z.ZodNumber>;
9
+ search: z.ZodOptional<z.ZodString>;
10
+ projectId: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
11
+ }, z.core.$strip>, z.ZodObject<{
12
+ next: z.ZodNullable<z.ZodString>;
13
+ previous: z.ZodNullable<z.ZodString>;
14
+ count: z.ZodNumber;
15
+ results: z.ZodArray<z.ZodObject<{
16
+ id: z.ZodOptional<z.ZodNumber>;
17
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
18
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
19
+ post_to_slack: z.ZodOptional<z.ZodBoolean>;
20
+ slack_message_format: z.ZodOptional<z.ZodNullable<z.ZodString>>;
21
+ steps: z.ZodOptional<z.ZodArray<z.ZodObject<{
22
+ event: z.ZodOptional<z.ZodNullable<z.ZodString>>;
23
+ url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
24
+ url_matching: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
25
+ exact: "exact";
26
+ contains: "contains";
27
+ regex: "regex";
28
+ }>>>;
29
+ text: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
+ href: z.ZodOptional<z.ZodNullable<z.ZodString>>;
31
+ selector: z.ZodOptional<z.ZodNullable<z.ZodString>>;
32
+ properties: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>>;
33
+ }, z.core.$strip>>>;
34
+ created_at: z.ZodOptional<z.ZodString>;
35
+ created_by: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
36
+ deleted: z.ZodOptional<z.ZodBoolean>;
37
+ is_calculating: z.ZodOptional<z.ZodBoolean>;
38
+ }, z.core.$strip>>;
39
+ }, z.core.$strip>, readonly [_keystrokehq_core0.CredentialSet<"posthog", z.ZodObject<{
40
+ POSTHOG_PERSONAL_API_KEY: z.ZodString;
41
+ POSTHOG_PROJECT_API_KEY: z.ZodOptional<z.ZodString>;
42
+ POSTHOG_HOST: z.ZodDefault<z.ZodURL>;
43
+ POSTHOG_PROJECT_ID: z.ZodOptional<z.ZodString>;
44
+ POSTHOG_SCOPES: z.ZodOptional<z.ZodArray<z.ZodString>>;
45
+ }, z.core.$strip>, readonly _keystrokehq_core_credential_set0.CredentialConnection<z.ZodObject<{
46
+ POSTHOG_PERSONAL_API_KEY: z.ZodString;
47
+ POSTHOG_PROJECT_API_KEY: z.ZodOptional<z.ZodString>;
48
+ POSTHOG_HOST: z.ZodDefault<z.ZodURL>;
49
+ POSTHOG_PROJECT_ID: z.ZodOptional<z.ZodString>;
50
+ POSTHOG_SCOPES: z.ZodOptional<z.ZodArray<z.ZodString>>;
51
+ }, z.core.$strip>>[] | undefined>], undefined>;
52
+ declare const getAction: _keystrokehq_core0.Operation<z.ZodObject<{
53
+ id: z.ZodNumber;
54
+ projectId: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
55
+ }, z.core.$strip>, z.ZodObject<{
56
+ id: z.ZodOptional<z.ZodNumber>;
57
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
58
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
59
+ post_to_slack: z.ZodOptional<z.ZodBoolean>;
60
+ slack_message_format: z.ZodOptional<z.ZodNullable<z.ZodString>>;
61
+ steps: z.ZodOptional<z.ZodArray<z.ZodObject<{
62
+ event: z.ZodOptional<z.ZodNullable<z.ZodString>>;
63
+ url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
64
+ url_matching: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
65
+ exact: "exact";
66
+ contains: "contains";
67
+ regex: "regex";
68
+ }>>>;
69
+ text: z.ZodOptional<z.ZodNullable<z.ZodString>>;
70
+ href: z.ZodOptional<z.ZodNullable<z.ZodString>>;
71
+ selector: z.ZodOptional<z.ZodNullable<z.ZodString>>;
72
+ properties: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>>;
73
+ }, z.core.$strip>>>;
74
+ created_at: z.ZodOptional<z.ZodString>;
75
+ created_by: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
76
+ deleted: z.ZodOptional<z.ZodBoolean>;
77
+ is_calculating: z.ZodOptional<z.ZodBoolean>;
78
+ }, z.core.$strip>, readonly [_keystrokehq_core0.CredentialSet<"posthog", z.ZodObject<{
79
+ POSTHOG_PERSONAL_API_KEY: z.ZodString;
80
+ POSTHOG_PROJECT_API_KEY: z.ZodOptional<z.ZodString>;
81
+ POSTHOG_HOST: z.ZodDefault<z.ZodURL>;
82
+ POSTHOG_PROJECT_ID: z.ZodOptional<z.ZodString>;
83
+ POSTHOG_SCOPES: z.ZodOptional<z.ZodArray<z.ZodString>>;
84
+ }, z.core.$strip>, readonly _keystrokehq_core_credential_set0.CredentialConnection<z.ZodObject<{
85
+ POSTHOG_PERSONAL_API_KEY: z.ZodString;
86
+ POSTHOG_PROJECT_API_KEY: z.ZodOptional<z.ZodString>;
87
+ POSTHOG_HOST: z.ZodDefault<z.ZodURL>;
88
+ POSTHOG_PROJECT_ID: z.ZodOptional<z.ZodString>;
89
+ POSTHOG_SCOPES: z.ZodOptional<z.ZodArray<z.ZodString>>;
90
+ }, z.core.$strip>>[] | undefined>], undefined>;
91
+ declare const createAction: _keystrokehq_core0.Operation<z.ZodObject<{
92
+ name: z.ZodString;
93
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
94
+ steps: z.ZodOptional<z.ZodArray<z.ZodObject<{
95
+ event: z.ZodOptional<z.ZodNullable<z.ZodString>>;
96
+ url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
97
+ url_matching: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
98
+ exact: "exact";
99
+ contains: "contains";
100
+ regex: "regex";
101
+ }>>>;
102
+ text: z.ZodOptional<z.ZodNullable<z.ZodString>>;
103
+ href: z.ZodOptional<z.ZodNullable<z.ZodString>>;
104
+ selector: z.ZodOptional<z.ZodNullable<z.ZodString>>;
105
+ properties: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>>;
106
+ }, z.core.$strip>>>;
107
+ post_to_slack: z.ZodOptional<z.ZodBoolean>;
108
+ slack_message_format: z.ZodOptional<z.ZodNullable<z.ZodString>>;
109
+ deleted: z.ZodOptional<z.ZodBoolean>;
110
+ projectId: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
111
+ }, z.core.$strip>, z.ZodObject<{
112
+ id: z.ZodOptional<z.ZodNumber>;
113
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
114
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
115
+ post_to_slack: z.ZodOptional<z.ZodBoolean>;
116
+ slack_message_format: z.ZodOptional<z.ZodNullable<z.ZodString>>;
117
+ steps: z.ZodOptional<z.ZodArray<z.ZodObject<{
118
+ event: z.ZodOptional<z.ZodNullable<z.ZodString>>;
119
+ url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
120
+ url_matching: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
121
+ exact: "exact";
122
+ contains: "contains";
123
+ regex: "regex";
124
+ }>>>;
125
+ text: z.ZodOptional<z.ZodNullable<z.ZodString>>;
126
+ href: z.ZodOptional<z.ZodNullable<z.ZodString>>;
127
+ selector: z.ZodOptional<z.ZodNullable<z.ZodString>>;
128
+ properties: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>>;
129
+ }, z.core.$strip>>>;
130
+ created_at: z.ZodOptional<z.ZodString>;
131
+ created_by: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
132
+ deleted: z.ZodOptional<z.ZodBoolean>;
133
+ is_calculating: z.ZodOptional<z.ZodBoolean>;
134
+ }, z.core.$strip>, readonly [_keystrokehq_core0.CredentialSet<"posthog", z.ZodObject<{
135
+ POSTHOG_PERSONAL_API_KEY: z.ZodString;
136
+ POSTHOG_PROJECT_API_KEY: z.ZodOptional<z.ZodString>;
137
+ POSTHOG_HOST: z.ZodDefault<z.ZodURL>;
138
+ POSTHOG_PROJECT_ID: z.ZodOptional<z.ZodString>;
139
+ POSTHOG_SCOPES: z.ZodOptional<z.ZodArray<z.ZodString>>;
140
+ }, z.core.$strip>, readonly _keystrokehq_core_credential_set0.CredentialConnection<z.ZodObject<{
141
+ POSTHOG_PERSONAL_API_KEY: z.ZodString;
142
+ POSTHOG_PROJECT_API_KEY: z.ZodOptional<z.ZodString>;
143
+ POSTHOG_HOST: z.ZodDefault<z.ZodURL>;
144
+ POSTHOG_PROJECT_ID: z.ZodOptional<z.ZodString>;
145
+ POSTHOG_SCOPES: z.ZodOptional<z.ZodArray<z.ZodString>>;
146
+ }, z.core.$strip>>[] | undefined>], undefined>;
147
+ declare const updateAction: _keystrokehq_core0.Operation<z.ZodObject<{
148
+ name: z.ZodOptional<z.ZodString>;
149
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
150
+ steps: z.ZodOptional<z.ZodArray<z.ZodObject<{
151
+ event: z.ZodOptional<z.ZodNullable<z.ZodString>>;
152
+ url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
153
+ url_matching: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
154
+ exact: "exact";
155
+ contains: "contains";
156
+ regex: "regex";
157
+ }>>>;
158
+ text: z.ZodOptional<z.ZodNullable<z.ZodString>>;
159
+ href: z.ZodOptional<z.ZodNullable<z.ZodString>>;
160
+ selector: z.ZodOptional<z.ZodNullable<z.ZodString>>;
161
+ properties: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>>;
162
+ }, z.core.$strip>>>;
163
+ post_to_slack: z.ZodOptional<z.ZodBoolean>;
164
+ slack_message_format: z.ZodOptional<z.ZodNullable<z.ZodString>>;
165
+ deleted: z.ZodOptional<z.ZodBoolean>;
166
+ id: z.ZodNumber;
167
+ projectId: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
168
+ }, z.core.$strip>, z.ZodObject<{
169
+ id: z.ZodOptional<z.ZodNumber>;
170
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
171
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
172
+ post_to_slack: z.ZodOptional<z.ZodBoolean>;
173
+ slack_message_format: z.ZodOptional<z.ZodNullable<z.ZodString>>;
174
+ steps: z.ZodOptional<z.ZodArray<z.ZodObject<{
175
+ event: z.ZodOptional<z.ZodNullable<z.ZodString>>;
176
+ url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
177
+ url_matching: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
178
+ exact: "exact";
179
+ contains: "contains";
180
+ regex: "regex";
181
+ }>>>;
182
+ text: z.ZodOptional<z.ZodNullable<z.ZodString>>;
183
+ href: z.ZodOptional<z.ZodNullable<z.ZodString>>;
184
+ selector: z.ZodOptional<z.ZodNullable<z.ZodString>>;
185
+ properties: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>>;
186
+ }, z.core.$strip>>>;
187
+ created_at: z.ZodOptional<z.ZodString>;
188
+ created_by: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
189
+ deleted: z.ZodOptional<z.ZodBoolean>;
190
+ is_calculating: z.ZodOptional<z.ZodBoolean>;
191
+ }, z.core.$strip>, readonly [_keystrokehq_core0.CredentialSet<"posthog", z.ZodObject<{
192
+ POSTHOG_PERSONAL_API_KEY: z.ZodString;
193
+ POSTHOG_PROJECT_API_KEY: z.ZodOptional<z.ZodString>;
194
+ POSTHOG_HOST: z.ZodDefault<z.ZodURL>;
195
+ POSTHOG_PROJECT_ID: z.ZodOptional<z.ZodString>;
196
+ POSTHOG_SCOPES: z.ZodOptional<z.ZodArray<z.ZodString>>;
197
+ }, z.core.$strip>, readonly _keystrokehq_core_credential_set0.CredentialConnection<z.ZodObject<{
198
+ POSTHOG_PERSONAL_API_KEY: z.ZodString;
199
+ POSTHOG_PROJECT_API_KEY: z.ZodOptional<z.ZodString>;
200
+ POSTHOG_HOST: z.ZodDefault<z.ZodURL>;
201
+ POSTHOG_PROJECT_ID: z.ZodOptional<z.ZodString>;
202
+ POSTHOG_SCOPES: z.ZodOptional<z.ZodArray<z.ZodString>>;
203
+ }, z.core.$strip>>[] | undefined>], undefined>;
204
+ declare const deleteAction: _keystrokehq_core0.Operation<z.ZodObject<{
205
+ id: z.ZodNumber;
206
+ projectId: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
207
+ }, z.core.$strip>, z.ZodObject<{
208
+ id: z.ZodOptional<z.ZodNumber>;
209
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
210
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
211
+ post_to_slack: z.ZodOptional<z.ZodBoolean>;
212
+ slack_message_format: z.ZodOptional<z.ZodNullable<z.ZodString>>;
213
+ steps: z.ZodOptional<z.ZodArray<z.ZodObject<{
214
+ event: z.ZodOptional<z.ZodNullable<z.ZodString>>;
215
+ url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
216
+ url_matching: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
217
+ exact: "exact";
218
+ contains: "contains";
219
+ regex: "regex";
220
+ }>>>;
221
+ text: z.ZodOptional<z.ZodNullable<z.ZodString>>;
222
+ href: z.ZodOptional<z.ZodNullable<z.ZodString>>;
223
+ selector: z.ZodOptional<z.ZodNullable<z.ZodString>>;
224
+ properties: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>>;
225
+ }, z.core.$strip>>>;
226
+ created_at: z.ZodOptional<z.ZodString>;
227
+ created_by: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
228
+ deleted: z.ZodOptional<z.ZodBoolean>;
229
+ is_calculating: z.ZodOptional<z.ZodBoolean>;
230
+ }, z.core.$strip>, readonly [_keystrokehq_core0.CredentialSet<"posthog", z.ZodObject<{
231
+ POSTHOG_PERSONAL_API_KEY: z.ZodString;
232
+ POSTHOG_PROJECT_API_KEY: z.ZodOptional<z.ZodString>;
233
+ POSTHOG_HOST: z.ZodDefault<z.ZodURL>;
234
+ POSTHOG_PROJECT_ID: z.ZodOptional<z.ZodString>;
235
+ POSTHOG_SCOPES: z.ZodOptional<z.ZodArray<z.ZodString>>;
236
+ }, z.core.$strip>, readonly _keystrokehq_core_credential_set0.CredentialConnection<z.ZodObject<{
237
+ POSTHOG_PERSONAL_API_KEY: z.ZodString;
238
+ POSTHOG_PROJECT_API_KEY: z.ZodOptional<z.ZodString>;
239
+ POSTHOG_HOST: z.ZodDefault<z.ZodURL>;
240
+ POSTHOG_PROJECT_ID: z.ZodOptional<z.ZodString>;
241
+ POSTHOG_SCOPES: z.ZodOptional<z.ZodArray<z.ZodString>>;
242
+ }, z.core.$strip>>[] | undefined>], undefined>;
243
+ //#endregion
244
+ export { createAction, deleteAction, getAction, listActions, updateAction };
@@ -0,0 +1,129 @@
1
+ import { createPosthogManagementClient } from "./client.mjs";
2
+ import { actionSchema, actionStepSchema, paginatedResponseSchema, projectIdInputShape } from "./schemas.mjs";
3
+ import { t as posthogOperation } from "./factory-DYDvHOGb.mjs";
4
+ import { z } from "zod";
5
+
6
+ //#region src/actions.ts
7
+ /**
8
+ * posthog/actions.ts
9
+ *
10
+ * Action CRUD. Actions are reusable event matchers used by dashboards,
11
+ * funnels, and Slack notifications.
12
+ *
13
+ * Docs: https://posthog.com/docs/api/actions
14
+ */
15
+ const idInput = {
16
+ ...projectIdInputShape,
17
+ id: z.number().int()
18
+ };
19
+ const writeShape = {
20
+ name: z.string().optional(),
21
+ description: z.string().nullable().optional(),
22
+ steps: z.array(actionStepSchema).optional(),
23
+ post_to_slack: z.boolean().optional(),
24
+ slack_message_format: z.string().nullable().optional(),
25
+ deleted: z.boolean().optional()
26
+ };
27
+ const listActions = posthogOperation({
28
+ id: "posthog_actions_list",
29
+ name: "PostHog List Actions",
30
+ description: "List actions in a project",
31
+ input: z.object({
32
+ ...projectIdInputShape,
33
+ limit: z.number().int().min(1).max(500).optional(),
34
+ offset: z.number().int().min(0).optional(),
35
+ search: z.string().optional()
36
+ }),
37
+ output: paginatedResponseSchema(actionSchema),
38
+ run: async (input, credentials) => {
39
+ const client = createPosthogManagementClient(credentials);
40
+ const projectId = client.projectId(input.projectId);
41
+ return client.request({
42
+ method: "GET",
43
+ path: `/api/projects/${projectId}/actions/`,
44
+ query: {
45
+ limit: input.limit,
46
+ offset: input.offset,
47
+ search: input.search
48
+ }
49
+ });
50
+ }
51
+ });
52
+ const getAction = posthogOperation({
53
+ id: "posthog_actions_get",
54
+ name: "PostHog Get Action",
55
+ description: "Retrieve an action by id",
56
+ input: z.object(idInput),
57
+ output: actionSchema,
58
+ run: async (input, credentials) => {
59
+ const client = createPosthogManagementClient(credentials);
60
+ const projectId = client.projectId(input.projectId);
61
+ return client.request({
62
+ method: "GET",
63
+ path: `/api/projects/${projectId}/actions/${input.id}/`
64
+ });
65
+ }
66
+ });
67
+ const createAction = posthogOperation({
68
+ id: "posthog_actions_create",
69
+ name: "PostHog Create Action",
70
+ description: "Create a new action",
71
+ input: z.object({
72
+ ...projectIdInputShape,
73
+ ...writeShape,
74
+ name: z.string().min(1)
75
+ }),
76
+ output: actionSchema,
77
+ needsApproval: true,
78
+ run: async (input, credentials) => {
79
+ const client = createPosthogManagementClient(credentials);
80
+ const projectId = client.projectId(input.projectId);
81
+ const { projectId: _pid, ...body } = input;
82
+ return client.request({
83
+ method: "POST",
84
+ path: `/api/projects/${projectId}/actions/`,
85
+ body
86
+ });
87
+ }
88
+ });
89
+ const updateAction = posthogOperation({
90
+ id: "posthog_actions_update",
91
+ name: "PostHog Update Action",
92
+ description: "Partial update to an action",
93
+ input: z.object({
94
+ ...idInput,
95
+ ...writeShape
96
+ }),
97
+ output: actionSchema,
98
+ needsApproval: true,
99
+ run: async (input, credentials) => {
100
+ const client = createPosthogManagementClient(credentials);
101
+ const projectId = client.projectId(input.projectId);
102
+ const { projectId: _pid, id, ...body } = input;
103
+ return client.request({
104
+ method: "PATCH",
105
+ path: `/api/projects/${projectId}/actions/${id}/`,
106
+ body
107
+ });
108
+ }
109
+ });
110
+ const deleteAction = posthogOperation({
111
+ id: "posthog_actions_delete",
112
+ name: "PostHog Delete Action",
113
+ description: "Soft-delete an action",
114
+ input: z.object(idInput),
115
+ output: actionSchema,
116
+ needsApproval: true,
117
+ run: async (input, credentials) => {
118
+ const client = createPosthogManagementClient(credentials);
119
+ const projectId = client.projectId(input.projectId);
120
+ return client.request({
121
+ method: "PATCH",
122
+ path: `/api/projects/${projectId}/actions/${input.id}/`,
123
+ body: { deleted: true }
124
+ });
125
+ }
126
+ });
127
+
128
+ //#endregion
129
+ export { createAction, deleteAction, getAction, listActions, updateAction };