@go-labs-sg/rsvp 0.17.0 → 1.0.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 (3) hide show
  1. package/README.md +237 -27
  2. package/dist/index.js +12 -9
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -135,6 +135,76 @@ rsvp event flow versions list --organization-id org_123 --event-id evt_123
135
135
  rsvp event flow resources get --organization-id org_123 --event-id evt_123
136
136
  ```
137
137
 
138
+ ### Registration-flow admission policy
139
+
140
+ `event flow draft get` returns normalized legacy invitation forms as
141
+ `authentication.mode: "EMAIL_OTP"` with `definition.admissionPolicy: "ROSTER_ONLY"`.
142
+ Carry that independent policy through `event flow draft save`, `event flow publish`,
143
+ and `event flow version activate`; none of those operations silently opens signup.
144
+ The participant-safe `event flow published get` admission manifest also reports
145
+ `admissionPolicy` (`OPEN` for modern definitions without an explicit policy).
146
+
147
+ Save the complete returned definition with its current `expectedRevision`.
148
+ Omitting `admissionPolicy` preserves the stored draft/publication policy for older
149
+ clients. To intentionally broaden admission, explicitly set it to `"OPEN"` in the
150
+ modern email-auth definition, save, then publish; this remains subject to event
151
+ permissions, audience restrictions, and email-domain policy for new attendees.
152
+ Existing eligible roster attendees keep their existing eligibility rules.
153
+
154
+ ```sh
155
+ rsvp event flow draft get --payload '{"organizationId":"org_123","eventId":"evt_123","flowId":"flow_123"}'
156
+ # Save the complete JSON definition and expectedRevision in flow-draft.json.
157
+ # Keep admissionPolicy: "ROSTER_ONLY" unless the organiser approves open signup.
158
+ rsvp event flow draft save --allow-state-change --target evt_123 --payload "$(cat flow-draft.json)"
159
+ rsvp event flow publish --allow-state-change --target evt_123 --payload '{"organizationId":"org_123","eventId":"evt_123","flowId":"flow_123","expectedDraftRevision":2}'
160
+ rsvp event flow version activate --allow-state-change --target evt_123 --payload '{"organizationId":"org_123","eventId":"evt_123","flowId":"flow_123","flowVersionId":"version_123"}'
161
+ ```
162
+
163
+ Replace illustrative IDs and revisions with current readback values. Deploy API
164
+ policy enforcement before clients; an old API does not understand this field.
165
+ No authentication, consent flags, command names, or credential protocol changes.
166
+
167
+ ### Registration-flow date-limit messages
168
+
169
+ `DATE` and `DATETIME` custom fields accept optional
170
+ `field.validation.minDateMessage` and `maxDateMessage`: trimmed, non-empty plain
171
+ text of at most 500 characters. Each replaces only its corresponding out-of-range
172
+ explanation. Inclusive `minDate`/`maxDate` bounds, malformed-date errors and
173
+ required-field errors are unchanged; omitted messages keep the existing defaults.
174
+
175
+ An illustrative DOB validation object is:
176
+
177
+ ```json
178
+ {
179
+ "maxDate": "2008-01-01",
180
+ "maxDateMessage": "You must be at least 18 to register for this event."
181
+ }
182
+ ```
183
+
184
+ Age wording is organizer-authored, not a dynamic age rule. Choose the cutoff for
185
+ the event; do not reuse the illustrative date blindly.
186
+
187
+ Read the full current definition/revision using `event flow draft get`, edit the
188
+ intended field, then pass the complete definition to `event flow preview` and
189
+ `event flow draft save --allow-state-change --target <eventId> --payload <JSON>`.
190
+ Preview/save payloads include `organizationId`, `eventId`, optional `flowId`, and
191
+ `definition`; save also requires `expectedRevision`. Publish separately using
192
+ `event flow publish --allow-state-change --target <eventId> --payload <JSON>` with
193
+ `expectedDraftRevision`. Read back the saved definition with `event flow draft get`
194
+ and verify its compiled participant projection using the authenticated organizer
195
+ `event flow preview` command. Use `event flow versions list` to check immutable
196
+ version/publication identity; `event flow published get` provides public admission
197
+ and publication metadata in normal CLI execution, not the full participant fields.
198
+ It has no participant-session forwarding; the API returns `flow.participant` as
199
+ `null` without matching participant access. Verify the actual published date limits
200
+ and messages through the event's registration flow with a valid participant
201
+ session.
202
+
203
+ Existing commands forward the definition unchanged to the authenticated shared
204
+ API; no new flags or CLI-only validation are needed. Deploy matching API/web
205
+ support before saving these keys via the CLI; older APIs strip unrecognized
206
+ message keys. No event or published version is updated automatically.
207
+
138
208
  ### Registration-flow image upload lifecycle
139
209
 
140
210
  Registration-flow images are **named, event-local assets**. Create one with an
@@ -175,6 +245,163 @@ protocol. Reference the finalized asset from the appropriate form choice, then
175
245
  save and publish the flow separately when the complete draft is approved.
176
246
 
177
247
 
248
+ ## Stripe payments and external refunds
249
+
250
+ `payment checkout create` uses the same server-enforced finite reservation policy
251
+ as the web app. New Checkout sessions exclude known slow-settling methods while
252
+ retaining dynamic immediate methods such as cards and PayNow. Existing sessions
253
+ and late-success safeguards are unchanged.
254
+
255
+ `payment event list` reports completed refund totals including separately
256
+ recorded, verified refunds issued outside RSVP. Pending/failed provider refunds
257
+ do not count, and an external refund never consumes an unrelated app refund
258
+ request. `payment refund` still requires the existing financial/external-write
259
+ gates and original account binding. `payment exception list` remains the place
260
+ to inspect unresolved payment exceptions. Existing command inputs and gates are
261
+ unchanged. `payment refund recover` checks an existing local or external refund
262
+ adjustment through its stored provider reference; it never creates a new refund:
263
+
264
+ ```sh
265
+ rsvp payment refund recover \
266
+ --ack-sensitive-data --allow-external-write --allow-financial-write \
267
+ --allow-state-change --target adjustment_123 \
268
+ --payload '{"organizationId":"org_123","eventId":"evt_123","paymentAttemptId":"attempt_123","adjustmentId":"adjustment_123"}'
269
+ ```
270
+
271
+ The organization/event/attempt and adjustment must belong together, and the
272
+ caller must retain payment-adjustment permission through the provider lookup;
273
+ current actor authority and event lifecycle are rechecked transactionally before
274
+ any financial or audit writes. Repeated checks reconcile the
275
+ same adjustment safely; a missing provider reference requires separate operator
276
+ reconciliation, not a new key or refund request.
277
+
278
+ ### Tax configuration and breakdowns
279
+
280
+ `payment configure` accepts optional `tax` JSON. Use `{"mode":"NONE"}` for
281
+ no tax. `INCLUSIVE` extracts tax from the configured price; `EXCLUSIVE` adds
282
+ tax to it. Both taxable modes require a trimmed `label` (1–50 characters), an
283
+ integer `rateBasisPoints` from 0 to 10000, and explicit `donationTaxable`.
284
+ **100 basis points = 1%.** The example below is illustrative, not a recommended
285
+ rate or a decision about whether donations are taxable.
286
+
287
+ Read the current policy and `configurationVersion` before configuring, and
288
+ replace the IDs, version, amounts and tax settings for the intended event:
289
+
290
+ ```sh
291
+ rsvp payment event get --allow-financial-write \
292
+ --payload '{"organizationId":"org_123","eventId":"evt_123"}'
293
+
294
+ rsvp payment configure \
295
+ --allow-external-write --allow-financial-write --allow-state-change \
296
+ --target evt_123 \
297
+ --payload '{"organizationId":"org_123","eventId":"evt_123","eventVersion":7,"enabled":true,"currency":"SGD","amountMinor":1000,"pricingMode":"PER_REGISTRATION","donationMaximumMinor":500,"checkoutExpiryMinutes":30,"reservationPolicy":"HOLD_UNTIL_EXPIRY","tax":{"mode":"EXCLUSIVE","rateBasisPoints":900,"label":"Tax","donationTaxable":false}}'
298
+ ```
299
+
300
+ This is a complete configuration write, not a tax-only patch: preserve the
301
+ intended payment policy and credential selection. Add `flowId` for a named
302
+ form override; `useEventDefaults: true` makes that form inherit the event policy,
303
+ including tax. Omitted tax remains compatible with legacy no-tax configuration.
304
+ Read `payment event get` back with the same scope to verify the saved policy.
305
+
306
+ `payment mine get` exposes the attempt's saved tax quote and subtotal/tax/final
307
+ total. `payment event list` exposes each attempt's original `quote` plus
308
+ `refundBreakdown` (cumulative refunded subtotal, tax and total). Pending refunds
309
+ are not confirmed refunded amounts. These are payment breakdowns, not statutory
310
+ tax invoices. Organizers choose applicable settings; configuration does not
311
+ establish legal approval or activate an event. Deploy matching API/web/CLI
312
+ support before using these fields.
313
+
314
+ ### Pending Stripe connection preparation
315
+
316
+ Organization managers can persist separate named Sandbox and Live connections
317
+ without either secret. Generate one webhook UUID for each request, keep it for
318
+ retries, and replace all illustrative IDs below:
319
+
320
+ ```sh
321
+ rsvp stripe credential prepare \
322
+ --allow-external-write --allow-state-change --target org_123 \
323
+ --payload '{"organizationId":"org_123","name":"Client Sandbox","livemode":false,"webhookSourceId":"9dd0ba39-b55e-4e65-aa3e-d08242c45b8f"}'
324
+
325
+ rsvp stripe credential preparation list \
326
+ --payload '{"organizationId":"org_123"}'
327
+ ```
328
+
329
+ The response includes the saved preparation ID, webhook path, environment,
330
+ endpoint API version and required events. Confirm the deployment/hosting origin
331
+ before constructing the full client URL. Pending records survive reload but are
332
+ not usable payment credentials or defaults and cannot verify webhooks. Pending
333
+ names are also protected from legacy credential creation and rename operations;
334
+ unreserved names remain supported.
335
+
336
+ Prefer **Complete setup** in the encrypted integrations UI for secret entry.
337
+ For approved private automation, `stripe credential complete` calls the same
338
+ API with `organizationId`, the unchanged `name`, saved `preparationId` and
339
+ `webhookSourceId`, plus `secretKey` and `webhookSecret`. It requires
340
+ `--allow-external-write --allow-state-change --target <organizationId>`.
341
+ Both restricted `rk_` and secret `sk_` server keys are supported. Never place
342
+ secrets in chat, payment payloads, committed files, or shared shell history.
343
+ The complete command returns only public credential metadata.
344
+
345
+ Then `stripe credential test` takes `organizationId` and `credentialId` with
346
+ `--allow-external-write --allow-state-change --target <credentialId>`.
347
+ Its bounded account/Balance/Checkout/PaymentIntent/Refund reads verify the
348
+ prepared mode and read access, not write permission or webhook delivery. Only a
349
+ tested usable connection can be selected for payments; perform a separate sandbox
350
+ payment and webhook acceptance check before launch. These commands use the
351
+ normal authenticated API and never bypass organization-management permission.
352
+
353
+ Deploy with the schema/client and webhook prerequisites in
354
+ [the application guide](../../../apps/rsvp/README.md#refunds). Local generated
355
+ clients can be refreshed with `bun db:generate`; that is not a database push or
356
+ proof of deployed schema state.
357
+
358
+ ## Lucky Draw check-in cutoff
359
+
360
+ The event manager can save an optional cutoff in **Check-in → Settings → Lucky
361
+ draw eligibility**, in the event's configured timezone. The API stores an absolute
362
+ ISO timestamp with an explicit offset (`Z` or `±HH:MM`), not a browser-local time.
363
+ There is no fixed cutoff or 8 PM default. Unconfigured events return
364
+ `luckyDrawEligibility.cutoffAt: null`; malformed stored values also return `null`
365
+ rather than being interpreted in the browser's timezone.
366
+
367
+ Read the event first:
368
+
369
+ ```sh
370
+ rsvp event get --organization-id org_123 --event-id evt_123
371
+ ```
372
+
373
+ Copy its current `configurationVersion` into the setup payload's `version`.
374
+ Replace all example IDs, version `7`, and the illustrative timestamp below with
375
+ values for the intended event; the date, time, and offset are not defaults:
376
+
377
+ ```sh
378
+ rsvp event setup step update \
379
+ --allow-state-change \
380
+ --target evt_123 \
381
+ --payload '{"organizationId":"org_123","eventId":"evt_123","version":7,"section":"LUCKY_DRAW","cutoffAt":"2030-06-15T13:30:00+02:00"}'
382
+ ```
383
+
384
+ To clear the cutoff, read the event again and use its fresh version with
385
+ `cutoffAt: null` (not a blank string):
386
+
387
+ ```sh
388
+ rsvp event setup step update \
389
+ --allow-state-change \
390
+ --target evt_123 \
391
+ --payload '{"organizationId":"org_123","eventId":"evt_123","version":7,"section":"LUCKY_DRAW","cutoffAt":null}'
392
+ ```
393
+
394
+ Both writes require `event.manage`, the explicit state-change acknowledgement,
395
+ and a `--target` matching the payload's `eventId`. A stale version returns
396
+ `CONFLICT`: fetch the event, review the latest settings, then retry with its
397
+ current version rather than replaying an old payload. Read the event back after
398
+ a successful write to verify the cutoff and configuration version.
399
+
400
+ This configuration step only stores the cutoff and preserves unrelated event
401
+ metadata. It does not choose eligible people, apply category/exclusion rules,
402
+ import a draw roster, or reconcile prizes/vouchers. Deploy the updated API before
403
+ saving the new setup section; no database schema migration is required.
404
+
178
405
  ## Per-form confirmation presentation
179
406
 
180
407
  In the form builder's **Flow settings → Confirmation and check-in pass**, set
@@ -302,40 +529,24 @@ rsvp check-in by-reference \
302
529
 
303
530
  High-impact payment and retention commands remain protected by their matching financial, deletion, external-write, and sensitive-data gates. The API always re-evaluates the authenticated user's current Registration role, organization membership, event assignment, and resource permissions.
304
531
 
305
- ## Operational report exports
306
-
307
- `export request` accepts `format: "XLSX"` (the default when omitted) or `"CSV"`.
308
- Use `filters.view` to name the population rather than relying on a dataset label:
309
-
310
- - RSVP: `MASTER` (all invitees, grouped employee/guest responses; default),
311
- `CURRENT` (current response rows per person), `HISTORY` (all registration
312
- records, not every edit revision), or `CLIENT_REGISTRATION` (current completed
313
- employee/guest responses, including declines; excludes nonrespondents/drafts).
314
- The client XLSX has **Attending**, **Not Attending**, **Master**, and **Metadata**
315
- sheets; its CSV contains Master data only. Guest staff/department fields
316
- describe the host, while menu and dietary answers remain person-scoped.
317
- - SEATING: `CURRENT` (active bookings; default) or `HISTORY` (active and released).
318
- - ATTENDANCE: `CURRENT` (expected people; default) or `CHECKED_IN` (expected people
319
- with a check-in that has not been undone), or `ALL_INVITEES` (roster invitees,
320
- including nonrespondents/declines, plus current guests). Registered, submitted,
321
- attending, and active check-in states remain separate. None defines draw
322
- eligibility.
532
+ ## Registration master list export
323
533
 
324
- Form, registration-status and submission-date filters apply only to RSVP.
325
- Other datasets do not accept `view`. These combinations are validated by the API.
534
+ `export request` queues the single **Registration master list** Excel workbook
535
+ (one **Master List** sheet; question columns follow the event's form). The
536
+ payload is `organizationId`, `eventId` and an audit `reason`; the old `dataset`,
537
+ `format` and `filters` fields are ignored. See the RSVP app README for columns.
326
538
 
327
539
  ```sh
328
540
  rsvp export request \
329
541
  --ack-sensitive-data \
330
542
  --allow-state-change \
331
543
  --target evt_123 \
332
- --payload '{"organizationId":"org_123","eventId":"evt_123","dataset":"RSVP","format":"XLSX","filters":{"view":"MASTER"},"reason":"Organizer master list"}'
544
+ --payload '{"organizationId":"org_123","eventId":"evt_123","reason":"Organizer master list"}'
333
545
  ```
334
546
 
335
547
  Use `export list` to check the requester-scoped job, then `export download` for
336
- its current authorized download URL. For the client workbook, replace `MASTER`
337
- in the example with `CLIENT_REGISTRATION`. For the all-invitee attendance report,
338
- set `dataset` to `ATTENDANCE` and `filters.view` to `ALL_INVITEES`.
548
+ its current authorized download URL. `event registrations export` and
549
+ `event check-ins export` were removed; use `export request` instead.
339
550
 
340
551
  Operational check-in accepts `ATTENDING` and legacy `SUBMITTED`; roster/detail,
341
552
  manual/QR/reference entry, `report overview`, and `event people overview` use that same
@@ -343,9 +554,8 @@ population. Non-operational statuses remain excluded, and permissions, payment
343
554
  gates, duplicate protection, and undo behavior are unchanged. The web panel's
344
555
  realtime connection and manual refresh controls do not add a CLI subscription.
345
556
 
346
- Deploy matching API and export-worker versions before requesting the new views;
347
- old servers/workers do not understand them. Existing CLI commands pass the JSON
348
- payload to the shared typed API, so no new command or client-only rules are needed.
557
+ Deploy matching API and export-worker versions together; an old worker would build the retired
558
+ registration-records report for master-list jobs.
349
559
 
350
560
  ## Seating updates
351
561
 
package/dist/index.js CHANGED
@@ -6326,7 +6326,7 @@ var commands = {
6326
6326
  effects: [],
6327
6327
  operation: (api, input) => api.eventFlow.preview.query(input),
6328
6328
  payloadOnly: true,
6329
- summary: "Validate and preview an event flow definition (--payload JSON)."
6329
+ summary: "Validate and preview an event flow, including date-limit messages (--payload JSON)."
6330
6330
  },
6331
6331
  "event flow draft get": {
6332
6332
  effects: [],
@@ -6372,7 +6372,7 @@ var commands = {
6372
6372
  operation: (api, input) => api.eventFlow.saveDraft.mutate(input),
6373
6373
  payloadOnly: true,
6374
6374
  targetKey: "eventId",
6375
- summary: "Save a revision-checked registration flow draft (--payload JSON)."
6375
+ summary: "Save a revision-checked draft; omitted admissionPolicy preserves roster-only access, explicit OPEN permits intentional broadening (--payload JSON)."
6376
6376
  },
6377
6377
  "event flow published get": {
6378
6378
  effects: [],
@@ -6549,7 +6549,7 @@ var commands = {
6549
6549
  effects: ["sensitive-data", "state-change"],
6550
6550
  operation: (api, input) => api.export.requestExport.mutate(input),
6551
6551
  payloadOnly: true,
6552
- summary: "Request an operational report (--payload JSON; format CSV/XLSX, default XLSX; RSVP views MASTER/CURRENT/HISTORY/CLIENT_REGISTRATION; ATTENDANCE views CURRENT/CHECKED_IN/ALL_INVITEES; SEATING views CURRENT/HISTORY)."
6552
+ summary: "Request the registration master list XLSX (--payload JSON: eventId, organizationId, reason)."
6553
6553
  },
6554
6554
  "export list": {
6555
6555
  effects: ["sensitive-data"],
@@ -6613,8 +6613,8 @@ var eventScopeQueryCommand = (operation, summary) => ({
6613
6613
  summary
6614
6614
  });
6615
6615
  Object.assign(commands, {
6616
- "payment configure": payloadCommand((api, input) => api.payment.configureEventPayment.mutate(input), "Configure event payments (--payload JSON).", ["external-write", "financial-write", "state-change"]),
6617
- "payment checkout create": payloadCommand((api, input) => api.payment.createCheckout.mutate(input), "Create the caller's payment checkout (--payload JSON).", ["external-write", "financial-write", "state-change"]),
6616
+ "payment configure": payloadCommand((api, input) => api.payment.configureEventPayment.mutate(input), "Configure event or form payments with optional tax: NONE, INCLUSIVE or EXCLUSIVE; taxable modes require label, rateBasisPoints (100 = 1%) and explicit donationTaxable (--payload JSON).", ["external-write", "financial-write", "state-change"]),
6617
+ "payment checkout create": payloadCommand((api, input) => api.payment.createCheckout.mutate(input), "Create the caller's checkout; slow-settling payment methods are excluded (--payload JSON).", ["external-write", "financial-write", "state-change"]),
6618
6618
  "access mine": payloadCommand((api, input) => api.access.getMyEventAccess.query(input), "Get the caller's event access (--payload JSON)."),
6619
6619
  "access list": payloadCommand((api, input) => api.access.listEventAccess.query(input), "List event access grants (--payload JSON).", ["sensitive-data"]),
6620
6620
  "access assignment list": payloadCommand((api, input) => api.access.listEventAssignments.query(input), "List event assignments (--payload JSON)."),
@@ -6647,8 +6647,6 @@ Object.assign(commands, {
6647
6647
  "event seating seat tier update": payloadCommand((api, input) => api.event.setSeatAudienceTier.mutate(input), "Set or inherit an audience tier for seating seats (--payload JSON).", ["state-change"], "eventId"),
6648
6648
  "event field deactivate": payloadCommand((api, input) => api.event.deactivateFieldDefinition.mutate(input), "Deactivate an event field (--payload JSON).", ["delete", "state-change"]),
6649
6649
  "event field upsert": payloadCommand((api, input) => api.event.upsertFieldDefinition.mutate(input), "Create or update an event field (--payload JSON).", ["sensitive-data", "state-change"]),
6650
- "event check-ins export": payloadCommand((api, input) => api.event.exportCheckIns.mutate(input), "Export check-ins (--payload JSON).", ["sensitive-data", "state-change"]),
6651
- "event registrations export": payloadCommand((api, input) => api.event.exportRegistrations.mutate(input), "Export registrations (--payload JSON).", ["sensitive-data", "state-change"]),
6652
6650
  "event rsvp mine": payloadCommand((api, input) => api.event.getMyRsvp.query(input), "Get the caller's registration (--payload JSON).", ["sensitive-data"]),
6653
6651
  "event people overview": payloadCommand((api, input) => api.event.getPeopleOverview.query(input), "Get people operations overview (--payload JSON).", ["sensitive-data"]),
6654
6652
  "event reminder counts": payloadCommand((api, input) => api.event.getReminderSegmentCounts.query(input), "Get reminder segment counts (--payload JSON).", ["sensitive-data"]),
@@ -6682,12 +6680,17 @@ Object.assign(commands, {
6682
6680
  });
6683
6681
  Object.assign(commands, {
6684
6682
  "payment event get": payloadCommand((api, input) => api.payment.getEventPayment.query(input), "Get event payment configuration (--payload JSON).", ["financial-write"]),
6685
- "payment mine get": payloadCommand((api, input) => api.payment.getMyPayment.query(input), "Get the caller's payment (--payload JSON).", ["financial-write", "sensitive-data"]),
6686
- "payment event list": payloadCommand((api, input) => api.payment.listEventPayments.query(input), "List event payments (--payload JSON).", ["financial-write", "sensitive-data"]),
6683
+ "payment mine get": payloadCommand((api, input) => api.payment.getMyPayment.query(input), "Get the caller's payment with its saved subtotal, tax and final total breakdown (--payload JSON).", ["financial-write", "sensitive-data"]),
6684
+ "payment event list": payloadCommand((api, input) => api.payment.listEventPayments.query(input), "List event payments with original quote and cumulative refunded subtotal/tax/total, including verified external refunds (--payload JSON).", ["financial-write", "sensitive-data"]),
6687
6685
  "payment exception list": payloadCommand((api, input) => api.payment.listPaymentExceptions.query(input), "List payment exceptions (--payload JSON).", ["financial-write", "sensitive-data"]),
6688
6686
  "payment exception resolve": payloadCommand((api, input) => api.payment.resolvePaymentException.mutate(input), "Resolve a payment exception (--payload JSON).", ["financial-write", "sensitive-data", "state-change"]),
6689
6687
  "payment reconcile": payloadCommand((api, input) => api.payment.reconcilePayment.query(input), "Compare a payment attempt with its provider (--payload JSON).", ["external-write", "financial-write"]),
6690
6688
  "payment refund": payloadCommand((api, input) => api.payment.refundPayment.mutate(input), "Refund a payment (--payload JSON).", ["external-write", "financial-write", "state-change"]),
6689
+ "stripe credential prepare": payloadCommand((api, input) => api.organization.prepareStripeCredential.mutate(input), "Persist a named pending Sandbox/Live Stripe connection and stable webhook URL without secrets (--payload JSON).", ["external-write", "state-change"], "organizationId"),
6690
+ "stripe credential complete": payloadCommand((api, input) => api.organization.createStripeCredential.mutate(input), "Complete a saved Stripe preparation using its exact IDs/name and private credentials (--payload JSON); secrets remain write-only.", ["external-write", "state-change"], "organizationId"),
6691
+ "stripe credential test": payloadCommand((api, input) => api.organization.testStripeCredential.mutate(input), "Run bounded account/Balance/Checkout/PaymentIntent/Refund read checks for a saved connection (--payload JSON).", ["external-write", "state-change"], "credentialId"),
6692
+ "stripe credential preparation list": payloadCommand((api, input) => api.organization.listStripeCredentialPreparations.query(input), "List organization-scoped pending Stripe connections and webhook setup instructions (--payload JSON)."),
6693
+ "payment refund recover": payloadCommand((api, input) => api.payment.recoverRefund.mutate(input), "Check an existing scoped refund adjustment without creating a provider refund (--payload JSON).", ["external-write", "financial-write", "state-change"], "adjustmentId"),
6691
6694
  "retention overview": payloadCommand((api, input) => api.retention.getRetentionOverview.query(input), "Get retention overview (--payload JSON).", ["sensitive-data"]),
6692
6695
  "retention hold create": payloadCommand((api, input) => api.retention.createLegalHold.mutate(input), "Create a legal hold (--payload JSON).", ["sensitive-data", "state-change"]),
6693
6696
  "retention hold release": payloadCommand((api, input) => api.retention.releaseLegalHold.mutate(input), "Release a legal hold (--payload JSON).", ["delete", "sensitive-data", "state-change"]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@go-labs-sg/rsvp",
3
- "version": "0.17.0",
3
+ "version": "1.0.0",
4
4
  "description": "RSVP CLI for authorized event operations.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",