@dxos/shell 0.6.14-staging.e15392e → 0.7.1-staging.599df14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/bundle/shell.mjs +5291 -5188
  2. package/dist/bundle/shell.mjs.map +1 -1
  3. package/dist/bundle/shell.umd.js +57 -57
  4. package/dist/bundle/shell.umd.js.map +1 -1
  5. package/dist/bundle/style.css +1 -1
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/browser/react.mjs +97 -91
  8. package/dist/lib/browser/react.mjs.map +3 -3
  9. package/dist/lib/browser/testing/index.mjs +2 -0
  10. package/dist/lib/browser/testing/index.mjs.map +2 -2
  11. package/dist/lib/node/meta.json +1 -1
  12. package/dist/lib/node/react.cjs +78 -72
  13. package/dist/lib/node/react.cjs.map +3 -3
  14. package/dist/lib/node/testing/index.cjs +2 -0
  15. package/dist/lib/node/testing/index.cjs.map +2 -2
  16. package/dist/lib/node-esm/meta.json +1 -1
  17. package/dist/lib/node-esm/react.mjs +97 -91
  18. package/dist/lib/node-esm/react.mjs.map +3 -3
  19. package/dist/lib/node-esm/testing/index.mjs +2 -0
  20. package/dist/lib/node-esm/testing/index.mjs.map +2 -2
  21. package/dist/types/src/components/DeviceList/DeviceListItem.d.ts.map +1 -1
  22. package/dist/types/src/components/DeviceList/DeviceListItem.js +4 -10
  23. package/dist/types/src/components/DeviceList/DeviceListItem.js.map +1 -1
  24. package/dist/types/src/components/Panel/Action.d.ts +2 -0
  25. package/dist/types/src/components/Panel/Action.d.ts.map +1 -1
  26. package/dist/types/src/components/Panel/Action.js +16 -14
  27. package/dist/types/src/components/Panel/Action.js.map +1 -1
  28. package/dist/types/src/panels/IdentityPanel/IdentityPanel.d.ts.map +1 -1
  29. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js +13 -6
  30. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js.map +1 -1
  31. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts +1 -0
  32. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts.map +1 -1
  33. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.d.ts.map +1 -1
  34. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js +3 -3
  35. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js.map +1 -1
  36. package/dist/types/src/panels/IdentityPanel/useEdgeAgentsHandlers.d.ts.map +1 -1
  37. package/dist/types/src/panels/IdentityPanel/useEdgeAgentsHandlers.js +8 -1
  38. package/dist/types/src/panels/IdentityPanel/useEdgeAgentsHandlers.js.map +1 -1
  39. package/dist/types/src/panels/SpacePanel/SpacePanel.d.ts.map +1 -1
  40. package/dist/types/src/panels/SpacePanel/SpacePanel.js +2 -2
  41. package/dist/types/src/panels/SpacePanel/SpacePanel.js.map +1 -1
  42. package/dist/types/src/panels/SpacePanel/SpacePanelProps.d.ts +1 -0
  43. package/dist/types/src/panels/SpacePanel/SpacePanelProps.d.ts.map +1 -1
  44. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.d.ts.map +1 -1
  45. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.js +5 -3
  46. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.js.map +1 -1
  47. package/dist/types/src/playwright/invitations-manager.d.ts.map +1 -1
  48. package/dist/types/src/playwright/invitations-manager.js +9 -1
  49. package/dist/types/src/playwright/invitations-manager.js.map +1 -1
  50. package/dist/types/src/testing/shell-manager.d.ts.map +1 -1
  51. package/dist/types/src/testing/shell-manager.js +2 -0
  52. package/dist/types/src/testing/shell-manager.js.map +1 -1
  53. package/package.json +25 -25
  54. package/src/components/DeviceList/DeviceListItem.tsx +38 -42
  55. package/src/components/Panel/Action.tsx +40 -31
  56. package/src/panels/IdentityPanel/IdentityPanel.tsx +13 -3
  57. package/src/panels/IdentityPanel/IdentityPanelProps.ts +1 -0
  58. package/src/panels/IdentityPanel/steps/IdentityActionChooser.tsx +5 -3
  59. package/src/panels/IdentityPanel/useEdgeAgentsHandlers.ts +10 -1
  60. package/src/panels/SpacePanel/SpacePanel.tsx +2 -1
  61. package/src/panels/SpacePanel/SpacePanelProps.ts +1 -0
  62. package/src/panels/SpacePanel/steps/SpaceManager.tsx +5 -3
  63. package/src/playwright/invitations-manager.ts +8 -1
  64. package/src/testing/shell-manager.ts +2 -0
@@ -576,7 +576,7 @@ import React9, { forwardRef as forwardRef2 } from "react";
576
576
  import { generateName as generateName2 } from "@dxos/display-name";
577
577
  import { Device, DeviceType, DeviceKind } from "@dxos/react-client/halo";
578
578
  import { ConnectionState } from "@dxos/react-client/mesh";
579
- import { ListItem as ListItem2, Avatar as Avatar3, useId as useId3, Tag, useTranslation as useTranslation6, DropdownMenu as DropdownMenu2, Button as Button5, Tooltip as Tooltip5 } from "@dxos/react-ui";
579
+ import { ListItem as ListItem2, Avatar as Avatar3, useId as useId3, Tag, useTranslation as useTranslation6, DropdownMenu as DropdownMenu2, Button as Button5 } from "@dxos/react-ui";
580
580
  import { getSize as getSize5 } from "@dxos/react-ui-theme";
581
581
  import { keyToFallback as keyToFallback2 } from "@dxos/util";
582
582
  var iconProps = {
@@ -586,7 +586,7 @@ var iconProps = {
586
586
  x: 8,
587
587
  y: 8
588
588
  };
589
- var DeviceListItem = /* @__PURE__ */ forwardRef2(({ device, onClickAdd, onClickEdit, onClickReset, onClickRecover, onClickJoinExisting, classNames, connectionState, onAgentDestroy, ...props }, forwardedRef) => {
589
+ var DeviceListItem = /* @__PURE__ */ forwardRef2(({ device, onClickAdd, onClickEdit, onClickReset, onClickRecover, onClickJoinExisting, classNames, connectionState, onAgentDestroy: _, ...props }, forwardedRef) => {
590
590
  const { t } = useTranslation6("os");
591
591
  const fallbackValue = keyToFallback2(device.deviceKey);
592
592
  const labelId = useId3("identityListItem__label");
@@ -620,21 +620,7 @@ var DeviceListItem = /* @__PURE__ */ forwardRef2(({ device, onClickAdd, onClickE
620
620
  classNames: "flex-1 text-sm truncate"
621
621
  }, displayName), isCurrent && /* @__PURE__ */ React9.createElement(Tag, {
622
622
  color: "primary"
623
- }, t("current device tag label")), device.profile?.type === DeviceType.AGENT_MANAGED ? /* @__PURE__ */ React9.createElement(Tooltip5.Root, null, /* @__PURE__ */ React9.createElement(Tooltip5.Trigger, {
624
- asChild: true
625
- }, /* @__PURE__ */ React9.createElement(Button5, {
626
- variant: "ghost",
627
- classNames: "pli-0 is-[--rail-action] bs-[--rail-action]",
628
- "data-testid": "agent.destroy",
629
- onClick: onAgentDestroy
630
- }, /* @__PURE__ */ React9.createElement("span", {
631
- className: "sr-only"
632
- }, t("destroy agent label")), /* @__PURE__ */ React9.createElement(Power2, {
633
- className: getSize5(5)
634
- }))), /* @__PURE__ */ React9.createElement(Tooltip5.Portal, null, /* @__PURE__ */ React9.createElement(Tooltip5.Content, {
635
- side: "bottom",
636
- classNames: "z-50"
637
- }, t("destroy agent label")))) : device.kind === DeviceKind.CURRENT && /* @__PURE__ */ React9.createElement(DropdownMenu2.Root, null, /* @__PURE__ */ React9.createElement(DropdownMenu2.Trigger, {
623
+ }, t("current device tag label")), device.kind === DeviceKind.CURRENT && /* @__PURE__ */ React9.createElement(DropdownMenu2.Root, null, /* @__PURE__ */ React9.createElement(DropdownMenu2.Trigger, {
638
624
  asChild: true
639
625
  }, /* @__PURE__ */ React9.createElement(Button5, {
640
626
  variant: "ghost",
@@ -702,7 +688,7 @@ import { X } from "@phosphor-icons/react";
702
688
  import { formatDistanceToNow } from "date-fns";
703
689
  import React12, { useCallback as useCallback2 } from "react";
704
690
  import { Invitation, useInvitationStatus } from "@dxos/react-client/invitations";
705
- import { Button as Button7, ListItem as ListItem3, useTranslation as useTranslation8, Avatar as Avatar4, useThemeContext as useThemeContext4, Tooltip as Tooltip6 } from "@dxos/react-ui";
691
+ import { Button as Button7, ListItem as ListItem3, useTranslation as useTranslation8, Avatar as Avatar4, useThemeContext as useThemeContext4, Tooltip as Tooltip5 } from "@dxos/react-ui";
706
692
  import { focusRing, getSize as getSize7, mx as mx9 } from "@dxos/react-ui-theme";
707
693
  import { hexToEmoji } from "@dxos/util";
708
694
 
@@ -833,11 +819,11 @@ var InvitationListItemImpl = ({ invitation, invitationStatus: propsInvitationSta
833
819
  status: avatarStatus,
834
820
  animation: avatarAnimation,
835
821
  reverseEffects
836
- }), /* @__PURE__ */ React12.createElement(Tooltip6.Root, null, /* @__PURE__ */ React12.createElement(Avatar4.Root, {
822
+ }), /* @__PURE__ */ React12.createElement(Tooltip5.Root, null, /* @__PURE__ */ React12.createElement(Avatar4.Root, {
837
823
  ...avatarProps,
838
824
  animation: avatarAnimation,
839
825
  status: avatarStatus
840
- }, /* @__PURE__ */ React12.createElement(Tooltip6.Trigger, {
826
+ }, /* @__PURE__ */ React12.createElement(Tooltip5.Trigger, {
841
827
  asChild: true
842
828
  }, /* @__PURE__ */ React12.createElement(Avatar4.Frame, {
843
829
  tabIndex: 0,
@@ -847,10 +833,10 @@ var InvitationListItemImpl = ({ invitation, invitationStatus: propsInvitationSta
847
833
  ]
848
834
  }, /* @__PURE__ */ React12.createElement(Avatar4.Fallback, {
849
835
  text: hexToEmoji(invitationId)
850
- })))), /* @__PURE__ */ React12.createElement(Tooltip6.Portal, null, /* @__PURE__ */ React12.createElement(Tooltip6.Content, {
836
+ })))), /* @__PURE__ */ React12.createElement(Tooltip5.Portal, null, /* @__PURE__ */ React12.createElement(Tooltip5.Content, {
851
837
  side: "left",
852
838
  classNames: "z-[70]"
853
- }, t(multiUse ? "invite many qr label" : "invite one qr label"), /* @__PURE__ */ React12.createElement(Tooltip6.Arrow, null)))), showShare && invitationUrl ? /* @__PURE__ */ React12.createElement(Tooltip6.Root, null, /* @__PURE__ */ React12.createElement(React12.Fragment, null, /* @__PURE__ */ React12.createElement(Tooltip6.Trigger, {
839
+ }, t(multiUse ? "invite many qr label" : "invite one qr label"), /* @__PURE__ */ React12.createElement(Tooltip5.Arrow, null)))), showShare && invitationUrl ? /* @__PURE__ */ React12.createElement(Tooltip5.Root, null, /* @__PURE__ */ React12.createElement(React12.Fragment, null, /* @__PURE__ */ React12.createElement(Tooltip5.Trigger, {
854
840
  asChild: true
855
841
  }, /* @__PURE__ */ React12.createElement(Button7, {
856
842
  variant: "ghost",
@@ -863,7 +849,7 @@ var InvitationListItemImpl = ({ invitation, invitationStatus: propsInvitationSta
863
849
  }, /* @__PURE__ */ React12.createElement("span", null, t("open share panel label")))), /* @__PURE__ */ React12.createElement(CopyButtonIconOnly, {
864
850
  variant: "ghost",
865
851
  value: invitationUrl
866
- })), /* @__PURE__ */ React12.createElement(Tooltip6.Portal, null, /* @__PURE__ */ React12.createElement(Tooltip6.Content, {
852
+ })), /* @__PURE__ */ React12.createElement(Tooltip5.Portal, null, /* @__PURE__ */ React12.createElement(Tooltip5.Content, {
867
853
  side: "left",
868
854
  classNames: "z-[70]"
869
855
  }, invitationHasLifetime && /* @__PURE__ */ React12.createElement("span", null, "Expires ", invitationTimeLeft)))) : showAuthCode ? /* @__PURE__ */ React12.createElement(AuthCode, {
@@ -960,7 +946,8 @@ var defaultActions = {
960
946
  }
961
947
  };
962
948
  var BifurcatedAction = /* @__PURE__ */ forwardRef3((props, forwardedRef) => {
963
- const { classNames, variant, isFull = true, actions = defaultActions, activeAction: propsActiveAction, onChangeActiveAction, defaultActiveAction, ...rest } = props;
949
+ const { classNames, variant, isFull = true, actions = defaultActions, activeAction: propsActiveAction, onChangeActiveAction, defaultActiveAction, "data-testid": testId, ...rest } = props;
950
+ const dropdownTestId = testId && `${testId}.more`;
964
951
  const [activeActionKey2 = Object.keys(actions)[0], setActiveAction] = useControllableState3({
965
952
  prop: propsActiveAction,
966
953
  onChange: onChangeActiveAction,
@@ -979,6 +966,7 @@ var BifurcatedAction = /* @__PURE__ */ forwardRef3((props, forwardedRef) => {
979
966
  ],
980
967
  ref: forwardedRef,
981
968
  variant,
969
+ "data-testid": testId,
982
970
  onClick: activeAction.onClick
983
971
  }, activeAction.icon && /* @__PURE__ */ React15.createElement(activeAction.icon, {
984
972
  className: getSize8(5)
@@ -988,19 +976,21 @@ var BifurcatedAction = /* @__PURE__ */ forwardRef3((props, forwardedRef) => {
988
976
  classNames: [
989
977
  "bs-11 flex-none rounded-is-none",
990
978
  classNames
991
- ]
979
+ ],
980
+ "data-testid": dropdownTestId
992
981
  }, /* @__PURE__ */ React15.createElement("span", {
993
982
  className: "sr-only"
994
983
  }, t("invite options label")), /* @__PURE__ */ React15.createElement(CaretDown3, {
995
984
  className: getSize8(4)
996
- }))), /* @__PURE__ */ React15.createElement(DropdownMenu3.Content, null, /* @__PURE__ */ React15.createElement(DropdownMenu3.Viewport, null, Object.entries(actions).map(([id, action]) => {
985
+ }))), /* @__PURE__ */ React15.createElement(DropdownMenu3.Portal, null, /* @__PURE__ */ React15.createElement(DropdownMenu3.Content, null, /* @__PURE__ */ React15.createElement(DropdownMenu3.Viewport, null, Object.entries(actions).map(([id, action]) => {
997
986
  return /* @__PURE__ */ React15.createElement(DropdownMenu3.CheckboxItem, {
998
987
  key: id,
999
988
  "aria-labelledby": `${id}__label`,
1000
989
  "aria-describedby": `${id}__description`,
1001
990
  checked: activeActionKey2 === id,
1002
991
  onCheckedChange: (checked) => checked && setActiveAction(id),
1003
- classNames: "gap-2"
992
+ classNames: "gap-2",
993
+ "data-testid": action.testId
1004
994
  }, action.icon && /* @__PURE__ */ React15.createElement(action.icon, {
1005
995
  className: getSize8(5)
1006
996
  }), /* @__PURE__ */ React15.createElement("div", {
@@ -1017,7 +1007,7 @@ var BifurcatedAction = /* @__PURE__ */ forwardRef3((props, forwardedRef) => {
1017
1007
  weight: "bold",
1018
1008
  className: getSize8(4)
1019
1009
  })));
1020
- })), /* @__PURE__ */ React15.createElement(DropdownMenu3.Arrow, null))));
1010
+ })), /* @__PURE__ */ React15.createElement(DropdownMenu3.Arrow, null)))));
1021
1011
  });
1022
1012
  var Action = /* @__PURE__ */ forwardRef3((props, forwardedRef) => {
1023
1013
  const { children, classNames, variant, isFull = true, ...rest } = props;
@@ -1247,12 +1237,12 @@ import { FirstAidKit as FirstAidKit2, Key, Plugs, PlugsConnected } from "@phosph
1247
1237
  import React29, { useEffect as useEffect4, useMemo as useMemo3, useState as useState9 } from "react";
1248
1238
  import { generateName as generateName3 } from "@dxos/display-name";
1249
1239
  import { invariant as invariant3 } from "@dxos/invariant";
1250
- import { log as log6 } from "@dxos/log";
1240
+ import { log as log7 } from "@dxos/log";
1251
1241
  import { useClient as useClient6 } from "@dxos/react-client";
1252
1242
  import { useIdentity, useDevices, useHaloInvitations as useHaloInvitations2 } from "@dxos/react-client/halo";
1253
1243
  import { useInvitationStatus as useInvitationStatus2 } from "@dxos/react-client/invitations";
1254
1244
  import { useNetworkStatus, ConnectionState as ConnectionState2 } from "@dxos/react-client/mesh";
1255
- import { Avatar as Avatar6, Input as Input2, Toolbar as Toolbar3, Tooltip as Tooltip7, useId as useId6, useTranslation as useTranslation14 } from "@dxos/react-ui";
1245
+ import { Avatar as Avatar6, Input as Input2, Toolbar as Toolbar3, Tooltip as Tooltip6, useId as useId6, useTranslation as useTranslation14 } from "@dxos/react-ui";
1256
1246
  import { getSize as getSize13 } from "@dxos/react-ui-theme";
1257
1247
  import { hexToEmoji as hexToEmoji4, hexToHue as hexToHue2, keyToFallback as keyToFallback3 } from "@dxos/util";
1258
1248
 
@@ -1420,7 +1410,7 @@ var IdentityActionChooser = (props) => {
1420
1410
  });
1421
1411
  };
1422
1412
  var IdentityActionChooserImpl = ({ devices, connectionState, agentHostingEnabled, onClickAdd, onClickJoinExisting, onClickRecover, onClickReset, ...agentProps }) => {
1423
- const managedDeviceAvailable = devices.find((device) => device.profile?.type === DeviceType2.AGENT_MANAGED);
1413
+ const edgeDeviceAvailable = devices.find((device) => device.profile?.type === DeviceType2.AGENT_MANAGED && device.profile?.os?.toUpperCase() === "EDGE");
1424
1414
  return /* @__PURE__ */ React25.createElement("div", {
1425
1415
  role: "none",
1426
1416
  className: "bs-40 grow overflow-y-auto overflow-x-hidden"
@@ -1429,10 +1419,10 @@ var IdentityActionChooserImpl = ({ devices, connectionState, agentHostingEnabled
1429
1419
  connectionState,
1430
1420
  onClickAdd,
1431
1421
  onClickJoinExisting,
1432
- onClickRecover,
1422
+ onClickRecover: agentProps.agentStatus === "created" ? onClickRecover : void 0,
1433
1423
  onClickReset,
1434
1424
  onAgentDestroy: agentProps.onAgentDestroy
1435
- }), !managedDeviceAvailable && agentHostingEnabled && /* @__PURE__ */ React25.createElement(AgentConfig, agentProps));
1425
+ }), !edgeDeviceAvailable && agentHostingEnabled && /* @__PURE__ */ React25.createElement(AgentConfig, agentProps));
1436
1426
  };
1437
1427
 
1438
1428
  // packages/sdk/shell/src/panels/IdentityPanel/steps/ProfileForm.tsx
@@ -1447,7 +1437,9 @@ import { useClient as useClient5 } from "@dxos/react-client";
1447
1437
  // packages/sdk/shell/src/panels/IdentityPanel/useEdgeAgentsHandlers.ts
1448
1438
  import { useEffect as useEffect2, useState as useState6 } from "react";
1449
1439
  import { invariant } from "@dxos/invariant";
1440
+ import { log as log4 } from "@dxos/log";
1450
1441
  import { QueryAgentStatusResponse } from "@dxos/protocols/proto/dxos/client/services";
1442
+ import { EdgeReplicationSetting } from "@dxos/protocols/proto/dxos/echo/metadata";
1451
1443
  import { useClient as useClient3 } from "@dxos/react-client";
1452
1444
  var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/panels/IdentityPanel/useEdgeAgentsHandlers.ts";
1453
1445
  var useEdgeAgentHandlers = ({ identity }) => {
@@ -1484,7 +1476,7 @@ var useEdgeAgentHandlers = ({ identity }) => {
1484
1476
  const onAgentCreate = async () => {
1485
1477
  invariant(identity, "Identity not found", {
1486
1478
  F: __dxlog_file3,
1487
- L: 56,
1479
+ L: 59,
1488
1480
  S: void 0,
1489
1481
  A: [
1490
1482
  "identity",
@@ -1505,9 +1497,18 @@ var useEdgeAgentHandlers = ({ identity }) => {
1505
1497
  setAgentStatus("creating");
1506
1498
  setValidationMessage("");
1507
1499
  try {
1508
- await service.createAgent();
1500
+ await service.createAgent(null, {
1501
+ timeout: 7500
1502
+ });
1503
+ await Promise.all(client.spaces.get().map((space) => space?.internal.setEdgeReplicationPreference(EdgeReplicationSetting.ENABLED)));
1509
1504
  setAgentStatus("created");
1510
1505
  } catch (err) {
1506
+ log4.catch(err, void 0, {
1507
+ F: __dxlog_file3,
1508
+ L: 82,
1509
+ S: void 0,
1510
+ C: (f, a) => f(...a)
1511
+ });
1511
1512
  setAgentStatus("error");
1512
1513
  setValidationMessage(`Error creating an agent: ${err.message}`);
1513
1514
  }
@@ -1532,7 +1533,7 @@ var useEdgeAgentHandlers = ({ identity }) => {
1532
1533
  // packages/sdk/shell/src/panels/IdentityPanel/useKubeAgentHandlers.ts
1533
1534
  import { useCallback as useCallback4, useEffect as useEffect3, useState as useState7 } from "react";
1534
1535
  import { invariant as invariant2 } from "@dxos/invariant";
1535
- import { log as log4 } from "@dxos/log";
1536
+ import { log as log5 } from "@dxos/log";
1536
1537
  import { useClient as useClient4, useAgentHostingClient } from "@dxos/react-client";
1537
1538
  import { Invitation as Invitation3, InvitationEncoder as InvitationEncoder2 } from "@dxos/react-client/invitations";
1538
1539
  var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/panels/IdentityPanel/useKubeAgentHandlers.ts";
@@ -1621,7 +1622,7 @@ var useKubeAgentHandlers = ({ invitations, identity }) => {
1621
1622
  const handleAgentCreate = useCallback4(async (invitation) => {
1622
1623
  const invitationCode = InvitationEncoder2.encode(invitation);
1623
1624
  if (invitation.state === Invitation3.State.CONNECTING) {
1624
- log4.info(JSON.stringify({
1625
+ log5.info(JSON.stringify({
1625
1626
  invitationCode,
1626
1627
  authCode: invitation.authCode
1627
1628
  }), void 0, {
@@ -1798,7 +1799,7 @@ var InvitationManager = ({ invitationUrl, active, send, status, multiUse, authCo
1798
1799
  // packages/sdk/shell/src/steps/ConfirmReset.tsx
1799
1800
  import { Warning } from "@phosphor-icons/react";
1800
1801
  import React28, { useState as useState8 } from "react";
1801
- import { log as log5 } from "@dxos/log";
1802
+ import { log as log6 } from "@dxos/log";
1802
1803
  import { Message, useTranslation as useTranslation13 } from "@dxos/react-ui";
1803
1804
  import { getSize as getSize12, mx as mx21 } from "@dxos/react-ui-theme";
1804
1805
  var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/steps/ConfirmReset.tsx";
@@ -1809,7 +1810,7 @@ var ConfirmReset = ({ active, onCancel, onConfirm, mode }) => {
1809
1810
  const processReset = async () => {
1810
1811
  setPending(true);
1811
1812
  return onConfirm?.().then(() => setPending(false), (error) => {
1812
- log5.catch(error, void 0, {
1813
+ log6.catch(error, void 0, {
1813
1814
  F: __dxlog_file5,
1814
1815
  L: 38,
1815
1816
  S: void 0,
@@ -1870,7 +1871,7 @@ var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/panels/I
1870
1871
  var viewStyles = "pbs-1 pbe-3 pli-3";
1871
1872
  var getHueValue = (identity) => identity?.profile?.data?.hue || hexToHue2(identity?.identityKey.toHex() ?? "0");
1872
1873
  var getEmojiValue = (identity) => identity?.profile?.data?.emoji || hexToEmoji4(identity?.identityKey.toHex() ?? "0");
1873
- var IdentityHeading = ({ titleId, title, identity, onDone, onUpdateProfile, connectionState, onChangeConnectionState }) => {
1874
+ var IdentityHeading = ({ titleId, title, identity, hideRecover, onDone, onUpdateProfile, connectionState, onChangeConnectionState }) => {
1874
1875
  const client = useClient6();
1875
1876
  const fallbackValue = keyToFallback3(identity.identityKey);
1876
1877
  const { t } = useTranslation14("os");
@@ -1903,7 +1904,7 @@ var IdentityHeading = ({ titleId, title, identity, onDone, onUpdateProfile, conn
1903
1904
  const handleRecoveryCode = async () => {
1904
1905
  invariant3(client.services.services.IdentityService, "IdentityService not available", {
1905
1906
  F: __dxlog_file6,
1906
- L: 76,
1907
+ L: 77,
1907
1908
  S: void 0,
1908
1909
  A: [
1909
1910
  "client.services.services.IdentityService",
@@ -1914,7 +1915,6 @@ var IdentityHeading = ({ titleId, title, identity, onDone, onUpdateProfile, conn
1914
1915
  void setTextValue(seedphrase);
1915
1916
  };
1916
1917
  const isConnected = connectionState === ConnectionState2.ONLINE;
1917
- const isProduction = client.config.values.runtime?.app?.env?.DX_ENVIRONMENT === "production";
1918
1918
  return /* @__PURE__ */ React29.createElement(Heading, {
1919
1919
  titleId,
1920
1920
  title,
@@ -1958,7 +1958,7 @@ var IdentityHeading = ({ titleId, title, identity, onDone, onUpdateProfile, conn
1958
1958
  hue,
1959
1959
  onChangeHue: setHue,
1960
1960
  classNames: "bs-[--rail-action]"
1961
- }), /* @__PURE__ */ React29.createElement(Tooltip7.Root, null, /* @__PURE__ */ React29.createElement(Tooltip7.Trigger, {
1961
+ }), /* @__PURE__ */ React29.createElement(Tooltip6.Root, null, /* @__PURE__ */ React29.createElement(Tooltip6.Trigger, {
1962
1962
  asChild: true
1963
1963
  }, /* @__PURE__ */ React29.createElement(Toolbar3.Button, {
1964
1964
  classNames: "bs-[--rail-action]",
@@ -1968,20 +1968,20 @@ var IdentityHeading = ({ titleId, title, identity, onDone, onUpdateProfile, conn
1968
1968
  className: "sr-only"
1969
1969
  }, t(publicKeyCopied ? "copy success label" : "copy self public key label")), /* @__PURE__ */ React29.createElement(Key, {
1970
1970
  className: getSize13(5)
1971
- }))), /* @__PURE__ */ React29.createElement(Tooltip7.Portal, null, /* @__PURE__ */ React29.createElement(Tooltip7.Content, {
1971
+ }))), /* @__PURE__ */ React29.createElement(Tooltip6.Portal, null, /* @__PURE__ */ React29.createElement(Tooltip6.Content, {
1972
1972
  side: "bottom",
1973
1973
  classNames: "z-50"
1974
- }, t(publicKeyCopied ? "copy success label" : "copy self public key label"), /* @__PURE__ */ React29.createElement(Tooltip7.Arrow, null)))), !isProduction && /* @__PURE__ */ React29.createElement(Tooltip7.Root, null, /* @__PURE__ */ React29.createElement(Tooltip7.Trigger, {
1974
+ }, t(publicKeyCopied ? "copy success label" : "copy self public key label"), /* @__PURE__ */ React29.createElement(Tooltip6.Arrow, null)))), !hideRecover && /* @__PURE__ */ React29.createElement(Tooltip6.Root, null, /* @__PURE__ */ React29.createElement(Tooltip6.Trigger, {
1975
1975
  asChild: true
1976
1976
  }, /* @__PURE__ */ React29.createElement(Toolbar3.Button, {
1977
1977
  classNames: "bs-[--rail-action]",
1978
1978
  onClick: handleRecoveryCode
1979
1979
  }, /* @__PURE__ */ React29.createElement(FirstAidKit2, {
1980
1980
  className: getSize13(5)
1981
- }))), /* @__PURE__ */ React29.createElement(Tooltip7.Portal, null, /* @__PURE__ */ React29.createElement(Tooltip7.Content, {
1981
+ }))), /* @__PURE__ */ React29.createElement(Tooltip6.Portal, null, /* @__PURE__ */ React29.createElement(Tooltip6.Content, {
1982
1982
  side: "bottom",
1983
1983
  classNames: "z-50"
1984
- }, t("create recovery code label"), /* @__PURE__ */ React29.createElement(Tooltip7.Arrow, null)))), /* @__PURE__ */ React29.createElement(Tooltip7.Root, null, /* @__PURE__ */ React29.createElement(Tooltip7.Trigger, {
1984
+ }, t("create recovery code label"), /* @__PURE__ */ React29.createElement(Tooltip6.Arrow, null)))), /* @__PURE__ */ React29.createElement(Tooltip6.Root, null, /* @__PURE__ */ React29.createElement(Tooltip6.Trigger, {
1985
1985
  asChild: true
1986
1986
  }, /* @__PURE__ */ React29.createElement(Toolbar3.Button, {
1987
1987
  classNames: [
@@ -1995,10 +1995,10 @@ var IdentityHeading = ({ titleId, title, identity, onDone, onUpdateProfile, conn
1995
1995
  className: getSize13(5)
1996
1996
  }) : /* @__PURE__ */ React29.createElement(Plugs, {
1997
1997
  className: getSize13(5)
1998
- }))), /* @__PURE__ */ React29.createElement(Tooltip7.Portal, null, /* @__PURE__ */ React29.createElement(Tooltip7.Content, {
1998
+ }))), /* @__PURE__ */ React29.createElement(Tooltip6.Portal, null, /* @__PURE__ */ React29.createElement(Tooltip6.Content, {
1999
1999
  side: "bottom",
2000
2000
  classNames: "z-50"
2001
- }, t(isConnected ? "disconnect label" : "connect label"), /* @__PURE__ */ React29.createElement(Tooltip7.Arrow, null)))))));
2001
+ }, t(isConnected ? "disconnect label" : "connect label"), /* @__PURE__ */ React29.createElement(Tooltip6.Arrow, null)))))));
2002
2002
  };
2003
2003
  var IdentityPanelImpl = (props) => {
2004
2004
  const { identity, titleId, activeView, onUpdateProfile, onResetStorage, onRecover, onJoinNewIdentity, IdentityActionChooser: IdentityActionChooserComponent = IdentityActionChooser, InvitationManager: InvitationManagerComponent = InvitationManager, connectionState, onChangeConnectionState, onDone, ...rest } = props;
@@ -2015,10 +2015,12 @@ var IdentityPanelImpl = (props) => {
2015
2015
  t
2016
2016
  ]);
2017
2017
  const onCancelReset = () => rest.send?.("unchooseAction");
2018
+ const hideRecover = rest.agentStatus !== "created";
2018
2019
  return /* @__PURE__ */ React29.createElement(React29.Fragment, null, /* @__PURE__ */ React29.createElement(IdentityHeading, {
2019
2020
  identity,
2020
2021
  titleId,
2021
2022
  title,
2023
+ hideRecover,
2022
2024
  onDone,
2023
2025
  onUpdateProfile,
2024
2026
  connectionState,
@@ -2086,9 +2088,9 @@ var IdentityPanel = ({ titleId: propsTitleId, createInvitationUrl = (code) => co
2086
2088
  invitations
2087
2089
  });
2088
2090
  if (!identity) {
2089
- log6.error("IdentityPanel rendered with no active identity.", void 0, {
2091
+ log7.error("IdentityPanel rendered with no active identity.", void 0, {
2090
2092
  F: __dxlog_file6,
2091
- L: 278,
2093
+ L: 288,
2092
2094
  S: void 0,
2093
2095
  C: (f, a) => f(...a)
2094
2096
  });
@@ -2103,9 +2105,9 @@ var IdentityPanel = ({ titleId: propsTitleId, createInvitationUrl = (code) => co
2103
2105
  const handleChangeConnectionState = async (nextState) => client?.mesh.updateConfig(nextState);
2104
2106
  useEffect4(() => {
2105
2107
  const subscription = identityService.subscribe((state) => {
2106
- log6("[state]", state, {
2108
+ log7("[state]", state, {
2107
2109
  F: __dxlog_file6,
2108
- L: 291,
2110
+ L: 301,
2109
2111
  S: void 0,
2110
2112
  C: (f, a) => f(...a)
2111
2113
  });
@@ -2159,7 +2161,7 @@ var IdentityPanel = ({ titleId: propsTitleId, createInvitationUrl = (code) => co
2159
2161
 
2160
2162
  // packages/sdk/shell/src/panels/JoinPanel/JoinPanel.tsx
2161
2163
  import React38, { useCallback as useCallback6, useEffect as useEffect6, useMemo as useMemo4 } from "react";
2162
- import { log as log10 } from "@dxos/log";
2164
+ import { log as log11 } from "@dxos/log";
2163
2165
  import { useClient as useClient8, useMulticastObservable } from "@dxos/react-client";
2164
2166
  import { useIdentity as useIdentity2 } from "@dxos/react-client/halo";
2165
2167
  import { useId as useId8, useThemeContext as useThemeContext5 } from "@dxos/react-ui";
@@ -2201,12 +2203,12 @@ var JoinHeading = /* @__PURE__ */ forwardRef9(({ mode, titleId, exitActionParent
2201
2203
  import { useMachine as useMachine2 } from "@xstate/react";
2202
2204
  import { useCallback as useCallback5 } from "react";
2203
2205
  import { assign as assign2, createMachine as createMachine2 } from "xstate";
2204
- import { log as log7 } from "@dxos/log";
2206
+ import { log as log8 } from "@dxos/log";
2205
2207
  import { AlreadyJoinedError } from "@dxos/react-client";
2206
2208
  import { Invitation as Invitation5, InvitationEncoder as InvitationEncoder3 } from "@dxos/react-client/invitations";
2207
2209
  var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/panels/JoinPanel/joinMachine.ts";
2208
2210
  var getInvitationSubscribable = (Kind, invitation) => {
2209
- log7("[subscribing to invitation]", invitation, {
2211
+ log8("[subscribing to invitation]", invitation, {
2210
2212
  F: __dxlog_file7,
2211
2213
  L: 90,
2212
2214
  S: void 0,
@@ -2216,7 +2218,7 @@ var getInvitationSubscribable = (Kind, invitation) => {
2216
2218
  subscribe: (next, onError, complete) => invitation.subscribe((invitation2) => {
2217
2219
  switch (invitation2.state) {
2218
2220
  case Invitation5.State.CONNECTING: {
2219
- log7("[invitation connecting]", {
2221
+ log8("[invitation connecting]", {
2220
2222
  Kind,
2221
2223
  invitation: invitation2
2222
2224
  }, {
@@ -2231,7 +2233,7 @@ var getInvitationSubscribable = (Kind, invitation) => {
2231
2233
  });
2232
2234
  }
2233
2235
  case Invitation5.State.CONNECTED: {
2234
- log7("[invitation connected]", {
2236
+ log8("[invitation connected]", {
2235
2237
  Kind,
2236
2238
  invitation: invitation2
2237
2239
  }, {
@@ -2246,7 +2248,7 @@ var getInvitationSubscribable = (Kind, invitation) => {
2246
2248
  });
2247
2249
  }
2248
2250
  case Invitation5.State.READY_FOR_AUTHENTICATION: {
2249
- log7("[invitation ready for authentication]", {
2251
+ log8("[invitation ready for authentication]", {
2250
2252
  Kind,
2251
2253
  invitation: invitation2
2252
2254
  }, {
@@ -2261,7 +2263,7 @@ var getInvitationSubscribable = (Kind, invitation) => {
2261
2263
  });
2262
2264
  }
2263
2265
  case Invitation5.State.AUTHENTICATING: {
2264
- log7("[invitation authenticating]", {
2266
+ log8("[invitation authenticating]", {
2265
2267
  Kind,
2266
2268
  invitation: invitation2
2267
2269
  }, {
@@ -2276,7 +2278,7 @@ var getInvitationSubscribable = (Kind, invitation) => {
2276
2278
  });
2277
2279
  }
2278
2280
  case Invitation5.State.SUCCESS: {
2279
- log7("[invitation success]", {
2281
+ log8("[invitation success]", {
2280
2282
  Kind,
2281
2283
  invitation: invitation2
2282
2284
  }, {
@@ -2292,7 +2294,7 @@ var getInvitationSubscribable = (Kind, invitation) => {
2292
2294
  return complete?.();
2293
2295
  }
2294
2296
  case Invitation5.State.CANCELLED: {
2295
- log7.warn("[invitation cancelled]", {
2297
+ log8.warn("[invitation cancelled]", {
2296
2298
  Kind
2297
2299
  }, {
2298
2300
  F: __dxlog_file7,
@@ -2306,7 +2308,7 @@ var getInvitationSubscribable = (Kind, invitation) => {
2306
2308
  });
2307
2309
  }
2308
2310
  case Invitation5.State.TIMEOUT: {
2309
- log7.error("[invitation timeout]", {
2311
+ log8.error("[invitation timeout]", {
2310
2312
  Kind
2311
2313
  }, {
2312
2314
  F: __dxlog_file7,
@@ -2322,7 +2324,7 @@ var getInvitationSubscribable = (Kind, invitation) => {
2322
2324
  }
2323
2325
  }, (error) => {
2324
2326
  if (error instanceof AlreadyJoinedError) {
2325
- log7("[already joined]", {
2327
+ log8("[already joined]", {
2326
2328
  Kind,
2327
2329
  error
2328
2330
  }, {
@@ -2337,7 +2339,7 @@ var getInvitationSubscribable = (Kind, invitation) => {
2337
2339
  });
2338
2340
  return complete?.();
2339
2341
  }
2340
- log7.error("[invitation errored]", {
2342
+ log8.error("[invitation errored]", {
2341
2343
  Kind,
2342
2344
  error
2343
2345
  }, {
@@ -2676,7 +2678,7 @@ var joinMachine = createMachine2({
2676
2678
  } : context.space
2677
2679
  }),
2678
2680
  log: (context, event) => {
2679
- log7("[transition]", {
2681
+ log8("[transition]", {
2680
2682
  event,
2681
2683
  haloInvitation: context.halo.invitation,
2682
2684
  spaceInvitation: context.space.invitation
@@ -2694,7 +2696,7 @@ var defaultCodeFromUrl = (invitationType, text) => {
2694
2696
  const searchParams = new URLSearchParams(text.substring(text.lastIndexOf("?")));
2695
2697
  return searchParams.get(`${invitationType}InvitationCode`) ?? searchParams.get(`${invitationType}Invitation`) ?? searchParams.get("invitationCode") ?? searchParams.get("invitation") ?? text;
2696
2698
  } catch (err) {
2697
- log7.catch(err, void 0, {
2699
+ log8.catch(err, void 0, {
2698
2700
  F: __dxlog_file7,
2699
2701
  L: 452,
2700
2702
  S: void 0,
@@ -2715,7 +2717,7 @@ var useJoinMachine = (client, options) => {
2715
2717
  invitationSubscribable: getInvitationSubscribable("Halo", invitationObservable)
2716
2718
  };
2717
2719
  } catch (err) {
2718
- log7.error("Could not redeem device invitation code", err, {
2720
+ log8.error("Could not redeem device invitation code", err, {
2719
2721
  F: __dxlog_file7,
2720
2722
  L: 473,
2721
2723
  S: void 0,
@@ -2740,7 +2742,7 @@ var useJoinMachine = (client, options) => {
2740
2742
  invitationSubscribable: getInvitationSubscribable("Space", invitationObservable)
2741
2743
  };
2742
2744
  } catch (err) {
2743
- log7.error("Could not redeem space invitation code", err, {
2745
+ log8.error("Could not redeem space invitation code", err, {
2744
2746
  F: __dxlog_file7,
2745
2747
  L: 495,
2746
2748
  S: void 0,
@@ -2904,7 +2906,7 @@ var IdentityAdded = (props) => {
2904
2906
 
2905
2907
  // packages/sdk/shell/src/panels/JoinPanel/steps/IdentityInput.tsx
2906
2908
  import React33, { useState as useState10 } from "react";
2907
- import { log as log8 } from "@dxos/log";
2909
+ import { log as log9 } from "@dxos/log";
2908
2910
  import { useClient as useClient7 } from "@dxos/react-client";
2909
2911
  import { useTranslation as useTranslation18 } from "@dxos/react-ui";
2910
2912
  var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/panels/JoinPanel/steps/IdentityInput.tsx";
@@ -2924,7 +2926,7 @@ var IdentityInput = (props) => {
2924
2926
  identity
2925
2927
  });
2926
2928
  }, (error) => {
2927
- log8.catch(error, void 0, {
2929
+ log9.catch(error, void 0, {
2928
2930
  F: __dxlog_file8,
2929
2931
  L: 38,
2930
2932
  S: void 0,
@@ -2941,7 +2943,7 @@ var IdentityInput = (props) => {
2941
2943
  identity
2942
2944
  });
2943
2945
  }, (error) => {
2944
- log8.catch(error, void 0, {
2946
+ log9.catch(error, void 0, {
2945
2947
  F: __dxlog_file8,
2946
2948
  L: 48,
2947
2949
  S: void 0,
@@ -2994,7 +2996,7 @@ import { useTranslation as useTranslation19 } from "@dxos/react-ui";
2994
2996
 
2995
2997
  // packages/sdk/shell/src/panels/JoinPanel/steps/InvitationInput.tsx
2996
2998
  import React35, { useState as useState11, useEffect as useEffect5, cloneElement as cloneElement4 } from "react";
2997
- import { log as log9 } from "@dxos/log";
2999
+ import { log as log10 } from "@dxos/log";
2998
3000
  import { useTranslation as useTranslation20 } from "@dxos/react-ui";
2999
3001
  var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/panels/JoinPanel/steps/InvitationInput.tsx";
3000
3002
  var invitationCodeFromUrl = (text) => {
@@ -3003,7 +3005,7 @@ var invitationCodeFromUrl = (text) => {
3003
3005
  const invitation = searchParams.get("spaceInvitationCode") ?? searchParams.get("deviceInvitationCode");
3004
3006
  return invitation ?? text;
3005
3007
  } catch (err) {
3006
- log9.catch(err, void 0, {
3008
+ log10.catch(err, void 0, {
3007
3009
  F: __dxlog_file9,
3008
3010
  L: 25,
3009
3011
  S: void 0,
@@ -3383,7 +3385,7 @@ var JoinPanel = ({ titleId: propsTitleId, mode = "default", initialDisposition =
3383
3385
  });
3384
3386
  useEffect6(() => {
3385
3387
  const subscription = joinService.subscribe((state) => {
3386
- log10("[state]", state, {
3388
+ log11("[state]", state, {
3387
3389
  F: __dxlog_file10,
3388
3390
  L: 210,
3389
3391
  S: void 0,
@@ -3673,14 +3675,14 @@ var JoinPanel = ({ titleId: propsTitleId, mode = "default", initialDisposition =
3673
3675
  // packages/sdk/shell/src/panels/SpacePanel/SpacePanel.tsx
3674
3676
  import { Planet } from "@phosphor-icons/react";
3675
3677
  import React40, { useEffect as useEffect7, useMemo as useMemo5 } from "react";
3676
- import { log as log13 } from "@dxos/log";
3678
+ import { log as log14 } from "@dxos/log";
3677
3679
  import { useInvitationStatus as useInvitationStatus3 } from "@dxos/react-client/invitations";
3678
3680
  import { useId as useId9, useTranslation as useTranslation24 } from "@dxos/react-ui";
3679
3681
 
3680
3682
  // packages/sdk/shell/src/panels/SpacePanel/spaceMachine.ts
3681
3683
  import { useMachine as useMachine3 } from "@xstate/react";
3682
3684
  import { assign as assign3, createMachine as createMachine3 } from "xstate";
3683
- import { log as log11 } from "@dxos/log";
3685
+ import { log as log12 } from "@dxos/log";
3684
3686
  var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/panels/SpacePanel/spaceMachine.ts";
3685
3687
  var spaceMachine = createMachine3({
3686
3688
  id: "space",
@@ -3718,7 +3720,7 @@ var spaceMachine = createMachine3({
3718
3720
  invitation: () => void 0
3719
3721
  }),
3720
3722
  log: (context, event) => {
3721
- log11("[transition]", {
3723
+ log12("[transition]", {
3722
3724
  event,
3723
3725
  context
3724
3726
  }, {
@@ -3742,7 +3744,7 @@ var useSpaceMachine = (options) => {
3742
3744
  // packages/sdk/shell/src/panels/SpacePanel/steps/SpaceManager.tsx
3743
3745
  import { Placeholder as Placeholder2, UserPlus, UsersThree } from "@phosphor-icons/react";
3744
3746
  import React39, { useCallback as useCallback7, useState as useState13 } from "react";
3745
- import { log as log12 } from "@dxos/log";
3747
+ import { log as log13 } from "@dxos/log";
3746
3748
  import { useConfig } from "@dxos/react-client";
3747
3749
  import { useSpaceInvitations as useSpaceInvitations2 } from "@dxos/react-client/echo";
3748
3750
  import { Invitation as Invitation8, InvitationEncoder as InvitationEncoder4 } from "@dxos/react-client/invitations";
@@ -3753,7 +3755,7 @@ var activeActionKey = "dxos:react-shell/space-manager/active-action";
3753
3755
  var handleInvitationEvent = (invitation, subscription) => {
3754
3756
  const invitationCode = InvitationEncoder4.encode(invitation);
3755
3757
  if (invitation.state === Invitation8.State.CONNECTING) {
3756
- log12.info(JSON.stringify({
3758
+ log13.info(JSON.stringify({
3757
3759
  invitationCode,
3758
3760
  authCode: invitation.authCode
3759
3761
  }), void 0, {
@@ -3775,6 +3777,7 @@ var SpaceManager = (props) => {
3775
3777
  label: t("invite one label"),
3776
3778
  description: t("invite one description"),
3777
3779
  icon: UserPlus,
3780
+ testId: "spaces-panel.invite-one",
3778
3781
  onClick: useCallback7(() => {
3779
3782
  const invitation = space.share?.({
3780
3783
  type: Invitation8.Type.INTERACTIVE,
@@ -3786,13 +3789,15 @@ var SpaceManager = (props) => {
3786
3789
  const subscription = invitation.subscribe((invitation2) => handleInvitationEvent(invitation2, subscription));
3787
3790
  }
3788
3791
  }, [
3789
- space
3792
+ space,
3793
+ target
3790
3794
  ])
3791
3795
  },
3792
3796
  inviteMany: {
3793
3797
  label: t("invite many label"),
3794
3798
  description: t("invite many description"),
3795
3799
  icon: UsersThree,
3800
+ testId: "spaces-panel.invite-many",
3796
3801
  onClick: useCallback7(() => {
3797
3802
  const invitation = space.share?.({
3798
3803
  type: Invitation8.Type.DELEGATED,
@@ -3804,7 +3809,8 @@ var SpaceManager = (props) => {
3804
3809
  const subscription = invitation.subscribe((invitation2) => handleInvitationEvent(invitation2, subscription));
3805
3810
  }
3806
3811
  }, [
3807
- space
3812
+ space,
3813
+ target
3808
3814
  ])
3809
3815
  }
3810
3816
  };
@@ -3827,7 +3833,7 @@ var SpaceManagerImpl = (props) => {
3827
3833
  }
3828
3834
  }
3829
3835
  };
3830
- const [activeAction, setInternalActiveAction] = useState13(localStorage.getItem(activeActionKey) ?? "inviteOne");
3836
+ const [activeAction, setInternalActiveAction] = useState13(localStorage.getItem(activeActionKey) ?? "inviteMany");
3831
3837
  const setActiveAction = (nextAction) => {
3832
3838
  setInternalActiveAction(nextAction);
3833
3839
  localStorage.setItem(activeActionKey, nextAction);
@@ -3886,8 +3892,8 @@ var SpacePanelHeading = ({ titleId, space, onDone }) => {
3886
3892
  }, name ?? space.key.truncate())));
3887
3893
  };
3888
3894
  var SpacePanelImpl = (props) => {
3889
- const { titleId, activeView, space, target, SpaceManager: SpaceManagerComponent = SpaceManager, InvitationManager: InvitationManagerComponent = InvitationManager, ...rest } = props;
3890
- return /* @__PURE__ */ React40.createElement(React40.Fragment, null, /* @__PURE__ */ React40.createElement(SpacePanelHeading, {
3895
+ const { titleId, activeView, space, hideHeading, target, SpaceManager: SpaceManagerComponent = SpaceManager, InvitationManager: InvitationManagerComponent = InvitationManager, ...rest } = props;
3896
+ return /* @__PURE__ */ React40.createElement(React40.Fragment, null, !hideHeading && /* @__PURE__ */ React40.createElement(SpacePanelHeading, {
3891
3897
  ...rest,
3892
3898
  titleId,
3893
3899
  space
@@ -3927,9 +3933,9 @@ var SpacePanel = ({ titleId: propsTitleId, createInvitationUrl = (code) => code,
3927
3933
  });
3928
3934
  useEffect7(() => {
3929
3935
  const subscription = spaceService.subscribe((state) => {
3930
- log13("[state]", state, {
3936
+ log14("[state]", state, {
3931
3937
  F: __dxlog_file13,
3932
- L: 94,
3938
+ L: 95,
3933
3939
  S: void 0,
3934
3940
  C: (f, a) => f(...a)
3935
3941
  });
@@ -4034,13 +4040,13 @@ import React47, { StrictMode } from "react";
4034
4040
  import { createRoot } from "react-dom/client";
4035
4041
  import { DEFAULT_CLIENT_CHANNEL, DEFAULT_SHELL_CHANNEL } from "@dxos/client-protocol";
4036
4042
  import { AgentHostingProvider, ClientProvider, ClientServicesProxy, Config, ShellDisplay as ShellDisplay2 } from "@dxos/react-client";
4037
- import { Button as Button11, Dialog as Dialog3, ThemeProvider, Tooltip as Tooltip8, useTranslation as useTranslation26 } from "@dxos/react-ui";
4043
+ import { Button as Button11, Dialog as Dialog3, ThemeProvider, Tooltip as Tooltip7, useTranslation as useTranslation26 } from "@dxos/react-ui";
4038
4044
  import { defaultTx } from "@dxos/react-ui-theme";
4039
4045
  import { createIFramePort } from "@dxos/rpc-tunnel";
4040
4046
 
4041
4047
  // packages/sdk/shell/src/composites/Shell/Shell.tsx
4042
4048
  import React46, { useEffect as useEffect8, useState as useState14 } from "react";
4043
- import { log as log14 } from "@dxos/log";
4049
+ import { log as log15 } from "@dxos/log";
4044
4050
  import { useClient as useClient9 } from "@dxos/react-client";
4045
4051
  import { ShellDisplay, ShellLayout } from "@dxos/react-client";
4046
4052
  import { useSpace as useSpace2 } from "@dxos/react-client/echo";
@@ -4118,7 +4124,7 @@ var Shell = ({ runtime }) => {
4118
4124
  ]);
4119
4125
  useEffect8(() => {
4120
4126
  if (layout === ShellLayout.SPACE && !space) {
4121
- log14.warn("No space found for shell space invitations.", void 0, {
4127
+ log15.warn("No space found for shell space invitations.", void 0, {
4122
4128
  F: __dxlog_file14,
4123
4129
  L: 67,
4124
4130
  S: void 0,
@@ -4538,7 +4544,7 @@ var runShell = async (config = new Config()) => {
4538
4544
  config,
4539
4545
  services,
4540
4546
  noBanner: true
4541
- }, /* @__PURE__ */ React47.createElement(ClipboardProvider, null, /* @__PURE__ */ React47.createElement(Tooltip8.Provider, null, /* @__PURE__ */ React47.createElement(AgentHostingProvider, null, /* @__PURE__ */ React47.createElement(Shell, {
4547
+ }, /* @__PURE__ */ React47.createElement(ClipboardProvider, null, /* @__PURE__ */ React47.createElement(Tooltip7.Provider, null, /* @__PURE__ */ React47.createElement(AgentHostingProvider, null, /* @__PURE__ */ React47.createElement(Shell, {
4542
4548
  runtime
4543
4549
  }))))))));
4544
4550
  } catch {