@capxul/sdk-react 4.20.0-beta.4 → 4.20.0-beta.40

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.
package/dist/index.d.mts CHANGED
@@ -1,8 +1,9 @@
1
- import { A as entered, C as CreateOrganizationFailure, D as OrganizationDetails, E as InvocationOptions, F as useCapxulTransitions, M as useCapxulDestination, N as useCapxulIdentity, O as ProfileDetails, P as useCapxulSend, S as CapxulSend, T as Destination, _ as ReadyDestination, a as AuthenticationSlots, b as Slot, c as ControllerAction, d as OnboardingControllerProps, f as OrgFailure, g as ProfileSlotProps, h as PendingAuthState, i as AuthenticatedState, j as useCapxulAuth, k as SendResult, l as FaultedState, m as OtpPendingState, n as AccountProgress, o as CapxulAuthenticationController, p as OrgProgress, r as ActionResult, s as CapxulOnboardingController, t as AccountFailure, u as NavigationAction, v as RetryAction, w as CreateOrganizationSubmission, x as CapxulAuth, y as SignedOutState } from "./controllers-BWmKRFy6.mjs";
1
+ import { A as TransitionListener, C as CreateOrganizationFailure, D as OrganizationDetails, E as InvocationOptions, O as ProfileDetails, S as CapxulSend, T as Destination, _ as ReadyDestination, a as ActionResult, b as Slot, c as CapxulAuthenticationController, d as NavigationAction, f as OrgFailure, g as ProfileSlotProps, h as PendingAuthState, i as AccountProgress, k as SendResult, l as ControllerAction, m as OtpPendingState, n as OnboardingControllerProps, o as AuthenticatedState, p as OrgProgress, r as AccountFailure, s as AuthenticationSlots, t as CapxulOnboardingController, u as FaultedState, v as RetryAction, w as CreateOrganizationSubmission, x as CapxulAuth, y as SignedOutState } from "./onboarding-controller-DrJiYWfY.mjs";
2
+ import * as React from "react";
2
3
  import { ReactNode, RefCallback } from "react";
3
4
  import { QueryClient, UseMutationResult, UseQueryResult } from "@tanstack/react-query";
4
- import { Account, AccountRequirement, ActivityAnnotation, ActivityAnnotationInput, ActivityDetail, ActivityKind, ActivityListParams, ActivityPage, ActivityPhase, ActivityRange, ActivityReference, ActorReference, AddressBookEntry, BudgetId, CapxulClient, CapxulError, CapxulResult, CapxulSigner, CreateOrgInput, CurrentHoldings, HostObservability, IdentityDestination, IdentityState, InviteMemberInput, MemberView, Money, MoneyParseErrorReason, OrgId, OrgView, OrganizationPaymentBatchInput, OrganizationPaymentInput, PartyId, Payment, PaymentDirection, PaymentDocumentRef, PaymentDocumentRender, PaymentStatus, PaymentTiming, PaymentType, PaymentsPayInput, PayrollGroupId, PayrollGroupInput, PayrollRunId, PayrollRunStatus, Permission, PermissionMethods, PermissionReadResult, Profile, RoleView, SubmittedPermissionExecution, isClaimed, isRestoring } from "@capxul/sdk";
5
- //#region src/provider.d.ts
5
+ import { Account, AccountRequirement, ActivityAnnotation, ActivityAnnotationInput, ActivityDetail, ActivityItem, ActivityKind, ActivityListParams, ActivityPage, ActivityPhase, ActivityRange, ActivityReference, ActivitySummaryTotal, ActorReference, AddressBookEntry, AssetAmount, AssetId, BudgetId, CapxulClient, CapxulError, CapxulResult, CapxulSigner, CurrentHoldings, HostObservability, IdentityDestination, IdentityState, IdentityTransition, MemberView, Money, MoneyParseErrorReason, OrgId, OrganizationAccess, OrganizationOnboarding, OrganizationOnboardingInput, OrganizationPaymentBatchInput, OrganizationPaymentInput, Page, PartyId, Payment, PaymentDirection, PaymentDocumentDownload, PaymentDocumentReadRef, PaymentDocumentRef, PaymentDocumentRender, PaymentStatus, PaymentType, PaymentsPayInput, PayrollGroupId, PayrollGroupInput, PayrollRunId, PayrollRunStatus, Permission, PermissionMethods, PermissionReadResult, Profile, RoleView, StateLabel, SubmittedPermissionExecution, isClaimed, isRestoring } from "@capxul/sdk";
6
+ //#region src/platform/provider.d.ts
6
7
  type CapxulProviderSharedProps = {
7
8
  /** Bring your own QueryClient; otherwise the provider creates one. */
8
9
  readonly queryClient?: QueryClient;
@@ -28,6 +29,11 @@ type CapxulProviderPublishableKeyProps = CapxulProviderSharedProps & {
28
29
  * route cross-origin for the publishable key's allowed origins.
29
30
  */
30
31
  readonly bootstrapBaseUrl?: string;
32
+ /**
33
+ * AUTH A3. Pass `"explicit"` on `/connect` so restore and OTP do not write
34
+ * Profile, Account, or invitations. Default automatic.
35
+ */
36
+ readonly accountSetup?: "automatic" | "explicit";
31
37
  };
32
38
  /**
33
39
  * Node / server / test path — a pre-built client is supplied; lifecycle stays
@@ -43,181 +49,151 @@ type CapxulProviderInjectedClientProps = CapxulProviderSharedProps & {
43
49
  readonly bootstrapBaseUrl?: never;
44
50
  };
45
51
  type CapxulProviderProps = CapxulProviderPublishableKeyProps | CapxulProviderInjectedClientProps;
46
- declare function CapxulProvider(props: CapxulProviderProps): import("react/jsx-runtime").JSX.Element;
52
+ export declare function CapxulProvider(props: CapxulProviderProps): React.JSX.Element;
47
53
  //#endregion
48
- //#region src/internal/capxul-bootstrap-context.d.ts
54
+ //#region src/platform/bootstrap-context.d.ts
49
55
  type CapxulBootstrapStatus = "bootstrapping" | "ready" | "error";
50
56
  interface CapxulBootstrapState {
51
57
  readonly status: CapxulBootstrapStatus;
52
58
  readonly error: CapxulError | null;
53
59
  readonly retry: () => void;
54
60
  }
55
- declare function useCapxul(): CapxulBootstrapState;
61
+ export declare function useCapxul(): CapxulBootstrapState;
56
62
  //#endregion
57
- //#region src/internal/capxul-client-context.d.ts
63
+ //#region src/platform/client-context.d.ts
58
64
  /**
59
65
  * Returns the client, or `null` while `<CapxulProvider>` is still bootstrapping.
60
66
  * Data hooks use this so they can sit in `isPending` (disabled query) until the
61
67
  * client resolves, rather than throwing during bootstrap.
62
68
  */
63
- declare function useCapxulClientOrNull(): CapxulClient | null;
64
- //#endregion
65
- //#region src/hooks/use-capxul-profile.d.ts
66
- type UseCapxulProfileReturn = UseQueryResult<Profile | null, CapxulError>;
67
- declare function useCapxulProfile(): UseCapxulProfileReturn;
68
- //#endregion
69
- //#region src/hooks/use-capxul-account-balance.d.ts
70
- type UseCapxulAccountBalanceReturn = UseQueryResult<Account, CapxulError>;
71
- type UseCapxulAccountBalanceOptions = {
72
- /** When false, skips the Convex readBalance action until the account ladder is ready. */
73
- readonly enabled?: boolean;
74
- };
75
- declare function useCapxulAccountBalance(options?: UseCapxulAccountBalanceOptions): UseCapxulAccountBalanceReturn;
76
- //#endregion
77
- //#region src/hooks/use-capxul-account-fund.d.ts
78
- type UseCapxulAccountFundReturn = UseMutationResult<{
79
- readonly txHash: string;
80
- }, CapxulError, Money>;
81
- declare function useCapxulAccountFund(): UseCapxulAccountFundReturn;
82
- //#endregion
83
- //#region src/hooks/use-capxul-money.d.ts
84
- type CapxulPayIntent = PaymentsPayInput;
85
- type UseCapxulPayReturn = UseMutationResult<Payment, CapxulError, CapxulPayIntent>;
86
- declare function useCapxulPay(): UseCapxulPayReturn;
87
- type UseCapxulCreateCommitmentReturn = UseMutationResult<Payment, CapxulError, PaymentsPayInput & {
88
- readonly timing: Exclude<PaymentTiming, {
89
- readonly kind: "instant";
90
- }>;
91
- }>;
92
- declare function useCapxulCreateCommitment(): UseCapxulCreateCommitmentReturn;
93
- declare const useCapxulClaimPayment: () => UseMutationResult<Payment, CapxulError, string>;
94
- declare const useCapxulCancelPayment: () => UseMutationResult<Payment, CapxulError, string>;
95
- type UseCapxulRedirectPaymentReturn = UseMutationResult<Payment, CapxulError, Parameters<import("@capxul/sdk").PaymentsMethods["redirect"]>[0]>;
96
- declare function useCapxulRedirectPayment(): UseCapxulRedirectPaymentReturn;
97
- type UseCapxulPaymentsReturn = UseQueryResult<readonly Payment[], CapxulError>;
98
- declare function useCapxulPayments(options?: {
99
- readonly enabled?: boolean;
100
- }): UseCapxulPaymentsReturn;
101
- type UseCapxulPaymentReturn = UseQueryResult<Payment | null, CapxulError>;
102
- declare function useCapxulPayment(paymentId: string | undefined, options?: {
103
- readonly enabled?: boolean;
104
- }): UseCapxulPaymentReturn;
105
- //#endregion
106
- //#region src/hooks/use-capxul-organization-payments.d.ts
107
- /**
108
- * `orgId` may be absent because a screen has no branded org id until its org
109
- * context loads (`OrgView.id` is the branded one). An absent id refuses the
110
- * mutation the way every other org read refuses one, rather than forcing a
111
- * `as OrgId` cast at the call site.
112
- */
113
- declare function useCapxulOrganizationPay(orgId: OrgId | undefined): UseMutationResult<Payment, CapxulError, OrganizationPaymentInput>;
114
- declare function useCapxulOrganizationPayBatch(orgId: OrgId): UseMutationResult<readonly Payment[], CapxulError, OrganizationPaymentBatchInput>;
115
- //#endregion
116
- //#region src/hooks/use-capxul-permissions.d.ts
117
- type Operation = "create" | "change" | "assign" | "revoke" | "replace";
118
- type Input<K extends Operation> = Parameters<PermissionMethods[K]>[0];
119
- declare const useCapxulPermissionCreate: (orgId: OrgId) => UseMutationResult<SubmittedPermissionExecution, CapxulError, Input<"create">>;
120
- declare const useCapxulPermissionChange: (orgId: OrgId) => UseMutationResult<SubmittedPermissionExecution, CapxulError, Input<"change">>;
121
- declare const useCapxulPermissionAssign: (orgId: OrgId) => UseMutationResult<SubmittedPermissionExecution, CapxulError, Input<"assign">>;
122
- declare const useCapxulPermissionRevoke: (orgId: OrgId) => UseMutationResult<SubmittedPermissionExecution, CapxulError, Input<"revoke">>;
123
- declare const useCapxulPermissionReplace: (orgId: OrgId) => UseMutationResult<SubmittedPermissionExecution, CapxulError, Input<"replace">>;
124
- declare function useCapxulPermissions(orgId: OrgId, options?: {
125
- readonly enabled?: boolean;
126
- }): UseQueryResult<PermissionReadResult, CapxulError>;
127
- declare function useCapxulPermission(orgId: OrgId, permissionId: string | undefined): UseQueryResult<Permission | null, CapxulError>;
69
+ export declare function useCapxulClientOrNull(): CapxulClient | null;
128
70
  //#endregion
129
- //#region src/hooks/use-capxul-activity.d.ts
130
- declare function useCapxulActivity(params?: ActivityListParams): UseQueryResult<ActivityPage, CapxulError>;
131
- declare function useCapxulActivityDetail(reference: ActivityReference | undefined, actor?: ActorReference): UseQueryResult<ActivityDetail | null, CapxulError>;
132
- declare function useCapxulAnnotateMovement(): UseMutationResult<ActivityAnnotation, CapxulError, ActivityAnnotationInput>;
71
+ //#region src/platform/identity.d.ts
72
+ export declare function useCapxulIdentity(): IdentityState;
73
+ export declare function useCapxulSend(): CapxulSend;
74
+ export declare function useCapxulAuth(): CapxulAuth;
75
+ export declare function useCapxulDestination(): Destination | null;
76
+ export declare function useCapxulTransitions(listener: TransitionListener): void;
77
+ export declare const entered: (record: IdentityTransition, target: StateLabel) => boolean;
133
78
  //#endregion
134
- //#region src/hooks/use-capxul-holdings.d.ts
135
- interface UseCapxulHoldingsParams {
136
- /** Omitted = the signed-in person. SDK core already accepts one. */
137
- readonly actor?: ActorReference;
79
+ //#region src/access/use-client-connection.d.ts
80
+ interface OtpSlice {
81
+ readonly email: string;
82
+ readonly pending: boolean;
83
+ readonly canResend: boolean;
84
+ readonly verifyCode: (code: string) => Promise<void>;
85
+ readonly resend: () => Promise<void>;
86
+ }
87
+ interface ConsentSlice {
88
+ readonly verifiedEmail: string;
89
+ readonly clientLabel: string;
90
+ readonly scopeCodes: readonly string[];
91
+ readonly purpose: "login" | "signup";
92
+ readonly setupState: "not_required" | "new" | "resumable";
93
+ readonly pending: boolean;
94
+ readonly accept: () => Promise<void>;
95
+ readonly cancel: () => Promise<void>;
96
+ }
97
+ interface CompleteSlice {
98
+ readonly outcome: "connected";
99
+ }
100
+ interface FailureSlice {
101
+ readonly code: string;
102
+ readonly field?: string;
103
+ readonly retry: () => Promise<void>;
104
+ readonly cancel: () => Promise<void>;
138
105
  }
139
- declare function useCapxulHoldings(params?: UseCapxulHoldingsParams): UseQueryResult<CurrentHoldings, CapxulError>;
140
- //#endregion
141
- //#region src/hooks/use-capxul-orgs.d.ts
142
- /**
143
- * List the Organizations that the current user can access. Binds directly to
144
- * the locked `capxul.orgs()` SDK method.
145
- */
146
- type UseCapxulOrgsReturn = UseQueryResult<readonly OrgView[], CapxulError>;
147
- type UseCapxulOrgsOptions = {
148
- /**
149
- * Gate the query on auth readiness. `client.orgs()` is a session-scoped
150
- * authenticated read; firing it before the session token settles surfaces a
151
- * spurious `NOT_AUTHENTICATED`. Consumers pass `enabled: <auth-ready>`.
152
- * Defaults to `true` to preserve the bare `useCapxulOrgs()` call shape.
153
- */
154
- readonly enabled?: boolean;
155
- };
156
- declare function useCapxulOrgs(options?: UseCapxulOrgsOptions): UseCapxulOrgsReturn;
157
- //#endregion
158
- //#region src/hooks/use-capxul-org-members.d.ts
159
- type UseCapxulOrgMembersOptions = {
160
- readonly enabled?: boolean;
161
- };
162
- /**
163
- * List the members of one Organization. Binds directly to
164
- * `capxul.org(orgId).members()`. Gated by
165
- * `orgId !== undefined`; callers may additionally gate on canonical identity
166
- * readiness through `options.enabled`.
167
- */
168
- type UseCapxulOrgMembersReturn = UseQueryResult<readonly MemberView[], CapxulError>;
169
- declare function useCapxulOrgMembers(orgId: OrgId | undefined, options?: UseCapxulOrgMembersOptions): UseCapxulOrgMembersReturn;
170
106
  //#endregion
171
- //#region src/hooks/use-capxul-org-roles.d.ts
172
- type UseCapxulOrgRolesOptions = {
173
- readonly enabled?: boolean;
107
+ //#region src/access/client-connection.d.ts
108
+ interface CapxulClientConnectionProps {
109
+ readonly client: CapxulClient;
110
+ readonly requestId: string;
111
+ readonly children: ReactNode;
112
+ }
113
+ declare function Root$7({ client, requestId, children }: CapxulClientConnectionProps): import("react").JSX.Element;
114
+ declare function Checking$1({ children }: {
115
+ readonly children: ReactNode;
116
+ }): import("react").JSX.Element | null;
117
+ declare function Otp({ children }: {
118
+ readonly children: (slice: OtpSlice) => ReactNode;
119
+ }): import("react").JSX.Element | null;
120
+ declare function Consent({ children }: {
121
+ readonly children: (slice: ConsentSlice) => ReactNode;
122
+ }): import("react").JSX.Element | null;
123
+ declare function Complete({ children }: {
124
+ readonly children: (slice: CompleteSlice) => ReactNode;
125
+ }): import("react").JSX.Element | null;
126
+ declare function Failure({ children }: {
127
+ readonly children: (slice: FailureSlice) => ReactNode;
128
+ }): import("react").JSX.Element | null;
129
+ export declare const CapxulClientConnection: typeof Root$7 & {
130
+ Checking: typeof Checking$1;
131
+ Otp: typeof Otp;
132
+ Consent: typeof Consent;
133
+ Complete: typeof Complete;
134
+ Failure: typeof Failure;
174
135
  };
175
- /**
176
- * List the roles for one Organization. Binds directly
177
- * to `capxul.org(orgId).roles()`. Gated by `orgId !== undefined`.
178
- */
179
- type UseCapxulOrgRolesReturn = UseQueryResult<readonly RoleView[], CapxulError>;
180
- declare function useCapxulOrgRoles(orgId: OrgId | undefined, options?: UseCapxulOrgRolesOptions): UseCapxulOrgRolesReturn;
181
136
  //#endregion
182
- //#region src/hooks/use-capxul-org-treasury.d.ts
183
- type UseCapxulOrgTreasuryOptions = {
184
- readonly enabled?: boolean;
137
+ //#region src/access/dashboard-access.d.ts
138
+ type DashboardScope = {
139
+ readonly kind: "personal";
140
+ } | {
141
+ readonly kind: "organization";
142
+ readonly orgId?: string;
185
143
  };
144
+ type DashboardAccessPhase = "checking" | "error" | "redirect" | "granted";
186
145
  /**
187
- * Return the Organization treasury Account.
188
- * NEVER `AccountStatus` (the deploy-readiness ladder, no balance). Binds
189
- * Binds directly to `capxul.org(orgId).treasury()`. Gated by `orgId !== undefined`.
190
- */
191
- type UseCapxulOrgTreasuryReturn = UseQueryResult<Account, CapxulError>;
192
- declare function useCapxulOrgTreasury(orgId: OrgId | undefined, options?: UseCapxulOrgTreasuryOptions): UseCapxulOrgTreasuryReturn;
193
- //#endregion
194
- //#region src/hooks/use-capxul-create-org.d.ts
195
- /**
196
- * Create an Organization. Binds directly to the
197
- * `capxul.createOrg(input)` SDK method. On success, invalidates the org list.
146
+ * Which probe produced the error the screen is showing. The
147
+ * error code alone cannot say: a provider failure reads the same whether the
148
+ * session read, the membership list or the lifecycle read raised it, and a
149
+ * consumer that reports a displayed gate error has to keep those apart
150
+ * (#1963 R05-2). It names the SOURCE only; `retry` still re-runs every failed
151
+ * probe, exactly as before.
198
152
  */
199
- type UseCapxulCreateOrgReturn = UseMutationResult<OrgView, CapxulError, CreateOrgInput>;
200
- declare function useCapxulCreateOrg(): UseCapxulCreateOrgReturn;
201
- //#endregion
202
- //#region src/hooks/use-capxul-invite-member.d.ts
153
+ type DashboardAccessProbe = "session" | "membership" | "lifecycle" | "authority";
154
+ interface DashboardAccessErrorSlice {
155
+ readonly error: CapxulError;
156
+ /** The probe the surfaced error came from, in the frozen precedence order. */
157
+ readonly probe: DashboardAccessProbe;
158
+ /** Re-runs each failed probe. */
159
+ readonly retry: () => void;
160
+ }
161
+ interface DashboardAccessRedirectSlice {
162
+ readonly destination: IdentityDestination;
163
+ }
164
+ interface CapxulDashboardAccessProps {
165
+ readonly scope: DashboardScope;
166
+ readonly children: ReactNode;
167
+ }
168
+ declare function Root$6({ scope, children }: CapxulDashboardAccessProps): import("react").JSX.Element;
169
+ /** Hands nothing — today's app renders `null` here, exactly as it does now. */
170
+ declare function Checking({ children }: {
171
+ readonly children?: ReactNode;
172
+ }): import("react").JSX.Element | null;
173
+ declare function DashboardError({ children }: {
174
+ readonly children: (slice: DashboardAccessErrorSlice) => ReactNode;
175
+ }): import("react").JSX.Element | null;
203
176
  /**
204
- * R06 (#1964): `options` is the browser attempt the caller captured before the
205
- * person pressed Send. It reaches the SDK operation unchanged, so the durable
206
- * `org_invite_sent` and the later `org_invite_progressed` carry that attempt's
207
- * correlation. Absent, the invitation keeps its own invocation context.
177
+ * Hands the destination and draws nothing. Reaching this part is a REQUEST to
178
+ * navigate, never an arrival: the app may cancel or supersede it, so nothing
179
+ * here — and nothing a consumer hangs off it — may claim a completed redirect
180
+ * (#1963 R05-1). The destination page's own normalized pageview proves arrival.
208
181
  */
209
- type UseCapxulInviteMemberInput = InviteMemberInput & {
210
- readonly options?: InvocationOptions;
182
+ declare function Redirect({ children }: {
183
+ readonly children: (slice: DashboardAccessRedirectSlice) => ReactNode;
184
+ }): import("react").JSX.Element | null;
185
+ declare function Granted({ children }: {
186
+ readonly children?: ReactNode;
187
+ }): import("react").JSX.Element | null;
188
+ /** The compound shape the app's own design system already uses (`StatusTabs`). */
189
+ export declare const CapxulDashboardAccess: typeof Root$6 & {
190
+ Checking: typeof Checking;
191
+ Error: typeof DashboardError;
192
+ Redirect: typeof Redirect;
193
+ Granted: typeof Granted;
211
194
  };
212
- /**
213
- * Invite a member to an Organization by email. The hook uses the closed-over `orgId`.
214
- * It binds directly to
215
- * `capxul.org(orgId).invite(input)`. On success, invalidates the member list.
216
- */
217
- type UseCapxulInviteMemberReturn = UseMutationResult<MemberView, CapxulError, UseCapxulInviteMemberInput>;
218
- declare function useCapxulInviteMember(orgId: OrgId | undefined): UseCapxulInviteMemberReturn;
219
195
  //#endregion
220
- //#region src/headless/journey/journey-state.d.ts
196
+ //#region src/profiles/journey-state.d.ts
221
197
  type OnboardingIntent = "personal" | "organization";
222
198
  type OnboardingStep = "profile" | "organization" | "provisioning";
223
199
  type PayoutDraftChain = "evm" | "solana" | "starknet";
@@ -275,40 +251,40 @@ type OnboardingJourneyPosition = {
275
251
  readonly organizationId?: string;
276
252
  readonly verification: boolean;
277
253
  };
278
- declare function startOnboardingJourney(input: {
254
+ export declare function startOnboardingJourney(input: {
279
255
  readonly intent: OnboardingIntent;
280
256
  readonly ownerId: string;
281
257
  readonly entryPoint: "signup" | "dashboard";
282
258
  readonly origin?: OnboardingOrigin;
283
259
  readonly step?: OnboardingStep;
284
260
  }): OnboardingJourney;
285
- declare function loadOnboardingJourney(expectedOwnerId?: string): OnboardingJourney | null;
286
- declare function saveOnboardingJourney(journey: OnboardingJourney): void;
287
- declare function currentOnboardingJourneyId(): string | undefined;
261
+ export declare function loadOnboardingJourney(expectedOwnerId?: string): OnboardingJourney | null;
262
+ export declare function saveOnboardingJourney(journey: OnboardingJourney): void;
263
+ export declare function currentOnboardingJourneyId(): string | undefined;
288
264
  /** Stop observation attribution while no authenticated owner is established. */
289
- declare function invalidateOnboardingJourneyObservation(): void;
265
+ export declare function invalidateOnboardingJourneyObservation(): void;
290
266
  /** Where the journey stands — the pure position apps map to their routes. */
291
- declare function onboardingJourneyPosition(journey: OnboardingJourney): OnboardingJourneyPosition;
267
+ export declare function onboardingJourneyPosition(journey: OnboardingJourney): OnboardingJourneyPosition;
292
268
  /**
293
269
  * The interruption-recovery decision (behavior map §4): a journey that does
294
270
  * not match the ready destination the app just rendered must resume; a
295
271
  * matching one needs no recovery. Returns the journey to resume, or null.
296
272
  */
297
- declare function activeOnboardingRecovery(ownerId: string, renderedReadyDestination?: {
273
+ export declare function activeOnboardingRecovery(ownerId: string, renderedReadyDestination?: {
298
274
  readonly kind: "personal";
299
275
  } | {
300
276
  readonly kind: "organization";
301
277
  readonly organizationId: string;
302
278
  }): OnboardingJourney | null;
303
- declare function acknowledgeOnboardingDestination(destination: {
279
+ export declare function acknowledgeOnboardingDestination(destination: {
304
280
  readonly kind: "personal";
305
281
  } | {
306
282
  readonly kind: "organization";
307
283
  readonly organizationId: string;
308
284
  }, ownerId: string): boolean;
309
- declare function clearOnboardingJourney(): void;
285
+ export declare function clearOnboardingJourney(): void;
310
286
  //#endregion
311
- //#region src/headless/onboarding/use-capxul-handle-availability.d.ts
287
+ //#region src/profiles/use-capxul-handle-availability.d.ts
312
288
  type HandleAvailability = {
313
289
  readonly available: boolean;
314
290
  readonly normalized: string;
@@ -321,159 +297,191 @@ type UseCapxulHandleAvailabilityReturn = UseQueryResult<HandleAvailability, Capx
321
297
  * boundary's message), not as `available: false` — only a handle someone
322
298
  * else owns is "taken".
323
299
  */
324
- declare function useCapxulHandleAvailability(handle: string, options?: {
300
+ export declare function useCapxulHandleAvailability(handle: string, options?: {
325
301
  readonly enabled?: boolean;
326
302
  readonly debounceMs?: number;
327
303
  }): UseCapxulHandleAvailabilityReturn;
328
304
  //#endregion
329
- //#region src/headless/media/use-capxul-image-upload.d.ts
330
- type ImageUploadTarget = {
331
- readonly kind: "profile";
332
- } | {
333
- readonly kind: "orgLogo";
334
- readonly orgId: string;
335
- };
336
- type ImageUploadInput = {
337
- readonly blob: Blob;
338
- readonly target: ImageUploadTarget;
305
+ //#region src/profiles/use-capxul-profile.d.ts
306
+ type UseCapxulProfileReturn = UseQueryResult<Profile | null, CapxulError>;
307
+ export declare function useCapxulProfile(): UseCapxulProfileReturn;
308
+ //#endregion
309
+ //#region src/accounts/use-capxul-account-balance.d.ts
310
+ type UseCapxulAccountBalanceReturn = UseQueryResult<Account, CapxulError>;
311
+ type UseCapxulAccountBalanceOptions = {
312
+ /** When false, skips the Convex readBalance action until the account ladder is ready. */
313
+ readonly enabled?: boolean;
339
314
  };
340
- type UseCapxulImageUploadReturn = UseMutationResult<{
341
- readonly url: string | null;
342
- }, CapxulError, ImageUploadInput>;
343
- /**
344
- * #1061 / ADR-0014: the whole upload→record sequence as one mutation —
345
- * upload the blob, then bind the returned storage id to the profile image or
346
- * the org logo. The url is the resolved serving URL (re-read from queries,
347
- * never persisted by consumers).
348
- */
349
- declare function useCapxulImageUpload(): UseCapxulImageUploadReturn;
315
+ export declare function useCapxulAccountBalance(options?: UseCapxulAccountBalanceOptions): UseCapxulAccountBalanceReturn;
350
316
  //#endregion
351
- //#region src/headless/media/use-capxul-upload-image.d.ts
352
- type UseCapxulUploadImageReturn = UseMutationResult<{
353
- readonly storageId: string;
354
- }, CapxulError, Blob>;
355
- /**
356
- * #1955: upload only. Hands back the storage id for a CREATE call to carry
357
- * (`ProfileDetails.imageStorageId`, `OrganizationDetails.logoStorageId`).
358
- *
359
- * `useCapxulImageUpload` is upload+bind and stays as it is for the settings
360
- * pages. It cannot serve onboarding: the row it binds to does not exist yet.
361
- * Nothing is bound here, so nothing is invalidated either — the create call
362
- * that carries the id owns the cache change.
363
- */
364
- declare function useCapxulUploadImage(): UseCapxulUploadImageReturn;
317
+ //#region src/accounts/use-capxul-account-fund.d.ts
318
+ type UseCapxulAccountFundReturn = UseMutationResult<{
319
+ readonly txHash: string;
320
+ }, CapxulError, AssetAmount>;
321
+ export declare function useCapxulAccountFund(): UseCapxulAccountFundReturn;
365
322
  //#endregion
366
- //#region src/headless/contacts/use-contacts.d.ts
367
- type ContactsActor = {
323
+ //#region src/accounts/use-capxul-holdings.d.ts
324
+ interface UseCapxulHoldingsParams {
325
+ /** Omitted = the signed-in person. SDK core already accepts one. */
326
+ readonly actor?: ActorReference;
327
+ }
328
+ export declare function useCapxulHoldings(params?: UseCapxulHoldingsParams): UseQueryResult<CurrentHoldings, CapxulError>;
329
+ //#endregion
330
+ //#region src/payments/use-recipient-resolution.d.ts
331
+ type SendMoneyRecipientStatus = "empty" | "invalid" | "checking" | "known-party" | "new-email" | "external-warning" | "external-ready" | "not-found" | "failed";
332
+ interface SendMoneyRecipientSlice {
333
+ readonly value: string;
334
+ readonly change: (text: string) => void;
335
+ readonly status: SendMoneyRecipientStatus;
336
+ readonly label: string | null;
337
+ readonly kind: "person" | "organization" | "external_address" | "unresolved" | null;
338
+ readonly isCapxulAccount: boolean | null;
339
+ readonly publicValue: string | null;
340
+ readonly requiresAcknowledgement: boolean;
341
+ readonly acknowledgeExternalAddress: () => void;
342
+ }
343
+ //#endregion
344
+ //#region src/payments/send-money-slices.d.ts
345
+ type SendActor = {
368
346
  readonly kind: "personal";
369
347
  } | {
370
348
  readonly kind: "organization";
371
349
  readonly orgId: OrgId | undefined;
372
350
  };
351
+ type SentPayment = {
352
+ /** The backend payment row. */
353
+ readonly payment: Payment;
354
+ /** What we parsed and sent — `.value` is the comma-stripped major-unit string. */
355
+ readonly amount: AssetAmount;
356
+ /** The trimmed text the person typed — the app's success toast interpolates it. */
357
+ readonly recipient: string;
358
+ };
373
359
  /**
374
- * How a contact entered the book. Taken from the shipped surface rather than
375
- * re-declared, so the component can never advertise a provenance the wire
376
- * cannot carry (ADR-0022 R2; #1532 owns the definition site).
377
- */
378
- type ContactRelationship = AddressBookEntry["relationship"][number];
379
- interface Contact {
380
- /**
381
- * The counterparty's `PartyId` — created once and claimed at signup, never
382
- * re-keyed (ADR-0022 R1/R3). No email, no prefix, nothing to parse.
383
- */
384
- readonly id: PartyId;
385
- /** The saved label when there is one, else the party's display name. */
386
- readonly name: string;
387
- readonly relationship: readonly ContactRelationship[];
388
- readonly hidden: boolean;
389
- /** Epoch milliseconds. The seam never formats a date; the app writes the words. */
390
- readonly lastActivityAt: number;
391
- }
392
- interface ContactRow extends Contact {
393
- /** Ours: one initials rule, not one copy per screen. */
394
- readonly initials: string;
395
- readonly rename: (name: string, options?: InvocationOptions) => void;
396
- readonly hide: (options?: InvocationOptions) => void;
397
- readonly unhide: (options?: InvocationOptions) => void;
398
- }
399
- /** ADR-0023 R1: refusal CODES, never sentences — the app owns the words. */
400
- type ContactsRefusal = "loading" | "org-unavailable" | "unavailable";
401
- /**
402
- * The blocked facts, in the fixed order `.Add.blockedReason` names them.
403
- * `"no-permission"` is absent by ruling, not by omission: the org screen places
404
- * `CapxulOrgMember.Can do="managePeople"` around its own Add control.
360
+ * Refusal CODES, never sentences (#1447 ruling 8). The app maps each code to
361
+ * the words it already prints; no English refusal string ships from here.
405
362
  */
406
- type ContactsAddBlockedReason = "org-unavailable" | "empty";
363
+ type CapxulSendMoneyBlockedReason = "signer-not-ready" | "amount-invalid" | "recipient-unresolved" | "no-source" | "no-asset";
407
364
  /**
408
- * Why an add did not land, as a code. ADR-0023 R1 supersedes the contract's
409
- * field-message carve-out: `"unresolved"` is the backend refusing to resolve
410
- * what was typed (`INVALID_INPUT`), and every other code — offline, signed
411
- * out, refused — is `"failed"`. A person can fix only one of them.
365
+ * One Budget the member can spend from — the id the payment carries, and
366
+ * nothing else.
367
+ *
368
+ * THE CONTRACT (amended 3) reverses amendment 7: the From row keeps the app's
369
+ * frozen `"<Org> Treasury"` string, and no budget label and no limit display
370
+ * cross this seam until the budgets build ships a remaining figure that is
371
+ * actually computable (ADR-0024 R3). The app already holds the org name and
372
+ * already builds that sentence today, so the option carries only what the app
373
+ * cannot know — which Budget the send is drawn from.
412
374
  */
413
- type ContactsAddError = "unresolved" | "failed";
414
- interface ContactsSummarySlice {
415
- readonly total: number | null;
416
- readonly activeCount: number | null;
417
- readonly isLoading: boolean;
418
- readonly reason: ContactsRefusal | null;
419
- }
420
- interface ContactsListSlice {
421
- readonly rows: readonly ContactRow[];
422
- readonly isLoading: boolean;
423
- readonly reason: ContactsRefusal | null;
375
+ interface SendMoneySourceOption {
376
+ readonly id: BudgetId;
424
377
  }
425
- interface ContactsListOptions {
426
- readonly limit?: number | undefined;
427
- /** `"all"` forwards `includeHidden` to the backend, which already accepts it. */
428
- readonly show?: "visible" | "all" | undefined;
378
+ /** ADR-0023 R1: a code, never a sentence — the app owns the words. */
379
+ type SendMoneySourceError = "read-failed";
380
+ interface SendMoneySourceSlice {
381
+ readonly options: ReadonlyArray<SendMoneySourceOption>;
382
+ readonly selected: SendMoneySourceOption | null;
383
+ readonly select: (id: string) => void;
384
+ readonly error: SendMoneySourceError | null;
385
+ readonly isPending: boolean;
429
386
  }
430
- interface ContactsAddSlice {
387
+ interface SendMoneyAssetOption {
388
+ readonly id: AssetId;
389
+ readonly symbol: string;
390
+ readonly availableDisplay: string;
391
+ }
392
+ /** ADR-0023 R1: a code, never a sentence — the app owns the words. */
393
+ type SendMoneyAssetError = "read-failed";
394
+ interface SendMoneyAssetSlice {
395
+ readonly options: ReadonlyArray<SendMoneyAssetOption>;
396
+ readonly selected: SendMoneyAssetOption | null;
397
+ readonly select: (id: string) => void;
398
+ readonly error: SendMoneyAssetError | null;
399
+ readonly isPending: boolean;
400
+ }
401
+ interface SendMoneyAmountSlice {
431
402
  readonly value: string;
432
403
  readonly change: (text: string) => void;
433
- /**
434
- * #1960 R02: hand it the options the screen captured BEFORE the click. The
435
- * same snapshot reaches the SDK add call and comes back on `onAdded`/
436
- * `onFailed`, so the UI observation and the operation share one identity even
437
- * when the reply lands after an account switch. Omitted stays omitted.
438
- */
439
- readonly submit: (options?: InvocationOptions) => void;
404
+ /** ADR-0023 R1: the parse verdict as a closed code; the app maps it to copy. */
405
+ readonly error: MoneyParseErrorReason | null;
406
+ readonly availableDisplay: string | null;
407
+ }
408
+ interface SendMoneyActionsSlice {
409
+ readonly submit: () => void;
440
410
  readonly isSubmitting: boolean;
441
411
  readonly blocked: boolean;
442
- readonly blockedReason: ContactsAddBlockedReason | null;
443
- readonly error: ContactsAddError | null;
412
+ readonly blockedReason: CapxulSendMoneyBlockedReason | null;
444
413
  }
445
414
  //#endregion
446
- //#region src/headless/contacts/contacts.d.ts
447
- interface CapxulContactsProps {
448
- readonly actor: ContactsActor;
449
- /**
450
- * `options` is exactly what the caller handed `.Add.submit` or a row verb, so
451
- * the screen's own observation of the finished action can reuse the attempt
452
- * identity the SDK operation ran under (#1960 R02).
453
- */
454
- readonly onAdded: (contact: Contact, options?: InvocationOptions) => void;
415
+ //#region src/payments/send-money.d.ts
416
+ interface CapxulSendMoneyProps {
417
+ readonly actor: SendActor;
418
+ readonly onSent: (sent: SentPayment) => void;
455
419
  /** ADR-0023 R1: the app maps `error.code` to its own copy; no SDK sentence. */
456
- readonly onFailed: (error: CapxulError, options?: InvocationOptions) => void;
420
+ readonly onFailed: (error: CapxulError) => void;
457
421
  readonly children: ReactNode;
458
422
  }
459
- declare function Root$6({ actor, onAdded, onFailed, children }: CapxulContactsProps): import("react/jsx-runtime").JSX.Element;
460
- declare function Summary$3({ children }: {
461
- readonly children: (slice: ContactsSummarySlice) => ReactNode;
462
- }): import("react/jsx-runtime").JSX.Element;
463
- declare function List({ limit, show, children }: ContactsListOptions & {
464
- readonly children: (slice: ContactsListSlice) => ReactNode;
465
- }): import("react/jsx-runtime").JSX.Element;
466
- declare function Add({ children }: {
467
- readonly children: (slice: ContactsAddSlice) => ReactNode;
468
- }): import("react/jsx-runtime").JSX.Element;
423
+ declare function Root$5({ actor, onSent, onFailed, children }: CapxulSendMoneyProps): import("react").JSX.Element;
424
+ declare function Source({ children }: {
425
+ readonly children: (slice: SendMoneySourceSlice) => ReactNode;
426
+ }): import("react").JSX.Element;
427
+ declare function Asset$1({ children }: {
428
+ readonly children: (slice: SendMoneyAssetSlice) => ReactNode;
429
+ }): import("react").JSX.Element;
430
+ declare function Amount({ children }: {
431
+ readonly children: (slice: SendMoneyAmountSlice) => ReactNode;
432
+ }): import("react").JSX.Element;
433
+ declare function Recipient({ children }: {
434
+ readonly children: (slice: SendMoneyRecipientSlice) => ReactNode;
435
+ }): import("react").JSX.Element;
436
+ declare function Actions$1({ children }: {
437
+ readonly children: (slice: SendMoneyActionsSlice) => ReactNode;
438
+ }): import("react").JSX.Element;
469
439
  /** The compound shape the app's own design system already uses (`StatusTabs`). */
470
- declare const CapxulContacts: typeof Root$6 & {
471
- Summary: typeof Summary$3;
472
- List: typeof List;
473
- Add: typeof Add;
440
+ export declare const CapxulSendMoney: typeof Root$5 & {
441
+ Source: typeof Source;
442
+ Asset: typeof Asset$1;
443
+ Amount: typeof Amount;
444
+ Recipient: typeof Recipient;
445
+ Actions: typeof Actions$1;
474
446
  };
475
447
  //#endregion
476
- //#region src/headless/activity/types.d.ts
448
+ //#region src/payments/use-capxul-money.d.ts
449
+ type CapxulPayIntent = PaymentsPayInput;
450
+ type UseCapxulPayReturn = UseMutationResult<Payment, CapxulError, CapxulPayIntent>;
451
+ export declare function useCapxulPay(): UseCapxulPayReturn;
452
+ type UseCapxulPaymentsReturn = UseQueryResult<Page<Payment>, CapxulError>;
453
+ export declare function useCapxulPayments(options?: {
454
+ readonly enabled?: boolean;
455
+ }): UseCapxulPaymentsReturn;
456
+ type UseCapxulPaymentReturn = UseQueryResult<Payment | null, CapxulError>;
457
+ export declare function useCapxulPayment(paymentId: string | undefined, options?: {
458
+ readonly enabled?: boolean;
459
+ }): UseCapxulPaymentReturn;
460
+ //#endregion
461
+ //#region src/payments/use-capxul-organization-payments.d.ts
462
+ /**
463
+ * `orgId` may be absent because a screen has no branded org id until its org
464
+ * context loads (`OrgView.id` is the branded one). An absent id refuses the
465
+ * mutation the way every other org read refuses one, rather than forcing a
466
+ * `as OrgId` cast at the call site.
467
+ */
468
+ export declare function useCapxulOrganizationPay(orgId: OrgId | undefined): UseMutationResult<Payment, CapxulError, OrganizationPaymentInput>;
469
+ export declare function useCapxulOrganizationPayBatch(orgId: OrgId): UseMutationResult<readonly Payment[], CapxulError, OrganizationPaymentBatchInput>;
470
+ //#endregion
471
+ //#region src/permissions/use-capxul-permissions.d.ts
472
+ type Operation = "create" | "change" | "assign" | "revoke" | "replace";
473
+ type Input<K extends Operation> = Parameters<PermissionMethods[K]>[0];
474
+ export declare const useCapxulPermissionCreate: (orgId: OrgId) => UseMutationResult<SubmittedPermissionExecution, CapxulError, Input<"create">>;
475
+ export declare const useCapxulPermissionChange: (orgId: OrgId) => UseMutationResult<SubmittedPermissionExecution, CapxulError, Input<"change">>;
476
+ export declare const useCapxulPermissionAssign: (orgId: OrgId) => UseMutationResult<SubmittedPermissionExecution, CapxulError, Input<"assign">>;
477
+ export declare const useCapxulPermissionRevoke: (orgId: OrgId) => UseMutationResult<SubmittedPermissionExecution, CapxulError, Input<"revoke">>;
478
+ export declare const useCapxulPermissionReplace: (orgId: OrgId) => UseMutationResult<SubmittedPermissionExecution, CapxulError, Input<"replace">>;
479
+ export declare function useCapxulPermissions(orgId: OrgId, options?: {
480
+ readonly enabled?: boolean;
481
+ }): UseQueryResult<PermissionReadResult, CapxulError>;
482
+ export declare function useCapxulPermission(orgId: OrgId, permissionId: string | undefined): UseQueryResult<Permission | null, CapxulError>;
483
+ //#endregion
484
+ //#region src/activity/activity-slices.d.ts
477
485
  /** The settled transfer a row was built from. The app builds the explorer URL. */
478
486
  interface ActivityReceipt {
479
487
  readonly chainId: number;
@@ -509,7 +517,9 @@ type ActivityRow = {
509
517
  readonly signedAmountDisplay: string;
510
518
  readonly currency: string;
511
519
  readonly createdAt: number;
512
- readonly classification: "movement_only_outflow";
520
+ readonly classification: Extract<ActivityItem, {
521
+ readonly kind: "movement";
522
+ }>["classification"];
513
523
  readonly phase: ActivityPhase;
514
524
  readonly receipt: ActivityReceipt;
515
525
  };
@@ -520,8 +530,8 @@ type ActivityRow = {
520
530
  */
521
531
  type SummaryWindow = "all" | "last30days" | ActivityRange;
522
532
  /**
523
- * Finished money strings for ONE currency bucket, so no consumer indexes an
524
- * array of per-currency totals. All four strings are `null` and `count` is `0`
533
+ * Finished valuation strings in the display currency. Unrated assets remain
534
+ * separate. All four strings are `null` and `count` is `0`
525
535
  * when the window holds no activity — we say there is nothing, the app says it
526
536
  * in its own words.
527
537
  */
@@ -532,6 +542,7 @@ interface ActivitySummarySlice {
532
542
  readonly moneyOut: string | null;
533
543
  readonly net: string | null;
534
544
  readonly pending: string | null;
545
+ readonly unrated: readonly ActivitySummaryTotal[];
535
546
  /** A count is not money, so it is not formatted. */
536
547
  readonly count: number;
537
548
  readonly isLoading: boolean;
@@ -595,9 +606,12 @@ interface ActivityLoadMoreSlice {
595
606
  interface ActivityDetailSlice {
596
607
  /** Current Payment state from the existing detail read; absent for Movements. */
597
608
  readonly payment?: Pick<Payment, "status" | "execution">;
598
- /** ONE finished document, never the array, so no consumer writes `documents[0]`. */
599
- readonly receiptDocument: PaymentDocumentRef | null;
600
- readonly openReceiptDocument: () => Promise<PaymentDocumentRender>;
609
+ readonly documents: readonly PaymentDocumentRef[];
610
+ readonly selectedDocument: PaymentDocumentRef | null;
611
+ readonly selectDocument: (ref: PaymentDocumentReadRef) => void;
612
+ readonly renderDocument: () => Promise<PaymentDocumentRender>;
613
+ /** Return exact bytes on a deliberate action. The host owns the download URL. */
614
+ readonly downloadDocument: () => Promise<PaymentDocumentDownload>;
601
615
  readonly isOpeningDocument: boolean;
602
616
  readonly memo: string;
603
617
  readonly setMemo: (text: string) => void;
@@ -625,7 +639,7 @@ interface ActivityExportSlice {
625
639
  readonly isExporting: boolean;
626
640
  }
627
641
  //#endregion
628
- //#region src/headless/activity/activity.d.ts
642
+ //#region src/activity/activity.d.ts
629
643
  interface CapxulActivityProps {
630
644
  /** Omitted = the signed-in person. */
631
645
  readonly actor?: ActorReference;
@@ -637,39 +651,39 @@ interface CapxulActivityProps {
637
651
  readonly pageSize?: number;
638
652
  readonly children: ReactNode;
639
653
  }
640
- declare function Root$5({ actor, pageSize, children }: CapxulActivityProps): import("react/jsx-runtime").JSX.Element;
654
+ declare function Root$4({ actor, pageSize, children }: CapxulActivityProps): import("react").JSX.Element;
641
655
  /**
642
656
  * The one part that holds a query rather than reading the engine's: it takes a
643
657
  * `window` prop, and two placements can ask for different windows, so a single
644
658
  * pre-fetched result cannot serve both. It still holds no logic and draws
645
659
  * nothing.
646
660
  */
647
- declare function Summary$2({ window, children }: {
661
+ declare function Summary$3({ window, children }: {
648
662
  readonly window?: SummaryWindow;
649
663
  readonly children: (slice: ActivitySummarySlice) => ReactNode;
650
- }): import("react/jsx-runtime").JSX.Element;
664
+ }): import("react").JSX.Element;
651
665
  declare function Filters({ children }: {
652
666
  readonly children: (slice: ActivityFiltersSlice) => ReactNode;
653
- }): import("react/jsx-runtime").JSX.Element;
667
+ }): import("react").JSX.Element;
654
668
  declare function Search({ children }: {
655
669
  readonly children: (slice: ActivitySearchSlice) => ReactNode;
656
- }): import("react/jsx-runtime").JSX.Element;
670
+ }): import("react").JSX.Element;
657
671
  declare function Rows({ children }: {
658
672
  readonly children: (slice: ActivityRowsSlice) => ReactNode;
659
- }): import("react/jsx-runtime").JSX.Element;
673
+ }): import("react").JSX.Element;
660
674
  declare function LoadMore({ children }: {
661
675
  readonly children: (slice: ActivityLoadMoreSlice) => ReactNode;
662
- }): import("react/jsx-runtime").JSX.Element;
676
+ }): import("react").JSX.Element;
663
677
  declare function Detail({ reference, children }: {
664
678
  readonly reference?: ActivityReference;
665
679
  readonly children: (slice: ActivityDetailSlice) => ReactNode;
666
- }): import("react/jsx-runtime").JSX.Element;
680
+ }): import("react").JSX.Element;
667
681
  declare function Export({ children }: {
668
682
  readonly children: (slice: ActivityExportSlice) => ReactNode;
669
- }): import("react/jsx-runtime").JSX.Element;
683
+ }): import("react").JSX.Element;
670
684
  /** The compound shape the app's own design system already uses (`StatusTabs`). */
671
- declare const CapxulActivity: typeof Root$5 & {
672
- Summary: typeof Summary$2;
685
+ export declare const CapxulActivity: typeof Root$4 & {
686
+ Summary: typeof Summary$3;
673
687
  Filters: typeof Filters;
674
688
  Search: typeof Search;
675
689
  Rows: typeof Rows;
@@ -678,125 +692,12 @@ declare const CapxulActivity: typeof Root$5 & {
678
692
  Export: typeof Export;
679
693
  };
680
694
  //#endregion
681
- //#region src/headless/send-money/use-recipient-resolution.d.ts
682
- type SendMoneyRecipientStatus = "empty" | "invalid" | "checking" | "known-party" | "new-email" | "external-warning" | "external-ready" | "not-found" | "failed";
683
- interface SendMoneyRecipientSlice {
684
- readonly value: string;
685
- readonly change: (text: string) => void;
686
- readonly status: SendMoneyRecipientStatus;
687
- readonly label: string | null;
688
- readonly kind: "person" | "organization" | "external_address" | "unresolved" | null;
689
- readonly isCapxulAccount: boolean | null;
690
- readonly publicValue: string | null;
691
- readonly requiresAcknowledgement: boolean;
692
- readonly acknowledgeExternalAddress: () => void;
693
- }
694
- //#endregion
695
- //#region src/headless/send-money/use-send-money.d.ts
696
- type SendActor = {
697
- readonly kind: "personal";
698
- } | {
699
- readonly kind: "organization";
700
- readonly orgId: OrgId | undefined;
701
- };
702
- type SentPayment = {
703
- /** The backend payment row. */
704
- readonly payment: Payment;
705
- /** What we parsed and sent — `.value` is the comma-stripped major-unit string. */
706
- readonly amount: Money;
707
- /** The trimmed text the person typed — the app's success toast interpolates it. */
708
- readonly recipient: string;
709
- };
710
- /**
711
- * Refusal CODES, never sentences (#1447 ruling 8). The app maps each code to
712
- * the words it already prints; no English refusal string ships from here.
713
- */
714
- type CapxulSendMoneyBlockedReason = "signer-not-ready" | "amount-invalid" | "recipient-unresolved" | "no-source" | "no-asset";
715
- /**
716
- * One Budget the member can spend from — the id the payment carries, and
717
- * nothing else.
718
- *
719
- * THE CONTRACT (amended 3) reverses amendment 7: the From row keeps the app's
720
- * frozen `"<Org> Treasury"` string, and no budget label and no limit display
721
- * cross this seam until the budgets build ships a remaining figure that is
722
- * actually computable (ADR-0024 R3). The app already holds the org name and
723
- * already builds that sentence today, so the option carries only what the app
724
- * cannot know — which Budget the send is drawn from.
725
- */
726
- interface SendMoneySourceOption {
727
- readonly id: BudgetId;
728
- }
729
- /** ADR-0023 R1: a code, never a sentence — the app owns the words. */
730
- type SendMoneySourceError = "read-failed";
731
- interface SendMoneySourceSlice {
732
- readonly options: ReadonlyArray<SendMoneySourceOption>;
733
- readonly selected: SendMoneySourceOption | null;
734
- readonly select: (id: string) => void;
735
- readonly error: SendMoneySourceError | null;
736
- readonly isPending: boolean;
737
- }
738
- interface SendMoneyAssetOption {
739
- readonly id: string;
740
- readonly symbol: string;
741
- readonly availableDisplay: string;
742
- }
743
- /** ADR-0023 R1: a code, never a sentence — the app owns the words. */
744
- type SendMoneyAssetError = "read-failed";
745
- interface SendMoneyAssetSlice {
746
- readonly options: ReadonlyArray<SendMoneyAssetOption>;
747
- readonly selected: SendMoneyAssetOption | null;
748
- readonly select: (id: string) => void;
749
- readonly error: SendMoneyAssetError | null;
750
- readonly isPending: boolean;
751
- }
752
- interface SendMoneyAmountSlice {
753
- readonly value: string;
754
- readonly change: (text: string) => void;
755
- /** ADR-0023 R1: the parse verdict as a closed code; the app maps it to copy. */
756
- readonly error: MoneyParseErrorReason | null;
757
- readonly availableDisplay: string | null;
758
- }
759
- interface SendMoneyActionsSlice {
760
- readonly submit: () => void;
761
- readonly isSubmitting: boolean;
762
- readonly blocked: boolean;
763
- readonly blockedReason: CapxulSendMoneyBlockedReason | null;
764
- }
765
- //#endregion
766
- //#region src/headless/send-money/send-money.d.ts
767
- interface CapxulSendMoneyProps {
768
- readonly actor: SendActor;
769
- readonly onSent: (sent: SentPayment) => void;
770
- /** ADR-0023 R1: the app maps `error.code` to its own copy; no SDK sentence. */
771
- readonly onFailed: (error: CapxulError) => void;
772
- readonly children: ReactNode;
773
- }
774
- declare function Root$4({ actor, onSent, onFailed, children }: CapxulSendMoneyProps): import("react/jsx-runtime").JSX.Element;
775
- declare function Source({ children }: {
776
- readonly children: (slice: SendMoneySourceSlice) => ReactNode;
777
- }): import("react/jsx-runtime").JSX.Element;
778
- declare function Asset$1({ children }: {
779
- readonly children: (slice: SendMoneyAssetSlice) => ReactNode;
780
- }): import("react/jsx-runtime").JSX.Element;
781
- declare function Amount({ children }: {
782
- readonly children: (slice: SendMoneyAmountSlice) => ReactNode;
783
- }): import("react/jsx-runtime").JSX.Element;
784
- declare function Recipient({ children }: {
785
- readonly children: (slice: SendMoneyRecipientSlice) => ReactNode;
786
- }): import("react/jsx-runtime").JSX.Element;
787
- declare function Actions$1({ children }: {
788
- readonly children: (slice: SendMoneyActionsSlice) => ReactNode;
789
- }): import("react/jsx-runtime").JSX.Element;
790
- /** The compound shape the app's own design system already uses (`StatusTabs`). */
791
- declare const CapxulSendMoney: typeof Root$4 & {
792
- Source: typeof Source;
793
- Asset: typeof Asset$1;
794
- Amount: typeof Amount;
795
- Recipient: typeof Recipient;
796
- Actions: typeof Actions$1;
797
- };
695
+ //#region src/activity/use-capxul-activity.d.ts
696
+ export declare function useCapxulActivity(params?: ActivityListParams): UseQueryResult<ActivityPage, CapxulError>;
697
+ export declare function useCapxulActivityDetail(reference: ActivityReference | undefined, actor?: ActorReference): UseQueryResult<ActivityDetail | null, CapxulError>;
698
+ export declare function useCapxulAnnotateMovement(): UseMutationResult<ActivityAnnotation, CapxulError, ActivityAnnotationInput>;
798
699
  //#endregion
799
- //#region src/headless/access/org-member.d.ts
700
+ //#region src/organizations/org-member.d.ts
800
701
  /** The two enforcement facts, named the way a screen asks for them. */
801
702
  type OrgMemberAction = "spend" | "managePeople";
802
703
  /**
@@ -820,7 +721,7 @@ interface CapxulOrgMemberProps {
820
721
  readonly orgId: OrgId | string | undefined;
821
722
  readonly children: ReactNode;
822
723
  }
823
- declare function Root$3({ orgId, children }: CapxulOrgMemberProps): import("react/jsx-runtime").JSX.Element;
724
+ declare function Root$3({ orgId, children }: CapxulOrgMemberProps): import("react").JSX.Element;
824
725
  /**
825
726
  * One part serves all four denial idioms the app already uses: disabled with no
826
727
  * explanation, disabled plus a native `title`, a whole-surface swap, and
@@ -830,135 +731,255 @@ declare function Root$3({ orgId, children }: CapxulOrgMemberProps): import("reac
830
731
  declare function Can({ do: action, children }: {
831
732
  readonly do: OrgMemberAction;
832
733
  readonly children: (slice: OrgMemberCanSlice) => ReactNode;
833
- }): import("react/jsx-runtime").JSX.Element;
734
+ }): import("react").JSX.Element;
834
735
  declare function Standing({ children }: {
835
736
  readonly children: (slice: OrgMemberStandingSlice) => ReactNode;
836
- }): import("react/jsx-runtime").JSX.Element;
737
+ }): import("react").JSX.Element;
837
738
  /** The compound shape the app's own design system already uses (`StatusTabs`). */
838
- declare const CapxulOrgMember: typeof Root$3 & {
739
+ export declare const CapxulOrgMember: typeof Root$3 & {
839
740
  Can: typeof Can;
840
741
  Standing: typeof Standing;
841
742
  };
842
743
  //#endregion
843
- //#region src/headless/access/dashboard-access.d.ts
844
- type DashboardScope = {
845
- readonly kind: "personal";
846
- } | {
847
- readonly kind: "organization";
848
- readonly orgId?: string;
849
- };
850
- type DashboardAccessPhase = "checking" | "error" | "redirect" | "granted";
744
+ //#region src/organizations/use-capxul-create-org.d.ts
851
745
  /**
852
- * Which of the three probes produced the error the screen is showing. The
853
- * error code alone cannot say: a provider failure reads the same whether the
854
- * session read, the membership list or the lifecycle read raised it, and a
855
- * consumer that reports a displayed gate error has to keep those apart
856
- * (#1963 R05-2). It names the SOURCE only; `retry` still re-runs every failed
857
- * probe, exactly as before.
746
+ * Create an Organization. Binds directly to the
747
+ * `onboarding.completeOrganization(input)` SDK method. On success, invalidates the org list.
858
748
  */
859
- type DashboardAccessProbe = "session" | "membership" | "lifecycle";
860
- interface DashboardAccessErrorSlice {
861
- readonly error: CapxulError;
862
- /** The probe the surfaced error came from, in the frozen precedence order. */
863
- readonly probe: DashboardAccessProbe;
864
- /** Re-runs each failed probe. */
865
- readonly retry: () => void;
866
- }
867
- interface DashboardAccessRedirectSlice {
868
- readonly destination: IdentityDestination;
869
- }
870
- interface CapxulDashboardAccessProps {
871
- readonly scope: DashboardScope;
872
- readonly children: ReactNode;
873
- }
874
- declare function Root$2({ scope, children }: CapxulDashboardAccessProps): import("react/jsx-runtime").JSX.Element;
875
- /** Hands nothing — today's app renders `null` here, exactly as it does now. */
876
- declare function Checking({ children }: {
877
- readonly children?: ReactNode;
878
- }): import("react/jsx-runtime").JSX.Element | null;
879
- declare function DashboardError({ children }: {
880
- readonly children: (slice: DashboardAccessErrorSlice) => ReactNode;
881
- }): import("react/jsx-runtime").JSX.Element | null;
749
+ type UseCapxulCreateOrgReturn = UseMutationResult<OrganizationOnboarding, CapxulError, OrganizationOnboardingInput>;
750
+ export declare function useCapxulCreateOrg(): UseCapxulCreateOrgReturn;
751
+ //#endregion
752
+ //#region src/organizations/use-capxul-org-members.d.ts
753
+ type UseCapxulOrgMembersOptions = {
754
+ readonly enabled?: boolean;
755
+ };
882
756
  /**
883
- * Hands the destination and draws nothing. Reaching this part is a REQUEST to
884
- * navigate, never an arrival: the app may cancel or supersede it, so nothing
885
- * here — and nothing a consumer hangs off it — may claim a completed redirect
886
- * (#1963 R05-1). The destination page's own normalized pageview proves arrival.
757
+ * List the members of one Organization. Binds directly to
758
+ * `capxul.org(orgId).members()`. Gated by
759
+ * `orgId !== undefined`; callers may additionally gate on canonical identity
760
+ * readiness through `options.enabled`.
887
761
  */
888
- declare function Redirect({ children }: {
889
- readonly children: (slice: DashboardAccessRedirectSlice) => ReactNode;
890
- }): import("react/jsx-runtime").JSX.Element | null;
891
- declare function Granted({ children }: {
892
- readonly children?: ReactNode;
893
- }): import("react/jsx-runtime").JSX.Element | null;
894
- /** The compound shape the app's own design system already uses (`StatusTabs`). */
895
- declare const CapxulDashboardAccess: typeof Root$2 & {
896
- Checking: typeof Checking;
897
- Error: typeof DashboardError;
898
- Redirect: typeof Redirect;
899
- Granted: typeof Granted;
762
+ type UseCapxulOrgMembersReturn = UseQueryResult<Page<MemberView>, CapxulError>;
763
+ export declare function useCapxulOrgMembers(orgId: OrgId | undefined, options?: UseCapxulOrgMembersOptions): UseCapxulOrgMembersReturn;
764
+ //#endregion
765
+ //#region src/organizations/use-capxul-org-roles.d.ts
766
+ type UseCapxulOrgRolesOptions = {
767
+ readonly enabled?: boolean;
900
768
  };
769
+ /**
770
+ * List the roles for one Organization. Binds directly
771
+ * to `capxul.org(orgId).roles()`. Gated by `orgId !== undefined`.
772
+ */
773
+ type UseCapxulOrgRolesReturn = UseQueryResult<Page<RoleView>, CapxulError>;
774
+ export declare function useCapxulOrgRoles(orgId: OrgId | undefined, options?: UseCapxulOrgRolesOptions): UseCapxulOrgRolesReturn;
901
775
  //#endregion
902
- //#region src/headless/payroll/use-payroll.d.ts
903
- interface PayrollGroupRow {
904
- readonly id: PayrollGroupId;
776
+ //#region src/organizations/use-capxul-org-treasury.d.ts
777
+ type UseCapxulOrgTreasuryOptions = {
778
+ readonly enabled?: boolean;
779
+ };
780
+ /**
781
+ * Return the Organization treasury Account.
782
+ * NEVER `AccountStatus` (the deploy-readiness ladder, no balance). Binds
783
+ * Binds directly to `capxul.org(orgId).treasury()`. Gated by `orgId !== undefined`.
784
+ */
785
+ type UseCapxulOrgTreasuryReturn = UseQueryResult<Account, CapxulError>;
786
+ export declare function useCapxulOrgTreasury(orgId: OrgId | undefined, options?: UseCapxulOrgTreasuryOptions): UseCapxulOrgTreasuryReturn;
787
+ //#endregion
788
+ //#region src/organizations/use-capxul-orgs.d.ts
789
+ /**
790
+ * List the Organizations that the current user can access. Binds directly to
791
+ * the locked `capxul.orgs()` SDK method.
792
+ */
793
+ type UseCapxulOrgsReturn = UseQueryResult<Page<OrganizationAccess>, CapxulError>;
794
+ type UseCapxulOrgsOptions = {
795
+ /**
796
+ * Gate the query on auth readiness. `client.orgs()` is a session-scoped
797
+ * authenticated read; firing it before the session token settles surfaces a
798
+ * spurious `NOT_AUTHENTICATED`. Consumers pass `enabled: <auth-ready>`.
799
+ * Defaults to `true` to preserve the bare `useCapxulOrgs()` call shape.
800
+ */
801
+ readonly enabled?: boolean;
802
+ };
803
+ export declare function useCapxulOrgs(options?: UseCapxulOrgsOptions): UseCapxulOrgsReturn;
804
+ //#endregion
805
+ //#region src/media/use-capxul-image-upload.d.ts
806
+ type ImageUploadTarget = {
807
+ readonly kind: "profile";
808
+ } | {
809
+ readonly kind: "orgLogo";
810
+ readonly orgId: string;
811
+ };
812
+ type ImageUploadInput = {
813
+ readonly blob: Blob;
814
+ readonly target: ImageUploadTarget;
815
+ };
816
+ type UseCapxulImageUploadReturn = UseMutationResult<{
817
+ readonly url: string | null;
818
+ }, CapxulError, ImageUploadInput>;
819
+ /**
820
+ * #1061 / ADR-0014: the whole upload→record sequence as one mutation —
821
+ * upload the blob, then bind the returned storage id to the profile image or
822
+ * the org logo. The url is the resolved serving URL (re-read from queries,
823
+ * never persisted by consumers).
824
+ */
825
+ export declare function useCapxulImageUpload(): UseCapxulImageUploadReturn;
826
+ //#endregion
827
+ //#region src/media/use-capxul-upload-image.d.ts
828
+ type UseCapxulUploadImageReturn = UseMutationResult<{
829
+ readonly storageId: string;
830
+ }, CapxulError, Blob>;
831
+ /**
832
+ * #1955: upload only. Hands back the storage id for a CREATE call to carry
833
+ * (`ProfileDetails.imageStorageId`, `OrganizationDetails.logoStorageId`).
834
+ *
835
+ * `useCapxulImageUpload` is upload+bind and stays as it is for the settings
836
+ * pages. It cannot serve onboarding: the row it binds to does not exist yet.
837
+ * Nothing is bound here, so nothing is invalidated either — the create call
838
+ * that carries the id owns the cache change.
839
+ */
840
+ export declare function useCapxulUploadImage(): UseCapxulUploadImageReturn;
841
+ //#endregion
842
+ //#region src/parties/contact-slices.d.ts
843
+ type ContactsActor = {
844
+ readonly kind: "personal";
845
+ } | {
846
+ readonly kind: "organization";
847
+ readonly orgId: OrgId | undefined;
848
+ };
849
+ /**
850
+ * How a contact entered the book. Taken from the shipped surface rather than
851
+ * re-declared, so the component can never advertise a provenance the wire
852
+ * cannot carry (ADR-0022 R2; #1532 owns the definition site).
853
+ */
854
+ type ContactRelationship = AddressBookEntry["relationship"][number];
855
+ interface Contact {
856
+ /**
857
+ * The counterparty's `PartyId` — created once and claimed at signup, never
858
+ * re-keyed (ADR-0022 R1/R3). No email, no prefix, nothing to parse.
859
+ */
860
+ readonly id: PartyId;
861
+ /** The saved label when there is one, else the party's display name. */
905
862
  readonly name: string;
906
- /** A stored display preference; the app narrows it to its own DS union. */
907
- readonly tone: string;
908
- readonly memberCount: number;
909
- /** `formatMoney` over the amounts the employer typed on this group. */
910
- readonly totalDisplay: string;
911
- readonly members: readonly {
912
- /** The `partyId` — the stable id (ruling Q1), never an email. */
913
- readonly recipientId: string;
914
- readonly amount: string;
915
- readonly currency: Money["currency"];
916
- }[];
863
+ readonly relationship: readonly ContactRelationship[];
864
+ readonly hidden: boolean;
865
+ /** Epoch milliseconds. The seam never formats a date; the app writes the words. */
866
+ readonly lastActivityAt: number;
917
867
  }
918
- interface PayrollSummarySlice {
919
- readonly walletBalanceDisplay: string | null;
920
- readonly paidThisMonthDisplay: string | null;
868
+ interface ContactRow extends Contact {
869
+ /** Ours: one initials rule, not one copy per screen. */
870
+ readonly initials: string;
871
+ readonly rename: (name: string, options?: InvocationOptions) => void;
872
+ readonly hide: (options?: InvocationOptions) => void;
873
+ readonly unhide: (options?: InvocationOptions) => void;
874
+ }
875
+ /** ADR-0023 R1: refusal CODES, never sentences — the app owns the words. */
876
+ type ContactsRefusal = "loading" | "org-unavailable" | "unavailable";
877
+ /**
878
+ * The blocked facts, in the fixed order `.Add.blockedReason` names them.
879
+ * `"no-permission"` is absent by ruling, not by omission: the org screen places
880
+ * `CapxulOrgMember.Can do="managePeople"` around its own Add control.
881
+ */
882
+ type ContactsAddBlockedReason = "org-unavailable" | "empty";
883
+ /**
884
+ * Why an add did not land, as a code. ADR-0023 R1 supersedes the contract's
885
+ * field-message carve-out: `"unresolved"` is the backend refusing to resolve
886
+ * what was typed (`INVALID_INPUT`), and every other code — offline, signed
887
+ * out, refused — is `"failed"`. A person can fix only one of them.
888
+ */
889
+ type ContactsAddError = "unresolved" | "failed";
890
+ interface ContactsSummarySlice {
891
+ readonly total: number | null;
892
+ readonly activeCount: number | null;
921
893
  readonly isLoading: boolean;
922
- readonly error: CapxulError | null;
894
+ readonly reason: ContactsRefusal | null;
923
895
  }
924
- interface PayrollGroupsSlice {
925
- readonly groups: readonly PayrollGroupRow[];
896
+ interface ContactsListSlice {
897
+ readonly rows: readonly ContactRow[];
898
+ readonly isLoading: boolean;
899
+ readonly reason: ContactsRefusal | null;
900
+ }
901
+ interface ContactsListOptions {
902
+ readonly limit?: number | undefined;
903
+ /** `"all"` forwards `includeHidden` to the backend, which already accepts it. */
904
+ readonly show?: "visible" | "all" | undefined;
905
+ }
906
+ interface ContactsAddSlice {
907
+ readonly value: string;
908
+ readonly change: (text: string) => void;
926
909
  /**
927
- * R13 (#1968): `options` is the browser attempt the caller captured before the
928
- * employer pressed the button. It reaches the SDK operation unchanged, so the
929
- * group's `ui_payroll_action_completed` and the durable `payroll_group_changed`
930
- * share one correlation. Absent, the write keeps its own invocation context.
910
+ * #1960 R02: hand it the options the screen captured BEFORE the click. The
911
+ * same snapshot reaches the SDK add call and comes back on `onAdded`/
912
+ * `onFailed`, so the UI observation and the operation share one identity even
913
+ * when the reply lands after an account switch. Omitted stays omitted.
931
914
  */
932
- readonly save: (input: PayrollGroupInput, options?: InvocationOptions) => Promise<CapxulResult<PayrollGroupRow>>;
933
- readonly remove: (id: PayrollGroupId, options?: InvocationOptions) => Promise<CapxulResult<void>>;
934
- readonly isSaving: boolean;
935
- readonly isLoading: boolean;
936
- readonly error: CapxulError | null;
915
+ readonly submit: (options?: InvocationOptions) => void;
916
+ readonly isSubmitting: boolean;
917
+ readonly blocked: boolean;
918
+ readonly blockedReason: ContactsAddBlockedReason | null;
919
+ readonly error: ContactsAddError | null;
937
920
  }
938
921
  //#endregion
939
- //#region src/headless/payroll/payroll.d.ts
940
- interface CapxulPayrollProps {
941
- readonly orgId: OrgId | undefined;
922
+ //#region src/parties/contacts.d.ts
923
+ interface CapxulContactsProps {
924
+ readonly actor: ContactsActor;
925
+ /**
926
+ * `options` is exactly what the caller handed `.Add.submit` or a row verb, so
927
+ * the screen's own observation of the finished action can reuse the attempt
928
+ * identity the SDK operation ran under (#1960 R02).
929
+ */
930
+ readonly onAdded: (contact: Contact, options?: InvocationOptions) => void;
931
+ /** ADR-0023 R1: the app maps `error.code` to its own copy; no SDK sentence. */
932
+ readonly onFailed: (error: CapxulError, options?: InvocationOptions) => void;
942
933
  readonly children: ReactNode;
943
934
  }
944
- declare function Root$1({ orgId, children }: CapxulPayrollProps): import("react/jsx-runtime").JSX.Element;
945
- declare function Summary$1({ children }: {
946
- readonly children: (slice: PayrollSummarySlice) => ReactNode;
947
- }): import("react/jsx-runtime").JSX.Element;
948
- declare function Groups({ children }: {
949
- readonly children: (slice: PayrollGroupsSlice) => ReactNode;
950
- }): import("react/jsx-runtime").JSX.Element;
951
- /**
952
- * The compound shape the app's own design system already uses (`StatusTabs`).
953
- * There is NO `.Runs` part (ruling Q6): no shipped region has the right shape
954
- * for a run list, and a part without a production caller may not ship.
955
- */
956
- declare const CapxulPayroll: typeof Root$1 & {
957
- Summary: typeof Summary$1;
958
- Groups: typeof Groups;
935
+ declare function Root$2({ actor, onAdded, onFailed, children }: CapxulContactsProps): import("react").JSX.Element;
936
+ declare function Summary$2({ children }: {
937
+ readonly children: (slice: ContactsSummarySlice) => ReactNode;
938
+ }): import("react").JSX.Element;
939
+ declare function List({ limit, show, children }: ContactsListOptions & {
940
+ readonly children: (slice: ContactsListSlice) => ReactNode;
941
+ }): import("react").JSX.Element;
942
+ declare function Add({ children }: {
943
+ readonly children: (slice: ContactsAddSlice) => ReactNode;
944
+ }): import("react").JSX.Element;
945
+ /** The compound shape the app's own design system already uses (`StatusTabs`). */
946
+ export declare const CapxulContacts: typeof Root$2 & {
947
+ Summary: typeof Summary$2;
948
+ List: typeof List;
949
+ Add: typeof Add;
950
+ };
951
+ //#endregion
952
+ //#region src/platform/query-keys.d.ts
953
+ export declare const capxulKeys: {
954
+ root: readonly ["capxul"];
955
+ profile: readonly ["capxul", "profile"];
956
+ handleAvailability: (handle: string) => readonly ["capxul", "profile", "handle-availability", string];
957
+ account: readonly ["capxul", "account"];
958
+ provisioning: readonly ["capxul", "provisioning"];
959
+ binding: readonly ["capxul", "binding"];
960
+ accountBalance: readonly ["capxul", "accountBalance"];
961
+ orgs: readonly ["capxul", "orgs"];
962
+ org: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId];
963
+ orgMembers: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "members"];
964
+ orgRoles: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "roles"];
965
+ orgTreasury: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "treasury"];
966
+ orgPermissions: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "permissions"];
967
+ orgMe: (orgId: OrgId | undefined, account: string | undefined) => readonly ["capxul", "org", "pending" | OrgId, "me", string];
968
+ orgLifecycle: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "lifecycle"];
969
+ contacts: (scope: string) => readonly ["capxul", "contacts", string];
970
+ contactsList: (scope: string, includeHidden: boolean) => readonly ["capxul", "contacts", string, "all" | "visible"];
971
+ payrollRuns: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "payroll", "runs"];
972
+ payrollGroups: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "payroll", "groups"];
973
+ payrollTerms: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "payroll", "terms"];
974
+ activity: readonly ["capxul", "activity"];
975
+ activityDetail: (reference: ActivityReference | undefined, actor?: ActorReference) => readonly ["capxul", "activity", "self" | ActorReference, "pending" | ActivityReference];
976
+ activitySummary: (actor?: ActorReference, window?: ActivityRange) => readonly ["capxul", "activity", "summary", "self" | ActorReference, "all" | ActivityRange];
977
+ holdings: (actor?: ActorReference) => readonly ["capxul", "holdings", "self" | ActorReference];
978
+ payments: readonly ["capxul", "payments"];
979
+ payment: (paymentId: string | undefined) => readonly ["capxul", "payments", string];
959
980
  };
960
981
  //#endregion
961
- //#region src/headless/payroll/reads.d.ts
982
+ //#region src/payroll/reads.d.ts
962
983
  /**
963
984
  * One payable person, as the run composer and the group sheet see them.
964
985
  *
@@ -972,11 +993,11 @@ interface PayrollRecipientOption {
972
993
  readonly email: string | null;
973
994
  }
974
995
  //#endregion
975
- //#region src/headless/payroll/use-payroll-run.d.ts
996
+ //#region src/payroll/payroll-run-slices.d.ts
976
997
  /**
977
998
  * Refusal CODES, never sentences (ADR-0023 R1). `blockedReason` names the FIRST
978
- * false fact in the fixed order of the contract's seven-row table, so the same
979
- * composer state always yields the same code.
999
+ * false fact in the fixed order below, so the same composer state always
1000
+ * yields the same code.
980
1001
  */
981
1002
  type CapxulPayrollRunBlockedReason = "signer-not-ready" | "no-source" | "ambiguous-source" | "no-asset" | "no-recipients" | "amount-invalid" | "insufficient-funds";
982
1003
  interface PayrollRunGroupOption {
@@ -1005,7 +1026,7 @@ interface PayrollRunAmountEntry {
1005
1026
  /** True while the value is one we seeded and the employer has not edited. */
1006
1027
  readonly prefilled: boolean;
1007
1028
  /** The treasury asset's currency. Rows stay absent until this value exists. */
1008
- readonly currency: Money["currency"];
1029
+ readonly currency: string;
1009
1030
  }
1010
1031
  interface PayrollRunAmountsSlice {
1011
1032
  readonly entries: readonly PayrollRunAmountEntry[];
@@ -1048,7 +1069,7 @@ interface SentPayrollRun {
1048
1069
  readonly recipientCount: number;
1049
1070
  }
1050
1071
  //#endregion
1051
- //#region src/headless/payroll/payroll-run.d.ts
1072
+ //#region src/payroll/payroll-run.d.ts
1052
1073
  interface CapxulPayrollRunProps {
1053
1074
  readonly orgId: OrgId | undefined;
1054
1075
  /** How a group card opens pay-now pre-filled — today's group-context merge. */
@@ -1058,59 +1079,89 @@ interface CapxulPayrollRunProps {
1058
1079
  readonly onFailed: (error: CapxulError) => void;
1059
1080
  readonly children: ReactNode;
1060
1081
  }
1061
- declare function Root({ orgId, prefill, onRun, onFailed, children }: CapxulPayrollRunProps): import("react/jsx-runtime").JSX.Element;
1082
+ declare function Root$1({ orgId, prefill, onRun, onFailed, children }: CapxulPayrollRunProps): import("react").JSX.Element;
1062
1083
  declare function Recipients({ children }: {
1063
1084
  readonly children: (slice: PayrollRunRecipientsSlice) => ReactNode;
1064
- }): import("react/jsx-runtime").JSX.Element;
1085
+ }): import("react").JSX.Element;
1065
1086
  declare function Amounts({ children }: {
1066
1087
  readonly children: (slice: PayrollRunAmountsSlice) => ReactNode;
1067
- }): import("react/jsx-runtime").JSX.Element;
1088
+ }): import("react").JSX.Element;
1068
1089
  declare function Asset({ children }: {
1069
1090
  readonly children: (slice: PayrollRunAssetSlice) => ReactNode;
1070
- }): import("react/jsx-runtime").JSX.Element;
1071
- declare function Summary({ children }: {
1091
+ }): import("react").JSX.Element;
1092
+ declare function Summary$1({ children }: {
1072
1093
  readonly children: (slice: PayrollRunSummarySlice) => ReactNode;
1073
- }): import("react/jsx-runtime").JSX.Element;
1094
+ }): import("react").JSX.Element;
1074
1095
  declare function Actions({ children }: {
1075
1096
  readonly children: (slice: PayrollRunActionsSlice) => ReactNode;
1076
- }): import("react/jsx-runtime").JSX.Element;
1097
+ }): import("react").JSX.Element;
1077
1098
  /** The compound shape the app's own design system already uses (`StatusTabs`). */
1078
- declare const CapxulPayrollRun: typeof Root & {
1099
+ export declare const CapxulPayrollRun: typeof Root$1 & {
1079
1100
  Recipients: typeof Recipients;
1080
1101
  Amounts: typeof Amounts;
1081
1102
  Asset: typeof Asset;
1082
- Summary: typeof Summary;
1103
+ Summary: typeof Summary$1;
1083
1104
  Actions: typeof Actions;
1084
1105
  };
1085
1106
  //#endregion
1086
- //#region src/internal/reactivity-keys.d.ts
1087
- declare const capxulKeys: {
1088
- root: readonly ["capxul"];
1089
- profile: readonly ["capxul", "profile"];
1090
- handleAvailability: (handle: string) => readonly ["capxul", "profile", "handle-availability", string];
1091
- account: readonly ["capxul", "account"];
1092
- provisioning: readonly ["capxul", "provisioning"];
1093
- binding: readonly ["capxul", "binding"];
1094
- accountBalance: readonly ["capxul", "accountBalance"];
1095
- orgs: readonly ["capxul", "orgs"];
1096
- org: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId];
1097
- orgMembers: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "members"];
1098
- orgRoles: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "roles"];
1099
- orgTreasury: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "treasury"];
1100
- orgPermissions: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "permissions"];
1101
- orgMe: (orgId: OrgId | undefined, account: string | undefined) => readonly ["capxul", "org", "pending" | OrgId, "me", string];
1102
- orgLifecycle: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "lifecycle"];
1103
- contacts: (scope: string) => readonly ["capxul", "contacts", string];
1104
- contactsList: (scope: string, includeHidden: boolean) => readonly ["capxul", "contacts", string, "all" | "visible"];
1105
- payrollRuns: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "payroll", "runs"];
1106
- payrollGroups: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "payroll", "groups"];
1107
- payrollTerms: (orgId: OrgId | undefined) => readonly ["capxul", "org", "pending" | OrgId, "payroll", "terms"];
1108
- activity: readonly ["capxul", "activity"];
1109
- activityDetail: (reference: ActivityReference | undefined, actor?: ActorReference | undefined) => readonly ["capxul", "activity", "self" | ActorReference, "pending" | ActivityReference];
1110
- activitySummary: (actor?: ActorReference, window?: ActivityRange) => readonly ["capxul", "activity", "summary", "self" | ActorReference, "all" | ActivityRange];
1111
- holdings: (actor?: ActorReference) => readonly ["capxul", "holdings", "self" | ActorReference];
1112
- payments: readonly ["capxul", "payments"];
1113
- payment: (paymentId: string | undefined) => readonly ["capxul", "payments", string];
1107
+ //#region src/payroll/use-payroll.d.ts
1108
+ /** ADR-0022 R9: where a run stands on the shipped command lifecycle. */
1109
+ interface PayrollGroupRow {
1110
+ readonly id: PayrollGroupId;
1111
+ readonly name: string;
1112
+ /** A stored display preference; the app narrows it to its own DS union. */
1113
+ readonly tone: string;
1114
+ readonly memberCount: number;
1115
+ /** `formatMoney` over the amounts the employer typed on this group. */
1116
+ readonly totalDisplay: string;
1117
+ readonly members: readonly {
1118
+ /** The `partyId` — the stable id (ruling Q1), never an email. */
1119
+ readonly recipientId: string;
1120
+ readonly amount: string;
1121
+ readonly currency: Money["currency"];
1122
+ }[];
1123
+ }
1124
+ interface PayrollSummarySlice {
1125
+ readonly walletBalanceDisplay: string | null;
1126
+ readonly paidThisMonthDisplay: string | null;
1127
+ readonly isLoading: boolean;
1128
+ readonly error: CapxulError | null;
1129
+ }
1130
+ interface PayrollGroupsSlice {
1131
+ readonly groups: readonly PayrollGroupRow[];
1132
+ /**
1133
+ * R13 (#1968): `options` is the browser attempt the caller captured before the
1134
+ * employer pressed the button. It reaches the SDK operation unchanged, so the
1135
+ * group's `ui_payroll_action_completed` and the durable `payroll_group_changed`
1136
+ * share one correlation. Absent, the write keeps its own invocation context.
1137
+ */
1138
+ readonly save: (input: PayrollGroupInput, options?: InvocationOptions) => Promise<CapxulResult<PayrollGroupRow>>;
1139
+ readonly remove: (id: PayrollGroupId, options?: InvocationOptions) => Promise<CapxulResult<void>>;
1140
+ readonly isSaving: boolean;
1141
+ readonly isLoading: boolean;
1142
+ readonly error: CapxulError | null;
1143
+ }
1144
+ //#endregion
1145
+ //#region src/payroll/payroll.d.ts
1146
+ interface CapxulPayrollProps {
1147
+ readonly orgId: OrgId | undefined;
1148
+ readonly children: ReactNode;
1149
+ }
1150
+ declare function Root({ orgId, children }: CapxulPayrollProps): import("react").JSX.Element;
1151
+ declare function Summary({ children }: {
1152
+ readonly children: (slice: PayrollSummarySlice) => ReactNode;
1153
+ }): import("react").JSX.Element;
1154
+ declare function Groups({ children }: {
1155
+ readonly children: (slice: PayrollGroupsSlice) => ReactNode;
1156
+ }): import("react").JSX.Element;
1157
+ /**
1158
+ * The compound shape the app's own design system already uses (`StatusTabs`).
1159
+ * There is NO `.Runs` part (ruling Q6): no shipped region has the right shape
1160
+ * for a run list, and a part without a production caller may not ship.
1161
+ */
1162
+ export declare const CapxulPayroll: typeof Root & {
1163
+ Summary: typeof Summary;
1164
+ Groups: typeof Groups;
1114
1165
  };
1115
1166
  //#endregion
1116
- export { type AccountFailure, type AccountProgress, type ActionResult, type ActivityDetailSlice, type ActivityExportSlice, type ActivityFilterValues, type ActivityFiltersSlice, type ActivityLoadMoreSlice, type ActivityReceipt, type ActivityRow, type ActivityRowsSlice, type ActivitySearchSlice, type ActivitySummarySlice, type AuthenticatedState, type AuthenticationSlots, type CanReason, CapxulActivity, type CapxulActivityProps, type CapxulAuth, CapxulAuthenticationController, type CapxulBootstrapState, type CapxulBootstrapStatus, CapxulContacts, type CapxulContactsProps, CapxulDashboardAccess, type CapxulDashboardAccessProps, CapxulOnboardingController, CapxulOrgMember, type CapxulOrgMemberProps, CapxulPayroll, type CapxulPayrollProps, CapxulPayrollRun, type CapxulPayrollRunBlockedReason, type CapxulPayrollRunProps, CapxulProvider, type CapxulProviderProps, type CapxulSend, CapxulSendMoney, type CapxulSendMoneyBlockedReason, type CapxulSendMoneyProps, type Contact, type ContactRelationship, type ContactRow, type ContactsActor, type ContactsAddBlockedReason, type ContactsAddError, type ContactsAddSlice, type ContactsListOptions, type ContactsListSlice, type ContactsRefusal, type ContactsSummarySlice, type ControllerAction, type CreateOrganizationFailure, type CreateOrganizationSubmission, type CsvExport, type DashboardAccessErrorSlice, type DashboardAccessPhase, type DashboardAccessProbe, type DashboardAccessRedirectSlice, type DashboardScope, type Destination, type FaultedState, type HandleAvailability, type ImageUploadInput, type ImageUploadTarget, type InvocationOptions, type NavigationAction, type OnboardingControllerProps, type OnboardingIntent, type OnboardingJourney, type OnboardingJourneyPosition, type OnboardingOrigin, type OnboardingStep, type OrgFailure, type OrgMemberAction, type OrgMemberCanSlice, type OrgMemberStanding, type OrgMemberStandingSlice, type OrgProgress, type OrganizationDetails, type OrganizationDraft, type OtpPendingState, type PayoutDraftChain, type PayoutDraftEntry, type PayrollGroupRow, type PayrollGroupsSlice, type PayrollRecipientOption, type PayrollRunActionsSlice, type PayrollRunAmountEntry, type PayrollRunAmountsSlice, type PayrollRunAssetSlice, type PayrollRunGroupOption, type PayrollRunPrefill, type PayrollRunRecipientsSlice, type PayrollRunStatus, type PayrollRunSummarySlice, type PayrollSummarySlice, type PendingAuthState, type ProfileDetails, type ProfileDraft, type ProfileSlotProps, type ReadyDestination, type RetryAction, type SendActor, type SendMoneyActionsSlice, type SendMoneyAmountSlice, type SendMoneyAssetError, type SendMoneyAssetOption, type SendMoneyAssetSlice, type SendMoneyRecipientSlice, type SendMoneyRecipientStatus, type SendMoneySourceError, type SendMoneySourceOption, type SendMoneySourceSlice, type SendResult, type SentPayment, type SentPayrollRun, type SignedOutState, type Slot, type SummaryWindow, type UseCapxulAccountBalanceOptions, type UseCapxulAccountBalanceReturn, type UseCapxulAccountFundReturn, type UseCapxulCreateCommitmentReturn, type UseCapxulCreateOrgReturn, type UseCapxulHandleAvailabilityReturn, type UseCapxulImageUploadReturn, type UseCapxulInviteMemberInput, type UseCapxulInviteMemberReturn, type UseCapxulOrgMembersOptions, type UseCapxulOrgMembersReturn, type UseCapxulOrgRolesOptions, type UseCapxulOrgRolesReturn, type UseCapxulOrgTreasuryOptions, type UseCapxulOrgTreasuryReturn, type UseCapxulOrgsReturn, type UseCapxulPayReturn, type UseCapxulPaymentReturn, type UseCapxulPaymentsReturn, type UseCapxulProfileReturn, type UseCapxulRedirectPaymentReturn, type UseCapxulUploadImageReturn, acknowledgeOnboardingDestination, activeOnboardingRecovery, capxulKeys, clearOnboardingJourney, currentOnboardingJourneyId, entered, invalidateOnboardingJourneyObservation, isClaimed, isRestoring, loadOnboardingJourney, onboardingJourneyPosition, saveOnboardingJourney, startOnboardingJourney, useCapxul, useCapxulAccountBalance, useCapxulAccountFund, useCapxulActivity, useCapxulActivityDetail, useCapxulAnnotateMovement, useCapxulAuth, useCapxulCancelPayment, useCapxulClaimPayment, useCapxulClientOrNull, useCapxulCreateCommitment, useCapxulCreateOrg, useCapxulDestination, useCapxulHandleAvailability, useCapxulHoldings, useCapxulIdentity, useCapxulImageUpload, useCapxulInviteMember, useCapxulOrgMembers, useCapxulOrgRoles, useCapxulOrgTreasury, useCapxulOrganizationPay, useCapxulOrganizationPayBatch, useCapxulOrgs, useCapxulPay, useCapxulPayment, useCapxulPayments, useCapxulPermission, useCapxulPermissionAssign, useCapxulPermissionChange, useCapxulPermissionCreate, useCapxulPermissionReplace, useCapxulPermissionRevoke, useCapxulPermissions, useCapxulProfile, useCapxulRedirectPayment, useCapxulSend, useCapxulTransitions, useCapxulUploadImage };
1167
+ export { type AccountFailure, type AccountProgress, type ActionResult, type ActivityDetailSlice, type ActivityExportSlice, type ActivityFilterValues, type ActivityFiltersSlice, type ActivityLoadMoreSlice, type ActivityReceipt, type ActivityRow, type ActivityRowsSlice, type ActivitySearchSlice, type ActivitySummarySlice, type AuthenticatedState, type AuthenticationSlots, type CanReason, type CapxulActivityProps, type CapxulAuth, CapxulAuthenticationController, type CapxulBootstrapState, type CapxulBootstrapStatus, type CapxulClientConnectionProps, type CapxulContactsProps, type CapxulDashboardAccessProps, CapxulOnboardingController, type CapxulOrgMemberProps, type CapxulPayrollProps, type CapxulPayrollRunBlockedReason, type CapxulPayrollRunProps, type CapxulProviderProps, type CapxulSend, type CapxulSendMoneyBlockedReason, type CapxulSendMoneyProps, type CompleteSlice as ClientConnectionCompleteSlice, type ConsentSlice as ClientConnectionConsentSlice, type FailureSlice as ClientConnectionFailureSlice, type OtpSlice as ClientConnectionOtpSlice, type Contact, type ContactRelationship, type ContactRow, type ContactsActor, type ContactsAddBlockedReason, type ContactsAddError, type ContactsAddSlice, type ContactsListOptions, type ContactsListSlice, type ContactsRefusal, type ContactsSummarySlice, type ControllerAction, type CreateOrganizationFailure, type CreateOrganizationSubmission, type CsvExport, type DashboardAccessErrorSlice, type DashboardAccessPhase, type DashboardAccessProbe, type DashboardAccessRedirectSlice, type DashboardScope, type Destination, type FaultedState, type HandleAvailability, type ImageUploadInput, type ImageUploadTarget, type InvocationOptions, type NavigationAction, type OnboardingControllerProps, type OnboardingIntent, type OnboardingJourney, type OnboardingJourneyPosition, type OnboardingOrigin, type OnboardingStep, type OrgFailure, type OrgMemberAction, type OrgMemberCanSlice, type OrgMemberStanding, type OrgMemberStandingSlice, type OrgProgress, type OrganizationDetails, type OrganizationDraft, type OtpPendingState, type PayoutDraftChain, type PayoutDraftEntry, type PayrollGroupRow, type PayrollGroupsSlice, type PayrollRecipientOption, type PayrollRunActionsSlice, type PayrollRunAmountEntry, type PayrollRunAmountsSlice, type PayrollRunAssetSlice, type PayrollRunGroupOption, type PayrollRunPrefill, type PayrollRunRecipientsSlice, type PayrollRunStatus, type PayrollRunSummarySlice, type PayrollSummarySlice, type PendingAuthState, type ProfileDetails, type ProfileDraft, type ProfileSlotProps, type ReadyDestination, type RetryAction, type SendActor, type SendMoneyActionsSlice, type SendMoneyAmountSlice, type SendMoneyAssetError, type SendMoneyAssetOption, type SendMoneyAssetSlice, type SendMoneyRecipientSlice, type SendMoneyRecipientStatus, type SendMoneySourceError, type SendMoneySourceOption, type SendMoneySourceSlice, type SendResult, type SentPayment, type SentPayrollRun, type SignedOutState, type Slot, type SummaryWindow, type UseCapxulAccountBalanceOptions, type UseCapxulAccountBalanceReturn, type UseCapxulAccountFundReturn, type UseCapxulCreateOrgReturn, type UseCapxulHandleAvailabilityReturn, type UseCapxulImageUploadReturn, type UseCapxulOrgMembersOptions, type UseCapxulOrgMembersReturn, type UseCapxulOrgRolesOptions, type UseCapxulOrgRolesReturn, type UseCapxulOrgTreasuryOptions, type UseCapxulOrgTreasuryReturn, type UseCapxulOrgsReturn, type UseCapxulPayReturn, type UseCapxulPaymentReturn, type UseCapxulPaymentsReturn, type UseCapxulProfileReturn, type UseCapxulUploadImageReturn, isClaimed, isRestoring };