@xnetjs/react 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -282,13 +282,33 @@ function scheduleIdle(fn) {
282
282
  import { createUCAN } from "@xnetjs/identity";
283
283
  import { useCallback } from "react";
284
284
  var HUB_CAPABILITIES = [
285
- { with: "*", can: "hub/*" },
286
- { with: "*", can: "backup/*" },
287
- { with: "*", can: "files/*" },
288
- { with: "*", can: "query/*" },
289
- { with: "*", can: "index/*" }
285
+ // Connection + rooms: room-level authorization happens hub-side.
286
+ { with: "*", can: "hub/connect" },
287
+ { with: "*", can: "hub/signal" },
288
+ { with: "*", can: "hub/relay" },
289
+ { with: "*", can: "hub/query" },
290
+ { with: "*", can: "hub/backup" },
291
+ // Per-DID stores: backup blobs, files, query, search shards.
292
+ { with: "*", can: "backup/read" },
293
+ { with: "*", can: "backup/write" },
294
+ { with: "*", can: "backup/delete" },
295
+ { with: "*", can: "files/read" },
296
+ { with: "*", can: "files/write" },
297
+ { with: "*", can: "query/read" },
298
+ { with: "*", can: "index/write" },
299
+ // Calls (0167) + push registration (0168) + own-usage telemetry (0187).
300
+ { with: "*", can: "call/join" },
301
+ { with: "*", can: "call/signal" },
302
+ { with: "*", can: "notify/register" },
303
+ { with: "*", can: "telemetry/ingest" }
290
304
  ];
291
305
  var HUB_TOKEN_TTL_SECONDS = 60 * 60 * 24;
306
+ var mintNonce = () => {
307
+ if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
308
+ return crypto.randomUUID();
309
+ }
310
+ return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
311
+ };
292
312
  function useHubAuthToken(input) {
293
313
  const { authorDID, signingKey, hubUrl, autoAuth, staticHubAuthToken } = input;
294
314
  return useCallback(async () => {
@@ -300,9 +320,12 @@ function useHubAuthToken(input) {
300
320
  return createUCAN({
301
321
  issuer: authorDID,
302
322
  issuerKey: signingKey,
323
+ // The hub accepts its DID or its URL as audience (audienceAccepted);
324
+ // the URL is what the client reliably knows before connecting.
303
325
  audience: hubUrl,
304
326
  capabilities: HUB_CAPABILITIES,
305
- expiration: Math.floor(Date.now() / 1e3) + HUB_TOKEN_TTL_SECONDS
327
+ expiration: Math.floor(Date.now() / 1e3) + HUB_TOKEN_TTL_SECONDS,
328
+ nonce: mintNonce()
306
329
  });
307
330
  }, [authorDID, autoAuth, signingKey, hubUrl, staticHubAuthToken]);
308
331
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  useMutate,
3
3
  useQuery
4
- } from "./chunk-ZGP56IIJ.js";
4
+ } from "./chunk-RW3DSDKO.js";
5
5
  import {
6
6
  XNetContext,
7
7
  downloadBackup,
@@ -9,7 +9,7 @@ import {
9
9
  useNodeStore,
10
10
  useSecurityContext,
11
11
  useXNet
12
- } from "./chunk-H44ZSIH4.js";
12
+ } from "./chunk-5ILJMPKO.js";
13
13
 
14
14
  // src/hooks/useTaskProjectionSync.ts
15
15
  import { ExternalReferenceSchema, TaskSchema, isCompletedTaskStatus } from "@xnetjs/data";
@@ -3398,9 +3398,18 @@ var TRANSITIONS = {
3398
3398
  AUTHENTICATE: "authenticating",
3399
3399
  CREATE_NEW: "authenticating",
3400
3400
  CREATE_RECOVERABLE: "creating-recoverable",
3401
+ CONTINUE_WITH_ATPROTO: "atproto-ceremony",
3401
3402
  IMPORT_EXISTING: "import-identity",
3402
3403
  BROWSER_UNSUPPORTED: "unsupported-browser"
3403
3404
  },
3405
+ "atproto-ceremony": {
3406
+ // The ceremony handler stores the linked handle (ATPROTO_LINKED, self-loop)
3407
+ // then runs the existing passkey-create flow → PASSKEY_SUCCESS.
3408
+ ATPROTO_LINKED: "atproto-ceremony",
3409
+ PASSKEY_SUCCESS: "connecting-hub",
3410
+ ATPROTO_CEREMONY_FAILED: "auth-error",
3411
+ BACK_TO_WELCOME: "welcome"
3412
+ },
3404
3413
  "creating-recoverable": {
3405
3414
  RECOVERABLE_CREATED: "show-recovery-phrase",
3406
3415
  PASSKEY_FAILED: "auth-error",
@@ -3478,6 +3487,16 @@ function onboardingReducer(current, event) {
3478
3487
  case "IMPORT_FAILED":
3479
3488
  nextContext.error = event.error;
3480
3489
  break;
3490
+ case "ATPROTO_LINKED":
3491
+ nextContext.atprotoDid = event.atprotoDid;
3492
+ nextContext.atprotoHandle = event.atprotoHandle;
3493
+ nextContext.atprotoDisplayName = event.displayName ?? null;
3494
+ nextContext.error = null;
3495
+ break;
3496
+ case "ATPROTO_CEREMONY_FAILED":
3497
+ nextContext.error = event.error;
3498
+ break;
3499
+ case "CONTINUE_WITH_ATPROTO":
3481
3500
  case "CREATE_RECOVERABLE":
3482
3501
  nextContext.error = null;
3483
3502
  break;
@@ -3504,7 +3523,10 @@ function createInitialState(hubUrl) {
3504
3523
  hubUrl: hubUrl ?? null,
3505
3524
  error: null,
3506
3525
  isDemo: false,
3507
- recoveryPhrase: null
3526
+ recoveryPhrase: null,
3527
+ atprotoDid: null,
3528
+ atprotoHandle: null,
3529
+ atprotoDisplayName: null
3508
3530
  }
3509
3531
  };
3510
3532
  }
@@ -3530,7 +3552,8 @@ var OnboardingCtx = createContext(null);
3530
3552
  function OnboardingProvider({
3531
3553
  children,
3532
3554
  defaultHubUrl = "wss://hub.xnet.fyi",
3533
- onComplete
3555
+ onComplete,
3556
+ runAtprotoCeremony
3534
3557
  }) {
3535
3558
  const [{ state, context }, dispatch] = useReducer(
3536
3559
  onboardingReducer,
@@ -3659,7 +3682,44 @@ function OnboardingProvider({
3659
3682
  },
3660
3683
  [state, manager]
3661
3684
  );
3662
- return /* @__PURE__ */ jsx6(OnboardingCtx.Provider, { value: { state, context, send }, children });
3685
+ const startAtprotoCeremony = useCallback18(
3686
+ (handleOrPds) => {
3687
+ if (!runAtprotoCeremony || authInFlight.current) return;
3688
+ authInFlight.current = true;
3689
+ runAtprotoCeremony({ handleOrPds }).then(async (result) => {
3690
+ dispatch({
3691
+ type: "ATPROTO_LINKED",
3692
+ atprotoDid: result.atprotoDid,
3693
+ atprotoHandle: result.atprotoHandle,
3694
+ displayName: result.displayName
3695
+ });
3696
+ const keyBundle = await manager.create();
3697
+ if (result.writeBinding) {
3698
+ await result.writeBinding(keyBundle.identity.did, keyBundle.signingKey);
3699
+ }
3700
+ dispatch({ type: "PASSKEY_SUCCESS", identity: keyBundle.identity, keyBundle });
3701
+ }).catch((err) => {
3702
+ dispatch({
3703
+ type: "ATPROTO_CEREMONY_FAILED",
3704
+ error: err instanceof Error ? err : new Error(String(err))
3705
+ });
3706
+ }).finally(() => {
3707
+ authInFlight.current = false;
3708
+ });
3709
+ },
3710
+ [runAtprotoCeremony, manager]
3711
+ );
3712
+ const value = useMemo14(
3713
+ () => ({
3714
+ state,
3715
+ context,
3716
+ send,
3717
+ atprotoEnabled: Boolean(runAtprotoCeremony),
3718
+ startAtprotoCeremony
3719
+ }),
3720
+ [state, context, send, runAtprotoCeremony, startAtprotoCeremony]
3721
+ );
3722
+ return /* @__PURE__ */ jsx6(OnboardingCtx.Provider, { value, children });
3663
3723
  }
3664
3724
  function useOnboarding() {
3665
3725
  const ctx = useContext7(OnboardingCtx);
@@ -3911,7 +3971,7 @@ function UnsupportedBrowserScreen() {
3911
3971
  // src/onboarding/screens/WelcomeScreen.tsx
3912
3972
  import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
3913
3973
  function WelcomeScreen() {
3914
- const { send } = useOnboarding();
3974
+ const { send, atprotoEnabled } = useOnboarding();
3915
3975
  return /* @__PURE__ */ jsxs11("div", { className: "flex flex-col items-center justify-center min-h-screen bg-gradient-to-b from-background to-muted/30 text-foreground p-6", children: [
3916
3976
  /* @__PURE__ */ jsx13("div", { className: "w-16 h-16 mb-8 rounded-2xl bg-primary/10 flex items-center justify-center", children: /* @__PURE__ */ jsxs11(
3917
3977
  "svg",
@@ -3961,6 +4021,14 @@ function WelcomeScreen() {
3961
4021
  }
3962
4022
  ),
3963
4023
  /* @__PURE__ */ jsx13("p", { className: "text-xs text-muted-foreground/70 text-center max-w-xs mt-2 mb-6", children: "Creates a secure passkey on your device. No passwords needed." }),
4024
+ atprotoEnabled && /* @__PURE__ */ jsx13(
4025
+ "button",
4026
+ {
4027
+ className: "text-sm text-muted-foreground hover:text-foreground transition-colors underline-offset-4 hover:underline mb-2",
4028
+ onClick: () => send({ type: "CONTINUE_WITH_ATPROTO" }),
4029
+ children: "Continue with Bluesky (or any PDS)"
4030
+ }
4031
+ ),
3964
4032
  /* @__PURE__ */ jsx13(
3965
4033
  "button",
3966
4034
  {
@@ -3980,13 +4048,81 @@ function WelcomeScreen() {
3980
4048
  ] });
3981
4049
  }
3982
4050
 
4051
+ // src/onboarding/screens/AtprotoCeremonyScreen.tsx
4052
+ import { useState as useState24 } from "react";
4053
+ import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
4054
+ function AtprotoCeremonyScreen() {
4055
+ const { context, send, startAtprotoCeremony } = useOnboarding();
4056
+ const [handle, setHandle] = useState24("");
4057
+ const linked = Boolean(context.atprotoDid);
4058
+ const submit = () => {
4059
+ const value = handle.trim();
4060
+ if (value) startAtprotoCeremony(value);
4061
+ };
4062
+ return /* @__PURE__ */ jsxs12("div", { className: "flex flex-col items-center justify-center min-h-screen bg-background text-foreground p-6", children: [
4063
+ /* @__PURE__ */ jsx14("h1", { className: "text-2xl font-semibold mb-2", children: "Continue with Bluesky" }),
4064
+ /* @__PURE__ */ jsx14("p", { className: "text-muted-foreground text-center mb-6 max-w-sm", children: "Sign in with your ATProto handle to claim a free global name. Works with Bluesky or any PDS." }),
4065
+ linked ? /* @__PURE__ */ jsxs12("p", { className: "text-sm text-muted-foreground mb-6", children: [
4066
+ "Linked ",
4067
+ /* @__PURE__ */ jsxs12("span", { className: "font-medium text-foreground", children: [
4068
+ "@",
4069
+ context.atprotoHandle
4070
+ ] }),
4071
+ " \u2014 finishing your passkey\u2026"
4072
+ ] }) : /* @__PURE__ */ jsxs12("div", { className: "w-full max-w-sm", children: [
4073
+ /* @__PURE__ */ jsx14("label", { htmlFor: "atproto-handle", className: "sr-only", children: "ATProto handle" }),
4074
+ /* @__PURE__ */ jsx14(
4075
+ "input",
4076
+ {
4077
+ id: "atproto-handle",
4078
+ type: "text",
4079
+ inputMode: "url",
4080
+ autoCapitalize: "none",
4081
+ autoCorrect: "off",
4082
+ spellCheck: false,
4083
+ placeholder: "alice.bsky.social",
4084
+ value: handle,
4085
+ onChange: (e) => setHandle(e.target.value),
4086
+ onKeyDown: (e) => {
4087
+ if (e.key === "Enter") submit();
4088
+ },
4089
+ className: "w-full px-4 py-3 rounded-lg border border-border bg-background mb-3"
4090
+ }
4091
+ ),
4092
+ /* @__PURE__ */ jsx14(
4093
+ "button",
4094
+ {
4095
+ onClick: submit,
4096
+ disabled: !handle.trim(),
4097
+ className: "w-full px-4 py-3 bg-primary text-primary-foreground rounded-lg font-medium disabled:opacity-50",
4098
+ children: "Continue"
4099
+ }
4100
+ )
4101
+ ] }),
4102
+ context.error && /* @__PURE__ */ jsx14("p", { className: "text-sm text-destructive mt-4 max-w-sm text-center", children: context.error.message }),
4103
+ /* @__PURE__ */ jsxs12("p", { className: "text-xs text-muted-foreground/80 text-center max-w-xs mt-6", children: [
4104
+ "Your Bluesky account gives you a global name. It does ",
4105
+ /* @__PURE__ */ jsx14("strong", { children: "not" }),
4106
+ " hold or recover your xNet keys unless you later enable it as a recovery anchor."
4107
+ ] }),
4108
+ /* @__PURE__ */ jsx14(
4109
+ "button",
4110
+ {
4111
+ className: "text-sm text-muted-foreground hover:text-foreground underline-offset-4 hover:underline mt-6",
4112
+ onClick: () => send({ type: "BACK_TO_WELCOME" }),
4113
+ children: "Back"
4114
+ }
4115
+ )
4116
+ ] });
4117
+ }
4118
+
3983
4119
  // src/onboarding/screens/GuardianRecoveryScreen.tsx
3984
4120
  import { parseShare as parseShare2 } from "@xnetjs/identity";
3985
- import { useMemo as useMemo15, useState as useState24 } from "react";
3986
- import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
4121
+ import { useMemo as useMemo15, useState as useState25 } from "react";
4122
+ import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
3987
4123
  function GuardianRecoveryScreen() {
3988
4124
  const { send, context } = useOnboarding();
3989
- const [text, setText] = useState24("");
4125
+ const [text, setText] = useState25("");
3990
4126
  const { validCodes, invalidCount, threshold } = useMemo15(() => {
3991
4127
  const lines = text.split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0);
3992
4128
  const valid = [];
@@ -4012,10 +4148,10 @@ function GuardianRecoveryScreen() {
4012
4148
  if (threshold !== null) return `${validCodes.length} of ${threshold} needed`;
4013
4149
  return `${validCodes.length} share${validCodes.length === 1 ? "" : "s"} pasted`;
4014
4150
  })();
4015
- return /* @__PURE__ */ jsxs12("div", { className: "flex min-h-screen flex-col items-center justify-center bg-background p-6 text-foreground", children: [
4016
- /* @__PURE__ */ jsx14("h1", { className: "mb-2 text-2xl font-semibold", children: "Recover with your guardians" }),
4017
- /* @__PURE__ */ jsx14("p", { className: "mb-6 max-w-md text-center text-muted-foreground", children: "Paste the share codes your guardians gave you \u2014 one per line. You need enough of them to restore your identity; we\u2019ll tell you when you have enough." }),
4018
- /* @__PURE__ */ jsx14(
4151
+ return /* @__PURE__ */ jsxs13("div", { className: "flex min-h-screen flex-col items-center justify-center bg-background p-6 text-foreground", children: [
4152
+ /* @__PURE__ */ jsx15("h1", { className: "mb-2 text-2xl font-semibold", children: "Recover with your guardians" }),
4153
+ /* @__PURE__ */ jsx15("p", { className: "mb-6 max-w-md text-center text-muted-foreground", children: "Paste the share codes your guardians gave you \u2014 one per line. You need enough of them to restore your identity; we\u2019ll tell you when you have enough." }),
4154
+ /* @__PURE__ */ jsx15(
4019
4155
  "textarea",
4020
4156
  {
4021
4157
  autoFocus: true,
@@ -4029,14 +4165,14 @@ function GuardianRecoveryScreen() {
4029
4165
  className: "mb-2 w-80 max-w-full resize-none rounded-lg border border-border bg-muted/30 p-3 font-mono text-xs outline-none focus:border-primary"
4030
4166
  }
4031
4167
  ),
4032
- /* @__PURE__ */ jsx14("div", { className: "mb-4 h-5 text-xs", children: /* @__PURE__ */ jsx14(
4168
+ /* @__PURE__ */ jsx15("div", { className: "mb-4 h-5 text-xs", children: /* @__PURE__ */ jsx15(
4033
4169
  "span",
4034
4170
  {
4035
4171
  className: context.error || invalidCount > 0 ? "text-destructive" : "text-muted-foreground",
4036
4172
  children: hint
4037
4173
  }
4038
4174
  ) }),
4039
- /* @__PURE__ */ jsx14(
4175
+ /* @__PURE__ */ jsx15(
4040
4176
  "button",
4041
4177
  {
4042
4178
  disabled: !canRecover,
@@ -4045,7 +4181,7 @@ function GuardianRecoveryScreen() {
4045
4181
  children: "Recover my identity"
4046
4182
  }
4047
4183
  ),
4048
- /* @__PURE__ */ jsx14(
4184
+ /* @__PURE__ */ jsx15(
4049
4185
  "button",
4050
4186
  {
4051
4187
  className: "text-sm text-muted-foreground transition-colors hover:text-foreground",
@@ -4058,11 +4194,11 @@ function GuardianRecoveryScreen() {
4058
4194
 
4059
4195
  // src/onboarding/screens/RecoveryPhraseScreen.tsx
4060
4196
  import { validateRecoveryPhrase } from "@xnetjs/identity";
4061
- import { useMemo as useMemo16, useState as useState25 } from "react";
4062
- import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
4197
+ import { useMemo as useMemo16, useState as useState26 } from "react";
4198
+ import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
4063
4199
  function RecoveryPhraseScreen() {
4064
4200
  const { send, context } = useOnboarding();
4065
- const [phrase, setPhrase] = useState25("");
4201
+ const [phrase, setPhrase] = useState26("");
4066
4202
  const validation = useMemo16(() => validateRecoveryPhrase(phrase), [phrase]);
4067
4203
  const empty = phrase.trim().length === 0;
4068
4204
  const hint = (() => {
@@ -4072,10 +4208,10 @@ function RecoveryPhraseScreen() {
4072
4208
  }
4073
4209
  return `Not in the wordlist: ${validation.unknownWords.join(", ")}`;
4074
4210
  })();
4075
- return /* @__PURE__ */ jsxs13("div", { className: "flex min-h-screen flex-col items-center justify-center bg-background p-6 text-foreground", children: [
4076
- /* @__PURE__ */ jsx15("h1", { className: "mb-2 text-2xl font-semibold", children: "Enter your recovery phrase" }),
4077
- /* @__PURE__ */ jsx15("p", { className: "mb-6 max-w-md text-center text-muted-foreground", children: "Type the recovery phrase you saved. It restores the same identity and your encrypted data on this device." }),
4078
- /* @__PURE__ */ jsx15(
4211
+ return /* @__PURE__ */ jsxs14("div", { className: "flex min-h-screen flex-col items-center justify-center bg-background p-6 text-foreground", children: [
4212
+ /* @__PURE__ */ jsx16("h1", { className: "mb-2 text-2xl font-semibold", children: "Enter your recovery phrase" }),
4213
+ /* @__PURE__ */ jsx16("p", { className: "mb-6 max-w-md text-center text-muted-foreground", children: "Type the recovery phrase you saved. It restores the same identity and your encrypted data on this device." }),
4214
+ /* @__PURE__ */ jsx16(
4079
4215
  "textarea",
4080
4216
  {
4081
4217
  autoFocus: true,
@@ -4089,11 +4225,11 @@ function RecoveryPhraseScreen() {
4089
4225
  className: "mb-2 w-80 max-w-full resize-none rounded-lg border border-border bg-muted/30 p-3 font-mono text-sm outline-none focus:border-primary"
4090
4226
  }
4091
4227
  ),
4092
- /* @__PURE__ */ jsxs13("div", { className: "mb-4 h-5 text-xs", children: [
4093
- hint && /* @__PURE__ */ jsx15("span", { className: "text-destructive", children: hint }),
4094
- context.error && !hint && /* @__PURE__ */ jsx15("span", { className: "text-destructive", children: context.error.message })
4228
+ /* @__PURE__ */ jsxs14("div", { className: "mb-4 h-5 text-xs", children: [
4229
+ hint && /* @__PURE__ */ jsx16("span", { className: "text-destructive", children: hint }),
4230
+ context.error && !hint && /* @__PURE__ */ jsx16("span", { className: "text-destructive", children: context.error.message })
4095
4231
  ] }),
4096
- /* @__PURE__ */ jsx15(
4232
+ /* @__PURE__ */ jsx16(
4097
4233
  "button",
4098
4234
  {
4099
4235
  disabled: !validation.ok,
@@ -4102,7 +4238,7 @@ function RecoveryPhraseScreen() {
4102
4238
  children: "Recover my identity"
4103
4239
  }
4104
4240
  ),
4105
- /* @__PURE__ */ jsx15(
4241
+ /* @__PURE__ */ jsx16(
4106
4242
  "button",
4107
4243
  {
4108
4244
  className: "text-sm text-muted-foreground transition-colors hover:text-foreground",
@@ -4114,12 +4250,12 @@ function RecoveryPhraseScreen() {
4114
4250
  }
4115
4251
 
4116
4252
  // src/onboarding/screens/ShowRecoveryPhraseScreen.tsx
4117
- import { useState as useState26 } from "react";
4118
- import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
4253
+ import { useState as useState27 } from "react";
4254
+ import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
4119
4255
  function ShowRecoveryPhraseScreen() {
4120
4256
  const { send, context } = useOnboarding();
4121
- const [saved, setSaved] = useState26(false);
4122
- const [copied, setCopied] = useState26(false);
4257
+ const [saved, setSaved] = useState27(false);
4258
+ const [copied, setCopied] = useState27(false);
4123
4259
  const phrase = context.recoveryPhrase ?? "";
4124
4260
  const words = phrase.split(" ").filter(Boolean);
4125
4261
  const copy = () => {
@@ -4128,14 +4264,14 @@ function ShowRecoveryPhraseScreen() {
4128
4264
  () => setCopied(false)
4129
4265
  );
4130
4266
  };
4131
- return /* @__PURE__ */ jsxs14("div", { className: "flex min-h-screen flex-col items-center justify-center bg-background p-6 text-foreground", children: [
4132
- /* @__PURE__ */ jsx16("h1", { className: "mb-2 text-2xl font-semibold", children: "Save your recovery phrase" }),
4133
- /* @__PURE__ */ jsx16("p", { className: "mb-6 max-w-md text-center text-muted-foreground", children: "Write these words down and keep them somewhere safe. They are the only way to recover your workspace if you lose your passkey \u2014 we can\u2019t recover them for you." }),
4134
- /* @__PURE__ */ jsx16("ol", { className: "mb-3 grid w-80 max-w-full grid-cols-2 gap-x-6 gap-y-1 rounded-lg border border-border bg-muted/30 p-4 font-mono text-sm", children: words.map((word, i) => /* @__PURE__ */ jsxs14("li", { className: "flex gap-2", children: [
4135
- /* @__PURE__ */ jsx16("span", { className: "w-5 select-none text-right text-muted-foreground", children: i + 1 }),
4136
- /* @__PURE__ */ jsx16("span", { children: word })
4267
+ return /* @__PURE__ */ jsxs15("div", { className: "flex min-h-screen flex-col items-center justify-center bg-background p-6 text-foreground", children: [
4268
+ /* @__PURE__ */ jsx17("h1", { className: "mb-2 text-2xl font-semibold", children: "Save your recovery phrase" }),
4269
+ /* @__PURE__ */ jsx17("p", { className: "mb-6 max-w-md text-center text-muted-foreground", children: "Write these words down and keep them somewhere safe. They are the only way to recover your workspace if you lose your passkey \u2014 we can\u2019t recover them for you." }),
4270
+ /* @__PURE__ */ jsx17("ol", { className: "mb-3 grid w-80 max-w-full grid-cols-2 gap-x-6 gap-y-1 rounded-lg border border-border bg-muted/30 p-4 font-mono text-sm", children: words.map((word, i) => /* @__PURE__ */ jsxs15("li", { className: "flex gap-2", children: [
4271
+ /* @__PURE__ */ jsx17("span", { className: "w-5 select-none text-right text-muted-foreground", children: i + 1 }),
4272
+ /* @__PURE__ */ jsx17("span", { children: word })
4137
4273
  ] }, `${i}-${word}`)) }),
4138
- /* @__PURE__ */ jsx16(
4274
+ /* @__PURE__ */ jsx17(
4139
4275
  "button",
4140
4276
  {
4141
4277
  className: "mb-5 text-xs text-muted-foreground transition-colors hover:text-foreground",
@@ -4143,8 +4279,8 @@ function ShowRecoveryPhraseScreen() {
4143
4279
  children: copied ? "Copied \u2713" : "Copy to clipboard"
4144
4280
  }
4145
4281
  ),
4146
- /* @__PURE__ */ jsxs14("label", { className: "mb-4 flex max-w-xs cursor-pointer items-start gap-2 text-sm text-muted-foreground", children: [
4147
- /* @__PURE__ */ jsx16(
4282
+ /* @__PURE__ */ jsxs15("label", { className: "mb-4 flex max-w-xs cursor-pointer items-start gap-2 text-sm text-muted-foreground", children: [
4283
+ /* @__PURE__ */ jsx17(
4148
4284
  "input",
4149
4285
  {
4150
4286
  type: "checkbox",
@@ -4155,7 +4291,7 @@ function ShowRecoveryPhraseScreen() {
4155
4291
  ),
4156
4292
  "I\u2019ve saved my recovery phrase somewhere safe."
4157
4293
  ] }),
4158
- /* @__PURE__ */ jsx16(
4294
+ /* @__PURE__ */ jsx17(
4159
4295
  "button",
4160
4296
  {
4161
4297
  disabled: !saved,
@@ -4168,52 +4304,54 @@ function ShowRecoveryPhraseScreen() {
4168
4304
  }
4169
4305
 
4170
4306
  // src/onboarding/OnboardingFlow.tsx
4171
- import { Fragment, jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
4307
+ import { Fragment, jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
4172
4308
  function OnboardingFlow({ connectToHub, children }) {
4173
4309
  const { state } = useOnboarding();
4174
4310
  switch (state) {
4175
4311
  case "welcome":
4176
- return /* @__PURE__ */ jsx17(WelcomeScreen, {});
4312
+ return /* @__PURE__ */ jsx18(WelcomeScreen, {});
4177
4313
  case "authenticating":
4178
- return /* @__PURE__ */ jsx17(AuthenticatingScreen, {});
4314
+ return /* @__PURE__ */ jsx18(AuthenticatingScreen, {});
4179
4315
  case "auth-error":
4180
- return /* @__PURE__ */ jsx17(AuthErrorScreen, {});
4316
+ return /* @__PURE__ */ jsx18(AuthErrorScreen, {});
4181
4317
  case "unsupported-browser":
4182
- return /* @__PURE__ */ jsx17(UnsupportedBrowserScreen, {});
4318
+ return /* @__PURE__ */ jsx18(UnsupportedBrowserScreen, {});
4183
4319
  case "import-identity":
4184
- return /* @__PURE__ */ jsx17(ImportIdentityScreen, {});
4320
+ return /* @__PURE__ */ jsx18(ImportIdentityScreen, {});
4185
4321
  case "qr-scan":
4186
- return /* @__PURE__ */ jsxs15("div", { className: "flex flex-col items-center justify-center min-h-screen bg-background text-foreground p-6", children: [
4187
- /* @__PURE__ */ jsx17("h1", { className: "text-2xl font-semibold mb-2", children: "QR Scan" }),
4188
- /* @__PURE__ */ jsx17("p", { className: "text-muted-foreground", children: "Coming soon \u2014 scan a QR code from another device." })
4322
+ return /* @__PURE__ */ jsxs16("div", { className: "flex flex-col items-center justify-center min-h-screen bg-background text-foreground p-6", children: [
4323
+ /* @__PURE__ */ jsx18("h1", { className: "text-2xl font-semibold mb-2", children: "QR Scan" }),
4324
+ /* @__PURE__ */ jsx18("p", { className: "text-muted-foreground", children: "Coming soon \u2014 scan a QR code from another device." })
4189
4325
  ] });
4190
4326
  case "recovery-phrase":
4191
- return /* @__PURE__ */ jsx17(RecoveryPhraseScreen, {});
4327
+ return /* @__PURE__ */ jsx18(RecoveryPhraseScreen, {});
4192
4328
  case "guardian-recovery":
4193
- return /* @__PURE__ */ jsx17(GuardianRecoveryScreen, {});
4329
+ return /* @__PURE__ */ jsx18(GuardianRecoveryScreen, {});
4330
+ case "atproto-ceremony":
4331
+ return /* @__PURE__ */ jsx18(AtprotoCeremonyScreen, {});
4194
4332
  case "creating-recoverable":
4195
- return /* @__PURE__ */ jsx17(AuthenticatingScreen, {});
4333
+ return /* @__PURE__ */ jsx18(AuthenticatingScreen, {});
4196
4334
  case "show-recovery-phrase":
4197
- return /* @__PURE__ */ jsx17(ShowRecoveryPhraseScreen, {});
4335
+ return /* @__PURE__ */ jsx18(ShowRecoveryPhraseScreen, {});
4198
4336
  case "connecting-hub":
4199
- return /* @__PURE__ */ jsx17(HubConnectScreen, { connectToHub });
4337
+ return /* @__PURE__ */ jsx18(HubConnectScreen, { connectToHub });
4200
4338
  case "ready":
4201
- return /* @__PURE__ */ jsx17(ReadyScreen, {});
4339
+ return /* @__PURE__ */ jsx18(ReadyScreen, {});
4202
4340
  case "complete":
4203
- return /* @__PURE__ */ jsx17(Fragment, { children });
4341
+ return /* @__PURE__ */ jsx18(Fragment, { children });
4204
4342
  default:
4205
- return /* @__PURE__ */ jsx17(WelcomeScreen, {});
4343
+ return /* @__PURE__ */ jsx18(WelcomeScreen, {});
4206
4344
  }
4207
4345
  }
4208
4346
 
4209
4347
  // src/onboarding/screens/SmartWelcome.tsx
4210
4348
  import { discoverExistingPasskey } from "@xnetjs/identity";
4211
- import { useEffect as useEffect20, useState as useState27 } from "react";
4212
- import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
4349
+ import { useEffect as useEffect20, useState as useState28 } from "react";
4350
+ import { jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
4213
4351
  function SmartWelcome() {
4214
4352
  const { send } = useOnboarding();
4215
- const [checking, setChecking] = useState27(true);
4216
- const [hasExisting, setHasExisting] = useState27(false);
4353
+ const [checking, setChecking] = useState28(true);
4354
+ const [hasExisting, setHasExisting] = useState28(false);
4217
4355
  useEffect20(() => {
4218
4356
  let cancelled = false;
4219
4357
  discoverExistingPasskey().then((passkey) => {
@@ -4231,31 +4369,31 @@ function SmartWelcome() {
4231
4369
  };
4232
4370
  }, []);
4233
4371
  if (checking) {
4234
- return /* @__PURE__ */ jsx18("div", { className: "onboarding-screen", children: /* @__PURE__ */ jsx18("p", { className: "spinner-text", children: "Checking for existing identity..." }) });
4372
+ return /* @__PURE__ */ jsx19("div", { className: "onboarding-screen", children: /* @__PURE__ */ jsx19("p", { className: "spinner-text", children: "Checking for existing identity..." }) });
4235
4373
  }
4236
4374
  if (hasExisting) {
4237
4375
  const authName = getPlatformAuthName();
4238
- return /* @__PURE__ */ jsxs16("div", { className: "onboarding-screen welcome-back", children: [
4239
- /* @__PURE__ */ jsx18("h1", { children: "Welcome back!" }),
4240
- /* @__PURE__ */ jsxs16("p", { className: "subtitle", children: [
4376
+ return /* @__PURE__ */ jsxs17("div", { className: "onboarding-screen welcome-back", children: [
4377
+ /* @__PURE__ */ jsx19("h1", { children: "Welcome back!" }),
4378
+ /* @__PURE__ */ jsxs17("p", { className: "subtitle", children: [
4241
4379
  "We found your xNet identity. Use ",
4242
4380
  authName,
4243
4381
  " to sign in."
4244
4382
  ] }),
4245
- /* @__PURE__ */ jsxs16("button", { className: "primary-button", onClick: () => send({ type: "AUTHENTICATE" }), children: [
4383
+ /* @__PURE__ */ jsxs17("button", { className: "primary-button", onClick: () => send({ type: "AUTHENTICATE" }), children: [
4246
4384
  "Sign in with ",
4247
4385
  authName
4248
4386
  ] }),
4249
- /* @__PURE__ */ jsx18("button", { className: "text-button", onClick: () => send({ type: "CREATE_NEW" }), children: "Create a new identity instead" })
4387
+ /* @__PURE__ */ jsx19("button", { className: "text-button", onClick: () => send({ type: "CREATE_NEW" }), children: "Create a new identity instead" })
4250
4388
  ] });
4251
4389
  }
4252
- return /* @__PURE__ */ jsx18(WelcomeScreen, {});
4390
+ return /* @__PURE__ */ jsx19(WelcomeScreen, {});
4253
4391
  }
4254
4392
 
4255
4393
  // src/onboarding/screens/SyncProgressOverlay.tsx
4256
4394
  import { formatBytes as formatBytes2 } from "@xnetjs/core";
4257
4395
  import { useEffect as useEffect21 } from "react";
4258
- import { Fragment as Fragment2, jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
4396
+ import { Fragment as Fragment2, jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
4259
4397
  function SyncProgressOverlay({
4260
4398
  progress,
4261
4399
  onComplete
@@ -4266,14 +4404,14 @@ function SyncProgressOverlay({
4266
4404
  return () => clearTimeout(timer);
4267
4405
  }
4268
4406
  }, [progress.phase, onComplete]);
4269
- return /* @__PURE__ */ jsx19("div", { className: "sync-progress-overlay", children: /* @__PURE__ */ jsxs17("div", { className: "sync-card", children: [
4270
- progress.phase === "connecting" && /* @__PURE__ */ jsxs17(Fragment2, { children: [
4271
- /* @__PURE__ */ jsx19("h2", { children: "Connecting to server..." }),
4272
- /* @__PURE__ */ jsx19("p", { className: "spinner-text", children: "Please wait" })
4407
+ return /* @__PURE__ */ jsx20("div", { className: "sync-progress-overlay", children: /* @__PURE__ */ jsxs18("div", { className: "sync-card", children: [
4408
+ progress.phase === "connecting" && /* @__PURE__ */ jsxs18(Fragment2, { children: [
4409
+ /* @__PURE__ */ jsx20("h2", { children: "Connecting to server..." }),
4410
+ /* @__PURE__ */ jsx20("p", { className: "spinner-text", children: "Please wait" })
4273
4411
  ] }),
4274
- progress.phase === "syncing" && /* @__PURE__ */ jsxs17(Fragment2, { children: [
4275
- /* @__PURE__ */ jsx19("h2", { children: "Syncing your data" }),
4276
- /* @__PURE__ */ jsx19("div", { className: "progress-bar", children: /* @__PURE__ */ jsx19(
4412
+ progress.phase === "syncing" && /* @__PURE__ */ jsxs18(Fragment2, { children: [
4413
+ /* @__PURE__ */ jsx20("h2", { children: "Syncing your data" }),
4414
+ /* @__PURE__ */ jsx20("div", { className: "progress-bar", children: /* @__PURE__ */ jsx20(
4277
4415
  "div",
4278
4416
  {
4279
4417
  className: "progress-fill",
@@ -4282,29 +4420,29 @@ function SyncProgressOverlay({
4282
4420
  }
4283
4421
  }
4284
4422
  ) }),
4285
- /* @__PURE__ */ jsxs17("p", { className: "progress-text", children: [
4423
+ /* @__PURE__ */ jsxs18("p", { className: "progress-text", children: [
4286
4424
  progress.roomsSynced,
4287
4425
  " of ",
4288
4426
  progress.roomsTotal,
4289
4427
  " items"
4290
4428
  ] }),
4291
- /* @__PURE__ */ jsxs17("p", { className: "bytes-text", children: [
4429
+ /* @__PURE__ */ jsxs18("p", { className: "bytes-text", children: [
4292
4430
  formatBytes2(progress.bytesReceived),
4293
4431
  " received"
4294
4432
  ] })
4295
4433
  ] }),
4296
- progress.phase === "complete" && /* @__PURE__ */ jsxs17(Fragment2, { children: [
4297
- /* @__PURE__ */ jsx19("h2", { children: "All synced!" }),
4298
- /* @__PURE__ */ jsxs17("p", { children: [
4434
+ progress.phase === "complete" && /* @__PURE__ */ jsxs18(Fragment2, { children: [
4435
+ /* @__PURE__ */ jsx20("h2", { children: "All synced!" }),
4436
+ /* @__PURE__ */ jsxs18("p", { children: [
4299
4437
  progress.roomsTotal,
4300
4438
  " items synchronized"
4301
4439
  ] })
4302
4440
  ] }),
4303
- progress.phase === "error" && /* @__PURE__ */ jsxs17(Fragment2, { children: [
4304
- /* @__PURE__ */ jsx19("h2", { children: "Sync issue" }),
4305
- /* @__PURE__ */ jsx19("p", { children: "Some data may not be up to date." }),
4306
- progress.error && /* @__PURE__ */ jsx19("p", { className: "error-detail", children: progress.error.message }),
4307
- /* @__PURE__ */ jsx19("button", { className: "primary-button", onClick: onComplete, children: "Continue anyway" })
4441
+ progress.phase === "error" && /* @__PURE__ */ jsxs18(Fragment2, { children: [
4442
+ /* @__PURE__ */ jsx20("h2", { children: "Sync issue" }),
4443
+ /* @__PURE__ */ jsx20("p", { children: "Some data may not be up to date." }),
4444
+ progress.error && /* @__PURE__ */ jsx20("p", { className: "error-detail", children: progress.error.message }),
4445
+ /* @__PURE__ */ jsx20("button", { className: "primary-button", onClick: onComplete, children: "Continue anyway" })
4308
4446
  ] })
4309
4447
  ] }) });
4310
4448
  }
@@ -4369,60 +4507,60 @@ function isTaskOverdue(timestamp, completed) {
4369
4507
 
4370
4508
  // src/components/PageTasksPanel.tsx
4371
4509
  import { Calendar, CheckSquare2, ChevronDown, ChevronRight, Square, Users } from "lucide-react";
4372
- import { useMemo as useMemo17, useState as useState28 } from "react";
4373
- import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
4510
+ import { useMemo as useMemo17, useState as useState29 } from "react";
4511
+ import { jsx as jsx21, jsxs as jsxs19 } from "react/jsx-runtime";
4374
4512
  function PageTasksPanel({ pageId }) {
4375
- const [expanded, setExpanded] = useState28(true);
4513
+ const [expanded, setExpanded] = useState29(true);
4376
4514
  const { tree, loading } = useTasks({ pageId });
4377
4515
  const rows = useMemo17(() => flattenTaskTree(tree), [tree]);
4378
- return /* @__PURE__ */ jsxs18("div", { className: "mt-8 overflow-hidden rounded-lg border border-border", children: [
4379
- /* @__PURE__ */ jsx20(
4516
+ return /* @__PURE__ */ jsxs19("div", { className: "mt-8 overflow-hidden rounded-lg border border-border", children: [
4517
+ /* @__PURE__ */ jsx21(
4380
4518
  "button",
4381
4519
  {
4382
4520
  className: "w-full cursor-pointer border-none bg-secondary p-3 px-4 text-left",
4383
4521
  onClick: () => setExpanded((value) => !value),
4384
4522
  type: "button",
4385
- children: /* @__PURE__ */ jsxs18("h3", { className: "m-0 flex items-center justify-between text-sm font-semibold text-foreground", children: [
4386
- /* @__PURE__ */ jsxs18("span", { children: [
4523
+ children: /* @__PURE__ */ jsxs19("h3", { className: "m-0 flex items-center justify-between text-sm font-semibold text-foreground", children: [
4524
+ /* @__PURE__ */ jsxs19("span", { children: [
4387
4525
  "Tasks on this page (",
4388
4526
  rows.length,
4389
4527
  ")"
4390
4528
  ] }),
4391
- expanded ? /* @__PURE__ */ jsx20(ChevronDown, { size: 16, className: "text-muted-foreground" }) : /* @__PURE__ */ jsx20(ChevronRight, { size: 16, className: "text-muted-foreground" })
4529
+ expanded ? /* @__PURE__ */ jsx21(ChevronDown, { size: 16, className: "text-muted-foreground" }) : /* @__PURE__ */ jsx21(ChevronRight, { size: 16, className: "text-muted-foreground" })
4392
4530
  ] })
4393
4531
  }
4394
4532
  ),
4395
- expanded && /* @__PURE__ */ jsx20("div", { className: "p-3", children: loading ? /* @__PURE__ */ jsx20("p", { className: "m-0 text-sm text-muted-foreground", children: "Loading tasks..." }) : rows.length === 0 ? /* @__PURE__ */ jsx20("p", { className: "m-0 text-sm text-muted-foreground", children: "Checklist items on this page will appear here." }) : /* @__PURE__ */ jsx20("ul", { className: "m-0 list-none space-y-1 p-0", children: rows.map((task) => {
4533
+ expanded && /* @__PURE__ */ jsx21("div", { className: "p-3", children: loading ? /* @__PURE__ */ jsx21("p", { className: "m-0 text-sm text-muted-foreground", children: "Loading tasks..." }) : rows.length === 0 ? /* @__PURE__ */ jsx21("p", { className: "m-0 text-sm text-muted-foreground", children: "Checklist items on this page will appear here." }) : /* @__PURE__ */ jsx21("ul", { className: "m-0 list-none space-y-1 p-0", children: rows.map((task) => {
4396
4534
  const dueDateLabel = formatTaskDueDate(task.dueDate);
4397
4535
  const overdue = isTaskOverdue(task.dueDate, task.completed);
4398
- return /* @__PURE__ */ jsx20("li", { children: /* @__PURE__ */ jsxs18(
4536
+ return /* @__PURE__ */ jsx21("li", { children: /* @__PURE__ */ jsxs19(
4399
4537
  "div",
4400
4538
  {
4401
4539
  className: "flex items-start gap-2 rounded-md px-2 py-2 transition-colors hover:bg-accent/40",
4402
4540
  style: { paddingLeft: `${task.depth * 18 + 8}px` },
4403
4541
  children: [
4404
- task.completed ? /* @__PURE__ */ jsx20(CheckSquare2, { size: 15, className: "mt-0.5 flex-shrink-0 text-primary" }) : /* @__PURE__ */ jsx20(Square, { size: 15, className: "mt-0.5 flex-shrink-0 text-muted-foreground" }),
4405
- /* @__PURE__ */ jsxs18("div", { className: "min-w-0 flex-1", children: [
4406
- /* @__PURE__ */ jsx20(
4542
+ task.completed ? /* @__PURE__ */ jsx21(CheckSquare2, { size: 15, className: "mt-0.5 flex-shrink-0 text-primary" }) : /* @__PURE__ */ jsx21(Square, { size: 15, className: "mt-0.5 flex-shrink-0 text-muted-foreground" }),
4543
+ /* @__PURE__ */ jsxs19("div", { className: "min-w-0 flex-1", children: [
4544
+ /* @__PURE__ */ jsx21(
4407
4545
  "div",
4408
4546
  {
4409
4547
  className: `text-sm ${task.completed ? "line-through text-muted-foreground" : "text-foreground"}`,
4410
4548
  children: task.title
4411
4549
  }
4412
4550
  ),
4413
- /* @__PURE__ */ jsxs18("div", { className: "mt-1 flex flex-wrap items-center gap-2 text-[11px] text-muted-foreground", children: [
4414
- dueDateLabel ? /* @__PURE__ */ jsxs18(
4551
+ /* @__PURE__ */ jsxs19("div", { className: "mt-1 flex flex-wrap items-center gap-2 text-[11px] text-muted-foreground", children: [
4552
+ dueDateLabel ? /* @__PURE__ */ jsxs19(
4415
4553
  "span",
4416
4554
  {
4417
4555
  className: `inline-flex items-center gap-1 ${overdue ? "text-red-500" : "text-muted-foreground"}`,
4418
4556
  children: [
4419
- /* @__PURE__ */ jsx20(Calendar, { size: 11 }),
4557
+ /* @__PURE__ */ jsx21(Calendar, { size: 11 }),
4420
4558
  dueDateLabel
4421
4559
  ]
4422
4560
  }
4423
4561
  ) : null,
4424
- task.assigneeCount > 0 ? /* @__PURE__ */ jsxs18("span", { className: "inline-flex items-center gap-1", children: [
4425
- /* @__PURE__ */ jsx20(Users, { size: 11 }),
4562
+ task.assigneeCount > 0 ? /* @__PURE__ */ jsxs19("span", { className: "inline-flex items-center gap-1", children: [
4563
+ /* @__PURE__ */ jsx21(Users, { size: 11 }),
4426
4564
  task.assigneeCount
4427
4565
  ] }) : null
4428
4566
  ] })
@@ -4436,7 +4574,7 @@ function PageTasksPanel({ pageId }) {
4436
4574
 
4437
4575
  // src/components/TaskCollectionEmbed.tsx
4438
4576
  import { useMemo as useMemo18 } from "react";
4439
- import { jsx as jsx21, jsxs as jsxs19 } from "react/jsx-runtime";
4577
+ import { jsx as jsx22, jsxs as jsxs20 } from "react/jsx-runtime";
4440
4578
  function TaskCollectionEmbed({
4441
4579
  currentPageId,
4442
4580
  currentDid,
@@ -4469,33 +4607,33 @@ function TaskCollectionEmbed({
4469
4607
  }));
4470
4608
  }, [data, showHierarchy, tree]);
4471
4609
  if (missingPageContext) {
4472
- return /* @__PURE__ */ jsx21("div", { className: "p-4 text-sm text-muted-foreground", children: "This view needs a page context." });
4610
+ return /* @__PURE__ */ jsx22("div", { className: "p-4 text-sm text-muted-foreground", children: "This view needs a page context." });
4473
4611
  }
4474
4612
  if (loading) {
4475
- return /* @__PURE__ */ jsx21("div", { className: "p-4 text-sm text-muted-foreground", children: "Loading tasks..." });
4613
+ return /* @__PURE__ */ jsx22("div", { className: "p-4 text-sm text-muted-foreground", children: "Loading tasks..." });
4476
4614
  }
4477
4615
  if (rows.length === 0) {
4478
- return /* @__PURE__ */ jsx21("div", { className: "p-4 text-sm text-muted-foreground", children: "No tasks match the saved filters for this view." });
4616
+ return /* @__PURE__ */ jsx22("div", { className: "p-4 text-sm text-muted-foreground", children: "No tasks match the saved filters for this view." });
4479
4617
  }
4480
- return /* @__PURE__ */ jsx21("div", { className: "p-3", children: /* @__PURE__ */ jsx21("ul", { className: "m-0 list-none space-y-1 p-0", children: rows.map((task) => {
4618
+ return /* @__PURE__ */ jsx22("div", { className: "p-3", children: /* @__PURE__ */ jsx22("ul", { className: "m-0 list-none space-y-1 p-0", children: rows.map((task) => {
4481
4619
  const dueDateLabel = formatTaskDueDate(task.dueDate);
4482
4620
  const overdue = isTaskOverdue(task.dueDate, task.completed);
4483
- return /* @__PURE__ */ jsx21("li", { children: /* @__PURE__ */ jsxs19(
4621
+ return /* @__PURE__ */ jsx22("li", { children: /* @__PURE__ */ jsxs20(
4484
4622
  "div",
4485
4623
  {
4486
4624
  className: "flex items-start gap-2 rounded-lg px-2 py-2 hover:bg-accent/40",
4487
4625
  style: { paddingLeft: `${task.depth * 18 + 8}px` },
4488
4626
  children: [
4489
- /* @__PURE__ */ jsx21("span", { className: task.completed ? "text-primary" : "text-muted-foreground", children: task.completed ? "\u2611" : "\u2610" }),
4490
- /* @__PURE__ */ jsxs19("div", { className: "min-w-0 flex-1", children: [
4491
- /* @__PURE__ */ jsx21(
4627
+ /* @__PURE__ */ jsx22("span", { className: task.completed ? "text-primary" : "text-muted-foreground", children: task.completed ? "\u2611" : "\u2610" }),
4628
+ /* @__PURE__ */ jsxs20("div", { className: "min-w-0 flex-1", children: [
4629
+ /* @__PURE__ */ jsx22(
4492
4630
  "div",
4493
4631
  {
4494
4632
  className: task.completed ? "truncate text-sm text-muted-foreground line-through" : "truncate text-sm text-foreground",
4495
4633
  children: task.title
4496
4634
  }
4497
4635
  ),
4498
- dueDateLabel ? /* @__PURE__ */ jsx21(
4636
+ dueDateLabel ? /* @__PURE__ */ jsx22(
4499
4637
  "div",
4500
4638
  {
4501
4639
  className: overdue ? "mt-1 text-[11px] text-red-500" : "mt-1 text-[11px] text-muted-foreground",
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useNodeStore
3
- } from "./chunk-H44ZSIH4.js";
3
+ } from "./chunk-5ILJMPKO.js";
4
4
 
5
5
  // src/hooks/useUndoScope.ts
6
6
  import { UndoManager } from "@xnetjs/history";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useNodeStore
3
- } from "./chunk-H44ZSIH4.js";
3
+ } from "./chunk-5ILJMPKO.js";
4
4
 
5
5
  // src/hooks/useDatabaseDoc.ts
6
6
  import {
@@ -7,7 +7,7 @@ import {
7
7
  useDataBridge,
8
8
  useTelemetryReporter,
9
9
  useTracingReporter
10
- } from "./chunk-H44ZSIH4.js";
10
+ } from "./chunk-5ILJMPKO.js";
11
11
 
12
12
  // src/utils/flattenNode.ts
13
13
  function flattenNode(node, options) {
@@ -2,7 +2,7 @@ import {
2
2
  flattenNode,
3
3
  useQuery,
4
4
  useSyncManager
5
- } from "./chunk-ZGP56IIJ.js";
5
+ } from "./chunk-RW3DSDKO.js";
6
6
  import {
7
7
  useInstrumentation
8
8
  } from "./chunk-JCOFKBOB.js";
@@ -11,7 +11,7 @@ import {
11
11
  useNodeStore,
12
12
  useXNet,
13
13
  useXNetInternal
14
- } from "./chunk-H44ZSIH4.js";
14
+ } from "./chunk-5ILJMPKO.js";
15
15
 
16
16
  // src/hooks/useInfiniteQuery.ts
17
17
  import { createQueryDescriptor, serializeQueryDescriptor } from "@xnetjs/data-bridge";
package/dist/core.js CHANGED
@@ -5,16 +5,16 @@ import {
5
5
  useInfiniteQuery,
6
6
  useIsOffline,
7
7
  useNode
8
- } from "./chunk-VZMZQTR7.js";
8
+ } from "./chunk-UVJJN33U.js";
9
9
  import {
10
10
  useMutate,
11
11
  useQuery
12
- } from "./chunk-ZGP56IIJ.js";
12
+ } from "./chunk-RW3DSDKO.js";
13
13
  import "./chunk-JCOFKBOB.js";
14
14
  import {
15
15
  XNetProvider,
16
16
  useXNet
17
- } from "./chunk-H44ZSIH4.js";
17
+ } from "./chunk-5ILJMPKO.js";
18
18
  export {
19
19
  ErrorBoundary,
20
20
  OfflineIndicator,
package/dist/database.js CHANGED
@@ -6,8 +6,8 @@ import {
6
6
  useDatabaseSchema,
7
7
  useRelatedRows,
8
8
  useReverseRelations
9
- } from "./chunk-HTFAHJQK.js";
10
- import "./chunk-H44ZSIH4.js";
9
+ } from "./chunk-QSJJNEFY.js";
10
+ import "./chunk-5ILJMPKO.js";
11
11
  export {
12
12
  useCell,
13
13
  useDatabase,
@@ -1100,7 +1100,7 @@ declare function useSyncManager(): SyncManager | null;
1100
1100
  * welcome → import-identity → qr-scan/recovery-phrase → connecting-hub
1101
1101
  */
1102
1102
 
1103
- type OnboardingState = 'welcome' | 'authenticating' | 'auth-error' | 'unsupported-browser' | 'import-identity' | 'qr-scan' | 'recovery-phrase' | 'guardian-recovery' | 'creating-recoverable' | 'show-recovery-phrase' | 'connecting-hub' | 'ready' | 'complete';
1103
+ type OnboardingState = 'welcome' | 'authenticating' | 'auth-error' | 'unsupported-browser' | 'import-identity' | 'qr-scan' | 'recovery-phrase' | 'guardian-recovery' | 'atproto-ceremony' | 'creating-recoverable' | 'show-recovery-phrase' | 'connecting-hub' | 'ready' | 'complete';
1104
1104
  type OnboardingEvent = {
1105
1105
  type: 'AUTHENTICATE';
1106
1106
  } | {
@@ -1157,6 +1157,16 @@ type OnboardingEvent = {
1157
1157
  phrase: string;
1158
1158
  } | {
1159
1159
  type: 'PHRASE_SAVED';
1160
+ } | {
1161
+ type: 'CONTINUE_WITH_ATPROTO';
1162
+ } | {
1163
+ type: 'ATPROTO_LINKED';
1164
+ atprotoDid: string;
1165
+ atprotoHandle: string;
1166
+ displayName?: string;
1167
+ } | {
1168
+ type: 'ATPROTO_CEREMONY_FAILED';
1169
+ error: Error;
1160
1170
  };
1161
1171
  type OnboardingMachineContext = {
1162
1172
  identity: Identity | null;
@@ -1166,6 +1176,11 @@ type OnboardingMachineContext = {
1166
1176
  isDemo: boolean;
1167
1177
  /** The recovery phrase to show once, after creating a recoverable identity (0243). */
1168
1178
  recoveryPhrase: string | null;
1179
+ /** Linked ATProto identity from the login-door ceremony (0322/0338), if any. */
1180
+ atprotoDid: string | null;
1181
+ atprotoHandle: string | null;
1182
+ /** Display name pulled from the ATProto profile, to pre-fill the xNet profile. */
1183
+ atprotoDisplayName: string | null;
1169
1184
  };
1170
1185
  type OnboardingReducerState = {
1171
1186
  state: OnboardingState;
@@ -1174,6 +1189,39 @@ type OnboardingReducerState = {
1174
1189
  declare function onboardingReducer(current: OnboardingReducerState, event: OnboardingEvent): OnboardingReducerState;
1175
1190
  declare function createInitialState(hubUrl?: string): OnboardingReducerState;
1176
1191
 
1192
+ /**
1193
+ * @xnetjs/react/onboarding - ATProto login-door ceremony contract (0322/0338).
1194
+ *
1195
+ * The actual OAuth 2.1 / PKCE / DPoP dance lives in `@atproto/oauth-client-*`,
1196
+ * which is heavy and browser/redirect-bound. To keep `@xnetjs/react`
1197
+ * dependency-light and unit-testable, the ceremony is *injected*: the host app
1198
+ * (apps/web, apps/electron) provides a `runAtprotoCeremony` that resolves to
1199
+ * the linked identity, and — after the xNet passkey identity is created — a
1200
+ * `writeBinding` that puts the signed `net.x.identity.binding` record into the
1201
+ * user's repo. The onboarding machine wires the two around the existing
1202
+ * passkey-create step.
1203
+ */
1204
+ interface AtprotoCeremonyResult {
1205
+ /** The proven ATProto DID (`did:plc:…` / `did:web:…`). */
1206
+ atprotoDid: string;
1207
+ /** The handle the user authenticated with (e.g. `alice.bsky.social`). */
1208
+ atprotoHandle: string;
1209
+ /** Optional display name pulled from the ATProto profile, to pre-fill xNet. */
1210
+ displayName?: string;
1211
+ /**
1212
+ * Finish the binding once the xNet identity exists: sign
1213
+ * `net.x.identity.binding` with the new xNet key and `putRecord` it. Called
1214
+ * with the freshly created xNet DID + signing key. Optional — a login-only
1215
+ * flow may skip writing the binding record.
1216
+ */
1217
+ writeBinding?: (xnetDid: string, signingKey: Uint8Array) => Promise<void>;
1218
+ }
1219
+ /** Start the ATProto OAuth ceremony for a handle/PDS the user typed. */
1220
+ type RunAtprotoCeremony = (input: {
1221
+ /** Handle or PDS host the user entered, e.g. `alice.bsky.social`. */
1222
+ handleOrPds: string;
1223
+ }) => Promise<AtprotoCeremonyResult>;
1224
+
1177
1225
  /**
1178
1226
  * @xnetjs/react/onboarding - React context provider for the onboarding flow
1179
1227
  */
@@ -1182,6 +1230,14 @@ type OnboardingContextValue = {
1182
1230
  state: OnboardingState;
1183
1231
  context: OnboardingMachineContext;
1184
1232
  send: (event: OnboardingEvent) => void;
1233
+ /** Whether the ATProto login door is available (host supplied a ceremony). */
1234
+ atprotoEnabled: boolean;
1235
+ /**
1236
+ * Run the ATProto login door for a typed handle/PDS (0322/0338): OAuth
1237
+ * ceremony → existing passkey-create → write the binding record. No-op when
1238
+ * the ceremony was not provided.
1239
+ */
1240
+ startAtprotoCeremony: (handleOrPds: string) => void;
1185
1241
  };
1186
1242
  type OnboardingProviderProps = {
1187
1243
  children: ReactNode;
@@ -1189,8 +1245,14 @@ type OnboardingProviderProps = {
1189
1245
  defaultHubUrl?: string;
1190
1246
  /** Called when onboarding completes */
1191
1247
  onComplete?: (identity: Identity, keyBundle: KeyBundle) => void;
1248
+ /**
1249
+ * ATProto login-door ceremony (0322/0338). When provided, the "Continue with
1250
+ * Bluesky (or any PDS)" door is offered; the host app supplies the OAuth
1251
+ * implementation. When omitted, the door is hidden.
1252
+ */
1253
+ runAtprotoCeremony?: RunAtprotoCeremony;
1192
1254
  };
1193
- declare function OnboardingProvider({ children, defaultHubUrl, onComplete }: OnboardingProviderProps): JSX.Element;
1255
+ declare function OnboardingProvider({ children, defaultHubUrl, onComplete, runAtprotoCeremony }: OnboardingProviderProps): JSX.Element;
1194
1256
  /**
1195
1257
  * Access the onboarding state machine from within an OnboardingProvider.
1196
1258
  */
@@ -1619,4 +1681,4 @@ declare function useView(type: string): ViewContribution | undefined;
1619
1681
  */
1620
1682
  declare function useCommand(id: string): CommandContribution | undefined;
1621
1683
 
1622
- export { summarizeReactionNode as $, type AddCommentOptions as A, selectPublicInteractionMode as B, type CommentThread as C, summarizeModerationLabel as D, summarizePublicInteractionPolicy as E, type CommentVisibility as F, type FirstContactMode as G, type ModeratedCommentThread as H, type InteractionPermission as I, type ModerationFilterOptions as J, type ModerationLabelSummary as K, type PublicInteractionMode as L, type ModeratedCommentNode as M, type PublicInteractionPolicySnapshot as N, type PublicInteractionSurface as O, type PageTaskInput as P, type PublicModerationMode as Q, type ReplyContext as R, type UseModeratedThreadOptions as S, type TaskProjectionInput as T, type UseTaskProjectionSyncResult as U, type UseVisibleCommentsOptions as V, type UseVisibleCommentsResult as W, usePolicyFilteredReactionCounters as X, createReactionCounterSnapshot as Y, dedupeReactions as Z, isReactionVisible as _, type TaskTreeItem as a, type RemoteSchemaDefinition as a$, type AddReactionOptions as a0, type ReactionCounterSnapshot as a1, type ReactionNode as a2, type ReactionType as a3, type UsePolicyFilteredReactionCountersOptions as a4, type UsePolicyFilteredReactionCountersResult as a5, useMessageRequests as a6, createConversationKey as a7, createMessageRequestProperties as a8, evaluateFirstContactDecision as a9, type UseBlameResult as aA, useVerification as aB, type UseVerificationResult as aC, useHubStatus as aD, useCan as aE, type UseCanResult as aF, useCanEdit as aG, type UseCanEditResult as aH, describeGrantConsent as aI, useGrants as aJ, type GrantConsentSummary as aK, type GrantInput as aL, type UseGrantsResult as aM, summarizeAuthTrace as aN, useAuthTrace as aO, type AuthTraceSummary as aP, type UseAuthTraceResult as aQ, useBackup as aR, type UseBackupReturn as aS, useFileUpload as aT, type FileRef as aU, type UseFileUploadReturn as aV, useHubSearch as aW, type HubSearchOptions as aX, type HubSearchResult as aY, type HubSearchState as aZ, useRemoteSchema as a_, findLatestMessageRequest as aa, hasAcceptedContact as ab, summarizeMessageRequest as ac, type CreateMessageRequestOptions as ad, type FirstContactAdmission as ae, type FirstContactDecision as af, type FirstContactDecisionInput as ag, type FirstContactVisibility as ah, type MessageRequestNode as ai, type MessageRequestProperties as aj, type MessageRequestStatus as ak, type UseMessageRequestsOptions as al, type UseMessageRequestsResult as am, useCommentCount as an, useCommentCounts as ao, useHistory as ap, type UseHistoryResult as aq, useUndo as ar, type UseUndoResult as as, type UseUndoOptions as at, useAudit as au, type UseAuditResult as av, type UseAuditOptions as aw, useDiff as ax, type UseDiffResult as ay, useBlame as az, type UseFindOptions as b, useViews as b$, type RemoteSchemaState as b0, usePeerDiscovery as b1, type DiscoveredPeer as b2, HubStatusIndicator as b3, Skeleton as b4, injectSkeletonStyles as b5, type SkeletonProps as b6, DemoBanner as b7, type DemoBannerProps as b8, DemoQuotaIndicator as b9, type OnboardingContextValue as bA, type OnboardingFlowProps as bB, type OnboardingState as bC, type OnboardingEvent as bD, type OnboardingMachineContext as bE, type OnboardingReducerState as bF, type QuickStartTemplate as bG, type SyncProgressOverlayProps as bH, PageTasksPanel as bI, type PageTasksPanelProps as bJ, TaskCollectionEmbed as bK, type TaskCollectionEmbedProps as bL, SecurityProvider as bM, useSecurityContext as bN, useSecurityContextOptional as bO, type SecurityContextState as bP, type SecurityContextActions as bQ, type SecurityContextValue as bR, type SecurityProviderProps as bS, useSecurity as bT, type UseSecurityOptions as bU, type UseSecurityResult as bV, PluginRegistryContext as bW, usePluginRegistry as bX, usePluginRegistryOptional as bY, usePlugins as bZ, useContributions as b_, type DemoQuotaIndicatorProps as ba, DemoDataExpiredScreen as bb, useDemoMode as bc, type DemoModeState as bd, type DemoLimits as be, type DemoUsage as bf, useSyncManager as bg, OnboardingProvider as bh, useOnboarding as bi, OnboardingFlow as bj, WelcomeScreen as bk, AuthenticatingScreen as bl, AuthErrorScreen as bm, UnsupportedBrowserScreen as bn, ImportIdentityScreen as bo, HubConnectScreen as bp, ReadyScreen as bq, SmartWelcome as br, SyncProgressOverlay as bs, onboardingReducer as bt, createInitialState as bu, QUICK_START_TEMPLATES as bv, getPlatformAuthName as bw, truncateDid as bx, copyToClipboard as by, type OnboardingProviderProps as bz, type UseFindResult as c, useCommands as c0, useSlashCommands as c1, useSidebarItems as c2, useImporters as c3, useEditorExtensions as c4, useEditorExtensionsSafe as c5, useMergedEditorContributions as c6, mergeEditorContributions as c7, type MergedEditorContributions as c8, useView as c9, useCommand as ca, usePageTaskSync as d, type PageTaskReferenceInput as e, type UsePageTaskSyncOptions as f, type UsePageTaskSyncResult as g, useTaskProjectionSync as h, type TaskProjectionReferenceInput as i, type TaskProjectionHost as j, type UseTaskProjectionSyncOptions as k, useTasks as l, type UseTasksOptions as m, type UseTasksResult as n, useComments as o, type UseCommentsOptions as p, type UseCommentsResult as q, type CommentNode as r, useVisibleComments as s, useModeratedThread as t, useFind as u, createModerationLabelIndex as v, evaluateCommentModeration as w, evaluateInteractionPermission as x, moderateThread as y, selectActiveInteractionPolicy as z };
1684
+ export { summarizeReactionNode as $, type AddCommentOptions as A, selectPublicInteractionMode as B, type CommentThread as C, summarizeModerationLabel as D, summarizePublicInteractionPolicy as E, type CommentVisibility as F, type FirstContactMode as G, type ModeratedCommentThread as H, type InteractionPermission as I, type ModerationFilterOptions as J, type ModerationLabelSummary as K, type PublicInteractionMode as L, type ModeratedCommentNode as M, type PublicInteractionPolicySnapshot as N, type PublicInteractionSurface as O, type PageTaskInput as P, type PublicModerationMode as Q, type ReplyContext as R, type UseModeratedThreadOptions as S, type TaskProjectionInput as T, type UseTaskProjectionSyncResult as U, type UseVisibleCommentsOptions as V, type UseVisibleCommentsResult as W, usePolicyFilteredReactionCounters as X, createReactionCounterSnapshot as Y, dedupeReactions as Z, isReactionVisible as _, type TaskTreeItem as a, type RemoteSchemaDefinition as a$, type AddReactionOptions as a0, type ReactionCounterSnapshot as a1, type ReactionNode as a2, type ReactionType as a3, type UsePolicyFilteredReactionCountersOptions as a4, type UsePolicyFilteredReactionCountersResult as a5, useMessageRequests as a6, createConversationKey as a7, createMessageRequestProperties as a8, evaluateFirstContactDecision as a9, type UseBlameResult as aA, useVerification as aB, type UseVerificationResult as aC, useHubStatus as aD, useCan as aE, type UseCanResult as aF, useCanEdit as aG, type UseCanEditResult as aH, describeGrantConsent as aI, useGrants as aJ, type GrantConsentSummary as aK, type GrantInput as aL, type UseGrantsResult as aM, summarizeAuthTrace as aN, useAuthTrace as aO, type AuthTraceSummary as aP, type UseAuthTraceResult as aQ, useBackup as aR, type UseBackupReturn as aS, useFileUpload as aT, type FileRef as aU, type UseFileUploadReturn as aV, useHubSearch as aW, type HubSearchOptions as aX, type HubSearchResult as aY, type HubSearchState as aZ, useRemoteSchema as a_, findLatestMessageRequest as aa, hasAcceptedContact as ab, summarizeMessageRequest as ac, type CreateMessageRequestOptions as ad, type FirstContactAdmission as ae, type FirstContactDecision as af, type FirstContactDecisionInput as ag, type FirstContactVisibility as ah, type MessageRequestNode as ai, type MessageRequestProperties as aj, type MessageRequestStatus as ak, type UseMessageRequestsOptions as al, type UseMessageRequestsResult as am, useCommentCount as an, useCommentCounts as ao, useHistory as ap, type UseHistoryResult as aq, useUndo as ar, type UseUndoResult as as, type UseUndoOptions as at, useAudit as au, type UseAuditResult as av, type UseAuditOptions as aw, useDiff as ax, type UseDiffResult as ay, useBlame as az, type UseFindOptions as b, usePlugins as b$, type RemoteSchemaState as b0, usePeerDiscovery as b1, type DiscoveredPeer as b2, HubStatusIndicator as b3, Skeleton as b4, injectSkeletonStyles as b5, type SkeletonProps as b6, DemoBanner as b7, type DemoBannerProps as b8, DemoQuotaIndicator as b9, type OnboardingContextValue as bA, type OnboardingFlowProps as bB, type OnboardingState as bC, type OnboardingEvent as bD, type OnboardingMachineContext as bE, type OnboardingReducerState as bF, type QuickStartTemplate as bG, type SyncProgressOverlayProps as bH, type RunAtprotoCeremony as bI, type AtprotoCeremonyResult as bJ, PageTasksPanel as bK, type PageTasksPanelProps as bL, TaskCollectionEmbed as bM, type TaskCollectionEmbedProps as bN, SecurityProvider as bO, useSecurityContext as bP, useSecurityContextOptional as bQ, type SecurityContextState as bR, type SecurityContextActions as bS, type SecurityContextValue as bT, type SecurityProviderProps as bU, useSecurity as bV, type UseSecurityOptions as bW, type UseSecurityResult as bX, PluginRegistryContext as bY, usePluginRegistry as bZ, usePluginRegistryOptional as b_, type DemoQuotaIndicatorProps as ba, DemoDataExpiredScreen as bb, useDemoMode as bc, type DemoModeState as bd, type DemoLimits as be, type DemoUsage as bf, useSyncManager as bg, OnboardingProvider as bh, useOnboarding as bi, OnboardingFlow as bj, WelcomeScreen as bk, AuthenticatingScreen as bl, AuthErrorScreen as bm, UnsupportedBrowserScreen as bn, ImportIdentityScreen as bo, HubConnectScreen as bp, ReadyScreen as bq, SmartWelcome as br, SyncProgressOverlay as bs, onboardingReducer as bt, createInitialState as bu, QUICK_START_TEMPLATES as bv, getPlatformAuthName as bw, truncateDid as bx, copyToClipboard as by, type OnboardingProviderProps as bz, type UseFindResult as c, useContributions as c0, useViews as c1, useCommands as c2, useSlashCommands as c3, useSidebarItems as c4, useImporters as c5, useEditorExtensions as c6, useEditorExtensionsSafe as c7, useMergedEditorContributions as c8, mergeEditorContributions as c9, type MergedEditorContributions as ca, useView as cb, useCommand as cc, usePageTaskSync as d, type PageTaskReferenceInput as e, type UsePageTaskSyncOptions as f, type UsePageTaskSyncResult as g, useTaskProjectionSync as h, type TaskProjectionReferenceInput as i, type TaskProjectionHost as j, type UseTaskProjectionSyncOptions as k, useTasks as l, type UseTasksOptions as m, type UseTasksResult as n, useComments as o, type UseCommentsOptions as p, type UseCommentsResult as q, type CommentNode as r, useVisibleComments as s, useModeratedThread as t, useFind as u, createModerationLabelIndex as v, evaluateCommentModeration as w, evaluateInteractionPermission as x, moderateThread as y, selectActiveInteractionPolicy as z };
@@ -1,4 +1,4 @@
1
- export { A as AddCommentOptions, a0 as AddReactionOptions, bm as AuthErrorScreen, aP as AuthTraceSummary, bl as AuthenticatingScreen, r as CommentNode, C as CommentThread, F as CommentVisibility, ad as CreateMessageRequestOptions, b7 as DemoBanner, b8 as DemoBannerProps, bb as DemoDataExpiredScreen, be as DemoLimits, bd as DemoModeState, b9 as DemoQuotaIndicator, ba as DemoQuotaIndicatorProps, bf as DemoUsage, b2 as DiscoveredPeer, aU as FileRef, ae as FirstContactAdmission, af as FirstContactDecision, ag as FirstContactDecisionInput, G as FirstContactMode, ah as FirstContactVisibility, aK as GrantConsentSummary, aL as GrantInput, bp as HubConnectScreen, aX as HubSearchOptions, aY as HubSearchResult, aZ as HubSearchState, b3 as HubStatusIndicator, bo as ImportIdentityScreen, I as InteractionPermission, c8 as MergedEditorContributions, ai as MessageRequestNode, aj as MessageRequestProperties, ak as MessageRequestStatus, M as ModeratedCommentNode, H as ModeratedCommentThread, J as ModerationFilterOptions, K as ModerationLabelSummary, bA as OnboardingContextValue, bD as OnboardingEvent, bj as OnboardingFlow, bB as OnboardingFlowProps, bE as OnboardingMachineContext, bh as OnboardingProvider, bz as OnboardingProviderProps, bF as OnboardingReducerState, bC as OnboardingState, P as PageTaskInput, e as PageTaskReferenceInput, bI as PageTasksPanel, bJ as PageTasksPanelProps, bW as PluginRegistryContext, L as PublicInteractionMode, N as PublicInteractionPolicySnapshot, O as PublicInteractionSurface, Q as PublicModerationMode, bv as QUICK_START_TEMPLATES, bG as QuickStartTemplate, a1 as ReactionCounterSnapshot, a2 as ReactionNode, a3 as ReactionType, bq as ReadyScreen, a$ as RemoteSchemaDefinition, b0 as RemoteSchemaState, R as ReplyContext, bQ as SecurityContextActions, bP as SecurityContextState, bR as SecurityContextValue, bM as SecurityProvider, bS as SecurityProviderProps, b4 as Skeleton, b6 as SkeletonProps, br as SmartWelcome, bs as SyncProgressOverlay, bH as SyncProgressOverlayProps, bK as TaskCollectionEmbed, bL as TaskCollectionEmbedProps, a as TaskTreeItem, bn as UnsupportedBrowserScreen, aw as UseAuditOptions, av as UseAuditResult, aQ as UseAuthTraceResult, aS as UseBackupReturn, aA as UseBlameResult, aH as UseCanEditResult, aF as UseCanResult, p as UseCommentsOptions, q as UseCommentsResult, ay as UseDiffResult, aV as UseFileUploadReturn, b as UseFindOptions, c as UseFindResult, aM as UseGrantsResult, aq as UseHistoryResult, al as UseMessageRequestsOptions, am as UseMessageRequestsResult, S as UseModeratedThreadOptions, f as UsePageTaskSyncOptions, g as UsePageTaskSyncResult, a4 as UsePolicyFilteredReactionCountersOptions, a5 as UsePolicyFilteredReactionCountersResult, bU as UseSecurityOptions, bV as UseSecurityResult, m as UseTasksOptions, n as UseTasksResult, at as UseUndoOptions, as as UseUndoResult, aC as UseVerificationResult, V as UseVisibleCommentsOptions, W as UseVisibleCommentsResult, bk as WelcomeScreen, by as copyToClipboard, a7 as createConversationKey, bu as createInitialState, a8 as createMessageRequestProperties, v as createModerationLabelIndex, Y as createReactionCounterSnapshot, Z as dedupeReactions, aI as describeGrantConsent, w as evaluateCommentModeration, a9 as evaluateFirstContactDecision, x as evaluateInteractionPermission, aa as findLatestMessageRequest, bw as getPlatformAuthName, ab as hasAcceptedContact, b5 as injectSkeletonStyles, _ as isReactionVisible, c7 as mergeEditorContributions, y as moderateThread, bt as onboardingReducer, z as selectActiveInteractionPolicy, B as selectPublicInteractionMode, aN as summarizeAuthTrace, ac as summarizeMessageRequest, D as summarizeModerationLabel, E as summarizePublicInteractionPolicy, $ as summarizeReactionNode, bx as truncateDid, au as useAudit, aO as useAuthTrace, aR as useBackup, az as useBlame, aE as useCan, aG as useCanEdit, ca as useCommand, c0 as useCommands, an as useCommentCount, ao as useCommentCounts, o as useComments, b_ as useContributions, bc as useDemoMode, ax as useDiff, c4 as useEditorExtensions, c5 as useEditorExtensionsSafe, aT as useFileUpload, u as useFind, aJ as useGrants, ap as useHistory, aW as useHubSearch, aD as useHubStatus, c6 as useMergedEditorContributions, a6 as useMessageRequests, t as useModeratedThread, bi as useOnboarding, d as usePageTaskSync, b1 as usePeerDiscovery, bX as usePluginRegistry, bY as usePluginRegistryOptional, bZ as usePlugins, X as usePolicyFilteredReactionCounters, a_ as useRemoteSchema, bT as useSecurity, bN as useSecurityContext, bO as useSecurityContextOptional, c2 as useSidebarItems, c1 as useSlashCommands, bg as useSyncManager, l as useTasks, ar as useUndo, aB as useVerification, c9 as useView, b$ as useViews, s as useVisibleComments } from './experimental-DyPoZcJT.js';
1
+ export { A as AddCommentOptions, a0 as AddReactionOptions, bm as AuthErrorScreen, aP as AuthTraceSummary, bl as AuthenticatingScreen, r as CommentNode, C as CommentThread, F as CommentVisibility, ad as CreateMessageRequestOptions, b7 as DemoBanner, b8 as DemoBannerProps, bb as DemoDataExpiredScreen, be as DemoLimits, bd as DemoModeState, b9 as DemoQuotaIndicator, ba as DemoQuotaIndicatorProps, bf as DemoUsage, b2 as DiscoveredPeer, aU as FileRef, ae as FirstContactAdmission, af as FirstContactDecision, ag as FirstContactDecisionInput, G as FirstContactMode, ah as FirstContactVisibility, aK as GrantConsentSummary, aL as GrantInput, bp as HubConnectScreen, aX as HubSearchOptions, aY as HubSearchResult, aZ as HubSearchState, b3 as HubStatusIndicator, bo as ImportIdentityScreen, I as InteractionPermission, ca as MergedEditorContributions, ai as MessageRequestNode, aj as MessageRequestProperties, ak as MessageRequestStatus, M as ModeratedCommentNode, H as ModeratedCommentThread, J as ModerationFilterOptions, K as ModerationLabelSummary, bA as OnboardingContextValue, bD as OnboardingEvent, bj as OnboardingFlow, bB as OnboardingFlowProps, bE as OnboardingMachineContext, bh as OnboardingProvider, bz as OnboardingProviderProps, bF as OnboardingReducerState, bC as OnboardingState, P as PageTaskInput, e as PageTaskReferenceInput, bK as PageTasksPanel, bL as PageTasksPanelProps, bY as PluginRegistryContext, L as PublicInteractionMode, N as PublicInteractionPolicySnapshot, O as PublicInteractionSurface, Q as PublicModerationMode, bv as QUICK_START_TEMPLATES, bG as QuickStartTemplate, a1 as ReactionCounterSnapshot, a2 as ReactionNode, a3 as ReactionType, bq as ReadyScreen, a$ as RemoteSchemaDefinition, b0 as RemoteSchemaState, R as ReplyContext, bS as SecurityContextActions, bR as SecurityContextState, bT as SecurityContextValue, bO as SecurityProvider, bU as SecurityProviderProps, b4 as Skeleton, b6 as SkeletonProps, br as SmartWelcome, bs as SyncProgressOverlay, bH as SyncProgressOverlayProps, bM as TaskCollectionEmbed, bN as TaskCollectionEmbedProps, a as TaskTreeItem, bn as UnsupportedBrowserScreen, aw as UseAuditOptions, av as UseAuditResult, aQ as UseAuthTraceResult, aS as UseBackupReturn, aA as UseBlameResult, aH as UseCanEditResult, aF as UseCanResult, p as UseCommentsOptions, q as UseCommentsResult, ay as UseDiffResult, aV as UseFileUploadReturn, b as UseFindOptions, c as UseFindResult, aM as UseGrantsResult, aq as UseHistoryResult, al as UseMessageRequestsOptions, am as UseMessageRequestsResult, S as UseModeratedThreadOptions, f as UsePageTaskSyncOptions, g as UsePageTaskSyncResult, a4 as UsePolicyFilteredReactionCountersOptions, a5 as UsePolicyFilteredReactionCountersResult, bW as UseSecurityOptions, bX as UseSecurityResult, m as UseTasksOptions, n as UseTasksResult, at as UseUndoOptions, as as UseUndoResult, aC as UseVerificationResult, V as UseVisibleCommentsOptions, W as UseVisibleCommentsResult, bk as WelcomeScreen, by as copyToClipboard, a7 as createConversationKey, bu as createInitialState, a8 as createMessageRequestProperties, v as createModerationLabelIndex, Y as createReactionCounterSnapshot, Z as dedupeReactions, aI as describeGrantConsent, w as evaluateCommentModeration, a9 as evaluateFirstContactDecision, x as evaluateInteractionPermission, aa as findLatestMessageRequest, bw as getPlatformAuthName, ab as hasAcceptedContact, b5 as injectSkeletonStyles, _ as isReactionVisible, c9 as mergeEditorContributions, y as moderateThread, bt as onboardingReducer, z as selectActiveInteractionPolicy, B as selectPublicInteractionMode, aN as summarizeAuthTrace, ac as summarizeMessageRequest, D as summarizeModerationLabel, E as summarizePublicInteractionPolicy, $ as summarizeReactionNode, bx as truncateDid, au as useAudit, aO as useAuthTrace, aR as useBackup, az as useBlame, aE as useCan, aG as useCanEdit, cc as useCommand, c2 as useCommands, an as useCommentCount, ao as useCommentCounts, o as useComments, c0 as useContributions, bc as useDemoMode, ax as useDiff, c6 as useEditorExtensions, c7 as useEditorExtensionsSafe, aT as useFileUpload, u as useFind, aJ as useGrants, ap as useHistory, aW as useHubSearch, aD as useHubStatus, c8 as useMergedEditorContributions, a6 as useMessageRequests, t as useModeratedThread, bi as useOnboarding, d as usePageTaskSync, b1 as usePeerDiscovery, bZ as usePluginRegistry, b_ as usePluginRegistryOptional, b$ as usePlugins, X as usePolicyFilteredReactionCounters, a_ as useRemoteSchema, bV as useSecurity, bP as useSecurityContext, bQ as useSecurityContextOptional, c4 as useSidebarItems, c3 as useSlashCommands, bg as useSyncManager, l as useTasks, ar as useUndo, aB as useVerification, cb as useView, c1 as useViews, s as useVisibleComments } from './experimental-Dv0MIlsc.js';
2
2
  export { i as FlattenNodeOptions, f as flattenNode, e as flattenNodes, h as flattenNodesWithSchemaCheck, g as flattenUnknownSchemaNode } from './useQuery-D7ajycrc.js';
3
3
  export { BlobStoreForSync, ConnectionManager, ConnectionManagerConfig, ConnectionStatus, InitialSyncManager, InitialSyncMessage, METABRIDGE_ORIGIN, METABRIDGE_SEED_ORIGIN, MetaBridge, NodePool, NodePoolConfig, NodeStoreSyncProvider, NodeSyncResponse, OfflineQueue, OfflineQueueConfig, PoolEntryState, ProgressListener, QueueEntry, Registry, RegistryConfig, RegistryStorage, SerializedNodeChange, SyncLifecyclePhase, SyncLifecycleState, SyncManager, SyncManagerConfig, SyncStatus as SyncManagerStatus, SyncPhase, SyncProgress, TrackedNode, WebSocketSyncProvider, WebSocketSyncProviderOptions, createConnectionManager, createInitialSyncManager, createMetaBridge, createNodePool, createOfflineQueue, createRegistry, createSyncManager } from '@xnetjs/runtime';
4
4
  export { I as InstrumentationContext, a as InstrumentationContextValue, Q as QueryTrackerLike, Y as YDocRegistryLike, u as useInstrumentation } from './instrumentation-CpIuG2y5.js';
@@ -73,14 +73,14 @@ import {
73
73
  useUndo,
74
74
  useVerification,
75
75
  useVisibleComments
76
- } from "./chunk-ANCTAEML.js";
76
+ } from "./chunk-CZUUWSJ7.js";
77
77
  import {
78
78
  flattenNode,
79
79
  flattenNodes,
80
80
  flattenNodesWithSchemaCheck,
81
81
  flattenUnknownSchemaNode,
82
82
  useSyncManager
83
- } from "./chunk-ZGP56IIJ.js";
83
+ } from "./chunk-RW3DSDKO.js";
84
84
  import {
85
85
  InstrumentationContext,
86
86
  useInstrumentation
@@ -106,7 +106,7 @@ import {
106
106
  useTelemetryReporter,
107
107
  useView,
108
108
  useViews
109
- } from "./chunk-H44ZSIH4.js";
109
+ } from "./chunk-5ILJMPKO.js";
110
110
 
111
111
  // src/experimental.ts
112
112
  import { WebSocketSyncProvider } from "@xnetjs/runtime";
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { Q as QueryFilter, a as QueryStatus, F as FlatNode, b as QueryPlanSummary } from './useQuery-D7ajycrc.js';
2
2
  export { i as FlattenNodeOptions, M as MigrationWarning, c as QueryListResult, d as QuerySingleResult, S as SortDirection, f as flattenNode, e as flattenNodes, h as flattenNodesWithSchemaCheck, g as flattenUnknownSchemaNode, u as useQuery } from './useQuery-D7ajycrc.js';
3
3
  export { ErrorBoundary, ErrorBoundaryProps, InfiniteQueryFilter, InfiniteQueryPage, InfiniteQueryResult, MutateCreate, MutateDelete, MutateOp, MutateRestore, MutateUpdate, OfflineIndicator, OfflineIndicatorProps, PresenceUser, SyncStatus, UseIdentityResult, UseMutateResult, UseNodeOptions, UseNodeResult, useIdentity, useInfiniteQuery, useIsOffline, useMutate, useNode } from './core.js';
4
- import { U as UseTaskProjectionSyncResult, T as TaskProjectionInput, a as TaskTreeItem } from './experimental-DyPoZcJT.js';
5
- export { A as AddCommentOptions, a0 as AddReactionOptions, bm as AuthErrorScreen, aP as AuthTraceSummary, bl as AuthenticatingScreen, r as CommentNode, C as CommentThread, F as CommentVisibility, ad as CreateMessageRequestOptions, b7 as DemoBanner, b8 as DemoBannerProps, bb as DemoDataExpiredScreen, be as DemoLimits, bd as DemoModeState, b9 as DemoQuotaIndicator, ba as DemoQuotaIndicatorProps, bf as DemoUsage, b2 as DiscoveredPeer, aU as FileRef, ae as FirstContactAdmission, af as FirstContactDecision, ag as FirstContactDecisionInput, G as FirstContactMode, ah as FirstContactVisibility, aK as GrantConsentSummary, aL as GrantInput, bp as HubConnectScreen, aX as HubSearchOptions, aY as HubSearchResult, aZ as HubSearchState, b3 as HubStatusIndicator, bo as ImportIdentityScreen, I as InteractionPermission, c8 as MergedEditorContributions, ai as MessageRequestNode, aj as MessageRequestProperties, ak as MessageRequestStatus, M as ModeratedCommentNode, H as ModeratedCommentThread, J as ModerationFilterOptions, K as ModerationLabelSummary, bA as OnboardingContextValue, bD as OnboardingEvent, bj as OnboardingFlow, bB as OnboardingFlowProps, bE as OnboardingMachineContext, bh as OnboardingProvider, bz as OnboardingProviderProps, bF as OnboardingReducerState, bC as OnboardingState, P as PageTaskInput, e as PageTaskReferenceInput, bI as PageTasksPanel, bJ as PageTasksPanelProps, bW as PluginRegistryContext, L as PublicInteractionMode, N as PublicInteractionPolicySnapshot, O as PublicInteractionSurface, Q as PublicModerationMode, bv as QUICK_START_TEMPLATES, bG as QuickStartTemplate, a1 as ReactionCounterSnapshot, a2 as ReactionNode, a3 as ReactionType, bq as ReadyScreen, a$ as RemoteSchemaDefinition, b0 as RemoteSchemaState, R as ReplyContext, bQ as SecurityContextActions, bP as SecurityContextState, bR as SecurityContextValue, bM as SecurityProvider, bS as SecurityProviderProps, b4 as Skeleton, b6 as SkeletonProps, br as SmartWelcome, bs as SyncProgressOverlay, bH as SyncProgressOverlayProps, bK as TaskCollectionEmbed, bL as TaskCollectionEmbedProps, j as TaskProjectionHost, i as TaskProjectionReferenceInput, bn as UnsupportedBrowserScreen, aw as UseAuditOptions, av as UseAuditResult, aQ as UseAuthTraceResult, aS as UseBackupReturn, aA as UseBlameResult, aH as UseCanEditResult, aF as UseCanResult, p as UseCommentsOptions, q as UseCommentsResult, ay as UseDiffResult, aV as UseFileUploadReturn, b as UseFindOptions, c as UseFindResult, aM as UseGrantsResult, aq as UseHistoryResult, al as UseMessageRequestsOptions, am as UseMessageRequestsResult, S as UseModeratedThreadOptions, f as UsePageTaskSyncOptions, g as UsePageTaskSyncResult, a4 as UsePolicyFilteredReactionCountersOptions, a5 as UsePolicyFilteredReactionCountersResult, bU as UseSecurityOptions, bV as UseSecurityResult, k as UseTaskProjectionSyncOptions, m as UseTasksOptions, n as UseTasksResult, at as UseUndoOptions, as as UseUndoResult, aC as UseVerificationResult, V as UseVisibleCommentsOptions, W as UseVisibleCommentsResult, bk as WelcomeScreen, by as copyToClipboard, a7 as createConversationKey, bu as createInitialState, a8 as createMessageRequestProperties, v as createModerationLabelIndex, Y as createReactionCounterSnapshot, Z as dedupeReactions, aI as describeGrantConsent, w as evaluateCommentModeration, a9 as evaluateFirstContactDecision, x as evaluateInteractionPermission, aa as findLatestMessageRequest, bw as getPlatformAuthName, ab as hasAcceptedContact, b5 as injectSkeletonStyles, _ as isReactionVisible, c7 as mergeEditorContributions, y as moderateThread, bt as onboardingReducer, z as selectActiveInteractionPolicy, B as selectPublicInteractionMode, aN as summarizeAuthTrace, ac as summarizeMessageRequest, D as summarizeModerationLabel, E as summarizePublicInteractionPolicy, $ as summarizeReactionNode, bx as truncateDid, au as useAudit, aO as useAuthTrace, aR as useBackup, az as useBlame, aE as useCan, aG as useCanEdit, ca as useCommand, c0 as useCommands, an as useCommentCount, ao as useCommentCounts, o as useComments, b_ as useContributions, bc as useDemoMode, ax as useDiff, c4 as useEditorExtensions, c5 as useEditorExtensionsSafe, aT as useFileUpload, u as useFind, aJ as useGrants, ap as useHistory, aW as useHubSearch, aD as useHubStatus, c3 as useImporters, c6 as useMergedEditorContributions, a6 as useMessageRequests, t as useModeratedThread, bi as useOnboarding, d as usePageTaskSync, b1 as usePeerDiscovery, bX as usePluginRegistry, bY as usePluginRegistryOptional, bZ as usePlugins, X as usePolicyFilteredReactionCounters, a_ as useRemoteSchema, bT as useSecurity, bN as useSecurityContext, bO as useSecurityContextOptional, c2 as useSidebarItems, c1 as useSlashCommands, bg as useSyncManager, h as useTaskProjectionSync, l as useTasks, ar as useUndo, aB as useVerification, c9 as useView, b$ as useViews, s as useVisibleComments } from './experimental-DyPoZcJT.js';
4
+ import { U as UseTaskProjectionSyncResult, T as TaskProjectionInput, a as TaskTreeItem } from './experimental-Dv0MIlsc.js';
5
+ export { A as AddCommentOptions, a0 as AddReactionOptions, bJ as AtprotoCeremonyResult, bm as AuthErrorScreen, aP as AuthTraceSummary, bl as AuthenticatingScreen, r as CommentNode, C as CommentThread, F as CommentVisibility, ad as CreateMessageRequestOptions, b7 as DemoBanner, b8 as DemoBannerProps, bb as DemoDataExpiredScreen, be as DemoLimits, bd as DemoModeState, b9 as DemoQuotaIndicator, ba as DemoQuotaIndicatorProps, bf as DemoUsage, b2 as DiscoveredPeer, aU as FileRef, ae as FirstContactAdmission, af as FirstContactDecision, ag as FirstContactDecisionInput, G as FirstContactMode, ah as FirstContactVisibility, aK as GrantConsentSummary, aL as GrantInput, bp as HubConnectScreen, aX as HubSearchOptions, aY as HubSearchResult, aZ as HubSearchState, b3 as HubStatusIndicator, bo as ImportIdentityScreen, I as InteractionPermission, ca as MergedEditorContributions, ai as MessageRequestNode, aj as MessageRequestProperties, ak as MessageRequestStatus, M as ModeratedCommentNode, H as ModeratedCommentThread, J as ModerationFilterOptions, K as ModerationLabelSummary, bA as OnboardingContextValue, bD as OnboardingEvent, bj as OnboardingFlow, bB as OnboardingFlowProps, bE as OnboardingMachineContext, bh as OnboardingProvider, bz as OnboardingProviderProps, bF as OnboardingReducerState, bC as OnboardingState, P as PageTaskInput, e as PageTaskReferenceInput, bK as PageTasksPanel, bL as PageTasksPanelProps, bY as PluginRegistryContext, L as PublicInteractionMode, N as PublicInteractionPolicySnapshot, O as PublicInteractionSurface, Q as PublicModerationMode, bv as QUICK_START_TEMPLATES, bG as QuickStartTemplate, a1 as ReactionCounterSnapshot, a2 as ReactionNode, a3 as ReactionType, bq as ReadyScreen, a$ as RemoteSchemaDefinition, b0 as RemoteSchemaState, R as ReplyContext, bI as RunAtprotoCeremony, bS as SecurityContextActions, bR as SecurityContextState, bT as SecurityContextValue, bO as SecurityProvider, bU as SecurityProviderProps, b4 as Skeleton, b6 as SkeletonProps, br as SmartWelcome, bs as SyncProgressOverlay, bH as SyncProgressOverlayProps, bM as TaskCollectionEmbed, bN as TaskCollectionEmbedProps, j as TaskProjectionHost, i as TaskProjectionReferenceInput, bn as UnsupportedBrowserScreen, aw as UseAuditOptions, av as UseAuditResult, aQ as UseAuthTraceResult, aS as UseBackupReturn, aA as UseBlameResult, aH as UseCanEditResult, aF as UseCanResult, p as UseCommentsOptions, q as UseCommentsResult, ay as UseDiffResult, aV as UseFileUploadReturn, b as UseFindOptions, c as UseFindResult, aM as UseGrantsResult, aq as UseHistoryResult, al as UseMessageRequestsOptions, am as UseMessageRequestsResult, S as UseModeratedThreadOptions, f as UsePageTaskSyncOptions, g as UsePageTaskSyncResult, a4 as UsePolicyFilteredReactionCountersOptions, a5 as UsePolicyFilteredReactionCountersResult, bW as UseSecurityOptions, bX as UseSecurityResult, k as UseTaskProjectionSyncOptions, m as UseTasksOptions, n as UseTasksResult, at as UseUndoOptions, as as UseUndoResult, aC as UseVerificationResult, V as UseVisibleCommentsOptions, W as UseVisibleCommentsResult, bk as WelcomeScreen, by as copyToClipboard, a7 as createConversationKey, bu as createInitialState, a8 as createMessageRequestProperties, v as createModerationLabelIndex, Y as createReactionCounterSnapshot, Z as dedupeReactions, aI as describeGrantConsent, w as evaluateCommentModeration, a9 as evaluateFirstContactDecision, x as evaluateInteractionPermission, aa as findLatestMessageRequest, bw as getPlatformAuthName, ab as hasAcceptedContact, b5 as injectSkeletonStyles, _ as isReactionVisible, c9 as mergeEditorContributions, y as moderateThread, bt as onboardingReducer, z as selectActiveInteractionPolicy, B as selectPublicInteractionMode, aN as summarizeAuthTrace, ac as summarizeMessageRequest, D as summarizeModerationLabel, E as summarizePublicInteractionPolicy, $ as summarizeReactionNode, bx as truncateDid, au as useAudit, aO as useAuthTrace, aR as useBackup, az as useBlame, aE as useCan, aG as useCanEdit, cc as useCommand, c2 as useCommands, an as useCommentCount, ao as useCommentCounts, o as useComments, c0 as useContributions, bc as useDemoMode, ax as useDiff, c6 as useEditorExtensions, c7 as useEditorExtensionsSafe, aT as useFileUpload, u as useFind, aJ as useGrants, ap as useHistory, aW as useHubSearch, aD as useHubStatus, c5 as useImporters, c8 as useMergedEditorContributions, a6 as useMessageRequests, t as useModeratedThread, bi as useOnboarding, d as usePageTaskSync, b1 as usePeerDiscovery, bZ as usePluginRegistry, b_ as usePluginRegistryOptional, b$ as usePlugins, X as usePolicyFilteredReactionCounters, a_ as useRemoteSchema, bV as useSecurity, bP as useSecurityContext, bQ as useSecurityContextOptional, c4 as useSidebarItems, c3 as useSlashCommands, bg as useSyncManager, h as useTaskProjectionSync, l as useTasks, ar as useUndo, aB as useVerification, cb as useView, c1 as useViews, s as useVisibleComments } from './experimental-Dv0MIlsc.js';
6
6
  import { SchemaIRI, Schema, SavedViewDescriptor, DefinedSchema, PropertyBuilder, QueryASTOrderBy, QueryASTPage, QueryASTValidationResult, QueryASTPlannerGate, QueryASTAggregateExecution, ExternalReferenceProvider, SavedViewFeedLayout, SavedViewFeedDensity, FieldType, FieldConfig, ViewType, FilterGroup, SortConfig, RowHeight, SummaryFunction, FormViewConfig, FormFieldRule, ViewGroupMeta, MapViewport, CellValue, FormSubmissionMeta, NodeId, NodeState } from '@xnetjs/data';
7
7
  export { ColumnConfig, ColumnDefinition, ColumnType, SavedViewFeedDensity, SavedViewFeedLayout, ViewConfig, ViewType } from '@xnetjs/data';
8
8
  import { QueryExecutionMode, QuerySourcePreference, QuerySearchFilter, QueryPageInfo, QueryMetadata, QuerySpatialFilter } from '@xnetjs/data-bridge';
@@ -576,7 +576,7 @@ interface GridViewModel {
576
576
  }
577
577
  /**
578
578
  * The per-view presentation config a view component may patch through
579
- * `setViewConfig` (exploration 0337). One node write per patch — each
579
+ * `setViewConfig` (exploration 0339). One node write per patch — each
580
580
  * property merges independently (LWW) with other clients' edits.
581
581
  */
582
582
  interface GridViewConfigPatch {
@@ -621,7 +621,7 @@ interface UseGridDatabaseOptions {
621
621
  maxLoaded?: number;
622
622
  /**
623
623
  * Spatial window over two cell properties (map views, exploration
624
- * 0337): only rows inside the rect are fetched. Bypasses the
624
+ * 0339): only rows inside the rect are fetched. Bypasses the
625
625
  * materialized-view cache (the rect varies per pan).
626
626
  */
627
627
  spatial?: QuerySpatialFilter;
@@ -643,7 +643,7 @@ interface UseGridDatabaseResult {
643
643
  /** Rows: view filters + sorts applied to the fetched window */
644
644
  rows: GridRowModel[];
645
645
  /**
646
- * The fetch window (exploration 0337): `size` is the row cap, `total`
646
+ * The fetch window (exploration 0339): `size` is the row cap, `total`
647
647
  * the full match count when the bridge reports one. Views use this to
648
648
  * label truncation honestly instead of silently clipping.
649
649
  */
@@ -664,7 +664,7 @@ interface UseGridDatabaseResult {
664
664
  /**
665
665
  * Write several cells (and optionally the row's sortKey) as ONE node
666
666
  * update — a kanban card move is exactly one write carrying the group
667
- * cell + the fractional position (exploration 0337).
667
+ * cell + the fractional position (exploration 0339).
668
668
  */
669
669
  updateRowCells: (rowId: string, cells: Record<string, CellValue>, opts?: {
670
670
  sortKey?: string;
@@ -691,7 +691,7 @@ interface UseGridDatabaseResult {
691
691
  toggleSort: (fieldId: string) => Promise<void>;
692
692
  setFilters: (filters: FilterGroup | null) => Promise<void>;
693
693
  setGroupBy: (fieldId: string | null) => Promise<void>;
694
- /** Patch the active view's presentation config (exploration 0337) */
694
+ /** Patch the active view's presentation config (exploration 0339) */
695
695
  setViewConfig: (patch: GridViewConfigPatch) => Promise<void>;
696
696
  /** Persist a group's collapsed state on the active view */
697
697
  setGroupCollapsed: (groupKey: string, collapsed: boolean) => Promise<void>;
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  useInfiniteQuery,
6
6
  useIsOffline,
7
7
  useNode
8
- } from "./chunk-VZMZQTR7.js";
8
+ } from "./chunk-UVJJN33U.js";
9
9
  import {
10
10
  useCell,
11
11
  useDatabase,
@@ -14,7 +14,7 @@ import {
14
14
  useDatabaseSchema,
15
15
  useRelatedRows,
16
16
  useReverseRelations
17
- } from "./chunk-HTFAHJQK.js";
17
+ } from "./chunk-QSJJNEFY.js";
18
18
  import {
19
19
  AuthErrorScreen,
20
20
  AuthenticatingScreen,
@@ -94,7 +94,7 @@ import {
94
94
  useUndo,
95
95
  useVerification,
96
96
  useVisibleComments
97
- } from "./chunk-ANCTAEML.js";
97
+ } from "./chunk-CZUUWSJ7.js";
98
98
  import {
99
99
  EMPTY_PAGE_INFO,
100
100
  computeFallbackPageInfo,
@@ -106,10 +106,10 @@ import {
106
106
  useMutate,
107
107
  useQuery,
108
108
  useSyncManager
109
- } from "./chunk-ZGP56IIJ.js";
109
+ } from "./chunk-RW3DSDKO.js";
110
110
  import {
111
111
  useUndoScope
112
- } from "./chunk-SZQNGRTO.js";
112
+ } from "./chunk-KK6VADMZ.js";
113
113
  import {
114
114
  InstrumentationContext,
115
115
  useInstrumentation
@@ -144,7 +144,7 @@ import {
144
144
  useView,
145
145
  useViews,
146
146
  useXNet
147
- } from "./chunk-H44ZSIH4.js";
147
+ } from "./chunk-5ILJMPKO.js";
148
148
 
149
149
  // src/hooks/useEffectiveSchema.ts
150
150
  import {
package/dist/internal.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useUndoScope
3
- } from "./chunk-SZQNGRTO.js";
3
+ } from "./chunk-KK6VADMZ.js";
4
4
  import {
5
5
  InstrumentationContext,
6
6
  useInstrumentation
@@ -10,7 +10,7 @@ import {
10
10
  useNodeStore,
11
11
  useXNet,
12
12
  useXNetInternal
13
- } from "./chunk-H44ZSIH4.js";
13
+ } from "./chunk-5ILJMPKO.js";
14
14
  export {
15
15
  InstrumentationContext,
16
16
  useDataBridge,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xnetjs/react",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -46,15 +46,15 @@
46
46
  "y-protocols": "^1.0.6",
47
47
  "yjs": "^13.6.24",
48
48
  "@xnetjs/billing": "0.0.2",
49
- "@xnetjs/core": "2.2.0",
50
- "@xnetjs/crypto": "2.2.0",
51
- "@xnetjs/data": "2.2.0",
52
- "@xnetjs/data-bridge": "2.2.0",
53
- "@xnetjs/history": "2.2.0",
54
- "@xnetjs/identity": "2.2.0",
55
- "@xnetjs/plugins": "2.2.0",
56
- "@xnetjs/runtime": "0.5.2",
57
- "@xnetjs/sync": "2.2.0"
49
+ "@xnetjs/core": "2.3.0",
50
+ "@xnetjs/crypto": "2.3.0",
51
+ "@xnetjs/data": "2.3.0",
52
+ "@xnetjs/data-bridge": "2.3.0",
53
+ "@xnetjs/history": "2.3.0",
54
+ "@xnetjs/identity": "2.3.0",
55
+ "@xnetjs/plugins": "2.3.0",
56
+ "@xnetjs/runtime": "0.5.3",
57
+ "@xnetjs/sync": "2.3.0"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "react": "^18.0.0 || ^19.0.0"