@keystrokehq/sentry 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 (71) hide show
  1. package/README.md +218 -0
  2. package/dist/_official/index.d.mts +3 -0
  3. package/dist/_official/index.mjs +3 -0
  4. package/dist/_runtime/index.d.mts +2 -0
  5. package/dist/_runtime/index.mjs +3 -0
  6. package/dist/alerts.d.mts +551 -0
  7. package/dist/alerts.mjs +300 -0
  8. package/dist/client.d.mts +86 -0
  9. package/dist/client.mjs +233 -0
  10. package/dist/connection.d.mts +3 -0
  11. package/dist/connection.mjs +3 -0
  12. package/dist/dashboards.d.mts +203 -0
  13. package/dist/dashboards.mjs +122 -0
  14. package/dist/debug-files.d.mts +127 -0
  15. package/dist/debug-files.mjs +73 -0
  16. package/dist/deploys.d.mts +103 -0
  17. package/dist/deploys.mjs +67 -0
  18. package/dist/discover.d.mts +235 -0
  19. package/dist/discover.mjs +138 -0
  20. package/dist/endpoint-factory-BwjbcPwW.mjs +96 -0
  21. package/dist/environments.d.mts +121 -0
  22. package/dist/environments.mjs +71 -0
  23. package/dist/errors-DfEFwcTe.mjs +142 -0
  24. package/dist/events-api.d.mts +311 -0
  25. package/dist/events-api.mjs +184 -0
  26. package/dist/events.d.mts +754 -0
  27. package/dist/events.mjs +142 -0
  28. package/dist/feedback.d.mts +99 -0
  29. package/dist/feedback.mjs +63 -0
  30. package/dist/index.d.mts +1 -0
  31. package/dist/index.mjs +1 -0
  32. package/dist/integration-C8KHkeNG.d.mts +58 -0
  33. package/dist/integration-WwY95cWE.mjs +156 -0
  34. package/dist/issues.d.mts +563 -0
  35. package/dist/issues.mjs +324 -0
  36. package/dist/members.d.mts +365 -0
  37. package/dist/members.mjs +156 -0
  38. package/dist/messaging.d.mts +1 -0
  39. package/dist/messaging.mjs +1 -0
  40. package/dist/monitors.d.mts +539 -0
  41. package/dist/monitors.mjs +234 -0
  42. package/dist/notifications.d.mts +221 -0
  43. package/dist/notifications.mjs +133 -0
  44. package/dist/organizations.d.mts +563 -0
  45. package/dist/organizations.mjs +334 -0
  46. package/dist/pagination-PlgAqbZt.mjs +116 -0
  47. package/dist/project-keys.d.mts +287 -0
  48. package/dist/project-keys.mjs +122 -0
  49. package/dist/projects.d.mts +687 -0
  50. package/dist/projects.mjs +378 -0
  51. package/dist/provider-app-BANn4KOL.d.mts +45 -0
  52. package/dist/releases.d.mts +949 -0
  53. package/dist/releases.mjs +479 -0
  54. package/dist/replays.d.mts +307 -0
  55. package/dist/replays.mjs +192 -0
  56. package/dist/schemas.d.mts +381 -0
  57. package/dist/schemas.mjs +318 -0
  58. package/dist/scim.d.mts +413 -0
  59. package/dist/scim.mjs +249 -0
  60. package/dist/scopes-RRU0vt-a.mjs +36 -0
  61. package/dist/teams.d.mts +561 -0
  62. package/dist/teams.mjs +266 -0
  63. package/dist/triggers.d.mts +83 -0
  64. package/dist/triggers.mjs +263 -0
  65. package/dist/user-emails.d.mts +117 -0
  66. package/dist/user-emails.mjs +60 -0
  67. package/dist/verification.d.mts +30 -0
  68. package/dist/verification.mjs +83 -0
  69. package/dist/webhooks.d.mts +199 -0
  70. package/dist/webhooks.mjs +108 -0
  71. package/package.json +178 -0
@@ -0,0 +1,142 @@
1
+ import { sentryActorSchema, sentryJsonObjectSchema } from "./schemas.mjs";
2
+ import { z } from "zod";
3
+
4
+ //#region src/events.ts
5
+ /**
6
+ * Sentry integration-platform webhook payload schemas.
7
+ *
8
+ * Every payload follows the same envelope:
9
+ * { action, installation: { uuid }, data: {...}, actor: {...} }
10
+ *
11
+ * `action` names the specific event within a resource family; the resource
12
+ * family itself is conveyed via the `Sentry-Hook-Resource` header which the
13
+ * trigger dispatcher uses for routing. We parse with top-level strictness
14
+ * and allow `.passthrough()` on nested payload objects to tolerate field
15
+ * additions by Sentry without forcing a schema rev.
16
+ */
17
+ const sentryInstallationRefSchema = z.object({ uuid: z.string().min(1) }).passthrough();
18
+ function envelope(action, dataSchema) {
19
+ return z.object({
20
+ action: z.literal(action),
21
+ installation: sentryInstallationRefSchema,
22
+ data: dataSchema,
23
+ actor: sentryActorSchema.optional()
24
+ }).passthrough();
25
+ }
26
+ const sentryIssueWebhookDataSchema = z.object({ issue: z.object({
27
+ id: z.string().min(1),
28
+ shortId: z.string().optional(),
29
+ title: z.string().optional(),
30
+ culprit: z.string().nullable().optional(),
31
+ project: sentryJsonObjectSchema.optional(),
32
+ status: z.string().optional(),
33
+ level: z.string().optional(),
34
+ platform: z.string().nullable().optional(),
35
+ url: z.string().url().optional(),
36
+ web_url: z.string().url().optional()
37
+ }).passthrough() }).passthrough();
38
+ const sentryIssueCreatedEventSchema = envelope("created", sentryIssueWebhookDataSchema);
39
+ const sentryIssueResolvedEventSchema = envelope("resolved", sentryIssueWebhookDataSchema);
40
+ const sentryIssueAssignedEventSchema = envelope("assigned", sentryIssueWebhookDataSchema);
41
+ const sentryIssueUnresolvedEventSchema = envelope("unresolved", sentryIssueWebhookDataSchema);
42
+ const sentryIssueIgnoredEventSchema = envelope("ignored", sentryIssueWebhookDataSchema);
43
+ const sentryIssueArchivedEventSchema = envelope("archived", sentryIssueWebhookDataSchema);
44
+ const sentryInstallationWebhookDataSchema = z.object({ installation: z.object({
45
+ uuid: z.string().min(1),
46
+ status: z.string().optional(),
47
+ organization: sentryJsonObjectSchema.optional(),
48
+ app: sentryJsonObjectSchema.optional()
49
+ }).passthrough() }).passthrough();
50
+ const sentryInstallationCreatedEventSchema = envelope("created", sentryInstallationWebhookDataSchema);
51
+ const sentryInstallationDeletedEventSchema = envelope("deleted", sentryInstallationWebhookDataSchema);
52
+ const sentryErrorWebhookDataSchema = z.object({ error: z.object({
53
+ event_id: z.string().optional(),
54
+ project: z.union([z.string(), z.number()]).optional(),
55
+ issue_id: z.string().optional(),
56
+ title: z.string().optional(),
57
+ message: z.string().optional(),
58
+ datetime: z.string().optional(),
59
+ web_url: z.string().url().optional()
60
+ }).passthrough() }).passthrough();
61
+ const sentryErrorCreatedEventSchema = envelope("created", sentryErrorWebhookDataSchema);
62
+ const sentryCommentWebhookDataSchema = z.object({
63
+ comment_id: z.union([z.string(), z.number()]).optional(),
64
+ comment: z.string().optional(),
65
+ issue_id: z.union([z.string(), z.number()]).optional(),
66
+ project_slug: z.string().optional(),
67
+ timestamp: z.string().optional()
68
+ }).passthrough();
69
+ const sentryCommentCreatedEventSchema = envelope("created", sentryCommentWebhookDataSchema);
70
+ const sentryCommentUpdatedEventSchema = envelope("updated", sentryCommentWebhookDataSchema);
71
+ const sentryCommentDeletedEventSchema = envelope("deleted", sentryCommentWebhookDataSchema);
72
+ const sentryEventAlertWebhookDataSchema = z.object({
73
+ event: sentryJsonObjectSchema.optional(),
74
+ triggered_rule: z.string().optional(),
75
+ issue_alert: sentryJsonObjectSchema.optional(),
76
+ issue_id: z.union([z.string(), z.number()]).optional()
77
+ }).passthrough();
78
+ const sentryEventAlertTriggeredEventSchema = envelope("triggered", sentryEventAlertWebhookDataSchema);
79
+ const sentryMetricAlertWebhookDataSchema = z.object({
80
+ metric_alert: z.object({
81
+ id: z.union([z.string(), z.number()]),
82
+ identifier: z.string().optional(),
83
+ status: z.string().optional(),
84
+ title: z.string().optional()
85
+ }).passthrough(),
86
+ description_text: z.string().optional(),
87
+ description_title: z.string().optional(),
88
+ web_url: z.string().url().optional()
89
+ }).passthrough();
90
+ const sentryMetricAlertCriticalEventSchema = envelope("critical", sentryMetricAlertWebhookDataSchema);
91
+ const sentryMetricAlertWarningEventSchema = envelope("warning", sentryMetricAlertWebhookDataSchema);
92
+ const sentryMetricAlertResolvedEventSchema = envelope("resolved", sentryMetricAlertWebhookDataSchema);
93
+ const sentrySeerCommonDataSchema = z.object({
94
+ run_id: z.number(),
95
+ group_id: z.number()
96
+ }).passthrough();
97
+ const sentrySeerRootCauseCompletedDataSchema = sentrySeerCommonDataSchema.extend({ root_cause: sentryJsonObjectSchema.optional() });
98
+ const sentrySeerSolutionCompletedDataSchema = sentrySeerCommonDataSchema.extend({ solution: sentryJsonObjectSchema.optional() });
99
+ const sentrySeerCodingCompletedDataSchema = sentrySeerCommonDataSchema.extend({ changes: z.array(sentryJsonObjectSchema).optional() });
100
+ const sentrySeerPrCreatedDataSchema = sentrySeerCommonDataSchema.extend({ pull_requests: z.array(sentryJsonObjectSchema).optional() });
101
+ const sentrySeerRootCauseStartedEventSchema = envelope("root_cause_started", sentrySeerCommonDataSchema);
102
+ const sentrySeerRootCauseCompletedEventSchema = envelope("root_cause_completed", sentrySeerRootCauseCompletedDataSchema);
103
+ const sentrySeerSolutionStartedEventSchema = envelope("solution_started", sentrySeerCommonDataSchema);
104
+ const sentrySeerSolutionCompletedEventSchema = envelope("solution_completed", sentrySeerSolutionCompletedDataSchema);
105
+ const sentrySeerCodingStartedEventSchema = envelope("coding_started", sentrySeerCommonDataSchema);
106
+ const sentrySeerCodingCompletedEventSchema = envelope("coding_completed", sentrySeerCodingCompletedDataSchema);
107
+ const sentrySeerPrCreatedEventSchema = envelope("pr_created", sentrySeerPrCreatedDataSchema);
108
+ const sentryPreprodArtifactCommonDataSchema = z.object({
109
+ buildId: z.string().min(1),
110
+ organizationSlug: z.string().optional(),
111
+ projectSlug: z.string().optional(),
112
+ platform: z.string().nullable().optional(),
113
+ state: z.enum(["COMPLETED", "FAILED"]),
114
+ appInfo: sentryJsonObjectSchema.optional(),
115
+ gitInfo: sentryJsonObjectSchema.nullable().optional(),
116
+ errorCode: z.string().nullable().optional(),
117
+ errorMessage: z.string().nullable().optional()
118
+ }).passthrough();
119
+ const sentryPreprodArtifactSizeAnalysisCompletedEventSchema = envelope("size_analysis_completed", sentryPreprodArtifactCommonDataSchema);
120
+ const sentryPreprodArtifactBuildDistributionCompletedEventSchema = envelope("build_distribution_completed", sentryPreprodArtifactCommonDataSchema);
121
+ /**
122
+ * Legacy per-project service hooks deliver a simpler envelope that omits the
123
+ * `installation` object because the hook is not installed as an
124
+ * integration. We accept both `data.event_id` (pre-2022 shape) and
125
+ * `event_id` at the top level (newer shape).
126
+ */
127
+ const sentryServiceHookEventAlertSchema = z.object({
128
+ action: z.string(),
129
+ project: z.string().optional(),
130
+ project_name: z.string().optional(),
131
+ event: sentryJsonObjectSchema.optional(),
132
+ data: sentryJsonObjectSchema.optional(),
133
+ triggered_rule: z.string().optional(),
134
+ event_id: z.string().optional()
135
+ }).passthrough();
136
+ const sentryDiscoverEventsPollResponseSchema = z.object({
137
+ data: z.array(sentryJsonObjectSchema),
138
+ meta: sentryJsonObjectSchema.optional()
139
+ }).passthrough();
140
+
141
+ //#endregion
142
+ export { sentryCommentCreatedEventSchema, sentryCommentDeletedEventSchema, sentryCommentUpdatedEventSchema, sentryCommentWebhookDataSchema, sentryDiscoverEventsPollResponseSchema, sentryErrorCreatedEventSchema, sentryErrorWebhookDataSchema, sentryEventAlertTriggeredEventSchema, sentryEventAlertWebhookDataSchema, sentryInstallationCreatedEventSchema, sentryInstallationDeletedEventSchema, sentryInstallationRefSchema, sentryInstallationWebhookDataSchema, sentryIssueArchivedEventSchema, sentryIssueAssignedEventSchema, sentryIssueCreatedEventSchema, sentryIssueIgnoredEventSchema, sentryIssueResolvedEventSchema, sentryIssueUnresolvedEventSchema, sentryIssueWebhookDataSchema, sentryMetricAlertCriticalEventSchema, sentryMetricAlertResolvedEventSchema, sentryMetricAlertWarningEventSchema, sentryMetricAlertWebhookDataSchema, sentryPreprodArtifactBuildDistributionCompletedEventSchema, sentryPreprodArtifactCommonDataSchema, sentryPreprodArtifactSizeAnalysisCompletedEventSchema, sentrySeerCodingCompletedDataSchema, sentrySeerCodingCompletedEventSchema, sentrySeerCodingStartedEventSchema, sentrySeerCommonDataSchema, sentrySeerPrCreatedDataSchema, sentrySeerPrCreatedEventSchema, sentrySeerRootCauseCompletedDataSchema, sentrySeerRootCauseCompletedEventSchema, sentrySeerRootCauseStartedEventSchema, sentrySeerSolutionCompletedDataSchema, sentrySeerSolutionCompletedEventSchema, sentrySeerSolutionStartedEventSchema, sentryServiceHookEventAlertSchema };
@@ -0,0 +1,99 @@
1
+ import * as _keystrokehq_core0 from "@keystrokehq/core";
2
+ import { z } from "zod";
3
+ import * as _keystrokehq_core_credential_set0 from "@keystrokehq/core/credential-set";
4
+
5
+ //#region src/feedback.d.ts
6
+ declare const retrieveUserFeedbackForProject: _keystrokehq_core0.Operation<z.ZodObject<{
7
+ cursor: z.ZodOptional<z.ZodString>;
8
+ per_page: z.ZodOptional<z.ZodNumber>;
9
+ query: z.ZodOptional<z.ZodString>;
10
+ organization_slug: z.ZodOptional<z.ZodString>;
11
+ project_slug: z.ZodString;
12
+ }, z.core.$strip>, z.ZodArray<z.ZodObject<{
13
+ id: z.ZodOptional<z.ZodString>;
14
+ event_id: z.ZodOptional<z.ZodString>;
15
+ name: z.ZodOptional<z.ZodString>;
16
+ email: z.ZodOptional<z.ZodString>;
17
+ comments: z.ZodOptional<z.ZodString>;
18
+ dateCreated: z.ZodOptional<z.ZodISODateTime>;
19
+ }, z.core.$loose>>, readonly [_keystrokehq_core0.CredentialSet<"sentry", z.ZodObject<{
20
+ SENTRY_ACCESS_TOKEN: z.ZodString;
21
+ SENTRY_REGION_URL: z.ZodOptional<z.ZodString>;
22
+ SENTRY_ORG_SLUG: z.ZodOptional<z.ZodString>;
23
+ }, z.core.$strip>, readonly _keystrokehq_core_credential_set0.CredentialConnection<z.ZodObject<{
24
+ SENTRY_ACCESS_TOKEN: z.ZodString;
25
+ SENTRY_REGION_URL: z.ZodOptional<z.ZodString>;
26
+ SENTRY_ORG_SLUG: z.ZodOptional<z.ZodString>;
27
+ }, z.core.$strip>>[] | undefined>], undefined>;
28
+ declare const submitProjectUserFeedback: _keystrokehq_core0.Operation<z.ZodObject<{
29
+ organization_slug: z.ZodOptional<z.ZodString>;
30
+ project_slug: z.ZodString;
31
+ event_id: z.ZodString;
32
+ name: z.ZodString;
33
+ email: z.ZodString;
34
+ comments: z.ZodString;
35
+ }, z.core.$strip>, z.ZodObject<{
36
+ id: z.ZodOptional<z.ZodString>;
37
+ event_id: z.ZodOptional<z.ZodString>;
38
+ name: z.ZodOptional<z.ZodString>;
39
+ email: z.ZodOptional<z.ZodString>;
40
+ comments: z.ZodOptional<z.ZodString>;
41
+ dateCreated: z.ZodOptional<z.ZodISODateTime>;
42
+ }, z.core.$loose>, readonly [_keystrokehq_core0.CredentialSet<"sentry", z.ZodObject<{
43
+ SENTRY_ACCESS_TOKEN: z.ZodString;
44
+ SENTRY_REGION_URL: z.ZodOptional<z.ZodString>;
45
+ SENTRY_ORG_SLUG: z.ZodOptional<z.ZodString>;
46
+ }, z.core.$strip>, readonly _keystrokehq_core_credential_set0.CredentialConnection<z.ZodObject<{
47
+ SENTRY_ACCESS_TOKEN: z.ZodString;
48
+ SENTRY_REGION_URL: z.ZodOptional<z.ZodString>;
49
+ SENTRY_ORG_SLUG: z.ZodOptional<z.ZodString>;
50
+ }, z.core.$strip>>[] | undefined>], undefined>;
51
+ declare const sentryFeedbackOperations: {
52
+ readonly retrieveUserFeedbackForProject: _keystrokehq_core0.Operation<z.ZodObject<{
53
+ cursor: z.ZodOptional<z.ZodString>;
54
+ per_page: z.ZodOptional<z.ZodNumber>;
55
+ query: z.ZodOptional<z.ZodString>;
56
+ organization_slug: z.ZodOptional<z.ZodString>;
57
+ project_slug: z.ZodString;
58
+ }, z.core.$strip>, z.ZodArray<z.ZodObject<{
59
+ id: z.ZodOptional<z.ZodString>;
60
+ event_id: z.ZodOptional<z.ZodString>;
61
+ name: z.ZodOptional<z.ZodString>;
62
+ email: z.ZodOptional<z.ZodString>;
63
+ comments: z.ZodOptional<z.ZodString>;
64
+ dateCreated: z.ZodOptional<z.ZodISODateTime>;
65
+ }, z.core.$loose>>, readonly [_keystrokehq_core0.CredentialSet<"sentry", z.ZodObject<{
66
+ SENTRY_ACCESS_TOKEN: z.ZodString;
67
+ SENTRY_REGION_URL: z.ZodOptional<z.ZodString>;
68
+ SENTRY_ORG_SLUG: z.ZodOptional<z.ZodString>;
69
+ }, z.core.$strip>, readonly _keystrokehq_core_credential_set0.CredentialConnection<z.ZodObject<{
70
+ SENTRY_ACCESS_TOKEN: z.ZodString;
71
+ SENTRY_REGION_URL: z.ZodOptional<z.ZodString>;
72
+ SENTRY_ORG_SLUG: z.ZodOptional<z.ZodString>;
73
+ }, z.core.$strip>>[] | undefined>], undefined>;
74
+ readonly submitProjectUserFeedback: _keystrokehq_core0.Operation<z.ZodObject<{
75
+ organization_slug: z.ZodOptional<z.ZodString>;
76
+ project_slug: z.ZodString;
77
+ event_id: z.ZodString;
78
+ name: z.ZodString;
79
+ email: z.ZodString;
80
+ comments: z.ZodString;
81
+ }, z.core.$strip>, z.ZodObject<{
82
+ id: z.ZodOptional<z.ZodString>;
83
+ event_id: z.ZodOptional<z.ZodString>;
84
+ name: z.ZodOptional<z.ZodString>;
85
+ email: z.ZodOptional<z.ZodString>;
86
+ comments: z.ZodOptional<z.ZodString>;
87
+ dateCreated: z.ZodOptional<z.ZodISODateTime>;
88
+ }, z.core.$loose>, readonly [_keystrokehq_core0.CredentialSet<"sentry", z.ZodObject<{
89
+ SENTRY_ACCESS_TOKEN: z.ZodString;
90
+ SENTRY_REGION_URL: z.ZodOptional<z.ZodString>;
91
+ SENTRY_ORG_SLUG: z.ZodOptional<z.ZodString>;
92
+ }, z.core.$strip>, readonly _keystrokehq_core_credential_set0.CredentialConnection<z.ZodObject<{
93
+ SENTRY_ACCESS_TOKEN: z.ZodString;
94
+ SENTRY_REGION_URL: z.ZodOptional<z.ZodString>;
95
+ SENTRY_ORG_SLUG: z.ZodOptional<z.ZodString>;
96
+ }, z.core.$strip>>[] | undefined>], undefined>;
97
+ };
98
+ //#endregion
99
+ export { retrieveUserFeedbackForProject, sentryFeedbackOperations, submitProjectUserFeedback };
@@ -0,0 +1,63 @@
1
+ import { orgProjectScopeInputSchema, sentryFeedbackSchema, sentryIdSchema, sentryListInputSchema } from "./schemas.mjs";
2
+ import { t as defineSentryEndpoint } from "./endpoint-factory-BwjbcPwW.mjs";
3
+ import { t as SENTRY_SCOPE } from "./scopes-RRU0vt-a.mjs";
4
+ import { z } from "zod";
5
+
6
+ //#region src/feedback.ts
7
+ /**
8
+ * Sentry user-feedback operations. Maps to PLAN.md §6.18 (2 actions).
9
+ */
10
+ const ORG_PROJECT = [{
11
+ name: "organization_slug",
12
+ placeholder: "{organization_slug}"
13
+ }, {
14
+ name: "project_slug",
15
+ placeholder: "{project_slug}"
16
+ }];
17
+ const retrieveUserFeedbackForProject = defineSentryEndpoint({
18
+ id: "retrieve_user_feedback_for_project",
19
+ name: "List User Feedback",
20
+ description: "List user feedback submissions for a project.",
21
+ method: "GET",
22
+ path: "/api/0/projects/{organization_slug}/{project_slug}/user-feedback/",
23
+ pathParams: ORG_PROJECT,
24
+ input: sentryListInputSchema.merge(orgProjectScopeInputSchema),
25
+ queryFields: [
26
+ "cursor",
27
+ "per_page",
28
+ "query"
29
+ ],
30
+ output: z.array(sentryFeedbackSchema),
31
+ pagination: "cursor",
32
+ requiredOAuthScopes: [...SENTRY_SCOPE.projectRead]
33
+ });
34
+ const submitProjectUserFeedback = defineSentryEndpoint({
35
+ id: "submit_project_user_feedback",
36
+ name: "Submit User Feedback",
37
+ description: "Submit a user-feedback record against an event.",
38
+ method: "POST",
39
+ path: "/api/0/projects/{organization_slug}/{project_slug}/user-feedback/",
40
+ pathParams: ORG_PROJECT,
41
+ input: orgProjectScopeInputSchema.extend({
42
+ event_id: sentryIdSchema,
43
+ name: z.string().min(1),
44
+ email: z.string().email(),
45
+ comments: z.string().min(1)
46
+ }),
47
+ bodyFields: [
48
+ "event_id",
49
+ "name",
50
+ "email",
51
+ "comments"
52
+ ],
53
+ output: sentryFeedbackSchema,
54
+ needsApproval: true,
55
+ requiredOAuthScopes: [...SENTRY_SCOPE.projectWrite]
56
+ });
57
+ const sentryFeedbackOperations = {
58
+ retrieveUserFeedbackForProject,
59
+ submitProjectUserFeedback
60
+ };
61
+
62
+ //#endregion
63
+ export { retrieveUserFeedbackForProject, sentryFeedbackOperations, submitProjectUserFeedback };
@@ -0,0 +1 @@
1
+ export { };
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,58 @@
1
+ import * as _keystrokehq_core0 from "@keystrokehq/core";
2
+ import * as _keystrokehq_integration_authoring_official0 from "@keystrokehq/integration-authoring/official";
3
+ import { z } from "zod";
4
+ import * as _keystrokehq_core_credential_set0 from "@keystrokehq/core/credential-set";
5
+ import { InferCredentialSetAuth } from "@keystrokehq/core/credential-set";
6
+
7
+ //#region src/integration.d.ts
8
+ declare const sentryOfficialIntegration: {
9
+ id: "sentry";
10
+ name: string;
11
+ description: string;
12
+ auth: z.ZodObject<{
13
+ SENTRY_ACCESS_TOKEN: z.ZodString;
14
+ SENTRY_REGION_URL: z.ZodOptional<z.ZodString>;
15
+ SENTRY_ORG_SLUG: z.ZodOptional<z.ZodString>;
16
+ }, z.core.$strip>;
17
+ proxy: {
18
+ hosts: string[];
19
+ };
20
+ connections: {
21
+ kind: "oauth";
22
+ tokenType: "refreshable";
23
+ authUrl: "https://sentry.io/oauth/authorize/";
24
+ tokenUrl: "https://sentry.io/oauth/token/";
25
+ revokeUrl: null;
26
+ scopes: readonly ["org:read", "project:read", "project:write", "project:admin", "team:read", "team:write", "team:admin", "member:read", "member:write", "event:read", "event:admin", "alerts:read", "alerts:write", "release:admin"];
27
+ vault: {
28
+ readonly accessToken: "SENTRY_ACCESS_TOKEN";
29
+ };
30
+ exchangeCode: (ctx: _keystrokehq_core_credential_set0.ExchangeCodeContext) => Promise<_keystrokehq_core_credential_set0.TokenResult>;
31
+ extractInstallationInfo: ({
32
+ tokenResult
33
+ }: _keystrokehq_core_credential_set0.ExtractInstallationContext) => {
34
+ externalInstallationId: string | undefined;
35
+ externalWorkspaceId: string | undefined;
36
+ externalBotUserId: string | undefined;
37
+ metadata: Record<string, string>;
38
+ };
39
+ id: string;
40
+ }[];
41
+ };
42
+ declare const sentryBundle: _keystrokehq_integration_authoring_official0.OfficialIntegrationBundle<"sentry", z.ZodObject<{
43
+ SENTRY_ACCESS_TOKEN: z.ZodString;
44
+ SENTRY_REGION_URL: z.ZodOptional<z.ZodString>;
45
+ SENTRY_ORG_SLUG: z.ZodOptional<z.ZodString>;
46
+ }, z.core.$strip>>;
47
+ declare const sentry: _keystrokehq_core0.CredentialSet<"sentry", z.ZodObject<{
48
+ SENTRY_ACCESS_TOKEN: z.ZodString;
49
+ SENTRY_REGION_URL: z.ZodOptional<z.ZodString>;
50
+ SENTRY_ORG_SLUG: z.ZodOptional<z.ZodString>;
51
+ }, z.core.$strip>, readonly _keystrokehq_core_credential_set0.CredentialConnection<z.ZodObject<{
52
+ SENTRY_ACCESS_TOKEN: z.ZodString;
53
+ SENTRY_REGION_URL: z.ZodOptional<z.ZodString>;
54
+ SENTRY_ORG_SLUG: z.ZodOptional<z.ZodString>;
55
+ }, z.core.$strip>>[] | undefined>;
56
+ type SentryIntegrationCredentials = InferCredentialSetAuth<typeof sentry>;
57
+ //#endregion
58
+ export { sentryOfficialIntegration as i, sentry as n, sentryBundle as r, SentryIntegrationCredentials as t };
@@ -0,0 +1,156 @@
1
+ import { SENTRY_DEFAULT_BASE_URL } from "./client.mjs";
2
+ import { CredentialSet } from "@keystrokehq/core";
3
+ import { defineOfficialIntegration } from "@keystrokehq/integration-authoring/official";
4
+ import { z } from "zod";
5
+ import { oauthDefaults } from "@keystrokehq/credential-connection";
6
+
7
+ //#region src/_official/provider-app.ts
8
+ /**
9
+ * Internal Keystroke-owned Sentry app credentials.
10
+ *
11
+ * For Sentry, `clientSecret` doubles as the webhook signing secret per
12
+ * <https://docs.sentry.io/organization/integrations/integration-platform/webhooks/>,
13
+ * so `webhookSecret` is kept as a discrete field for symmetry with other
14
+ * integrations even though in practice platforms will populate both from the
15
+ * same Sentry-issued value.
16
+ */
17
+ const sentryAppCredentialSet = new CredentialSet({
18
+ id: "sentry-app",
19
+ exposure: "platform-only",
20
+ name: "Sentry App",
21
+ auth: z.object({
22
+ clientId: z.string(),
23
+ clientSecret: z.string(),
24
+ webhookSecret: z.string()
25
+ })
26
+ });
27
+ const sentryPlatformProviderSeed = {
28
+ provider: "sentry",
29
+ appRef: "sentry-platform",
30
+ displayName: "Sentry Platform",
31
+ credentialSetName: "Keystroke Sentry Platform App",
32
+ envShape: {
33
+ KEYSTROKE_PLATFORM_SENTRY_CLIENT_ID: z.string().optional(),
34
+ KEYSTROKE_PLATFORM_SENTRY_CLIENT_SECRET: z.string().optional(),
35
+ KEYSTROKE_PLATFORM_SENTRY_WEBHOOK_SECRET: z.string().optional()
36
+ },
37
+ requiredEnvKeys: [
38
+ "KEYSTROKE_PLATFORM_SENTRY_CLIENT_ID",
39
+ "KEYSTROKE_PLATFORM_SENTRY_CLIENT_SECRET",
40
+ "KEYSTROKE_PLATFORM_SENTRY_WEBHOOK_SECRET"
41
+ ],
42
+ externalAppIdEnvKey: "KEYSTROKE_PLATFORM_SENTRY_CLIENT_ID",
43
+ buildCredentials: (env) => ({
44
+ clientId: env.KEYSTROKE_PLATFORM_SENTRY_CLIENT_ID,
45
+ clientSecret: env.KEYSTROKE_PLATFORM_SENTRY_CLIENT_SECRET,
46
+ webhookSecret: env.KEYSTROKE_PLATFORM_SENTRY_WEBHOOK_SECRET
47
+ })
48
+ };
49
+
50
+ //#endregion
51
+ //#region src/oauth-connection.ts
52
+ const SENTRY_OAUTH_SCOPES = [
53
+ "org:read",
54
+ "project:read",
55
+ "project:write",
56
+ "project:admin",
57
+ "team:read",
58
+ "team:write",
59
+ "team:admin",
60
+ "member:read",
61
+ "member:write",
62
+ "event:read",
63
+ "event:admin",
64
+ "alerts:read",
65
+ "alerts:write",
66
+ "release:admin"
67
+ ];
68
+ const sentryOAuthConnection = {
69
+ kind: "oauth",
70
+ tokenType: "refreshable",
71
+ authUrl: "https://sentry.io/oauth/authorize/",
72
+ tokenUrl: "https://sentry.io/oauth/token/",
73
+ revokeUrl: null,
74
+ scopes: [...SENTRY_OAUTH_SCOPES],
75
+ vault: { accessToken: "SENTRY_ACCESS_TOKEN" },
76
+ async exchangeCode(ctx) {
77
+ const result = await oauthDefaults.exchangeCode(ctx);
78
+ const orgResponse = await fetch(`${SENTRY_DEFAULT_BASE_URL}/api/0/organizations/`, {
79
+ method: "GET",
80
+ headers: {
81
+ Authorization: `Bearer ${result.accessToken}`,
82
+ Accept: "application/json"
83
+ }
84
+ });
85
+ let firstOrg = null;
86
+ if (orgResponse.ok) {
87
+ const orgs = await orgResponse.json();
88
+ if (Array.isArray(orgs) && orgs.length > 0 && isOrganizationProbe(orgs[0])) firstOrg = orgs[0];
89
+ }
90
+ result.raw._sentryOrganization = firstOrg;
91
+ result.raw._sentryUser = pickUser(result.raw);
92
+ result.raw._sentryScopes = typeof result.raw.scope === "string" ? result.raw.scope : void 0;
93
+ return result;
94
+ },
95
+ extractInstallationInfo({ tokenResult }) {
96
+ const org = tokenResult.raw._sentryOrganization;
97
+ const user = tokenResult.raw._sentryUser;
98
+ const metadata = {};
99
+ if (org?.name) metadata.organizationName = org.name;
100
+ if (org?.slug) metadata.organizationSlug = org.slug;
101
+ const regionUrl = org?.links?.regionUrl;
102
+ if (regionUrl) metadata.regionUrl = regionUrl;
103
+ if (user?.name) metadata.userName = user.name;
104
+ if (user?.email) metadata.userEmail = user.email;
105
+ return {
106
+ externalInstallationId: org?.slug,
107
+ externalWorkspaceId: org?.id,
108
+ externalBotUserId: user?.id,
109
+ metadata
110
+ };
111
+ }
112
+ };
113
+ function isOrganizationProbe(value) {
114
+ return typeof value === "object" && value !== null;
115
+ }
116
+ function pickUser(raw) {
117
+ const user = raw.user;
118
+ if (user == null || typeof user !== "object") return null;
119
+ const u = user;
120
+ return {
121
+ id: typeof u.id === "string" ? u.id : void 0,
122
+ name: typeof u.name === "string" ? u.name : void 0,
123
+ email: typeof u.email === "string" ? u.email : void 0
124
+ };
125
+ }
126
+
127
+ //#endregion
128
+ //#region src/integration.ts
129
+ const sentryAuthSchema = z.object({
130
+ SENTRY_ACCESS_TOKEN: z.string().min(1),
131
+ SENTRY_REGION_URL: z.string().url().optional(),
132
+ SENTRY_ORG_SLUG: z.string().min(1).optional()
133
+ });
134
+ const sentryOfficialIntegration = {
135
+ id: "sentry",
136
+ name: "Sentry",
137
+ description: "Sentry — issue lifecycle, release tracking, alerts, monitors, replays, feedback, and integration-platform webhook triggers",
138
+ auth: sentryAuthSchema,
139
+ proxy: { hosts: [
140
+ "sentry.io",
141
+ "us.sentry.io",
142
+ "de.sentry.io"
143
+ ] },
144
+ connections: [{
145
+ id: "oauth",
146
+ ...sentryOAuthConnection
147
+ }]
148
+ };
149
+ const sentryBundle = defineOfficialIntegration({
150
+ ...sentryOfficialIntegration,
151
+ internal: { providerApp: sentryAppCredentialSet }
152
+ });
153
+ const sentry = sentryBundle.credentialSet;
154
+
155
+ //#endregion
156
+ export { sentryPlatformProviderSeed as a, sentryAppCredentialSet as i, sentryBundle as n, sentryOfficialIntegration as r, sentry as t };