@capxul/sandbox 4.20.0-beta.6 → 4.20.0-beta.7

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 +1 -1
  2. package/dist/main.mjs +411 -27
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -15,7 +15,7 @@ npx @capxul/sandbox faucet send
15
15
  vp run --filter @capxul/sandbox dev -- --help
16
16
  ```
17
17
 
18
- `key create` uses the Railway public staging Site endpoint and
18
+ `key create` uses the Coolify public staging Site endpoint and
19
19
  needs no operator secret. `APP_ENV` does not retarget this public command; use
20
20
  the returned key only with the staging tuple.
21
21
  `faucet send` invokes the canonical Convex deployment and requires operator
package/dist/main.mjs CHANGED
@@ -2021,6 +2021,28 @@ const toFunctionSelector = (fn) => slice(toSignatureHash(fn), 0, 4);
2021
2021
  //#region ../../packages/config/src/org-payments.ts
2022
2022
  /** Zodiac MultiSendCallOnly module on Base Sepolia. */
2023
2023
  const MULTI_SEND_CALL_ONLY = "0x9641d764fc13c8b624c04430c7356c1c7c8102e2";
2024
+ /** Supported Organization permission identities, newest first. */
2025
+ const ORG_PERMISSION_IDENTITY_PROFILES = [{
2026
+ id: "zodiac-roles-2.1.1",
2027
+ moduleFactoryRuntimeKeccak256: "0x01623cbcf010a1c326230f1b2d5f48a66b440232ee49096102bc84967dc5f21e",
2028
+ mastercopy: "0xf2964ce6161ce0e75964fe7927ce114cb0b283d5",
2029
+ mastercopyRuntimeKeccak256: "0x471d8b3b419f1eb955230c0326c8812176df49bf3c7b414a563fda5a3c6c10b6",
2030
+ proxyRuntimeKeccak256: "0x248f9591f94c24c199ade3e73feb477cf02d387b2bea91f2f931a0deb094f163",
2031
+ multiSendUnwrapper: "0xb4cd4bb764c089f20da18700ce8bc5e49f369efd",
2032
+ multiSendUnwrapperRuntimeKeccak256: "0x1f6e088be5e6ef9d0fbe0547d3fa9a9e40d823433fd8a4449215b5663209a1eb"
2033
+ }, {
2034
+ id: "zodiac-roles-2.1.0",
2035
+ moduleFactoryRuntimeKeccak256: "0x01623cbcf010a1c326230f1b2d5f48a66b440232ee49096102bc84967dc5f21e",
2036
+ mastercopy: "0x9646fdad06d3e24444381f44362a3b0eb343d337",
2037
+ mastercopyRuntimeKeccak256: "0x87911cbc6aa0496e6bcb07dab2462b9c76daea130dede6dcc57d0adf307fa7ec",
2038
+ proxyRuntimeKeccak256: "0x9d4059abf46db50e4b48d9b6404b1f200cb5a1efeb3725be2de630a2a9001944",
2039
+ multiSendUnwrapper: "0x93b7fcbc63ed8a3a24b59e1c3e6649d50b7427c0",
2040
+ multiSendUnwrapperRuntimeKeccak256: "0x4d8d8608b70a6e2f40726b9dd74406bbf73e90cac58e23ee953e2b45ad7dc3df"
2041
+ }];
2042
+ const CURRENT_ORG_PERMISSION_IDENTITY = ORG_PERMISSION_IDENTITY_PROFILES[0];
2043
+ ORG_PERMISSION_IDENTITY_PROFILES[1];
2044
+ CURRENT_ORG_PERMISSION_IDENTITY.mastercopy;
2045
+ CURRENT_ORG_PERMISSION_IDENTITY.multiSendUnwrapper;
2024
2046
  //#endregion
2025
2047
  //#region ../../packages/config/src/capxul-payments-v2.ts
2026
2048
  /** The exact compiled CapxulPaymentsV2 ABI. */
@@ -14174,10 +14196,12 @@ const CAPXUL_OPERATIONS = {
14174
14196
  prepareOrganizationPaymentExecution: "moneyExecution.prepareOrganizationPaymentExecution",
14175
14197
  preparePaymentExecution: "moneyExecution.preparePaymentExecution",
14176
14198
  preparePaymentLifecycleExecution: "moneyExecution.preparePaymentLifecycleExecution",
14199
+ prepareInvitationConfiguration: "moneyExecution.prepareInvitationConfiguration",
14177
14200
  preparePermissionExecution: "moneyExecution.preparePermissionExecution",
14178
14201
  recoverSubmissionClaims: "moneyExecution.recoverSubmissionClaims",
14179
14202
  submit: "moneyExecution.submit",
14180
14203
  submitPaymentCommandExecution: "moneyExecution.submitPaymentCommandExecution",
14204
+ submitInvitationConfigurationExecution: "moneyExecution.submitInvitationConfigurationExecution",
14181
14205
  submitPaymentExecution: "moneyExecution.submitPaymentExecution",
14182
14206
  submitPermissionExecution: "moneyExecution.submitPermissionExecution"
14183
14207
  },
@@ -14199,20 +14223,52 @@ const CAPXUL_OPERATIONS = {
14199
14223
  completePerson: "onboarding.completePerson"
14200
14224
  },
14201
14225
  org: {
14202
- acceptInvitations: "org.acceptInvitations",
14203
14226
  account: { get: "org.account.get" },
14204
- activateMember: "org.activateMember",
14205
14227
  auditLog: "org.auditLog",
14206
14228
  confirmBootstrap: "org.confirmBootstrap",
14207
14229
  createOrg: "org.createOrg",
14208
14230
  create: "org.create",
14209
- detectAndAcceptPendingInvitations: "org.detectAndAcceptPendingInvitations",
14231
+ /**
14232
+ * §11: the consent mutation reports `org_invite_accepted` through its own
14233
+ * scheduled emitter. It is named for the emit, not the acceptance, because
14234
+ * the interactive acceptance itself owns `org.invitations.accept`.
14235
+ */
14236
+ emitInviteAccepted: "org.emitInviteAccepted",
14210
14237
  emitInviteProgressed: "org.emitInviteProgressed",
14211
14238
  expireInvitations: "org.expireInvitations",
14212
14239
  getLifecycle: "org.getLifecycle",
14213
14240
  getProofReceipt: "org.getProofReceipt",
14214
14241
  invite: "org.invite",
14215
- inviteMember: "org.inviteMember",
14242
+ /** D8 invitation lifecycle: preview, own list, read, and the four transitions. */
14243
+ invitations: {
14244
+ /** The exact grantee's consent commit (§8): one accepted digest, once. */
14245
+ accept: "org.invitations.accept",
14246
+ /**
14247
+ * The authoring write. It is named `authorize`, not `invite`, because the
14248
+ * backend already uses `org.invitations.invite` as a refusal label and
14249
+ * `lint:telemetry-spine` refuses a label that collides with an operation.
14250
+ */
14251
+ authorize: "org.invitations.authorize",
14252
+ cancel: "org.invitations.cancel",
14253
+ decline: "org.invitations.decline",
14254
+ get: "org.invitations.get",
14255
+ list: "org.invitations.list",
14256
+ /**
14257
+ * The Admin-scoped Organization list. It is named `listScoped`, not
14258
+ * `list`, because the own-offer list already owns `org.invitations.list`.
14259
+ */
14260
+ listScoped: "org.invitations.listScoped",
14261
+ /**
14262
+ * The authoring write's inner hops: the SDK drives the backend's existing
14263
+ * prepare/submit pair, and these names label the two Convex calls. The
14264
+ * owning `capxul_sdk_operation` record stays `org.invitations.authorize`.
14265
+ */
14266
+ prepareConfiguration: "org.invitations.prepareConfiguration",
14267
+ preview: "org.invitations.preview",
14268
+ resend: "org.invitations.resend",
14269
+ retry: "org.invitations.retry",
14270
+ submitConfiguration: "org.invitations.submitConfiguration"
14271
+ },
14216
14272
  list: "org.list",
14217
14273
  load: "org.load",
14218
14274
  me: "org.me",
@@ -14271,7 +14327,6 @@ const CAPXUL_OPERATIONS = {
14271
14327
  },
14272
14328
  recordFailure: "org.recordFailure",
14273
14329
  recordProgress: "org.recordProgress",
14274
- resendInviteToken: "org.resendInviteToken",
14275
14330
  resumeBootstrapSubmission: "org.resumeBootstrapSubmission",
14276
14331
  retry: "org.retry",
14277
14332
  retrySetup: "org.retrySetup",
@@ -14288,7 +14343,6 @@ const CAPXUL_OPERATIONS = {
14288
14343
  retry: "organizationPayments.retry"
14289
14344
  },
14290
14345
  organizationSetup: { getProofReceipt: "organizationSetup.getProofReceipt" },
14291
- organizations: { detectAndAcceptPendingInvitations: "orgs.detectAndAcceptPendingInvitations" },
14292
14346
  payments: {
14293
14347
  cancel: "payments.cancel",
14294
14348
  claim: "payments.claim",
@@ -14326,6 +14380,7 @@ const CAPXUL_OPERATIONS = {
14326
14380
  terms: "payroll.terms"
14327
14381
  },
14328
14382
  permission: {
14383
+ verifyInvitationConfiguration: "permission.verifyInvitationConfiguration",
14329
14384
  command: "permission.command",
14330
14385
  retryVerification: "permission.retryVerification",
14331
14386
  verify: "permission.verify",
@@ -14862,6 +14917,11 @@ const OrgCreateFailedProps = Struct({
14862
14917
  const OrgInviteSentProps = Struct({
14863
14918
  ...TelemetryEnvelopeProps,
14864
14919
  org_id: OptionalOrgId,
14920
+ invitation_id: OptionalString,
14921
+ generation: OptionalString,
14922
+ command_id: OptionalString,
14923
+ subject_party_id: OptionalString,
14924
+ persisted_at: OptionalEpochMs,
14865
14925
  email_domain: OptionalString,
14866
14926
  role: OptionalString,
14867
14927
  status: OptionalString
@@ -14869,6 +14929,11 @@ const OrgInviteSentProps = Struct({
14869
14929
  const OrgInviteAcceptedProps = Struct({
14870
14930
  ...TelemetryEnvelopeProps,
14871
14931
  org_id: OptionalOrgId,
14932
+ invitation_id: OptionalString,
14933
+ accepted_at: OptionalEpochMs,
14934
+ generation: OptionalString,
14935
+ command_id: OptionalString,
14936
+ subject_party_id: OptionalString,
14872
14937
  role: OptionalString,
14873
14938
  status: OptionalString
14874
14939
  });
@@ -14876,6 +14941,7 @@ const OrgInviteExpiredProps = Struct({
14876
14941
  ...TelemetryEnvelopeProps,
14877
14942
  org_id: OptionalOrgId,
14878
14943
  email_domain: OptionalString,
14944
+ invitation_id: OptionalString,
14879
14945
  reason: OptionalString,
14880
14946
  role: OptionalString,
14881
14947
  status: OptionalString
@@ -15028,9 +15094,24 @@ const PermissionMirrorVerificationProps = Struct({
15028
15094
  "applied",
15029
15095
  "replayed",
15030
15096
  "conflicting_replay",
15031
- "revision_mismatch"
15097
+ "revision_mismatch",
15098
+ "cleanup_required",
15099
+ "not_applied",
15100
+ "application_failure",
15101
+ "mismatch",
15102
+ "refused"
15032
15103
  ])),
15104
+ command_kind: optional(Literals(["invitation_configuration", "invitation_eoa"])),
15033
15105
  command_id: OptionalString,
15106
+ invitation_id: OptionalString,
15107
+ generation: OptionalString,
15108
+ purpose: optional(Literals([
15109
+ "configure",
15110
+ "grant",
15111
+ "disable",
15112
+ "compensate"
15113
+ ])),
15114
+ $insert_id: OptionalString,
15034
15115
  /**
15035
15116
  * #1961 R03. The authorized stored row names the Permission it changed; the
15036
15117
  * verified receipt names the chain facts that prove it. Every field is
@@ -15417,6 +15498,13 @@ const CLI_COMMAND_NAMES = [
15417
15498
  "auth.profile",
15418
15499
  "auth.status",
15419
15500
  "auth.logout",
15501
+ "contact",
15502
+ "contact.list",
15503
+ "contact.get",
15504
+ "contact.add",
15505
+ "contact.label",
15506
+ "contact.hide",
15507
+ "contact.unhide",
15420
15508
  "org",
15421
15509
  CAPXUL_OPERATIONS.org.list,
15422
15510
  "org.use",
@@ -15425,6 +15513,24 @@ const CLI_COMMAND_NAMES = [
15425
15513
  CAPXUL_OPERATIONS.org.members,
15426
15514
  "org.member",
15427
15515
  "org.member.get",
15516
+ "org.member.invite",
15517
+ "org.contact",
15518
+ "org.contact.list",
15519
+ "org.contact.get",
15520
+ "org.contact.add",
15521
+ "org.contact.label",
15522
+ "org.contact.hide",
15523
+ "org.contact.unhide",
15524
+ CAPXUL_OPERATIONS.org.invite,
15525
+ "org.invite.list",
15526
+ "org.invite.get",
15527
+ "org.invite.wait",
15528
+ "org.invite.review",
15529
+ "org.invite.accept",
15530
+ "org.invite.decline",
15531
+ "org.invite.cancel",
15532
+ "org.invite.resend",
15533
+ "org.invite.retry",
15428
15534
  "org.wait",
15429
15535
  CAPXUL_OPERATIONS.org.create,
15430
15536
  CAPXUL_OPERATIONS.org.retry,
@@ -15435,7 +15541,8 @@ const CLI_CAPABILITIES = [
15435
15541
  "diagnostics",
15436
15542
  "collection",
15437
15543
  "authentication",
15438
- "organization"
15544
+ "organization",
15545
+ "contacts"
15439
15546
  ];
15440
15547
  const CLI_INVOCATION_KINDS = [
15441
15548
  "command",
@@ -15677,6 +15784,7 @@ Struct({
15677
15784
  ...TelemetryEnvelopeProps,
15678
15785
  organization_id: OrgIdTelemetrySchema,
15679
15786
  progress: Literals([
15787
+ "configuration_authorized",
15680
15788
  "account_ready",
15681
15789
  "permission_applied",
15682
15790
  "membership_activated",
@@ -15684,6 +15792,9 @@ Struct({
15684
15792
  ]),
15685
15793
  /** The invited Party. The initiating actor stays on the envelope's identity. */
15686
15794
  member_party_id: String$1,
15795
+ invitation_id: optional(String$1),
15796
+ generation: optional(String$1),
15797
+ command_id: optional(String$1),
15687
15798
  occurred_at: Number$1
15688
15799
  })
15689
15800
  });
@@ -15977,8 +16088,10 @@ const CAPXUL_FUNCTIONS = {
15977
16088
  "movement/annotations": { overlay: "movement/annotations:overlay" },
15978
16089
  "moneyExecution/actions": {
15979
16090
  abandonPaymentExecution: "moneyExecution/actions:abandonPaymentExecution",
16091
+ prepareInvitationConfiguration: "moneyExecution/actions:prepareInvitationConfiguration",
15980
16092
  preparePermissionExecution: "moneyExecution/actions:preparePermissionExecution",
15981
16093
  preparePaymentExecution: "moneyExecution/actions:preparePaymentExecution",
16094
+ submitInvitationConfigurationExecution: "moneyExecution/actions:submitInvitationConfigurationExecution",
15982
16095
  submitPermissionExecution: "moneyExecution/actions:submitPermissionExecution",
15983
16096
  submitPaymentExecution: "moneyExecution/actions:submitPaymentExecution"
15984
16097
  },
@@ -15995,8 +16108,6 @@ const CAPXUL_FUNCTIONS = {
15995
16108
  },
15996
16109
  "org/actions": {
15997
16110
  confirmBootstrap: "org/actions:confirmBootstrap",
15998
- detectAndAcceptPendingInvitations: "org/actions:detectAndAcceptPendingInvitations",
15999
- inviteMember: "org/actions:inviteMember",
16000
16111
  prepareBootstrap: "org/actions:prepareBootstrap",
16001
16112
  prepareFounderAccount: "org/actions:prepareFounderAccount",
16002
16113
  readTreasury: "org/actions:readTreasury",
@@ -16027,16 +16138,25 @@ const CAPXUL_FUNCTIONS = {
16027
16138
  startOrResume: "org/lifecycle:startOrResume"
16028
16139
  },
16029
16140
  "org/mutations": {
16141
+ accept: "org/mutations:accept",
16142
+ cancel: "org/mutations:cancel",
16030
16143
  createOrg: "org/mutations:createOrg",
16031
- resendInviteToken: "org/mutations:resendInviteToken"
16144
+ decline: "org/mutations:decline",
16145
+ invite: "org/mutations:invite",
16146
+ resend: "org/mutations:resend",
16147
+ retry: "org/mutations:retry"
16032
16148
  },
16033
16149
  "org/queries": {
16150
+ getInvitation: "org/queries:getInvitation",
16034
16151
  listAll: "org/queries:listAll",
16152
+ listInvitations: "org/queries:listInvitations",
16035
16153
  listMembersByOrgId: "org/queries:listMembersByOrgId",
16036
16154
  listMine: "org/queries:listMine",
16155
+ listMyInvitations: "org/queries:listMyInvitations",
16037
16156
  listRolesByOrgId: "org/queries:listRolesByOrgId",
16038
16157
  loadByOrgId: "org/queries:loadByOrgId",
16039
- me: "org/queries:me"
16158
+ me: "org/queries:me",
16159
+ previewInvite: "org/queries:previewInvite"
16040
16160
  },
16041
16161
  "smartAccount/actions": {
16042
16162
  claim: "smartAccount/actions:claim",
@@ -16972,6 +17092,93 @@ const EventRefSchema = Struct({
16972
17092
  topic0: Bytes32Schema,
16973
17093
  dataHash: Bytes32Schema
16974
17094
  });
17095
+ const InvitationEoaReceiptSchema = Struct({
17096
+ kind: Literal("invitation_eoa"),
17097
+ chainId: BaseSepoliaChainIdSchema,
17098
+ transactionHash: TxHashSchema,
17099
+ blockNumber: BlockNumberSchema,
17100
+ blockHash: Bytes32Schema,
17101
+ sender: AddressSchema,
17102
+ nonce: String$1.pipe(refine((value) => /^(0|[1-9][0-9]*)$/.test(value)))
17103
+ });
17104
+ const PermissionEventRefSchema = Struct({
17105
+ receipt: Union([Struct({
17106
+ kind: Literal("user_operation"),
17107
+ ...ReceiptRefSchema.fields
17108
+ }), InvitationEoaReceiptSchema]),
17109
+ emitter: AddressSchema,
17110
+ transactionIndex: LogIndexSchema,
17111
+ logIndex: LogIndexSchema,
17112
+ topic0: Bytes32Schema,
17113
+ dataHash: Bytes32Schema
17114
+ });
17115
+ Union([
17116
+ Struct({
17117
+ status: Literal("pending"),
17118
+ reason: Literal("receipt_missing")
17119
+ }),
17120
+ Struct({
17121
+ status: Literal("provider_failure"),
17122
+ retryable: Literal(true)
17123
+ }),
17124
+ Struct({
17125
+ status: Literal("mismatch"),
17126
+ code: Literals([
17127
+ "wrong_chain",
17128
+ "wrong_sender",
17129
+ "wrong_transaction",
17130
+ "failed_transaction",
17131
+ "non_canonical_block",
17132
+ "wrong_contract_identity",
17133
+ "missing_event",
17134
+ "extra_authority_event",
17135
+ "wrong_fact_tuple",
17136
+ "wrong_state",
17137
+ "conflicting_replay"
17138
+ ]),
17139
+ attemptTransactionHash: optional(TxHashSchema),
17140
+ receipt: optional(InvitationEoaReceiptSchema)
17141
+ }),
17142
+ Struct({
17143
+ status: Literal("verified"),
17144
+ commandId: PaymentCommandIdSchema,
17145
+ receipt: InvitationEoaReceiptSchema,
17146
+ events: ArraySchema(PermissionEventRefSchema),
17147
+ factsHash: Bytes32Schema
17148
+ })
17149
+ ]);
17150
+ /**
17151
+ * One stored `setAllowance` call inside a command's expected authority set.
17152
+ *
17153
+ * The pinned Roles module emits `SetAllowance` as *post-state*, not as the call
17154
+ * arguments: `maxRefill = 0` becomes `type(uint128).max`, and `timestamp = 0`
17155
+ * becomes the receipt block's timestamp. A hash over the call arguments can
17156
+ * therefore never match that receipt. `index` names the entry in
17157
+ * `expectedAuthorityEvents` the call produced, and `data` is the call's own
17158
+ * calldata, so the verifier can rebuild the one hash the module actually emits.
17159
+ * The rule is pinned by `test:invitation-conformance`.
17160
+ */
17161
+ const AllowanceExpectationSchema = Struct({
17162
+ index: nonNegativeInteger("index"),
17163
+ data: String$1.pipe(refine((value) => /^0x[0-9a-fA-F]+$/u.test(value), { message: "data must be 0x-prefixed hex" }))
17164
+ });
17165
+ Struct({
17166
+ commandId: PaymentCommandIdSchema,
17167
+ userOpHash: Bytes32Schema,
17168
+ generationHash: Bytes32Schema,
17169
+ chainId: BaseSepoliaChainIdSchema,
17170
+ organizationSafe: SafeAddressSchema,
17171
+ rolesModule: ModuleAddressSchema,
17172
+ userOpSenderSafe: SafeAddressSchema,
17173
+ expectedAuthorityEvents: ArraySchema(Bytes32Schema),
17174
+ /**
17175
+ * Absent means "no normalization": every expected hash is compared as stored.
17176
+ * A command whose set contains `setAllowance` then refuses (`wrong_fact_tuple`)
17177
+ * rather than passing on a weakened proof, so an incomplete caller fails
17178
+ * closed.
17179
+ */
17180
+ allowanceExpectations: optional(ArraySchema(AllowanceExpectationSchema))
17181
+ });
16975
17182
  const PermissionOperationSchema = Literals([
16976
17183
  "create",
16977
17184
  "change",
@@ -17014,7 +17221,9 @@ Struct({
17014
17221
  originatingAuthUserId: optional(String$1),
17015
17222
  originatingObservationContext: optional(Unknown)
17016
17223
  }),
17017
- userOpHash: Bytes32Schema
17224
+ userOpHash: Bytes32Schema,
17225
+ /** The stored `setAllowance` calls of this command's own expectation. */
17226
+ allowanceExpectations: optional(ArraySchema(AllowanceExpectationSchema))
17018
17227
  });
17019
17228
  Union([
17020
17229
  Struct({
@@ -17850,6 +18059,27 @@ Struct({
17850
18059
  digest: Bytes32Schema,
17851
18060
  value: PermissionResourceSchema
17852
18061
  });
18062
+ Struct({
18063
+ commandId: PaymentCommandIdSchema,
18064
+ signerAddress: AddressSchema
18065
+ });
18066
+ Struct({
18067
+ executionId: MoneyExecutionIdSchema,
18068
+ commandId: PaymentCommandIdSchema,
18069
+ orgId: nonEmpty("orgId"),
18070
+ invitationId: nonEmpty("invitationId"),
18071
+ generationHash: Bytes32Schema,
18072
+ chainId: BaseSepoliaChainIdSchema,
18073
+ signerAddress: AddressSchema,
18074
+ userOpSenderSafe: SafeAddressSchema,
18075
+ digest: Bytes32Schema
18076
+ });
18077
+ Struct({
18078
+ status: Literal("submitted"),
18079
+ executionId: MoneyExecutionIdSchema,
18080
+ commandId: PaymentCommandIdSchema,
18081
+ userOpHash: Bytes32Schema
18082
+ });
17853
18083
  Struct({
17854
18084
  status: Literal("submitted"),
17855
18085
  executionId: MoneyExecutionIdSchema,
@@ -18354,6 +18584,158 @@ const CurrentPolicySchema = Union([Struct({
18354
18584
  actions: NonEmptyArray(Literals(["pay", "commitments"]))
18355
18585
  })
18356
18586
  }), Struct({ type: Literal("managePeople") })]);
18587
+ const BudgetIntentSchema = CurrentPolicySchema.pipe(refine((value) => {
18588
+ if (value.type !== "budget") return false;
18589
+ const { actions, recipients } = value.scope;
18590
+ if (new Set(actions).size !== actions.length) return false;
18591
+ return recipients.type === "anyone" || recipients.accounts.length >= 1 && recipients.accounts.length <= 32 && new Set(recipients.accounts).size === recipients.accounts.length;
18592
+ }));
18593
+ const InvitationIdSchema = NonEmptyString;
18594
+ Struct({
18595
+ ...Struct({ invitationId: InvitationIdSchema }).fields,
18596
+ expectedOfferDigest: Bytes32Schema
18597
+ });
18598
+ /** The requested grantee of one invitation. */
18599
+ const GranteeRefSchema = Union([Struct({
18600
+ type: Literal("email"),
18601
+ email: NonEmptyString
18602
+ }), Struct({
18603
+ type: Literal("account"),
18604
+ accountId: AccountIdSchema
18605
+ })]);
18606
+ Struct({
18607
+ requestKey: String$1.pipe(refine((value) => /^[\x20-\x7e]{1,128}$/.test(value))),
18608
+ to: GranteeRefSchema,
18609
+ grants: ArraySchema(Union([
18610
+ Struct({
18611
+ type: Literal("budget"),
18612
+ budgetId: PermissionIdSchema
18613
+ }),
18614
+ Struct({
18615
+ type: Literal("managePeople"),
18616
+ permissionId: PermissionIdSchema
18617
+ }),
18618
+ Struct({
18619
+ type: Literal("new_budget"),
18620
+ label: String$1.pipe(refine((value) => value.trim().length >= 1 && value.trim().length <= 128)),
18621
+ intent: BudgetIntentSchema
18622
+ })
18623
+ ]))
18624
+ }).pipe(refine((value) => {
18625
+ if (value.grants.length < 1 || value.grants.length > 16) return false;
18626
+ const existing = value.grants.flatMap((grant) => grant.type === "new_budget" ? [] : [grant.type === "budget" ? grant.budgetId : grant.permissionId]);
18627
+ return new Set(existing).size === existing.length && value.grants.filter((grant) => grant.type === "new_budget").length <= 4;
18628
+ }));
18629
+ const InvitationPhaseSchema = Literals([
18630
+ "authorizing",
18631
+ "pending",
18632
+ "pending_grant",
18633
+ "active",
18634
+ "revoking",
18635
+ "declined",
18636
+ "cancelled",
18637
+ "expired",
18638
+ "revoked"
18639
+ ]);
18640
+ const EndingReasonSchema = Literals([
18641
+ "declined",
18642
+ "cancelled",
18643
+ "expired",
18644
+ "revoked"
18645
+ ]);
18646
+ const OfferedAuthoritySchema = Union([Struct({
18647
+ type: Literal("budget"),
18648
+ budgetId: NonEmptyString.pipe(refine((value) => value.length > 0)),
18649
+ label: String$1,
18650
+ policy: BudgetIntentSchema,
18651
+ policyDigest: Bytes32Schema
18652
+ }), Struct({
18653
+ type: Literal("managePeople"),
18654
+ permissionId: PermissionIdSchema,
18655
+ label: String$1
18656
+ })]);
18657
+ const NewBudgetOfferSchema = Struct({
18658
+ type: Literal("new_budget"),
18659
+ label: String$1,
18660
+ policy: BudgetIntentSchema,
18661
+ policyDigest: Bytes32Schema
18662
+ });
18663
+ const PreviewGranteeSchema = Struct({
18664
+ partyId: NullOr(PartyIdSchema),
18665
+ accountId: NullOr(AccountIdSchema),
18666
+ safeAddress: AddressSchema,
18667
+ accountReady: NullOr(Boolean)
18668
+ });
18669
+ Struct({
18670
+ orgId: NonEmptyString.pipe(refine((value) => value.length > 0)),
18671
+ grantee: PreviewGranteeSchema,
18672
+ grants: ArraySchema(Union([OfferedAuthoritySchema, NewBudgetOfferSchema])),
18673
+ existingAssignments: ArraySchema(PermissionAssignmentIdSchema),
18674
+ includesManagement: Boolean,
18675
+ observedAt: EpochMsSchema
18676
+ });
18677
+ Struct({
18678
+ cursor: optional(NonEmptyString),
18679
+ limit: optional(Number$1.pipe(refine((value) => Number.isSafeInteger(value) && value >= 1 && value <= 100))),
18680
+ phases: optional(ArraySchema(InvitationPhaseSchema).pipe(refine((value) => new Set(value).size === value.length)))
18681
+ });
18682
+ const InvitationRecoverySchema = Struct({
18683
+ actor: Literals([
18684
+ "system",
18685
+ "invitee",
18686
+ "admin"
18687
+ ]),
18688
+ action: Literals([
18689
+ "wait",
18690
+ "retry",
18691
+ "review_offer",
18692
+ "reauthorize"
18693
+ ]),
18694
+ reason: Literals([
18695
+ "configuration_pending",
18696
+ "grant_pending",
18697
+ "provider_unavailable",
18698
+ "policy_changed",
18699
+ "cleanup_pending",
18700
+ "signer_unavailable"
18701
+ ])
18702
+ });
18703
+ Struct({
18704
+ items: ArraySchema(Struct({
18705
+ id: InvitationIdSchema,
18706
+ orgId: NonEmptyString.pipe(refine((value) => value.length > 0)),
18707
+ organizationName: String$1,
18708
+ grantee: Struct({
18709
+ partyId: PartyIdSchema,
18710
+ accountId: NullOr(AccountIdSchema),
18711
+ safeAddress: AddressSchema,
18712
+ accountReady: NullOr(Boolean)
18713
+ }),
18714
+ phase: InvitationPhaseSchema,
18715
+ grants: ArraySchema(Union([Struct({
18716
+ type: Literal("budget"),
18717
+ budgetId: NonEmptyString.pipe(refine((value) => value.length > 0))
18718
+ }), Struct({
18719
+ type: Literal("managePeople"),
18720
+ permissionId: PermissionIdSchema
18721
+ })])),
18722
+ offers: ArraySchema(OfferedAuthoritySchema),
18723
+ recovery: NullOr(InvitationRecoverySchema),
18724
+ offerDigest: Bytes32Schema,
18725
+ authorizedAt: NullOr(EpochMsSchema),
18726
+ acceptedAt: NullOr(EpochMsSchema),
18727
+ expiresAt: NullOr(EpochMsSchema),
18728
+ commandId: NullOr(PaymentCommandIdSchema),
18729
+ endingReason: NullOr(EndingReasonSchema),
18730
+ delivery: Literals([
18731
+ "not_confirmed",
18732
+ "sent",
18733
+ "failed"
18734
+ ])
18735
+ })),
18736
+ nextCursor: NullOr(NonEmptyString),
18737
+ observedAt: EpochMsSchema
18738
+ });
18357
18739
  const ActiveBudgetSchema = Struct({
18358
18740
  id: PermissionIdSchema,
18359
18741
  label: String$1,
@@ -18627,7 +19009,7 @@ function statusFromAccount(account, requirement) {
18627
19009
  }
18628
19010
  makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/addressBook"].list), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/addressBook"].get), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/addressBook"].add), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/addressBook"].hide), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/addressBook"].unhide), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/addressBook"].label), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/requestsInbox"].issue), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/requestsInbox"].list), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/requestsInbox"].get), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/requestsInbox"].cancel), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/requestsInbox"].inboxList), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/requestsInbox"].approve), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/requestsInbox"].decline);
18629
19011
  makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/queries"].me), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/queries"].depositInstructions), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/queries"].resolveRecipient), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/destinations"].add), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/destinations"].list), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/destinations"].remove), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/queries"].listPayments), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/queries"].getPayment), makeFunctionReference(CAPXUL_FUNCTIONS["movement/activity"].list), makeFunctionReference(CAPXUL_FUNCTIONS["movement/activity"].summary), makeFunctionReference(CAPXUL_FUNCTIONS["movement/activity"].get), makeFunctionReference(CAPXUL_FUNCTIONS["movement/activity"].annotate), makeFunctionReference(CAPXUL_FUNCTIONS["movement/annotations"].overlay), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/queries"].getPaymentDocument), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/queries"].verifyPaymentDocument), makeFunctionReference(CAPXUL_FUNCTIONS["financialOps/queries"].renderStoredDocument);
18630
- makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/actions"].abandonPaymentExecution), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/actions"].preparePermissionExecution), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/actions"].preparePaymentExecution), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/paymentCommandActions"].prepareOrganizationPaymentExecution), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/paymentCommandActions"].preparePaymentLifecycleExecution), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/actions"].submitPaymentExecution), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/actions"].submitPermissionExecution), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/paymentCommandActions"].submitPaymentCommandExecution);
19012
+ makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/actions"].abandonPaymentExecution), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/actions"].prepareInvitationConfiguration), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/actions"].preparePermissionExecution), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/actions"].preparePaymentExecution), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/paymentCommandActions"].prepareOrganizationPaymentExecution), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/paymentCommandActions"].preparePaymentLifecycleExecution), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/actions"].submitPaymentExecution), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/actions"].submitInvitationConfigurationExecution), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/actions"].submitPermissionExecution), makeFunctionReference(CAPXUL_FUNCTIONS["moneyExecution/paymentCommandActions"].submitPaymentCommandExecution);
18631
19013
  TaggedError("IndexerReadError");
18632
19014
  Service()("@capxul/sdk/ports/IndexerReadPort");
18633
19015
  //#endregion
@@ -18925,7 +19307,7 @@ var SmartAccountPortTag = class extends Service()("@capxul/sdk/ports/SmartAccoun
18925
19307
  makeFunctionReference(CAPXUL_FUNCTIONS["smartAccount/queries"].loadByAuthUserId), makeFunctionReference(CAPXUL_FUNCTIONS["smartAccount/queries"].loadBySmartAccountAddress), makeFunctionReference(CAPXUL_FUNCTIONS["smartAccount/mutations"].provision), makeFunctionReference(CAPXUL_FUNCTIONS["smartAccount/actions"].confirmDeployment), makeFunctionReference(CAPXUL_FUNCTIONS["smartAccount/actions"].claim);
18926
19308
  TaggedError("OrgError");
18927
19309
  Service()("@capxul/sdk/ports/OrgPort");
18928
- makeFunctionReference(CAPXUL_FUNCTIONS["org/queries"].listAll), makeFunctionReference(CAPXUL_FUNCTIONS["org/queries"].listRolesByOrgId), makeFunctionReference(CAPXUL_FUNCTIONS["org/queries"].listMembersByOrgId), makeFunctionReference(CAPXUL_FUNCTIONS["org/actions"].readTreasury), makeFunctionReference(CAPXUL_FUNCTIONS["org/actions"].inviteMember), makeFunctionReference(CAPXUL_FUNCTIONS["org/mutations"].resendInviteToken), makeFunctionReference(CAPXUL_FUNCTIONS["org/actions"].detectAndAcceptPendingInvitations);
19310
+ makeFunctionReference(CAPXUL_FUNCTIONS["org/queries"].listAll), makeFunctionReference(CAPXUL_FUNCTIONS["org/queries"].listRolesByOrgId), makeFunctionReference(CAPXUL_FUNCTIONS["org/queries"].listMembersByOrgId), makeFunctionReference(CAPXUL_FUNCTIONS["org/actions"].readTreasury);
18929
19311
  makeFunctionReference(CAPXUL_FUNCTIONS["org/lifecycle"].startOrResume), makeFunctionReference(CAPXUL_FUNCTIONS["org/actions"].prepareFounderAccount), makeFunctionReference(CAPXUL_FUNCTIONS["org/actions"].prepareBootstrap), makeFunctionReference(CAPXUL_FUNCTIONS["org/actions"].submitBootstrap), makeFunctionReference(CAPXUL_FUNCTIONS["org/actions"].resumeBootstrapSubmission), makeFunctionReference(CAPXUL_FUNCTIONS["org/actions"].confirmBootstrap), makeFunctionReference(CAPXUL_FUNCTIONS["org/lifecycle"].recordFailure), makeFunctionReference(CAPXUL_FUNCTIONS["org/lifecycle"].load), makeFunctionReference(CAPXUL_FUNCTIONS["org/lifecycle"].retry);
18930
19312
  //#endregion
18931
19313
  //#region ../../packages/sdk/src/flows/identity.ts
@@ -19078,6 +19460,8 @@ gen(function* () {
19078
19460
  makeFunctionReference(CAPXUL_FUNCTIONS.media.generateUploadUrl), makeFunctionReference(CAPXUL_FUNCTIONS.media.setProfileImage), makeFunctionReference(CAPXUL_FUNCTIONS.media.setOrgLogo);
19079
19461
  makeFunctionReference(CAPXUL_FUNCTIONS.system.healthObserved);
19080
19462
  makeFunctionReference(CAPXUL_FUNCTIONS["org/queries"].me);
19463
+ makeFunctionReference(CAPXUL_FUNCTIONS["org/queries"].previewInvite), makeFunctionReference(CAPXUL_FUNCTIONS["org/queries"].listMyInvitations), makeFunctionReference(CAPXUL_FUNCTIONS["org/queries"].listInvitations), makeFunctionReference(CAPXUL_FUNCTIONS["org/queries"].getInvitation), makeFunctionReference(CAPXUL_FUNCTIONS["org/mutations"].invite), makeFunctionReference(CAPXUL_FUNCTIONS["org/mutations"].accept), makeFunctionReference(CAPXUL_FUNCTIONS["org/mutations"].decline), makeFunctionReference(CAPXUL_FUNCTIONS["org/mutations"].cancel), makeFunctionReference(CAPXUL_FUNCTIONS["org/mutations"].resend), makeFunctionReference(CAPXUL_FUNCTIONS["org/mutations"].retry);
19464
+ CAPXUL_OPERATIONS.org.invitations;
19081
19465
  makeFunctionReference(CAPXUL_FUNCTIONS["permission/queries"].read);
19082
19466
  makeFunctionReference(CAPXUL_FUNCTIONS["payroll/actions"].authorizeRun), makeFunctionReference(CAPXUL_FUNCTIONS["payroll/queries"].runs), makeFunctionReference(CAPXUL_FUNCTIONS["payroll/queries"].groups), makeFunctionReference(CAPXUL_FUNCTIONS["payroll/queries"].terms), makeFunctionReference(CAPXUL_FUNCTIONS["payroll/mutations"].saveGroup), makeFunctionReference(CAPXUL_FUNCTIONS["payroll/mutations"].removeGroup);
19083
19467
  CAPXUL_OPERATIONS.payroll.authorizeRun;
@@ -19160,15 +19544,15 @@ var deployment_topology_default = {
19160
19544
  "staging": {
19161
19545
  "appEnv": "staging",
19162
19546
  "productRole": "staging",
19163
- "substrate": "self-hosted-railway",
19164
- "convexProject": "adorable-illumination",
19165
- "deployment": "self-hosted:railway",
19547
+ "substrate": "self-hosted-coolify",
19548
+ "convexProject": "capxul-staging",
19549
+ "deployment": "self-hosted:coolify",
19166
19550
  "deploymentReference": "production",
19167
- "name": "convex-backend-production-f220",
19551
+ "name": "capxul-staging",
19168
19552
  "convexType": "self-hosted",
19169
- "convexUrl": "https://convex-backend-production-f220.up.railway.app",
19170
- "convexSiteUrl": "https://api.staging.capxul.com",
19171
- "authProviderJwksUrl": "https://convex-site-production-29eb.up.railway.app/api/auth/convex/jwks",
19553
+ "convexUrl": "https://convex.preview.abuusama.dev",
19554
+ "convexSiteUrl": "https://site.preview.abuusama.dev",
19555
+ "authProviderJwksUrl": "https://site.preview.abuusama.dev/api/auth/convex/jwks",
19172
19556
  "chainId": 84532,
19173
19557
  "expectedFingerprints": {
19174
19558
  "applicationId": "8a99496340f792f4",
@@ -19197,7 +19581,7 @@ function resolveDeploymentTier(appEnv) {
19197
19581
  }
19198
19582
  function assertDeploymentTuple(appEnv, values) {
19199
19583
  const tier = resolveDeploymentTier(appEnv);
19200
- const selfHosted = tier.substrate === "self-hosted-railway";
19584
+ const selfHosted = tier.convexType === "self-hosted";
19201
19585
  const expected = {
19202
19586
  CONVEX_URL: tier.convexUrl,
19203
19587
  CONVEX_SITE_URL: tier.convexSiteUrl,
@@ -19303,7 +19687,7 @@ const PLATFORM_ENV_NAMES = [
19303
19687
  "windir"
19304
19688
  ];
19305
19689
  function convexArgsForTarget(args, target, hasDeployKey) {
19306
- if (target.substrate === "self-hosted-railway") return [...args];
19690
+ if (target.substrate !== "convex-cloud") return [...args];
19307
19691
  if (hasDeployKey) return [...args];
19308
19692
  if (args[0] === "run") return [
19309
19693
  "run",
@@ -19324,7 +19708,7 @@ function convexChildEnv(target, sourceEnv) {
19324
19708
  PATH: process.env.PATH ?? "",
19325
19709
  TMPDIR: process.env.TMPDIR ?? tmpdir()
19326
19710
  };
19327
- if (target.substrate === "self-hosted-railway") {
19711
+ if (target.substrate !== "convex-cloud") {
19328
19712
  env.CONVEX_SELF_HOSTED_URL = target.convexUrl;
19329
19713
  const adminKey = sourceEnv.CONVEX_SELF_HOSTED_ADMIN_KEY?.trim();
19330
19714
  if (adminKey !== void 0 && adminKey.length > 0) env.CONVEX_SELF_HOSTED_ADMIN_KEY = adminKey;
@@ -19498,7 +19882,7 @@ async function runFaucetSend() {
19498
19882
  return 0;
19499
19883
  } catch (error) {
19500
19884
  s.stop("Faucet send failed");
19501
- const hint = process.env.CONVEX_SELF_HOSTED_ADMIN_KEY === void 0 ? "\nHint: CONVEX_SELF_HOSTED_ADMIN_KEY is not set — the faucet needs operator access to Railway staging. Supply it directly or, inside the infrastructure repo, run `APP_ENV=staging vp exec bash scripts/capxul-env.sh npx @capxul/sandbox faucet send`." : "";
19885
+ const hint = process.env.CONVEX_SELF_HOSTED_ADMIN_KEY === void 0 ? "\nHint: CONVEX_SELF_HOSTED_ADMIN_KEY is not set — the faucet needs operator access to Coolify staging. Supply it directly or, inside the infrastructure repo, run `APP_ENV=staging vp exec bash scripts/capxul-env.sh npx @capxul/sandbox faucet send`." : "";
19502
19886
  cancel(errorMessage(error) + hint);
19503
19887
  return 1;
19504
19888
  }
@@ -19632,7 +20016,7 @@ async function runKeyCreate() {
19632
20016
  return 0;
19633
20017
  }
19634
20018
  const origin = normalizeHttpOrigin(originPrompt);
19635
- const baseUrl = process.env.CAPXUL_QUICKSTART_URL ?? "https://api.staging.capxul.com";
20019
+ const baseUrl = process.env.CAPXUL_QUICKSTART_URL ?? "https://site.preview.abuusama.dev";
19636
20020
  const envPath = resolve(process.cwd(), ".env.local");
19637
20021
  const s = spinner();
19638
20022
  s.start("Requesting a sandbox publishable key");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capxul/sandbox",
3
- "version": "4.20.0-beta.6",
3
+ "version": "4.20.0-beta.7",
4
4
  "private": false,
5
5
  "description": "Capxul sandbox CLI for canonical quickstart keys and testnet faucet funds.",
6
6
  "keywords": [
@@ -42,7 +42,7 @@
42
42
  "typescript": "npm:@typescript/typescript6@6.0.2",
43
43
  "vite": "npm:@voidzero-dev/vite-plus-core@0.3.0",
44
44
  "vite-plus": "0.3.0",
45
- "@capxul/sdk": "4.20.0-beta.6",
45
+ "@capxul/sdk": "4.20.0-beta.7",
46
46
  "@capxul/typescript-config": "0.0.0"
47
47
  },
48
48
  "scripts": {