@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.
- package/README.md +237 -0
- package/dist/_official/index.d.mts +2 -0
- package/dist/_official/index.mjs +3 -0
- package/dist/_runtime/index.d.mts +7 -0
- package/dist/_runtime/index.mjs +3 -0
- package/dist/actions.d.mts +244 -0
- package/dist/actions.mjs +129 -0
- package/dist/annotations.d.mts +185 -0
- package/dist/annotations.mjs +141 -0
- package/dist/capture.d.mts +177 -0
- package/dist/capture.mjs +241 -0
- package/dist/client.d.mts +51 -0
- package/dist/client.mjs +200 -0
- package/dist/cohorts.d.mts +229 -0
- package/dist/cohorts.mjs +185 -0
- package/dist/connection.d.mts +2 -0
- package/dist/connection.mjs +3 -0
- package/dist/dashboards.d.mts +434 -0
- package/dist/dashboards.mjs +356 -0
- package/dist/decide.d.mts +74 -0
- package/dist/decide.mjs +75 -0
- package/dist/errors.d.mts +58 -0
- package/dist/errors.mjs +120 -0
- package/dist/events-management.d.mts +294 -0
- package/dist/events-management.mjs +242 -0
- package/dist/factory-DYDvHOGb.mjs +8 -0
- package/dist/feature-flags.d.mts +416 -0
- package/dist/feature-flags.mjs +317 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.mjs +1 -0
- package/dist/insights.d.mts +409 -0
- package/dist/insights.mjs +346 -0
- package/dist/integration-CsCBBu4d.d.mts +53 -0
- package/dist/integration-Doy2Dwli.mjs +30 -0
- package/dist/organizations.d.mts +257 -0
- package/dist/organizations.mjs +219 -0
- package/dist/persons.d.mts +369 -0
- package/dist/persons.mjs +345 -0
- package/dist/projects.d.mts +348 -0
- package/dist/projects.mjs +287 -0
- package/dist/schemas.d.mts +351 -0
- package/dist/schemas.mjs +302 -0
- package/dist/session-recordings.d.mts +391 -0
- package/dist/session-recordings.mjs +308 -0
- package/dist/surveys.d.mts +287 -0
- package/dist/surveys.mjs +208 -0
- package/dist/triggers.d.mts +115 -0
- package/dist/triggers.mjs +330 -0
- package/dist/webhook-management.d.mts +188 -0
- package/dist/webhook-management.mjs +152 -0
- 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,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,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 };
|
package/dist/actions.mjs
ADDED
|
@@ -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 };
|