@zackbart/connecta 0.33.0 → 0.34.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 (131) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/README.md +100 -128
  3. package/SECURITY.md +1 -1
  4. package/bin/version.mjs +1 -1
  5. package/dist/activity.d.ts +3 -0
  6. package/dist/branding.d.ts +7 -0
  7. package/dist/branding.js +76 -9
  8. package/dist/catalog-drift.d.ts +30 -26
  9. package/dist/catalog-drift.js +169 -84
  10. package/dist/catalog-service.js +16 -2
  11. package/dist/config-value-sources.js +6 -1
  12. package/dist/config.d.ts +13 -2
  13. package/dist/config.js +36 -2
  14. package/dist/connector-caller.js +2 -1
  15. package/dist/connectors/api-connector.d.ts +3 -0
  16. package/dist/connectors/api-connector.js +5 -1
  17. package/dist/connectors/option-shapes.js +1 -1
  18. package/dist/connectors/remote-mcp.d.ts +2 -0
  19. package/dist/connectors/remote-mcp.js +5 -1
  20. package/dist/describe-config.d.ts +5 -1
  21. package/dist/describe-config.js +2 -0
  22. package/dist/execute.js +1 -11
  23. package/dist/fix-prompt.js +2 -2
  24. package/dist/index.js +1 -0
  25. package/dist/invocation.js +3 -2
  26. package/dist/membership.d.ts +2 -0
  27. package/dist/meta-tools.js +3 -2
  28. package/dist/oauth-callback-outcome.js +2 -2
  29. package/dist/operator-ui/agents.d.ts +1 -1
  30. package/dist/operator-ui/agents.js +16 -16
  31. package/dist/operator-ui/config-summary.js +565 -0
  32. package/dist/operator-ui/connection-map.js +376 -0
  33. package/dist/operator-ui/endpoints.js +45 -16
  34. package/dist/operator-ui/fix-prompts.js +1 -1
  35. package/dist/operator-ui/generated.js +4 -4
  36. package/dist/operator-ui/health.js +52 -0
  37. package/dist/operator-ui/member-page.js +13 -28
  38. package/dist/operator-ui/overview.js +123 -0
  39. package/dist/operator-ui/view.d.ts +26 -22
  40. package/dist/operator-ui/view.js +130 -96
  41. package/dist/page-styles.js +5 -3
  42. package/dist/provider.d.ts +6 -1
  43. package/dist/provider.js +18 -1
  44. package/dist/providers/_shared/google/workspace.d.ts +9 -4
  45. package/dist/providers/_shared/google/workspace.js +7 -3
  46. package/dist/providers/basecamp/index.d.ts +2 -0
  47. package/dist/providers/breeze/index.d.ts +2 -0
  48. package/dist/providers/ccb/index.d.ts +2 -0
  49. package/dist/providers/ccb/index.js +2 -2
  50. package/dist/providers/cloudflare/index.d.ts +2 -0
  51. package/dist/providers/cloudflare/index.js +5 -1
  52. package/dist/providers/cloudflare/openapi.generated.js +3296 -3206
  53. package/dist/providers/cloudflare/rest.js +19 -0
  54. package/dist/providers/cloudflare/skill.generated.js +2 -2
  55. package/dist/providers/cloudflare/value-safety.js +51 -18
  56. package/dist/providers/docs/index.js +1 -1
  57. package/dist/providers/docs/skill.generated.js +2 -2
  58. package/dist/providers/drive/index.js +1 -1
  59. package/dist/providers/drive/skill.generated.js +2 -2
  60. package/dist/providers/forms/index.js +1 -1
  61. package/dist/providers/forms/skill.generated.js +2 -2
  62. package/dist/providers/gmail/index.js +1 -1
  63. package/dist/providers/gmail/skill.generated.js +2 -2
  64. package/dist/providers/intercom/index.d.ts +24 -0
  65. package/dist/providers/intercom/index.js +121 -0
  66. package/dist/providers/intercom/skill.generated.js +8 -0
  67. package/dist/providers/linear/index.js +204 -19
  68. package/dist/providers/linear/skill.generated.js +2 -2
  69. package/dist/providers/mixpanel/index.d.ts +2 -0
  70. package/dist/providers/mixpanel/index.js +21 -17
  71. package/dist/providers/mixpanel/skill.generated.js +3 -3
  72. package/dist/providers/notion/index.d.ts +2 -0
  73. package/dist/providers/notion/index.js +1 -1
  74. package/dist/providers/notion/skill.generated.js +1 -1
  75. package/dist/providers/overflow/index.d.ts +2 -0
  76. package/dist/providers/overflow/index.js +1 -1
  77. package/dist/providers/overflow/skill.generated.js +2 -2
  78. package/dist/providers/planning-center/index.d.ts +2 -0
  79. package/dist/providers/planning-center/index.js +1 -1
  80. package/dist/providers/planning-center/skill.generated.js +4 -4
  81. package/dist/providers/revenuecat/index.d.ts +5 -3
  82. package/dist/providers/revenuecat/index.js +147 -7
  83. package/dist/providers/revenuecat/skill.generated.js +3 -3
  84. package/dist/providers/sheets/index.js +1 -1
  85. package/dist/providers/sheets/skill.generated.js +2 -2
  86. package/dist/providers/slides/index.js +1 -1
  87. package/dist/providers/slides/skill.generated.js +2 -2
  88. package/dist/providers/stripe/index.d.ts +2 -0
  89. package/dist/providers/stripe/index.js +50 -30
  90. package/dist/providers/stripe/skill.generated.js +2 -1
  91. package/dist/providers/tithely/index.d.ts +2 -0
  92. package/dist/providers/tithely/index.js +1 -1
  93. package/dist/providers/vercel/index.d.ts +2 -0
  94. package/dist/providers/vercel/index.js +2 -2
  95. package/dist/providers/vercel/openapi.generated.js +391 -374
  96. package/dist/providers/vercel/skill.generated.js +2 -2
  97. package/dist/providers/vercel/value-safety.js +14 -4
  98. package/dist/registry.d.ts +10 -14
  99. package/dist/registry.js +77 -62
  100. package/dist/routes/mcp.js +20 -13
  101. package/dist/routes/oauth.js +2 -2
  102. package/dist/routes/ui-data.js +8 -2
  103. package/dist/skills.js +18 -2
  104. package/dist/storage/sql.js +5 -1
  105. package/dist/types.d.ts +36 -11
  106. package/dist/ui.js +9 -4
  107. package/dist/usage-guide.js +1 -1
  108. package/dist/version.d.ts +1 -1
  109. package/dist/version.js +1 -1
  110. package/documentation/README.md +2 -2
  111. package/documentation/architecture.md +66 -18
  112. package/documentation/auth.md +183 -67
  113. package/documentation/code-mode.md +30 -10
  114. package/documentation/deploying.md +5 -1
  115. package/documentation/integrating.md +64 -7
  116. package/documentation/meta-tools.md +38 -24
  117. package/documentation/migration-0.33.md +21 -13
  118. package/documentation/migration-0.34.md +67 -0
  119. package/documentation/operating.md +1 -1
  120. package/documentation/operator-tests.md +52 -20
  121. package/documentation/operator-ui.md +341 -104
  122. package/documentation/provider-auth-migration.md +22 -0
  123. package/examples/worker/AGENTS.md +15 -9
  124. package/examples/worker/README.md +41 -14
  125. package/examples/worker/src/connecta.config.ts +5 -4
  126. package/examples/worker/wrangler.jsonc +1 -1
  127. package/package.json +23 -19
  128. package/templates/node/AGENTS.md +13 -7
  129. package/templates/node/README.md +14 -11
  130. package/templates/node/package.json +1 -1
  131. package/templates/node/src/connecta.config.ts +2 -2
@@ -7,461 +7,601 @@ import { defineProvider } from "../../provider.js";
7
7
  /** RevenueCat publishes one hosted MCP endpoint, streamable HTTP. */
8
8
  export const REVENUECAT_MCP_ENDPOINT = "https://mcp.revenuecat.ai/mcp";
9
9
  /**
10
- * Reviewed in #705's provider audit against https://www.revenuecat.com/docs/tools/mcp/tools-reference.
11
- * Retains the release-reviewed inventory, including names absent from today's
12
- * public reference. Live annotations were not reverified without credentials.
13
- * No schema digest is asserted without a captured schema to review.
10
+ * Re-reviewed 2026-10-19 against RevenueCat's MCP reference and API v2 docs (#343, #703).
11
+ * This is a superset of permission-gated live catalogs, not a tool allowlist.
12
+ * Four reviewed schemas are pinned from live discovery; uncaptured schemas stay unpinned.
13
+ * Tools are optional in drift comparisons: permissions, project scope, and
14
+ * read-only keys can expose a subset of the reviewed inventory.
14
15
  */
15
16
  const REVENUECAT_CLASSIFICATION = {
16
17
  tools: {
17
18
  "get-account-billing": {
18
19
  "verdict": "read",
20
+ optional: true,
19
21
  "reason": "Retrieves RevenueCat account billing information without changing vendor state.",
20
22
  },
21
- "get-app": { "verdict": "read", "reason": "Retrieves RevenueCat app information without changing vendor state." },
23
+ "get-app": {
24
+ "verdict": "read",
25
+ optional: true,
26
+ "reason": "Retrieves RevenueCat app information without changing vendor state.",
27
+ },
22
28
  "get-project-ui-config": {
23
29
  "verdict": "read",
30
+ optional: true,
24
31
  "reason": "Retrieves RevenueCat project ui config information without changing vendor state.",
25
32
  },
26
33
  "list-account-billing-invoices": {
27
34
  "verdict": "read",
35
+ optional: true,
28
36
  "reason": "Retrieves RevenueCat account billing invoices information without changing vendor state.",
29
37
  },
30
38
  "list-app-public-api-keys": {
31
39
  "verdict": "read",
40
+ optional: true,
32
41
  "reason": "Retrieves RevenueCat app public api keys information without changing vendor state.",
33
42
  },
43
+ "list-app-subscription-groups": {
44
+ "verdict": "read",
45
+ optional: true,
46
+ "reason": "Lists App Store Connect subscription groups and products without changing vendor state; official MCP reference and live annotation agree.",
47
+ "schemaDigest": "sha256:8474bdced405e279ee56a36da289d26e8526ee8dec870aa731a9cc1fa14474c4",
48
+ },
34
49
  "list-apps": {
35
50
  "verdict": "read",
51
+ optional: true,
36
52
  "reason": "Retrieves RevenueCat apps information without changing vendor state.",
37
53
  },
38
54
  "list-audit-logs": {
39
55
  "verdict": "read",
56
+ optional: true,
40
57
  "reason": "Retrieves RevenueCat audit logs information without changing vendor state.",
41
58
  },
42
59
  "list-collaborators": {
43
60
  "verdict": "read",
61
+ optional: true,
44
62
  "reason": "Retrieves RevenueCat collaborators information without changing vendor state.",
45
63
  },
46
64
  "list-projects": {
47
65
  "verdict": "read",
66
+ optional: true,
48
67
  "reason": "Retrieves RevenueCat projects information without changing vendor state.",
49
68
  },
50
69
  "get-product": {
51
70
  "verdict": "read",
71
+ optional: true,
52
72
  "reason": "Retrieves RevenueCat product information without changing vendor state.",
53
73
  },
54
74
  "get-product-store-state": {
55
75
  "verdict": "read",
76
+ optional: true,
56
77
  "reason": "Retrieves RevenueCat product store state information without changing vendor state.",
57
78
  },
58
79
  "get-product-store-state-operation": {
59
80
  "verdict": "read",
81
+ optional: true,
60
82
  "reason": "Retrieves RevenueCat product store state operation information without changing vendor state.",
61
83
  },
62
84
  "get-product-store-state-plan": {
63
85
  "verdict": "read",
86
+ optional: true,
64
87
  "reason": "Retrieves RevenueCat product store state plan information without changing vendor state.",
65
88
  },
66
89
  "list-product-store-state-plans": {
67
90
  "verdict": "read",
91
+ optional: true,
68
92
  "reason": "Retrieves RevenueCat product store state plans information without changing vendor state.",
69
93
  },
70
94
  "list-products": {
71
95
  "verdict": "read",
96
+ optional: true,
72
97
  "reason": "Retrieves RevenueCat products information without changing vendor state.",
73
98
  },
74
99
  "get-entitlement": {
75
100
  "verdict": "read",
101
+ optional: true,
76
102
  "reason": "Retrieves RevenueCat entitlement information without changing vendor state.",
77
103
  },
78
104
  "get-products-from-entitlement": {
79
105
  "verdict": "read",
106
+ optional: true,
80
107
  "reason": "Retrieves RevenueCat products from entitlement information without changing vendor state.",
81
108
  },
82
109
  "list-entitlements": {
83
110
  "verdict": "read",
111
+ optional: true,
84
112
  "reason": "Retrieves RevenueCat entitlements information without changing vendor state.",
85
113
  },
86
114
  "get-offering": {
87
115
  "verdict": "read",
116
+ optional: true,
88
117
  "reason": "Retrieves RevenueCat offering information without changing vendor state.",
89
118
  },
90
119
  "get-offering-prices": {
91
120
  "verdict": "read",
121
+ optional: true,
92
122
  "reason": "Retrieves RevenueCat offering prices information without changing vendor state.",
93
123
  },
94
124
  "list-offerings": {
95
125
  "verdict": "read",
126
+ optional: true,
96
127
  "reason": "Retrieves RevenueCat offerings information without changing vendor state.",
97
128
  },
98
129
  "list-packages": {
99
130
  "verdict": "read",
131
+ optional: true,
100
132
  "reason": "Retrieves RevenueCat packages information without changing vendor state.",
101
133
  },
102
134
  "get-audience": {
103
135
  "verdict": "read",
136
+ optional: true,
104
137
  "reason": "Retrieves RevenueCat audience information without changing vendor state.",
105
138
  },
106
139
  "get-audience-filter-options": {
107
140
  "verdict": "read",
141
+ optional: true,
108
142
  "reason": "Retrieves RevenueCat audience filter options information without changing vendor state.",
109
143
  },
110
144
  "get-targeting-rule": {
111
145
  "verdict": "read",
146
+ optional: true,
112
147
  "reason": "Retrieves RevenueCat targeting rule information without changing vendor state.",
113
148
  },
114
149
  "list-audiences": {
115
150
  "verdict": "read",
151
+ optional: true,
116
152
  "reason": "Retrieves RevenueCat audiences information without changing vendor state.",
117
153
  },
118
154
  "list-targeting-rules": {
119
155
  "verdict": "read",
156
+ optional: true,
120
157
  "reason": "Retrieves RevenueCat targeting rules information without changing vendor state.",
121
158
  },
159
+ "preview-audience": {
160
+ "verdict": "read",
161
+ optional: true,
162
+ "reason": "Observational POST: previews matching customers without creating an audience; API v2 requires audiences:audiences:read and the live annotation agrees.",
163
+ "schemaDigest": "sha256:75d926cdc6a2b92ece3b2d8b2fdd21831deed71464024d0004da3d2bde769682",
164
+ },
165
+ "render-paywall-screenshot": {
166
+ "verdict": "read",
167
+ optional: true,
168
+ "reason": "Renders a paywall preview without publishing or editing it; the current official reference explicitly says Read and the live annotation agrees.",
169
+ "schemaDigest": "sha256:abb9d0e0e8674371fff7503b7c5f215ddbca9ebed12325c5d8b376eec7252294",
170
+ },
122
171
  "get-paywall": {
123
172
  "verdict": "read",
173
+ optional: true,
124
174
  "reason": "Retrieves RevenueCat paywall information without changing vendor state.",
125
175
  },
126
176
  "list-paywalls": {
127
177
  "verdict": "read",
178
+ optional: true,
128
179
  "reason": "Retrieves RevenueCat paywalls information without changing vendor state.",
129
180
  },
130
181
  "get-customer": {
131
182
  "verdict": "read",
183
+ optional: true,
132
184
  "reason": "Retrieves RevenueCat customer information without changing vendor state.",
133
185
  },
134
186
  "get-customer-center-config": {
135
187
  "verdict": "read",
188
+ optional: true,
136
189
  "reason": "Retrieves RevenueCat customer center config information without changing vendor state.",
137
190
  },
138
191
  "get-refund-request-preferences": {
139
192
  "verdict": "read",
193
+ optional: true,
140
194
  "reason": "Retrieves RevenueCat refund request preferences information without changing vendor state.",
141
195
  },
142
196
  "get-subscription": {
143
197
  "verdict": "read",
198
+ optional: true,
144
199
  "reason": "Retrieves RevenueCat subscription information without changing vendor state.",
145
200
  },
146
201
  "list-customer-events": {
147
202
  "verdict": "read",
203
+ optional: true,
148
204
  "reason": "Retrieves RevenueCat customer events information without changing vendor state.",
149
205
  },
150
206
  "list-customers": {
151
207
  "verdict": "read",
208
+ optional: true,
152
209
  "reason": "Retrieves RevenueCat customers information without changing vendor state.",
153
210
  },
154
211
  "list-purchases": {
155
212
  "verdict": "read",
213
+ optional: true,
156
214
  "reason": "Retrieves RevenueCat purchases information without changing vendor state.",
157
215
  },
158
216
  "list-subscriptions": {
159
217
  "verdict": "read",
218
+ optional: true,
160
219
  "reason": "Retrieves RevenueCat subscriptions information without changing vendor state.",
161
220
  },
162
221
  "list-virtual-currencies-balances": {
163
222
  "verdict": "read",
223
+ optional: true,
164
224
  "reason": "Retrieves RevenueCat virtual currencies balances information without changing vendor state.",
165
225
  },
166
226
  "get-virtual-currency": {
167
227
  "verdict": "read",
228
+ optional: true,
168
229
  "reason": "Retrieves RevenueCat virtual currency information without changing vendor state.",
169
230
  },
170
231
  "list-virtual-currencies": {
171
232
  "verdict": "read",
233
+ optional: true,
172
234
  "reason": "Retrieves RevenueCat virtual currencies information without changing vendor state.",
173
235
  },
174
236
  "get-benchmarks": {
175
237
  "verdict": "read",
238
+ optional: true,
176
239
  "reason": "Retrieves RevenueCat benchmarks information without changing vendor state.",
177
240
  },
178
241
  "get-chart-data": {
179
242
  "verdict": "read",
243
+ optional: true,
180
244
  "reason": "Retrieves RevenueCat chart data information without changing vendor state.",
181
245
  },
182
246
  "get-chart-options-schema": {
183
247
  "verdict": "read",
248
+ optional: true,
184
249
  "reason": "Retrieves RevenueCat chart options schema information without changing vendor state.",
185
250
  },
186
251
  "get-experiment": {
187
252
  "verdict": "read",
253
+ optional: true,
188
254
  "reason": "Retrieves RevenueCat experiment information without changing vendor state.",
189
255
  },
190
256
  "get-experiment-results": {
191
257
  "verdict": "read",
258
+ optional: true,
192
259
  "reason": "Retrieves RevenueCat experiment results information without changing vendor state.",
193
260
  },
194
261
  "get-overview-metrics": {
195
262
  "verdict": "read",
263
+ optional: true,
196
264
  "reason": "Retrieves RevenueCat overview metrics information without changing vendor state.",
197
265
  },
198
266
  "get-revenue-metric": {
199
267
  "verdict": "read",
268
+ optional: true,
200
269
  "reason": "Retrieves RevenueCat revenue metric information without changing vendor state.",
201
270
  },
202
271
  "list-experiments": {
203
272
  "verdict": "read",
273
+ optional: true,
204
274
  "reason": "Retrieves RevenueCat experiments information without changing vendor state.",
205
275
  },
206
276
  "get-webhook-integration": {
207
277
  "verdict": "read",
278
+ optional: true,
208
279
  "reason": "Retrieves RevenueCat webhook integration information without changing vendor state.",
209
280
  },
210
281
  "list-webhook-integrations": {
211
282
  "verdict": "read",
283
+ optional: true,
212
284
  "reason": "Retrieves RevenueCat webhook integrations information without changing vendor state.",
213
285
  },
214
286
  "list-sdk-feature-gates": {
215
287
  "verdict": "read",
288
+ optional: true,
216
289
  "reason": "Retrieves RevenueCat sdk feature gates information without changing vendor state.",
217
290
  },
218
291
  "list-sdk-versions": {
219
292
  "verdict": "read",
293
+ optional: true,
220
294
  "reason": "Retrieves RevenueCat sdk versions information without changing vendor state.",
221
295
  },
222
296
  "get-paywall-ai-task": {
223
297
  "verdict": "read",
298
+ optional: true,
224
299
  "reason": "Retrieves RevenueCat paywall ai task information without changing vendor state.",
225
300
  },
226
301
  "create-app": {
227
302
  "verdict": "write",
303
+ optional: true,
228
304
  "reason": "create app creates or appends RevenueCat state; it has side effects.",
229
305
  },
230
306
  "create-project": {
231
307
  "verdict": "write",
308
+ optional: true,
232
309
  "reason": "create project creates or appends RevenueCat state; it has side effects.",
233
310
  },
234
- "update-app": { "verdict": "destructive", "reason": "update app changes existing RevenueCat state or removes it." },
311
+ "update-app": {
312
+ "verdict": "destructive",
313
+ optional: true,
314
+ "reason": "update app changes existing RevenueCat state or removes it.",
315
+ },
235
316
  "update-project-ui-config": {
236
317
  "verdict": "destructive",
318
+ optional: true,
237
319
  "reason": "update project ui config changes existing RevenueCat state or removes it.",
238
320
  },
239
321
  "validate-app-credentials": {
240
322
  "verdict": "write",
241
- "reason": "validate app credentials creates or appends RevenueCat state; it has side effects.",
323
+ optional: true,
324
+ "reason": "Kept write conservatively: the MCP reference says Read and promises credentials are unchanged, but the live readOnlyHint is false and API v2 app docs do not establish whether validation results/status persist. No claim that validation mutates credentials.",
325
+ "schemaDigest": "sha256:680c861273535483ea19c032b4430b7f085fb89d6240853c15ed9284e50672c6",
242
326
  },
243
327
  "archive-product": {
244
328
  "verdict": "destructive",
329
+ optional: true,
245
330
  "reason": "archive product changes existing RevenueCat state or removes it.",
246
331
  },
247
332
  "create-product": {
248
333
  "verdict": "write",
334
+ optional: true,
249
335
  "reason": "create product creates or appends RevenueCat state; it has side effects.",
250
336
  },
251
337
  "create-product-prices": {
252
338
  "verdict": "destructive",
339
+ optional: true,
253
340
  "reason": "create product prices changes existing RevenueCat state or removes it.",
254
341
  },
255
342
  "equalize-subscription-prices": {
256
343
  "verdict": "write",
344
+ optional: true,
257
345
  "reason": "equalize subscription prices creates or appends RevenueCat state; it has side effects.",
258
346
  },
259
347
  "set-product-store-state": {
260
348
  "verdict": "destructive",
349
+ optional: true,
261
350
  "reason": "set product store state changes existing RevenueCat state or removes it.",
262
351
  },
263
352
  "submit-products-to-store": {
264
353
  "verdict": "destructive",
354
+ optional: true,
265
355
  "reason": "submit products to store changes existing RevenueCat state or removes it.",
266
356
  },
267
357
  "unarchive-product": {
268
358
  "verdict": "destructive",
359
+ optional: true,
269
360
  "reason": "unarchive product changes existing RevenueCat state or removes it.",
270
361
  },
271
362
  "update-product": {
272
363
  "verdict": "destructive",
364
+ optional: true,
273
365
  "reason": "update product changes existing RevenueCat state or removes it.",
274
366
  },
275
367
  "upload-product-store-state-screenshot": {
276
368
  "verdict": "write",
369
+ optional: true,
277
370
  "reason": "upload product store state screenshot creates or appends RevenueCat state; it has side effects.",
278
371
  },
279
372
  "create-product-store-state-plan": {
280
373
  "verdict": "write",
374
+ optional: true,
281
375
  "reason": "create product store state plan creates or appends RevenueCat state; it has side effects.",
282
376
  },
283
377
  "plan-product-store-state-plan": {
284
378
  "verdict": "destructive",
379
+ optional: true,
285
380
  "reason": "Advances a store-state plan workflow and can create asynchronous task state.",
286
381
  },
287
382
  "apply-product-store-state-plan": {
288
383
  "verdict": "destructive",
384
+ optional: true,
289
385
  "reason": "Applies a plan to store configuration and can change existing products.",
290
386
  },
291
387
  "update-product-store-state-plan": {
292
388
  "verdict": "destructive",
389
+ optional: true,
293
390
  "reason": "update product store state plan changes existing RevenueCat state or removes it.",
294
391
  },
295
392
  "discard-product-store-state-plan": {
296
393
  "verdict": "destructive",
394
+ optional: true,
297
395
  "reason": "discard product store state plan changes existing RevenueCat state or removes it.",
298
396
  },
299
397
  "archive-entitlement": {
300
398
  "verdict": "destructive",
399
+ optional: true,
301
400
  "reason": "archive entitlement changes existing RevenueCat state or removes it.",
302
401
  },
303
402
  "attach-products-to-entitlement": {
304
403
  "verdict": "write",
404
+ optional: true,
305
405
  "reason": "attach products to entitlement creates or appends RevenueCat state; it has side effects.",
306
406
  },
307
407
  "create-entitlement": {
308
408
  "verdict": "write",
409
+ optional: true,
309
410
  "reason": "create entitlement creates or appends RevenueCat state; it has side effects.",
310
411
  },
311
412
  "detach-products-from-entitlement": {
312
413
  "verdict": "destructive",
414
+ optional: true,
313
415
  "reason": "detach products from entitlement changes existing RevenueCat state or removes it.",
314
416
  },
315
417
  "unarchive-entitlement": {
316
418
  "verdict": "destructive",
419
+ optional: true,
317
420
  "reason": "unarchive entitlement changes existing RevenueCat state or removes it.",
318
421
  },
319
422
  "update-entitlement": {
320
423
  "verdict": "destructive",
424
+ optional: true,
321
425
  "reason": "update entitlement changes existing RevenueCat state or removes it.",
322
426
  },
323
427
  "archive-offering": {
324
428
  "verdict": "destructive",
429
+ optional: true,
325
430
  "reason": "archive offering changes existing RevenueCat state or removes it.",
326
431
  },
327
432
  "attach-products-to-package": {
328
433
  "verdict": "write",
434
+ optional: true,
329
435
  "reason": "attach products to package creates or appends RevenueCat state; it has side effects.",
330
436
  },
331
437
  "create-offering": {
332
438
  "verdict": "write",
439
+ optional: true,
333
440
  "reason": "create offering creates or appends RevenueCat state; it has side effects.",
334
441
  },
335
442
  "create-packages": {
336
443
  "verdict": "write",
444
+ optional: true,
337
445
  "reason": "create packages creates or appends RevenueCat state; it has side effects.",
338
446
  },
339
447
  "delete-package-from-offering": {
340
448
  "verdict": "destructive",
449
+ optional: true,
341
450
  "reason": "delete package from offering changes existing RevenueCat state or removes it.",
342
451
  },
343
452
  "detach-products-from-package": {
344
453
  "verdict": "destructive",
454
+ optional: true,
345
455
  "reason": "detach products from package changes existing RevenueCat state or removes it.",
346
456
  },
347
457
  "unarchive-offering": {
348
458
  "verdict": "destructive",
459
+ optional: true,
349
460
  "reason": "unarchive offering changes existing RevenueCat state or removes it.",
350
461
  },
351
462
  "update-offering": {
352
463
  "verdict": "destructive",
464
+ optional: true,
353
465
  "reason": "update offering changes existing RevenueCat state or removes it.",
354
466
  },
355
467
  "create-audience": {
356
468
  "verdict": "write",
469
+ optional: true,
357
470
  "reason": "create audience creates or appends RevenueCat state; it has side effects.",
358
471
  },
359
472
  "update-audience": {
360
473
  "verdict": "destructive",
474
+ optional: true,
361
475
  "reason": "update audience changes existing RevenueCat state or removes it.",
362
476
  },
363
477
  "create-targeting-rule": {
364
478
  "verdict": "write",
479
+ optional: true,
365
480
  "reason": "create targeting rule creates or appends RevenueCat state; it has side effects.",
366
481
  },
367
482
  "update-targeting-rule": {
368
483
  "verdict": "destructive",
484
+ optional: true,
369
485
  "reason": "update targeting rule changes existing RevenueCat state or removes it.",
370
486
  },
371
487
  "delete-targeting-rule": {
372
488
  "verdict": "destructive",
489
+ optional: true,
373
490
  "reason": "delete targeting rule changes existing RevenueCat state or removes it.",
374
491
  },
375
492
  "attach-offering-to-paywall": {
376
493
  "verdict": "destructive",
494
+ optional: true,
377
495
  "reason": "attach offering to paywall changes existing RevenueCat state or removes it.",
378
496
  },
379
497
  "detach-offering-from-paywall": {
380
498
  "verdict": "destructive",
499
+ optional: true,
381
500
  "reason": "detach offering from paywall changes existing RevenueCat state or removes it.",
382
501
  },
383
502
  "duplicate-paywall": {
384
503
  "verdict": "write",
504
+ optional: true,
385
505
  "reason": "duplicate paywall creates or appends RevenueCat state; it has side effects.",
386
506
  },
387
507
  "publish-paywall": {
388
508
  "verdict": "destructive",
509
+ optional: true,
389
510
  "reason": "publish paywall changes existing RevenueCat state or removes it.",
390
511
  },
391
512
  "unpublish-paywall": {
392
513
  "verdict": "destructive",
514
+ optional: true,
393
515
  "reason": "unpublish paywall changes existing RevenueCat state or removes it.",
394
516
  },
395
517
  "duplicate-offering": {
396
518
  "verdict": "write",
519
+ optional: true,
397
520
  "reason": "duplicate offering creates or appends RevenueCat state; it has side effects.",
398
521
  },
399
522
  "create-experiment": {
400
523
  "verdict": "write",
524
+ optional: true,
401
525
  "reason": "create experiment creates or appends RevenueCat state; it has side effects.",
402
526
  },
403
527
  "pause-experiment": {
404
528
  "verdict": "destructive",
529
+ optional: true,
405
530
  "reason": "pause experiment changes existing RevenueCat state or removes it.",
406
531
  },
407
532
  "resume-experiment": {
408
533
  "verdict": "destructive",
534
+ optional: true,
409
535
  "reason": "resume experiment changes existing RevenueCat state or removes it.",
410
536
  },
411
537
  "start-experiment": {
412
538
  "verdict": "destructive",
539
+ optional: true,
413
540
  "reason": "start experiment changes existing RevenueCat state or removes it.",
414
541
  },
415
542
  "stop-experiment": {
416
543
  "verdict": "destructive",
544
+ optional: true,
417
545
  "reason": "stop experiment changes existing RevenueCat state or removes it.",
418
546
  },
419
547
  "update-experiment": {
420
548
  "verdict": "destructive",
549
+ optional: true,
421
550
  "reason": "update experiment changes existing RevenueCat state or removes it.",
422
551
  },
423
552
  "assign-customer-offering": {
424
553
  "verdict": "destructive",
554
+ optional: true,
425
555
  "reason": "assign customer offering changes existing RevenueCat state or removes it.",
426
556
  },
427
557
  "grant-customer-entitlement": {
428
558
  "verdict": "destructive",
559
+ optional: true,
429
560
  "reason": "grant customer entitlement changes existing RevenueCat state or removes it.",
430
561
  },
431
562
  "archive-virtual-currency": {
432
563
  "verdict": "destructive",
564
+ optional: true,
433
565
  "reason": "archive virtual currency changes existing RevenueCat state or removes it.",
434
566
  },
435
567
  "create-virtual-currency": {
436
568
  "verdict": "write",
569
+ optional: true,
437
570
  "reason": "create virtual currency creates or appends RevenueCat state; it has side effects.",
438
571
  },
439
572
  "unarchive-virtual-currency": {
440
573
  "verdict": "destructive",
574
+ optional: true,
441
575
  "reason": "unarchive virtual currency changes existing RevenueCat state or removes it.",
442
576
  },
443
577
  "update-virtual-currency": {
444
578
  "verdict": "destructive",
579
+ optional: true,
445
580
  "reason": "update virtual currency changes existing RevenueCat state or removes it.",
446
581
  },
447
582
  "create-webhook-integration": {
448
583
  "verdict": "destructive",
584
+ optional: true,
449
585
  "reason": "Starts delivering customer events to a caller-supplied URL; omitted filters deliver every customer event in the project. Destructive by consequence even though it creates a new integration.",
450
586
  },
451
587
  "delete-webhook-integration": {
452
588
  "verdict": "destructive",
589
+ optional: true,
453
590
  "reason": "delete webhook integration changes existing RevenueCat state or removes it.",
454
591
  },
455
592
  "update-webhook-integration": {
456
593
  "verdict": "destructive",
594
+ optional: true,
457
595
  "reason": "update webhook integration changes existing RevenueCat state or removes it.",
458
596
  },
459
597
  "create-paywall-ai": {
460
598
  "verdict": "write",
599
+ optional: true,
461
600
  "reason": "create paywall ai creates or appends RevenueCat state; it has side effects.",
462
601
  },
463
602
  "edit-paywall-ai": {
464
603
  "verdict": "destructive",
604
+ optional: true,
465
605
  "reason": "edit paywall ai changes existing RevenueCat state or removes it.",
466
606
  },
467
607
  },