@greatwait/contracts 0.1.0-alpha.7 → 0.2.0

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 (37) hide show
  1. package/README.md +13 -12
  2. package/dist/billing.d.ts +2 -1
  3. package/dist/billing.js +8 -1
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.js +1 -0
  6. package/dist/operations.d.ts +42 -5
  7. package/dist/operations.js +3 -1
  8. package/dist/policy.d.ts +5 -4
  9. package/dist/policy.js +5 -4
  10. package/dist/project-notifications.d.ts +238 -0
  11. package/dist/project-notifications.js +236 -0
  12. package/dist/scheduling.js +5 -4
  13. package/dist/workspace.d.ts +4 -4
  14. package/generated/v1/examples/projectnotifications.read.response.json +12 -0
  15. package/generated/v1/examples/projectnotifications.rotateSigningKey.request.json +3 -0
  16. package/generated/v1/examples/projectnotifications.rotateSigningKey.response.json +25 -0
  17. package/generated/v1/examples/projectnotifications.update.request.json +10 -0
  18. package/generated/v1/examples/projectnotifications.update.response.json +12 -0
  19. package/generated/v1/examples/statusdeliveries.list.response.json +3 -0
  20. package/generated/v1/manifest.json +110 -0
  21. package/generated/v1/openapi.json +2525 -3
  22. package/generated/v1/policy-matrix.json +28 -0
  23. package/generated/v1/schemas/billing.notices.response.json +3 -2
  24. package/generated/v1/schemas/billing.purchase.request.json +4 -0
  25. package/generated/v1/schemas/projectnotifications.read.response.json +101 -0
  26. package/generated/v1/schemas/projectnotifications.rotateSigningKey.request.json +13 -0
  27. package/generated/v1/schemas/projectnotifications.rotateSigningKey.response.json +119 -0
  28. package/generated/v1/schemas/projectnotifications.update.request-headers.json +13 -0
  29. package/generated/v1/schemas/projectnotifications.update.request.json +90 -0
  30. package/generated/v1/schemas/projectnotifications.update.response.json +101 -0
  31. package/generated/v1/schemas/statusdeliveries.list.query.json +16 -0
  32. package/generated/v1/schemas/statusdeliveries.list.response.json +82 -0
  33. package/generated/v1/snippets/projectnotifications.read.json +6 -0
  34. package/generated/v1/snippets/projectnotifications.rotateSigningKey.json +6 -0
  35. package/generated/v1/snippets/projectnotifications.update.json +6 -0
  36. package/generated/v1/snippets/statusdeliveries.list.json +6 -0
  37. package/package.json +1 -1
package/README.md CHANGED
@@ -4,12 +4,8 @@ The public contracts for [GreatWait](https://greatwait.dev): the schemas every
4
4
  response is parsed with, the stable refusal catalog, the operation registry, and
5
5
  the generated OpenAPI documents.
6
6
 
7
- > **Alpha.** This package publishes on the `alpha` dist-tag and has no
8
- > `latest`. Install it explicitly, and pin the exact version in anything you
9
- > care about.
10
-
11
7
  ```bash
12
- npm install @greatwait/contracts@alpha
8
+ npm install @greatwait/contracts
13
9
  ```
14
10
 
15
11
  Most people arrive here through [`@greatwait/api-client`](https://www.npmjs.com/package/@greatwait/api-client),
@@ -67,13 +63,18 @@ That internal QA surface is deliberately excluded from the published package.
67
63
  of any deployment, because a service that ships twice a day must not imply the
68
64
  contract changed twice a day.
69
65
 
70
- ## The first-value journey
66
+ ## First callback
67
+
68
+ For a signed-in credential, a call scheduled directly to your HTTPS URL, and a
69
+ read of the delivery attempt, follow the
70
+ [JavaScript quickstart](https://docs.greatwait.dev/guides/javascript) with
71
+ [`@greatwait/api-client`](https://www.npmjs.com/package/@greatwait/api-client),
72
+ or the [CLI quickstart](https://docs.greatwait.dev/guides/cli).
73
+ The client already depends on this package; you only need a separate install
74
+ when importing the schemas directly.
71
75
 
72
- `generated/v1/first-value-journey.json` is the one sequence that takes a
73
- developer from a credential to an observed callback — the same steps the curl
74
- quickstart, the JavaScript quickstart and the website walkthrough render. Read
75
- it rather than restating the steps: each entry carries the operation, the
76
- method, the path, the scopes it needs, the refusals it can produce and what to
77
- do about each of them.
76
+ `generated/v1/first-value-journey.json` contains the expanded operation-by-operation
77
+ journey, including idempotent replay and destination setup. The hosted
78
+ quickstarts use the shorter direct-URL path. Both use the same public contracts.
78
79
 
79
80
  MIT licensed. Issues: <https://github.com/flowxo/greatwait/issues>.
package/dist/billing.d.ts CHANGED
@@ -110,6 +110,7 @@ export declare const billingPurchaseRequestSchema: import("zod").ZodObject<{
110
110
  confirmed: import("zod").ZodLiteral<true>;
111
111
  expectedRevision: import("zod").ZodNumber;
112
112
  quote: import("zod").ZodString;
113
+ savePaymentMethod: import("zod").ZodOptional<import("zod").ZodBoolean>;
113
114
  }, import("zod/v4/core").$strict>;
114
115
  export declare const billingCeilingUpdateRequestSchema: import("zod").ZodObject<{
115
116
  automaticExecutionTopUpCeiling: import("zod").ZodNullable<import("zod").ZodObject<{
@@ -427,7 +428,7 @@ export declare const billingFundingViewSchema: import("zod").ZodObject<{
427
428
  scale: import("zod").ZodLiteral<6>;
428
429
  }, import("zod/v4/core").$strip>;
429
430
  }, import("zod/v4/core").$strict>;
430
- export declare const BILLING_NOTICE_KINDS: readonly ["budget-warning", "budget-exhausted", "low-credit", "automatic-top-up-cap-reached", "funding-blocked", "payment-pending", "payment-succeeded", "payment-failed", "payment-authentication-required", "payment-outcome-unresolved", "service-restored", "schedule-auto-paused"];
431
+ export declare const BILLING_NOTICE_KINDS: readonly ["budget-warning", "budget-exhausted", "low-credit", "automatic-top-up-cap-reached", "funding-blocked", "payment-pending", "payment-succeeded", "payment-failed", "payment-authentication-required", "payment-outcome-unresolved", "service-restored", "schedule-auto-paused", "delivery-failed"];
431
432
  type BillingNoticeMoney = z.infer<typeof nonnegativeExactMoneySchema>;
432
433
  export interface BillingNotice {
433
434
  readonly amounts: {
package/dist/billing.js CHANGED
@@ -208,6 +208,12 @@ export const billingPurchaseRequestSchema = z
208
208
  confirmed: z.literal(true),
209
209
  expectedRevision: z.number().int().nonnegative(),
210
210
  quote: z.string().min(1).max(128),
211
+ savePaymentMethod: z
212
+ .boolean()
213
+ .meta({
214
+ description: "true: the customer also asks to keep the payment method they pay with, for automatic top-up and for projects past the free one. The hosted payment then saves it for later charges made without the customer present (it offers every method the account enables except Klarna, which cannot be charged that way), and once the provider confirms this payment paid, that method becomes the organization's saved payment method if it has none. An existing saved payment method is never replaced, and saving one never turns automatic top-up on. Omitted or false: the purchase does exactly what it always did.",
215
+ })
216
+ .optional(),
211
217
  })
212
218
  .strict();
213
219
  export const billingCeilingUpdateRequestSchema = z
@@ -407,13 +413,14 @@ export const BILLING_NOTICE_KINDS = [
407
413
  "payment-outcome-unresolved",
408
414
  "service-restored",
409
415
  "schedule-auto-paused",
416
+ "delivery-failed",
410
417
  ];
411
418
  export const billingNoticeRecoveryPathSchema = z.union([
412
419
  z.enum(["#billing", "#billing-funding", "#billing-notification-settings"]),
413
420
  z
414
421
  .string()
415
422
  .max(1024)
416
- .regex(/^\/o\/[A-Za-z0-9_%.-]+\/p\/proj_[0-9abcdefghjkmnpqrstvwxyz]{26}\/(?:live|test)\/schedules\/sch_[0-9abcdefghjkmnpqrstvwxyz]{26}$/u, "must be a scoped schedule recovery route"),
423
+ .regex(/^\/o\/[A-Za-z0-9_%.-]+\/p\/proj_[0-9abcdefghjkmnpqrstvwxyz]{26}\/(?:live|test)\/schedules(?:\/sch_[0-9abcdefghjkmnpqrstvwxyz]{26}(?:\/occurrences\/occ_[0-9abcdefghjkmnpqrstvwxyz]{26})?)?$/u, "must be a scoped schedule recovery route"),
417
424
  ]);
418
425
  export const billingNoticeSchema = z
419
426
  .object({
package/dist/index.d.ts CHANGED
@@ -33,3 +33,4 @@ export { effectiveCustomerLimitsSchema, type EffectiveCustomerLimits, } from "./
33
33
  export * from "./members.js";
34
34
  export * from "./http-request.js";
35
35
  export { sanitizedDiagnosticText, diagnosticBodyText, responseBodySentence, requestCaptureSentence, attemptStatusGuidance, } from "./attempt-diagnostics.js";
36
+ export { PROJECT_NOTIFICATION_OPERATIONS, notificationEmailRecipientsSchema, notificationEmailSettingsSchema, statusWebhookEventSchema, statusWebhookConfigurationSchema, projectNotificationSettingsSchema, projectNotificationSettingsUpdateRequestSchema, statusSigningKeyRequestSchema, statusSigningKeyCreatedSchema, statusWebhookPayloadSchema, statusWebhookDeliverySchema, statusWebhookDeliveryPageSchema, type ProjectNotificationSettings, type ProjectNotificationSettingsUpdateRequest, type StatusSigningKeyCreated, type StatusWebhookEvent, type StatusWebhookPayload, type StatusWebhookDelivery, type StatusWebhookDeliveryPage, } from "./project-notifications.js";
package/dist/index.js CHANGED
@@ -33,3 +33,4 @@ export { effectiveCustomerLimitsSchema, } from "./effective-limits.js";
33
33
  export * from "./members.js";
34
34
  export * from "./http-request.js";
35
35
  export { sanitizedDiagnosticText, diagnosticBodyText, responseBodySentence, requestCaptureSentence, attemptStatusGuidance, } from "./attempt-diagnostics.js";
36
+ export { PROJECT_NOTIFICATION_OPERATIONS, notificationEmailRecipientsSchema, notificationEmailSettingsSchema, statusWebhookEventSchema, statusWebhookConfigurationSchema, projectNotificationSettingsSchema, projectNotificationSettingsUpdateRequestSchema, statusSigningKeyRequestSchema, statusSigningKeyCreatedSchema, statusWebhookPayloadSchema, statusWebhookDeliverySchema, statusWebhookDeliveryPageSchema, } from "./project-notifications.js";
@@ -486,6 +486,42 @@ export declare const OPERATIONS: readonly [{
486
486
  readonly request: import("zod").ZodObject<{
487
487
  confirmed: import("zod").ZodLiteral<true>;
488
488
  }, import("zod/v4/core").$strict>;
489
+ }, OperationDefinition & {
490
+ readonly id: "projectnotifications.read";
491
+ }, OperationDefinition & {
492
+ readonly id: "projectnotifications.update";
493
+ } & {
494
+ readonly request: import("zod").ZodObject<{
495
+ expectedRevision: import("zod").ZodNumber;
496
+ email: import("zod").ZodOptional<import("zod").ZodObject<{
497
+ enabled: import("zod").ZodBoolean;
498
+ recipients: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
499
+ kind: import("zod").ZodLiteral<"admins">;
500
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
501
+ kind: import("zod").ZodLiteral<"members">;
502
+ memberIds: import("zod").ZodArray<import("zod").ZodString>;
503
+ }, import("zod/v4/core").$strict>], "kind">;
504
+ scheduleKinds: import("zod").ZodEnum<{
505
+ both: "both";
506
+ "one-shot": "one-shot";
507
+ recurring: "recurring";
508
+ }>;
509
+ }, import("zod/v4/core").$strict>>;
510
+ statusWebhook: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
511
+ url: import("zod").ZodString;
512
+ events: import("zod").ZodArray<import("zod").ZodEnum<{
513
+ failed: "failed";
514
+ }>>;
515
+ }, import("zod/v4/core").$strict>>>;
516
+ }, import("zod/v4/core").$strict>;
517
+ }, OperationDefinition & {
518
+ readonly id: "projectnotifications.rotateSigningKey";
519
+ } & {
520
+ readonly request: import("zod").ZodObject<{
521
+ expectedRevision: import("zod").ZodNumber;
522
+ }, import("zod/v4/core").$strict>;
523
+ }, OperationDefinition & {
524
+ readonly id: "statusdeliveries.list";
489
525
  }, OperationDefinition & {
490
526
  readonly id: "organizations.lifecycle";
491
527
  }, OperationDefinition & {
@@ -558,16 +594,16 @@ export declare const OPERATIONS: readonly [{
558
594
  readonly problems: readonly [];
559
595
  readonly response: import("zod").ZodNever | import("zod").ZodObject<{
560
596
  dependsOn: import("zod").ZodArray<import("zod").ZodEnum<{
561
- contract: "contract";
562
597
  platform: "platform";
598
+ contract: "contract";
563
599
  domain: "domain";
564
600
  application: "application";
565
601
  adapter: "adapter";
566
602
  "test-support": "test-support";
567
603
  }>>;
568
604
  layer: import("zod").ZodEnum<{
569
- contract: "contract";
570
605
  platform: "platform";
606
+ contract: "contract";
571
607
  domain: "domain";
572
608
  application: "application";
573
609
  adapter: "adapter";
@@ -634,16 +670,16 @@ export declare const OPERATIONS: readonly [{
634
670
  readonly problems: readonly ["not_found"];
635
671
  readonly response: import("zod").ZodNever | import("zod").ZodObject<{
636
672
  dependsOn: import("zod").ZodArray<import("zod").ZodEnum<{
637
- contract: "contract";
638
673
  platform: "platform";
674
+ contract: "contract";
639
675
  domain: "domain";
640
676
  application: "application";
641
677
  adapter: "adapter";
642
678
  "test-support": "test-support";
643
679
  }>>;
644
680
  layer: import("zod").ZodEnum<{
645
- contract: "contract";
646
681
  platform: "platform";
682
+ contract: "contract";
647
683
  domain: "domain";
648
684
  application: "application";
649
685
  adapter: "adapter";
@@ -4325,7 +4361,7 @@ export declare const OPERATIONS: readonly [{
4325
4361
  "Idempotency-Replayed": import("zod").ZodOptional<import("zod").ZodLiteral<"true">>;
4326
4362
  }, import("zod/v4/core").$strip>;
4327
4363
  readonly creates: true;
4328
- readonly description: "" | "Confirms one exact manual execution-credit quote and creates or replays its durable payment operation. Billing-owner authority and explicit agent approval apply; the Idempotency-Key preserves one payment identity across retries. Manual funding stays outside the automatic-charge ceiling. A browser redirect never grants credit: only authenticated provider reconciliation can move the operation to paid and grant its exact execution credit once, while the operation reports provider-confirmed tax and gross when known.";
4364
+ readonly description: "" | "Confirms one exact manual execution-credit quote and creates or replays its durable payment operation. Billing-owner authority and explicit agent approval apply; the Idempotency-Key preserves one payment identity across retries. Manual funding stays outside the automatic-charge ceiling. A browser redirect never grants credit: only authenticated provider reconciliation can move the operation to paid and grant its exact execution credit once, while the operation reports provider-confirmed tax and gross when known. With savePaymentMethod, the payment method used becomes the organization's saved payment method once the payment is confirmed, unless one is already saved.";
4329
4365
  readonly environments: readonly ["live"];
4330
4366
  readonly id: "billing.purchase";
4331
4367
  readonly idempotent: true;
@@ -4344,6 +4380,7 @@ export declare const OPERATIONS: readonly [{
4344
4380
  confirmed: import("zod").ZodLiteral<true>;
4345
4381
  expectedRevision: import("zod").ZodNumber;
4346
4382
  quote: import("zod").ZodString;
4383
+ savePaymentMethod: import("zod").ZodOptional<import("zod").ZodBoolean>;
4347
4384
  }, import("zod/v4/core").$strict>;
4348
4385
  readonly requestExample: {
4349
4386
  confirmed?: never;
@@ -1,6 +1,7 @@
1
1
  import { effectiveCustomerLimitsSchema } from "./effective-limits.js";
2
2
  import { z } from "./zod.js";
3
3
  import { MEMBER_OPERATIONS } from "./members.js";
4
+ import { PROJECT_NOTIFICATION_OPERATIONS } from "./project-notifications.js";
4
5
  import { DATA_EXPORT_OPERATIONS } from "./data-export.js";
5
6
  import { ORGANIZATION_LIFECYCLE_OPERATIONS } from "./organization-lifecycle.js";
6
7
  import { API_UNUSED_RESPONSE_SCHEMA } from "./operation-definitions.js";
@@ -527,6 +528,7 @@ export const OPERATIONS = [
527
528
  },
528
529
  ...DATA_EXPORT_OPERATIONS,
529
530
  ...MEMBER_OPERATIONS,
531
+ ...PROJECT_NOTIFICATION_OPERATIONS,
530
532
  ...ORGANIZATION_LIFECYCLE_OPERATIONS,
531
533
  {
532
534
  creates: false,
@@ -2492,7 +2494,7 @@ export const OPERATIONS = [
2492
2494
  creates: true,
2493
2495
  description: globalThis.GREATWAIT_RUNTIME_CONTRACTS_ONLY
2494
2496
  ? ""
2495
- : "Confirms one exact manual execution-credit quote and creates or replays its durable payment operation. Billing-owner authority and explicit agent approval apply; the Idempotency-Key preserves one payment identity across retries. Manual funding stays outside the automatic-charge ceiling. A browser redirect never grants credit: only authenticated provider reconciliation can move the operation to paid and grant its exact execution credit once, while the operation reports provider-confirmed tax and gross when known.",
2497
+ : "Confirms one exact manual execution-credit quote and creates or replays its durable payment operation. Billing-owner authority and explicit agent approval apply; the Idempotency-Key preserves one payment identity across retries. Manual funding stays outside the automatic-charge ceiling. A browser redirect never grants credit: only authenticated provider reconciliation can move the operation to paid and grant its exact execution credit once, while the operation reports provider-confirmed tax and gross when known. With savePaymentMethod, the payment method used becomes the organization's saved payment method once the payment is confirmed, unless one is already saved.",
2496
2498
  environments: ["live"],
2497
2499
  id: "billing.purchase",
2498
2500
  idempotent: true,
package/dist/policy.d.ts CHANGED
@@ -47,10 +47,11 @@ export declare function grantableScopes(): readonly Scope[];
47
47
  * that will be refused `authentication_required` on the only route it names,
48
48
  * for ever, and nothing about the key says so.
49
49
  *
50
- * `projects:read` remains excluded because enumerating an organization is a
51
- * signed-in member's question. Project writes are different: a key's authority
52
- * already names exactly the project that rename/archive/delete may affect, so
53
- * those scopes become usable when their operations do.
50
+ * Listing an organization's projects stays a signed-in member's question, and
51
+ * that operation refuses a key. `projects:read` is usable by a key all the same
52
+ * since W9-54, because reading its own project's notification settings declares
53
+ * it. A key's authority already names exactly the one project those reads,
54
+ * and rename/archive/delete, may affect.
54
55
  */
55
56
  export declare function credentialScopes(): readonly Scope[];
56
57
  /** One row of the generated policy matrix. */
package/dist/policy.js CHANGED
@@ -136,10 +136,11 @@ export function grantableScopes() {
136
136
  * that will be refused `authentication_required` on the only route it names,
137
137
  * for ever, and nothing about the key says so.
138
138
  *
139
- * `projects:read` remains excluded because enumerating an organization is a
140
- * signed-in member's question. Project writes are different: a key's authority
141
- * already names exactly the project that rename/archive/delete may affect, so
142
- * those scopes become usable when their operations do.
139
+ * Listing an organization's projects stays a signed-in member's question, and
140
+ * that operation refuses a key. `projects:read` is usable by a key all the same
141
+ * since W9-54, because reading its own project's notification settings declares
142
+ * it. A key's authority already names exactly the one project those reads,
143
+ * and rename/archive/delete, may affect.
143
144
  */
144
145
  export function credentialScopes() {
145
146
  const usable = new Set(allOperations()
@@ -0,0 +1,238 @@
1
+ import { z } from "./zod.js";
2
+ /** Per-project/environment preferences. Billing-safety notices are separate. */
3
+ export declare const notificationEmailRecipientsSchema: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
4
+ kind: import("zod").ZodLiteral<"admins">;
5
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
6
+ kind: import("zod").ZodLiteral<"members">;
7
+ memberIds: import("zod").ZodArray<import("zod").ZodString>;
8
+ }, import("zod/v4/core").$strict>], "kind">;
9
+ export declare const notificationEmailSettingsSchema: import("zod").ZodObject<{
10
+ enabled: import("zod").ZodBoolean;
11
+ recipients: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
12
+ kind: import("zod").ZodLiteral<"admins">;
13
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
14
+ kind: import("zod").ZodLiteral<"members">;
15
+ memberIds: import("zod").ZodArray<import("zod").ZodString>;
16
+ }, import("zod/v4/core").$strict>], "kind">;
17
+ scheduleKinds: import("zod").ZodEnum<{
18
+ both: "both";
19
+ "one-shot": "one-shot";
20
+ recurring: "recurring";
21
+ }>;
22
+ }, import("zod/v4/core").$strict>;
23
+ export declare const statusWebhookEventSchema: import("zod").ZodEnum<{
24
+ failed: "failed";
25
+ }>;
26
+ export type StatusWebhookEvent = z.infer<typeof statusWebhookEventSchema>;
27
+ export declare const statusWebhookConfigurationSchema: import("zod").ZodObject<{
28
+ url: import("zod").ZodString;
29
+ events: import("zod").ZodArray<import("zod").ZodEnum<{
30
+ failed: "failed";
31
+ }>>;
32
+ }, import("zod/v4/core").$strict>;
33
+ export declare const projectNotificationSettingsSchema: import("zod").ZodObject<{
34
+ project: import("zod").ZodString;
35
+ environmentKind: import("zod").ZodEnum<{
36
+ test: "test";
37
+ live: "live";
38
+ }>;
39
+ revision: import("zod").ZodNumber;
40
+ email: import("zod").ZodObject<{
41
+ enabled: import("zod").ZodBoolean;
42
+ recipients: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
43
+ kind: import("zod").ZodLiteral<"admins">;
44
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
45
+ kind: import("zod").ZodLiteral<"members">;
46
+ memberIds: import("zod").ZodArray<import("zod").ZodString>;
47
+ }, import("zod/v4/core").$strict>], "kind">;
48
+ scheduleKinds: import("zod").ZodEnum<{
49
+ both: "both";
50
+ "one-shot": "one-shot";
51
+ recurring: "recurring";
52
+ }>;
53
+ }, import("zod/v4/core").$strict>;
54
+ statusWebhook: import("zod").ZodOptional<import("zod").ZodObject<{
55
+ url: import("zod").ZodString;
56
+ events: import("zod").ZodArray<import("zod").ZodEnum<{
57
+ failed: "failed";
58
+ }>>;
59
+ signingKey: import("zod").ZodOptional<import("zod").ZodObject<{
60
+ id: import("zod").ZodString;
61
+ }, import("zod/v4/core").$strict>>;
62
+ revision: import("zod").ZodNumber;
63
+ }, import("zod/v4/core").$strict>>;
64
+ }, import("zod/v4/core").$strict>;
65
+ export type ProjectNotificationSettings = z.infer<typeof projectNotificationSettingsSchema>;
66
+ export declare const projectNotificationSettingsUpdateRequestSchema: import("zod").ZodObject<{
67
+ expectedRevision: import("zod").ZodNumber;
68
+ email: import("zod").ZodOptional<import("zod").ZodObject<{
69
+ enabled: import("zod").ZodBoolean;
70
+ recipients: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
71
+ kind: import("zod").ZodLiteral<"admins">;
72
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
73
+ kind: import("zod").ZodLiteral<"members">;
74
+ memberIds: import("zod").ZodArray<import("zod").ZodString>;
75
+ }, import("zod/v4/core").$strict>], "kind">;
76
+ scheduleKinds: import("zod").ZodEnum<{
77
+ both: "both";
78
+ "one-shot": "one-shot";
79
+ recurring: "recurring";
80
+ }>;
81
+ }, import("zod/v4/core").$strict>>;
82
+ statusWebhook: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
83
+ url: import("zod").ZodString;
84
+ events: import("zod").ZodArray<import("zod").ZodEnum<{
85
+ failed: "failed";
86
+ }>>;
87
+ }, import("zod/v4/core").$strict>>>;
88
+ }, import("zod/v4/core").$strict>;
89
+ export type ProjectNotificationSettingsUpdateRequest = z.infer<typeof projectNotificationSettingsUpdateRequestSchema>;
90
+ export declare const statusSigningKeyRequestSchema: import("zod").ZodObject<{
91
+ expectedRevision: import("zod").ZodNumber;
92
+ }, import("zod/v4/core").$strict>;
93
+ export declare const statusSigningKeyCreatedSchema: import("zod").ZodObject<{
94
+ settings: import("zod").ZodObject<{
95
+ project: import("zod").ZodString;
96
+ environmentKind: import("zod").ZodEnum<{
97
+ test: "test";
98
+ live: "live";
99
+ }>;
100
+ revision: import("zod").ZodNumber;
101
+ email: import("zod").ZodObject<{
102
+ enabled: import("zod").ZodBoolean;
103
+ recipients: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
104
+ kind: import("zod").ZodLiteral<"admins">;
105
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
106
+ kind: import("zod").ZodLiteral<"members">;
107
+ memberIds: import("zod").ZodArray<import("zod").ZodString>;
108
+ }, import("zod/v4/core").$strict>], "kind">;
109
+ scheduleKinds: import("zod").ZodEnum<{
110
+ both: "both";
111
+ "one-shot": "one-shot";
112
+ recurring: "recurring";
113
+ }>;
114
+ }, import("zod/v4/core").$strict>;
115
+ statusWebhook: import("zod").ZodOptional<import("zod").ZodObject<{
116
+ url: import("zod").ZodString;
117
+ events: import("zod").ZodArray<import("zod").ZodEnum<{
118
+ failed: "failed";
119
+ }>>;
120
+ signingKey: import("zod").ZodOptional<import("zod").ZodObject<{
121
+ id: import("zod").ZodString;
122
+ }, import("zod/v4/core").$strict>>;
123
+ revision: import("zod").ZodNumber;
124
+ }, import("zod/v4/core").$strict>>;
125
+ }, import("zod/v4/core").$strict>;
126
+ keyId: import("zod").ZodString;
127
+ secret: import("zod").ZodString;
128
+ shownOnce: import("zod").ZodLiteral<true>;
129
+ }, import("zod/v4/core").$strict>;
130
+ export type StatusSigningKeyCreated = z.infer<typeof statusSigningKeyCreatedSchema>;
131
+ /** Safe notification payload: no customer request or response content. */
132
+ export declare const statusWebhookPayloadSchema: import("zod").ZodObject<{
133
+ version: import("zod").ZodLiteral<"2026-10-08">;
134
+ eventId: import("zod").ZodString;
135
+ type: import("zod").ZodEnum<{
136
+ failed: "failed";
137
+ }>;
138
+ projectId: import("zod").ZodString;
139
+ environmentKind: import("zod").ZodEnum<{
140
+ test: "test";
141
+ live: "live";
142
+ }>;
143
+ scheduleId: import("zod").ZodString;
144
+ occurrenceId: import("zod").ZodString;
145
+ occurredAt: import("zod").ZodString;
146
+ outcomeOrigin: import("zod").ZodEnum<{
147
+ customer: "customer";
148
+ platform: "platform";
149
+ }>;
150
+ diagnostic: import("zod").ZodOptional<import("zod").ZodString>;
151
+ statusCode: import("zod").ZodOptional<import("zod").ZodNumber>;
152
+ pause: import("zod").ZodOptional<import("zod").ZodUnknown>;
153
+ }, import("zod/v4/core").$strip>;
154
+ export type StatusWebhookPayload = z.infer<typeof statusWebhookPayloadSchema>;
155
+ export declare const statusWebhookDeliverySchema: import("zod").ZodObject<{
156
+ id: import("zod").ZodString;
157
+ event: import("zod").ZodEnum<{
158
+ failed: "failed";
159
+ }>;
160
+ schedule: import("zod").ZodString;
161
+ occurrence: import("zod").ZodString;
162
+ occurredAt: import("zod").ZodString;
163
+ url: import("zod").ZodString;
164
+ state: import("zod").ZodEnum<{
165
+ suppressed: "suppressed";
166
+ failed: "failed";
167
+ pending: "pending";
168
+ delivered: "delivered";
169
+ delivering: "delivering";
170
+ }>;
171
+ attempts: import("zod").ZodNumber;
172
+ nextAttemptAt: import("zod").ZodOptional<import("zod").ZodString>;
173
+ lastStatus: import("zod").ZodOptional<import("zod").ZodNumber>;
174
+ lastError: import("zod").ZodOptional<import("zod").ZodString>;
175
+ }, import("zod/v4/core").$strict>;
176
+ export type StatusWebhookDelivery = z.infer<typeof statusWebhookDeliverySchema>;
177
+ export declare const statusWebhookDeliveryPageSchema: import("zod").ZodObject<{
178
+ data: import("zod").ZodArray<import("zod").ZodObject<{
179
+ id: import("zod").ZodString;
180
+ event: import("zod").ZodEnum<{
181
+ failed: "failed";
182
+ }>;
183
+ schedule: import("zod").ZodString;
184
+ occurrence: import("zod").ZodString;
185
+ occurredAt: import("zod").ZodString;
186
+ url: import("zod").ZodString;
187
+ state: import("zod").ZodEnum<{
188
+ suppressed: "suppressed";
189
+ failed: "failed";
190
+ pending: "pending";
191
+ delivered: "delivered";
192
+ delivering: "delivering";
193
+ }>;
194
+ attempts: import("zod").ZodNumber;
195
+ nextAttemptAt: import("zod").ZodOptional<import("zod").ZodString>;
196
+ lastStatus: import("zod").ZodOptional<import("zod").ZodNumber>;
197
+ lastError: import("zod").ZodOptional<import("zod").ZodString>;
198
+ }, import("zod/v4/core").$strict>>;
199
+ nextCursor: import("zod").ZodOptional<import("zod").ZodString>;
200
+ }, import("zod/v4/core").$strict>;
201
+ export type StatusWebhookDeliveryPage = z.infer<typeof statusWebhookDeliveryPageSchema>;
202
+ export declare const PROJECT_NOTIFICATION_OPERATIONS: readonly [import("./operations.js").OperationDefinition & {
203
+ readonly id: "projectnotifications.read";
204
+ }, import("./operations.js").OperationDefinition & {
205
+ readonly id: "projectnotifications.update";
206
+ } & {
207
+ readonly request: import("zod").ZodObject<{
208
+ expectedRevision: import("zod").ZodNumber;
209
+ email: import("zod").ZodOptional<import("zod").ZodObject<{
210
+ enabled: import("zod").ZodBoolean;
211
+ recipients: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
212
+ kind: import("zod").ZodLiteral<"admins">;
213
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
214
+ kind: import("zod").ZodLiteral<"members">;
215
+ memberIds: import("zod").ZodArray<import("zod").ZodString>;
216
+ }, import("zod/v4/core").$strict>], "kind">;
217
+ scheduleKinds: import("zod").ZodEnum<{
218
+ both: "both";
219
+ "one-shot": "one-shot";
220
+ recurring: "recurring";
221
+ }>;
222
+ }, import("zod/v4/core").$strict>>;
223
+ statusWebhook: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
224
+ url: import("zod").ZodString;
225
+ events: import("zod").ZodArray<import("zod").ZodEnum<{
226
+ failed: "failed";
227
+ }>>;
228
+ }, import("zod/v4/core").$strict>>>;
229
+ }, import("zod/v4/core").$strict>;
230
+ }, import("./operations.js").OperationDefinition & {
231
+ readonly id: "projectnotifications.rotateSigningKey";
232
+ } & {
233
+ readonly request: import("zod").ZodObject<{
234
+ expectedRevision: import("zod").ZodNumber;
235
+ }, import("zod/v4/core").$strict>;
236
+ }, import("./operations.js").OperationDefinition & {
237
+ readonly id: "statusdeliveries.list";
238
+ }];