@dxos/plugin-space 0.13.0 → 0.14.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.
- package/dist/lib/chunk-ImportSpaceDialog.mjs +2 -2
- package/dist/lib/chunk-ImportSpaceDialog.mjs.map +1 -1
- package/dist/lib/chunk-MembersContainer.mjs +8 -5
- package/dist/lib/chunk-MembersContainer.mjs.map +1 -1
- package/dist/lib/chunk-ObjectMasonry.mjs +1 -1
- package/dist/lib/chunk-ObjectMasonry.mjs.map +1 -1
- package/dist/lib/chunk-RecordArticle.mjs +4 -3
- package/dist/lib/chunk-RecordArticle.mjs.map +1 -1
- package/dist/lib/chunk-SpaceHomeDashboard.mjs +1 -1
- package/dist/lib/chunk-SpaceHomeDashboard.mjs.map +1 -1
- package/dist/lib/chunk-SpaceHomeRecent.mjs +41 -19
- package/dist/lib/chunk-SpaceHomeRecent.mjs.map +1 -1
- package/dist/lib/chunk-SyncStatus.mjs +2 -2
- package/dist/lib/chunk-SyncStatus.mjs.map +1 -1
- package/dist/lib/chunk-TypeArticle.mjs +1 -1
- package/dist/lib/chunk-TypeArticle.mjs.map +1 -1
- package/dist/lib/chunk-app-graph-builder.mjs +8 -4
- package/dist/lib/chunk-app-graph-builder.mjs.map +1 -1
- package/dist/lib/components.mjs +3 -2
- package/dist/lib/components.mjs.map +1 -1
- package/dist/lib/dashboard.mjs +3 -1
- package/dist/lib/dashboard.mjs.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/extensions/database.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/extensions/shared.d.ts +2 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/shared.d.ts.map +1 -1
- package/dist/types/src/containers/MembersContainer/MembersContainer.d.ts.map +1 -1
- package/dist/types/src/containers/RecordArticle/RecordArticle.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceHomeArticle/SpaceHomeArticle.stories.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceHomeRecent/SpaceHomeRecent.d.ts.map +1 -1
- package/dist/types/src/dashboard/stats.d.ts +2 -0
- package/dist/types/src/dashboard/stats.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +62 -62
- package/src/capabilities/app-graph-builder/extensions/database.ts +5 -3
- package/src/capabilities/app-graph-builder/extensions/shared.test.ts +25 -1
- package/src/capabilities/app-graph-builder/extensions/shared.ts +6 -0
- package/src/components/CreateObjectPanel/CreateObjectPanel.tsx +2 -2
- package/src/containers/ImportSpaceDialog/ImportSpaceDialog.tsx +2 -2
- package/src/containers/MembersContainer/MembersContainer.tsx +3 -2
- package/src/containers/ObjectMasonry/ObjectMasonryArticle.tsx +1 -1
- package/src/containers/RecordArticle/RecordArticle.tsx +2 -5
- package/src/containers/SpaceHomeArticle/SpaceHomeArticle.stories.tsx +6 -1
- package/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.tsx +1 -1
- package/src/containers/SpaceHomeRecent/SpaceHomeRecent.tsx +71 -28
- package/src/containers/SyncStatus/SyncStatus.tsx +2 -2
- package/src/containers/TypeArticle/TypeArticle.tsx +1 -1
- package/src/dashboard/stats.test.ts +12 -2
- package/src/dashboard/stats.ts +4 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-app-graph-builder.mjs","names":[],"sources":["../../src/capabilities/app-graph-builder/extensions/shared.ts","../../src/capabilities/app-graph-builder/extensions/spaces.ts","../../src/capabilities/app-graph-builder/extensions/database.ts","../../src/capabilities/app-graph-builder/extensions/collections.ts","../../src/capabilities/app-graph-builder/extensions/companions.ts","../../src/capabilities/app-graph-builder/extensions/settings.ts","../../src/capabilities/app-graph-builder/app-graph-builder.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Option from 'effect/Option';\nimport type * as Atom from 'effect/reactivity/Atom';\n\nimport type * as AppGraphNode from '@dxos/app-graph/AppGraphNode';\nimport { type Space, SpaceState, isSpace } from '@dxos/client/echo';\nimport type * as Operation from '@dxos/compute/Operation';\nimport { Annotation, Filter, Obj, Type } from '@dxos/echo';\nimport { Migrations, MigrationVersionAnnotation } from '@dxos/migrations';\nimport { type TreeData } from '@dxos/react-ui-list';\nimport type { EchoViewRefPath } from '@dxos/schema';\nimport { ViewAnnotation, getTypeURIFromQuery } from '@dxos/schema';\nimport { osTranslations } from '@dxos/ui-theme';\nimport { type Label } from '@dxos/ui-types/translations';\n\nimport { meta } from '#meta';\n\n//\n// Virtual Node Types\n//\n\nexport const DATABASE_SECTION_TYPE = `${meta.profile.key}.database`;\nexport const COLLECTIONS_SECTION_TYPE = `${meta.profile.key}.collections`;\n/** Tags every type node under the Database section — both static (compile-time) and database (dynamic) schemas. */\nexport const SCHEMA_NODE_TYPE = `${meta.profile.key}.static-schema`;\n\n//\n// Constants\n//\n\n/** Shared translation namespace descriptor. */\nexport const META_NS: { ns: string } = { ns: meta.profile.key };\n\n//\n// Stable Callbacks\n//\n\nexport const CAN_DROP_SPACE = (source: TreeData) => Obj.isObject(source.item.data) || isSpace(source.item.data);\n\n//\n// Caches (space-specific, not moved to app-toolkit)\n//\n\nexport const spaceActionsCache = new Map<\n string,\n {\n state: SpaceState;\n hasPendingMigration: boolean;\n migrating: boolean;\n actions: AppGraphNode.NodeArg<AppGraphNode.ActionData<Operation.Service>>[];\n }\n>();\nexport const spaceRearrangeCache = new Map<string, (nextOrder: string[]) => void>();\n\n//\n// Static Labels\n//\n\nexport const ADD_TO_COLLECTION_LABEL: Label = ['add-to-collection.label', { ns: osTranslations }];\nexport const ADD_VIEW_TO_SCHEMA_LABEL: Label = ['add-view-to-schema.label', META_NS];\nexport const ARCHIVE_OBJECT_LABEL: Label = ['archive-object.label', META_NS];\nexport const COPY_LINK_LABEL: Label = ['copy-link.label', META_NS];\nexport const CREATE_OBJECT_IN_COLLECTION_LABEL: Label = ['create-object-in-collection.label', META_NS];\nexport const CREATE_OBJECT_IN_SPACE_LABEL: Label = ['create-object-in-space.label', META_NS];\nexport const EXPOSE_OBJECT_LABEL: Label = ['expose-object.label', META_NS];\nexport const MIGRATE_SPACE_LABEL: Label = ['migrate-space.label', META_NS];\nexport const NEW_TYPE_LABEL: Label = ['new-type.label', META_NS];\nexport const PENDING_SPACE_LABEL: Label = ['pending-space.label', META_NS];\nexport const REMOVE_FROM_COLLECTION_LABEL: Label = ['remove-from-collection.label', META_NS];\nexport const RENAME_SPACE_LABEL: Label = ['rename-space.label', META_NS];\nexport const SHOW_ORIGINAL_LABEL: Label = ['show-original.label', META_NS];\nexport const SETTINGS_PANEL_LABEL: Label = ['settings-panel.label', META_NS];\nexport const SNAPSHOT_BY_SCHEMA_LABEL: Label = ['snapshot-by-schema.label', META_NS];\nexport const UNARCHIVE_OBJECT_LABEL: Label = ['unarchive-object.label', META_NS];\n\n//\n// Helpers\n//\n\nexport const checkPendingMigration = (space: Space) => {\n return (\n space.state.get() === SpaceState.SPACE_REQUIRES_MIGRATION ||\n (space.state.get() === SpaceState.SPACE_READY &&\n !!Migrations.targetVersion &&\n Annotation.get(space.properties, MigrationVersionAnnotation).pipe(Option.getOrUndefined) !==\n Migrations.targetVersion)\n );\n};\n\n//\n// View Index\n//\n\n/**\n * Index of view objects grouped by their target type URI.\n */\nexport type ViewIndex = {\n /** Type URIs that have at least one straightforward view targeting them. */\n typeUrisWithViews: Set<string>;\n /** View objects targeting a specific type URI. */\n getViewsForTypeUri: (typeUri: string) => Obj.Any[];\n /** True when the schema has `ViewAnnotation` and that path resolves non-null on `object`; false otherwise (no annotation, or null/undefined path — e.g. Kanban with unset `view`). */\n isView: (object: Obj.Any) => boolean;\n};\n\n/**\n * Builds an index of view objects by scanning view-annotated schemas and resolving the target\n * type URI from each view's query AST. Only straightforward views whose query resolves to a\n * type URI via getTypeURIFromQuery are included.\n */\n// TODO(wittjosiah): Make reactive to schema registry changes (currently only object/view mutations trigger updates).\nexport const buildViewIndex = (get: Atom.AtomContext, space: Space, schemas: Type.AnyEntity[]): ViewIndex => {\n const viewSchemas = schemas.filter((schema) => ViewAnnotation.has(schema));\n\n const viewsByTypeUri = new Map<string, Obj.Any[]>();\n // Object IDs whose `ViewAnnotation` path resolves to a non-null value.\n // Used by `isView` to distinguish view instances from regular instances of\n // the same schema (e.g. items-variant Kanban vs view-variant Kanban).\n const viewObjectIds = new Set<string>();\n\n if (viewSchemas.length > 0) {\n const filter = Filter.or(...viewSchemas.map((schema) => Filter.type(schema)));\n const viewObjects = get(space.db.query(filter).atom);\n\n for (const viewObject of viewObjects) {\n if (!Obj.isObject(viewObject)) {\n continue;\n }\n const holderType = Obj.getType(viewObject);\n const path = holderType\n ? ViewAnnotation.get(Type.getSchema(holderType)).pipe(Option.getOrElse(() => [] as EchoViewRefPath))\n : ([] as EchoViewRefPath);\n\n if (path.length === 0) {\n continue;\n }\n\n const viewSnapshot = get(Obj.atom(viewObject));\n let holder: unknown = viewSnapshot;\n for (const segment of path) {\n holder =\n holder == null || typeof holder !== 'object' ? undefined : (holder as Record<string, unknown>)[segment];\n }\n // Path resolved to a non-null value → this instance is a \"view\". Path\n // resolved to null/undefined → it's a regular object that happens to\n // be of a view-annotated schema.\n if (holder != null) {\n viewObjectIds.add(viewObject.id);\n }\n\n const viewTarget = holder != null ? get(Obj.atom(holder as Obj.Any)) : undefined;\n const typeUri = getTypeURIFromQuery(viewTarget?.query?.ast);\n if (typeUri) {\n const existing = viewsByTypeUri.get(typeUri) ?? [];\n existing.push(viewObject);\n viewsByTypeUri.set(typeUri, existing);\n }\n }\n }\n\n return {\n typeUrisWithViews: new Set(viewsByTypeUri.keys()),\n getViewsForTypeUri: (typeUri) => viewsByTypeUri.get(typeUri) ?? [],\n isView: (object) => viewObjectIds.has(object.id),\n };\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Atom from 'effect/reactivity/Atom';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as AppGraph from '@dxos/app-graph/AppGraph';\nimport * as AppGraphBuilder from '@dxos/app-graph/AppGraphBuilder';\nimport * as AppGraphNode from '@dxos/app-graph/AppGraphNode';\nimport * as CreateAtom from '@dxos/app-graph/CreateAtom';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\nimport * as AppNode from '@dxos/app-toolkit/AppNode';\nimport * as AppNodeMatcher from '@dxos/app-toolkit/AppNodeMatcher';\nimport * as AppSpace from '@dxos/app-toolkit/AppSpace';\nimport * as GraphPath from '@dxos/app-toolkit/GraphPath';\nimport { type Space, SpaceState } from '@dxos/client/echo';\nimport * as Operation from '@dxos/compute/Operation';\nimport { Filter, Obj } from '@dxos/echo';\nimport * as GraphNode from '@dxos/graph/GraphNode';\nimport * as GraphNodeMatcher from '@dxos/graph/GraphNodeMatcher';\nimport { Migrations } from '@dxos/migrations';\nimport * as ClientCapabilities from '@dxos/plugin-client/ClientCapabilities';\nimport { SpacesService } from '@dxos/protocols/rpc';\nimport { Expando } from '@dxos/schema';\nimport { type Label } from '@dxos/ui-types/translations';\nimport * as Position from '@dxos/util/Position';\n\nimport { meta } from '#meta';\nimport { SpaceCapabilities, SpaceOperation, SpaceSchema } from '#types';\n\nimport { getSpaceDisplayName } from '../../../util/index.ts';\nimport {\n CAN_DROP_SPACE,\n CREATE_OBJECT_IN_SPACE_LABEL,\n MIGRATE_SPACE_LABEL,\n PENDING_SPACE_LABEL,\n RENAME_SPACE_LABEL,\n checkPendingMigration,\n spaceActionsCache,\n spaceRearrangeCache,\n} from './shared.ts';\n\n//\n// Extension Factory\n//\n\n// The label tuple must be a module-level singleton: connectors re-evaluate whenever the matched\n// node emits, and a tuple rebuilt inline each time creates a new array reference, causing the graph\n// to re-emit the node and remount the Home article on every evaluation.\nconst SPACE_HOME_NODE_LABEL = ['space-home-node.label', { ns: meta.profile.key }] as const;\n\nconst SPACE_OPEN_TIMEOUT = 60_000;\n\nconst makeDeadlineAtom = () =>\n Atom.make((get) => {\n const timeout = setTimeout(() => get.setSelf(true), SPACE_OPEN_TIMEOUT);\n get.addFinalizer(() => clearTimeout(timeout));\n return false;\n });\n\n/** Creates space-related extensions: primary actions, space nodes, space actions, and the Home node. */\nexport const createSpaceExtensions = Effect.fnUntraced(function* () {\n const capabilities = yield* Capability.Service;\n // Hoisted so connector/action bodies read reactively via `get(...)` instead of a sync\n // `Capability.get`, establishing a dependency that heals once the capability lands.\n const clientAtom = yield* Capability.atom(ClientCapabilities.Client);\n const stateCapAtom = yield* Capability.atom(SpaceCapabilities.State);\n const ephemeralCapAtom = yield* Capability.atom(SpaceCapabilities.EphemeralState);\n const settingsCapAtom = yield* Capability.atom(SpaceCapabilities.SettingsAtom);\n const appGraphAtom = yield* Capability.atom(AppCapabilities.AppGraph);\n const openDeadlineFamily = Atom.family((_spaceId: string) => makeDeadlineAtom());\n const orderSettledAtom = Atom.make(false).pipe(Atom.keepAlive);\n\n return yield* Effect.all([\n AppGraphBuilder.createExtension({\n id: 'spaceHome',\n position: Position.first,\n url: { key: 'home', kind: 'singleton', path: [] },\n match: AppNodeMatcher.whenSpace,\n connector: (space) =>\n Effect.succeed([\n {\n id: GraphPath.SPACE_HOME_SEGMENT,\n type: SpaceSchema.SPACE_HOME_NODE_TYPE,\n data: SpaceSchema.SPACE_HOME_NODE_TYPE,\n properties: {\n label: SPACE_HOME_NODE_LABEL,\n icon: 'ph--house--regular',\n iconHue: 'emerald',\n testId: 'spacePlugin.spaceHome',\n position: Position.first,\n draggable: false,\n droppable: false,\n space,\n },\n } satisfies AppGraphNode.NodeArg<typeof SpaceSchema.SPACE_HOME_NODE_TYPE>,\n ]),\n }),\n\n AppGraphBuilder.createExtension({\n id: 'primaryActions',\n position: Position.first,\n match: GraphNodeMatcher.whenRoot,\n actions: () =>\n Effect.succeed([\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenCreateSpace.meta.key,\n data: () => Operation.invoke(SpaceOperation.OpenCreateSpace),\n properties: {\n label: ['create-space.label', { ns: meta.profile.key }],\n icon: 'ph--plus--regular',\n testId: 'spacePlugin.createSpace',\n disposition: 'menu',\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.Join.meta.key,\n data: () => Operation.invoke(SpaceOperation.Join, {}),\n properties: {\n label: ['join-space.label', { ns: meta.profile.key }],\n icon: 'ph--sign-in--regular',\n testId: 'spacePlugin.joinSpace',\n disposition: 'menu',\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenImportSpace.meta.key,\n data: () => Operation.invoke(SpaceOperation.OpenImportSpace),\n properties: {\n label: ['import-space.label', { ns: meta.profile.key }],\n icon: 'ph--upload--regular',\n testId: 'spacePlugin.importSpace',\n },\n }),\n AppGraphNode.makeAction({\n id: `${SpaceOperation.ExportSpace.meta.key}.binary`,\n data: Effect.fnUntraced(function* () {\n const client = yield* Capability.get(ClientCapabilities.Client);\n const space = AppSpace.getActiveSpace(client, capabilities) ?? AppSpace.getDefaultSpace(client);\n if (space) {\n yield* Operation.invoke(SpaceOperation.ExportSpace, {\n space,\n format: SpacesService.SpaceArchiveFormat.enums.BINARY,\n });\n }\n }),\n properties: {\n label: ['export-space-binary.label', { ns: meta.profile.key }],\n icon: 'ph--download--regular',\n testId: 'spacePlugin.exportSpaceBinary',\n },\n }),\n AppGraphNode.makeAction({\n id: `${SpaceOperation.ExportSpace.meta.key}.json`,\n data: Effect.fnUntraced(function* () {\n const client = yield* Capability.get(ClientCapabilities.Client);\n const space = AppSpace.getActiveSpace(client, capabilities) ?? AppSpace.getDefaultSpace(client);\n if (space) {\n yield* Operation.invoke(SpaceOperation.ExportSpace, {\n space,\n format: SpacesService.SpaceArchiveFormat.enums.JSON,\n });\n }\n }),\n properties: {\n label: ['export-space-json.label', { ns: meta.profile.key }],\n icon: 'ph--download--regular',\n testId: 'spacePlugin.exportSpaceJson',\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenMembers.meta.key,\n data: Effect.fnUntraced(function* () {\n const client = yield* Capability.get(ClientCapabilities.Client);\n const space = AppSpace.getActiveSpace(client, capabilities) ?? AppSpace.getDefaultSpace(client);\n if (space) {\n yield* Operation.invoke(SpaceOperation.OpenMembers, { space });\n }\n }),\n properties: {\n label: ['share-space.label', { ns: meta.profile.key }],\n icon: 'ph--users--regular',\n testId: 'spacePlugin.shareSpace',\n keyBinding: {\n macos: 'meta+.',\n windows: 'alt+.',\n },\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenSettings.meta.key,\n data: Effect.fnUntraced(function* () {\n const client = yield* Capability.get(ClientCapabilities.Client);\n const space = AppSpace.getActiveSpace(client, capabilities) ?? AppSpace.getDefaultSpace(client);\n if (space) {\n yield* Operation.invoke(SpaceOperation.OpenSettings, { space });\n }\n }),\n properties: {\n label: ['open-current-space-settings.label', { ns: meta.profile.key }],\n icon: 'ph--faders--regular',\n keyBinding: {\n macos: 'meta+shift+,',\n windows: 'ctrl+shift+,',\n },\n },\n }),\n ]),\n }),\n\n AppGraphBuilder.createExtension({\n id: 'spaces',\n match: GraphNodeMatcher.whenRoot,\n connector: (_node, get) => {\n // This reactive connector can recompute once during the teardown window (e.g. when stories\n // swap plugin managers) after the Client capability has been removed; the hoisted atom\n // resolves to an empty array rather than throwing in that case.\n const [client] = get(clientAtom);\n if (!client) {\n return Effect.succeed([]);\n }\n const [stateAtom] = get(stateCapAtom);\n const [ephemeralAtom] = get(ephemeralCapAtom);\n if (!stateAtom || !ephemeralAtom) {\n return Effect.succeed([]);\n }\n const spacesAtom = CreateAtom.fromObservable(client.spaces);\n\n const spaces = get(spacesAtom);\n if (!spaces) {\n return Effect.succeed([]);\n }\n\n const settingsSpace = AppSpace.getSettingsSpace(client);\n const settingsSpaceState = settingsSpace ? get(CreateAtom.fromObservable(settingsSpace.state)) : undefined;\n const orderingSpace = settingsSpaceState === SpaceState.SPACE_READY ? settingsSpace : undefined;\n\n const [settingsAtom] = get(settingsCapAtom);\n if (!settingsAtom) {\n return Effect.succeed([]);\n }\n const settings = get(settingsAtom);\n const state = get(stateAtom);\n const ephemeralState = get(ephemeralAtom);\n\n try {\n const [spacesOrder] = orderingSpace\n ? get(orderingSpace.db.query(Filter.type(Expando.Expando, { key: SpaceSchema.SHARED })).atom)\n : [undefined];\n const [appGraph] = get(appGraphAtom);\n if (!appGraph) {\n return Effect.succeed([]);\n }\n const { graph } = appGraph;\n\n const spacesOrderSnapshot = spacesOrder ? get(Obj.atom(spacesOrder)) : undefined;\n const order: string[] = (spacesOrderSnapshot as any)?.order ?? [];\n const orderMap = new Map(order.map((id, index) => [id, index]));\n const lazySpaceOpen = !!client.config.values.runtime?.client?.lazySpaceOpen;\n const orderSettled = get(orderSettledAtom);\n const orderResolved =\n orderSettled ||\n isOrderResolved({\n found: !!spacesOrder,\n settingsSpaceState,\n lazySpaceOpen,\n timedOut: () => !!settingsSpace && get(openDeadlineFamily(settingsSpace.id)),\n });\n if (!orderSettled && orderResolved && spaces.length > 0) {\n get.set(orderSettledAtom, true);\n }\n\n // Keyed by id rather than position: the array below is re-sorted by `orderMap`, so a\n // positional lookup would test one space's readiness against another's state.\n const spaceStates = new Map(spaces.map((space) => [space.id, get(CreateAtom.fromObservable(space.state))]));\n\n spaces.forEach((space) => {\n if (space.state.get() === SpaceState.SPACE_READY) {\n get(Obj.atom(space.properties));\n }\n });\n\n return Effect.succeed(\n [\n ...spaces\n .filter((space) => orderMap.has(space.id))\n .sort((sortA, sortB) => orderMap.get(sortA.id)! - orderMap.get(sortB.id)!),\n ...spaces.filter((space) => !orderMap.has(space.id)),\n ]\n .filter((space) => AppSpace.isVisibleSpace(space))\n .filter((space) =>\n shouldListSpace({\n state: spaceStates.get(space.id),\n timedOut: () => get(openDeadlineFamily(space.id)),\n lazySpaceOpen,\n }),\n )\n .map((space) =>\n isPendingSpaceNode({ state: spaceStates.get(space.id), orderResolved })\n ? constructPendingSpaceNode({ id: space.id, namesCache: state.spaceNames })\n : constructSpaceNode({\n space,\n navigable: ephemeralState.navigableCollections,\n namesCache: state.spaceNames,\n graph,\n spacesOrder,\n }),\n ),\n );\n } catch {\n return Effect.succeed([]);\n }\n },\n }),\n\n // Communications section group — no single plugin owns this category; it lives here so the\n // group is always present when the space plugin is active. A more specific plugin (e.g. a\n // future plugin-communications) should own this once one exists.\n // TODO(wittjosiah): Move to a dedicated communications plugin when one exists.\n AppGraphBuilder.createExtension({\n id: GraphPath.GroupSegments.communications,\n match: AppNodeMatcher.whenSpace,\n connector: (space) =>\n Effect.succeed([\n AppNode.makeGroup({\n id: GraphPath.GroupSegments.communications,\n type: GraphPath.GroupTypes.communications,\n label: ['nav-tree-group-comm.label', { ns: meta.profile.key }],\n icon: 'ph--chats--regular',\n space,\n position: 100,\n }),\n ]),\n }),\n\n AppGraphBuilder.createExtension({\n id: 'actions',\n match: AppNodeMatcher.whenSpace,\n actions: (space, get) => {\n const [client] = get(clientAtom);\n const [ephemeralAtom] = get(ephemeralCapAtom);\n\n if (!client || !ephemeralAtom) {\n return Effect.succeed([]);\n }\n const ephemeralState = get(ephemeralAtom);\n\n // Recompute actions when a migration completes (state transition or versionProperty stamp).\n get(CreateAtom.fromObservable(space.state));\n if (space.state.get() === SpaceState.SPACE_READY) {\n get(Obj.atom(space.properties));\n }\n\n return Effect.succeed(\n constructSpaceActions({\n space,\n migrating: ephemeralState.sdkMigrationRunning[space.id],\n }),\n );\n },\n }),\n ]);\n});\n\n//\n// Helpers\n//\n\nexport const isPendingSpace = (state: SpaceState | undefined, lazySpaceOpen = false): boolean =>\n state === SpaceState.SPACE_INITIALIZING ||\n (!lazySpaceOpen && (state === SpaceState.SPACE_CLOSED || state === SpaceState.SPACE_CONTROL_ONLY));\n\nexport const shouldListSpace = ({\n state,\n timedOut,\n lazySpaceOpen = false,\n}: {\n state: SpaceState | undefined;\n timedOut: () => boolean;\n lazySpaceOpen?: boolean;\n}): boolean => state === SpaceState.SPACE_READY || (isPendingSpace(state, lazySpaceOpen) && !timedOut());\n\nexport const isOrderResolved = ({\n found,\n settingsSpaceState,\n lazySpaceOpen = false,\n timedOut,\n}: {\n found: boolean;\n settingsSpaceState: SpaceState | undefined;\n lazySpaceOpen?: boolean;\n timedOut: () => boolean;\n}): boolean => {\n if (found) {\n return true;\n }\n const waiting = settingsSpaceState === SpaceState.SPACE_READY || isPendingSpace(settingsSpaceState, lazySpaceOpen);\n return !waiting || timedOut();\n};\n\nexport const isPendingSpaceNode = ({\n state,\n orderResolved,\n}: {\n state: SpaceState | undefined;\n orderResolved: boolean;\n}): boolean => !orderResolved || state !== SpaceState.SPACE_READY;\n\ntype SpaceNodeProperties = {\n label: Label;\n description: string | undefined;\n hue: string | undefined;\n icon: string | undefined;\n iconHue: string | undefined;\n disabled: boolean;\n pending: boolean;\n disposition: 'workspace';\n testId: 'spacePlugin.space' | 'spacePlugin.space.pending';\n onRearrange: ((nextOrder: string[]) => void) | undefined;\n canDrop: typeof CAN_DROP_SPACE | undefined;\n};\n\nexport const constructPendingSpaceNode = ({\n id,\n namesCache,\n}: {\n id: string;\n namesCache?: Record<string, string>;\n}): AppGraphNode.NodeArg<null, SpaceNodeProperties> =>\n AppGraphNode.make({\n id,\n type: SpaceSchema.SPACE_TYPE,\n data: null,\n properties: {\n label: namesCache?.[id] ?? PENDING_SPACE_LABEL,\n description: undefined,\n hue: undefined,\n icon: undefined,\n iconHue: undefined,\n disabled: true,\n pending: true,\n disposition: 'workspace',\n testId: 'spacePlugin.space.pending',\n onRearrange: undefined,\n canDrop: undefined,\n },\n });\n\nexport const constructSpaceNode = ({\n space,\n navigable = false,\n namesCache,\n graph,\n spacesOrder,\n}: {\n space: Space;\n navigable?: boolean;\n namesCache?: Record<string, string>;\n graph?: AppGraph.ExpandableGraph;\n spacesOrder?: Obj.Any;\n}): AppGraphNode.NodeArg<Space, SpaceNodeProperties> => {\n const ready = space.state.get() === SpaceState.SPACE_READY;\n const hasPendingMigration = checkPendingMigration(space);\n\n let onRearrange: ((nextOrder: string[]) => void) | undefined;\n if (graph && spacesOrder) {\n onRearrange = spaceRearrangeCache.get(space.id);\n if (!onRearrange) {\n onRearrange = (nextOrder: string[]) => {\n AppGraph.sortEdges(graph, GraphNode.RootId, 'outbound', nextOrder);\n Obj.update(spacesOrder, (spacesOrder: any) => {\n spacesOrder.order = nextOrder;\n });\n };\n spaceRearrangeCache.set(space.id, onRearrange);\n }\n }\n\n return AppGraphNode.make({\n id: space.id,\n type: SpaceSchema.SPACE_TYPE,\n cacheable: AppNode.CACHEABLE_PROPS,\n data: space,\n properties: {\n label: getSpaceDisplayName(space, { namesCache }),\n description: ready ? space.properties.description : undefined,\n hue: ready ? space.properties.hue : undefined,\n icon: ready && space.properties.icon ? `ph--${space.properties.icon}--regular` : undefined,\n iconHue: ready ? space.properties.iconHue : undefined,\n disabled: !navigable || !ready || hasPendingMigration,\n pending: false,\n disposition: 'workspace',\n testId: 'spacePlugin.space',\n onRearrange,\n canDrop: CAN_DROP_SPACE,\n },\n });\n};\n\n/** Builds the action list for a space node (migrate, create object, rename). */\nconst constructSpaceActions = ({ space, migrating }: { space: Space; migrating?: boolean }) => {\n const state = space.state.get();\n const hasPendingMigration = checkPendingMigration(space);\n const isMigrating = migrating || Migrations.running(space);\n\n const cached = spaceActionsCache.get(space.id);\n if (\n cached &&\n cached.state === state &&\n cached.hasPendingMigration === hasPendingMigration &&\n cached.migrating === isMigrating\n ) {\n return cached.actions;\n }\n\n const actions: AppGraphNode.NodeArg<AppGraphNode.ActionData<Operation.Service>>[] = [];\n\n if (hasPendingMigration) {\n actions.push(\n AppGraphNode.make({\n id: SpaceOperation.Migrate.meta.key,\n type: AppGraphNode.ActionGroupType,\n data: () => Operation.invoke(SpaceOperation.Migrate, { space }),\n properties: {\n label: MIGRATE_SPACE_LABEL,\n icon: 'ph--database--regular',\n disposition: 'list-item-primary',\n disabled: isMigrating,\n },\n }),\n );\n }\n\n if (state === SpaceState.SPACE_READY && !hasPendingMigration) {\n actions.push(\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenObjectForm.meta.key,\n data: () => Operation.invoke(SpaceOperation.OpenObjectForm, { target: space.db }),\n properties: {\n label: CREATE_OBJECT_IN_SPACE_LABEL,\n icon: 'ph--plus--regular',\n disposition: 'list-item-primary',\n testId: 'spacePlugin.createObject',\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.Rename.meta.key,\n data: (params?: AppGraphNode.InvokeProps) =>\n Operation.invoke(SpaceOperation.Rename, { space, caller: `${params?.caller}:${params?.parent?.id}` }),\n properties: {\n label: RENAME_SPACE_LABEL,\n icon: 'ph--pencil-simple-line--regular',\n keyBinding: {\n macos: 'shift+F6',\n windows: 'shift+F6',\n },\n },\n }),\n );\n }\n\n spaceActionsCache.set(space.id, { state, hasPendingMigration, migrating: isMigrating, actions });\n return actions;\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Match from 'effect/Match';\nimport * as Option from 'effect/Option';\nimport type * as Atom from 'effect/reactivity/Atom';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport type * as CapabilityManager from '@dxos/app-framework/CapabilityManager';\nimport * as Plugin from '@dxos/app-framework/Plugin';\nimport * as AppGraphBuilder from '@dxos/app-graph/AppGraphBuilder';\nimport * as AppGraphNode from '@dxos/app-graph/AppGraphNode';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\nimport * as AppNode from '@dxos/app-toolkit/AppNode';\nimport * as AppNodeMatcher from '@dxos/app-toolkit/AppNodeMatcher';\nimport * as GraphPath from '@dxos/app-toolkit/GraphPath';\nimport * as LayoutOperation from '@dxos/app-toolkit/LayoutOperation';\nimport * as NavigationOperation from '@dxos/app-toolkit/NavigationOperation';\nimport * as TypeOptions from '@dxos/app-toolkit/TypeOptions';\nimport { type Space, isSpace } from '@dxos/client/echo';\nimport * as Operation from '@dxos/compute/Operation';\nimport { Annotation, Collection, Entity, Filter, Obj, Query, Scope, Type } from '@dxos/echo';\nimport * as EffectEx from '@dxos/effect/EffectEx';\nimport * as ClientCapabilities from '@dxos/plugin-client/ClientCapabilities';\nimport { ViewAnnotation } from '@dxos/schema';\nimport { isLabel, toLocalizedString } from '@dxos/ui-types/translations';\nimport { createFilename, downloadBlob, isNonNullable } from '@dxos/util';\n\nimport { meta } from '#meta';\nimport { SpaceCapabilities, SpaceEvents, SpaceOperation } from '#types';\n\nimport { SpaceOperationError } from '../../../operations/errors.ts';\nimport { makeCreateObjectEntryForDatabaseType } from '../../../util/index.ts';\nimport {\n ADD_VIEW_TO_SCHEMA_LABEL,\n DATABASE_SECTION_TYPE,\n SCHEMA_NODE_TYPE,\n SNAPSHOT_BY_SCHEMA_LABEL,\n buildViewIndex,\n} from './shared.ts';\n\n//\n// Extension Factory\n//\n\n/** Creates database extensions: types section, schema nodes, schema children, and schema actions. */\nexport const createDatabaseExtensions = Effect.fnUntraced(function* () {\n const capabilities = yield* Capability.Service;\n const pluginManager = yield* Plugin.Service;\n // Fired from the schema-actions evaluation below, which re-runs reactively; the scheduler\n // short-circuits a dispatch with nothing left to activate, so repeats cost a lookup.\n const requestCreateObjectEntries = () =>\n EffectEx.runDetached(pluginManager.activate(SpaceEvents.CreateObjectRequested));\n\n return yield* Effect.all([\n // System section group — created alongside database/settings so the group always\n // appears when the space plugin is active and hides when there are no children.\n AppGraphBuilder.createExtension({\n id: GraphPath.GroupSegments.system,\n match: AppNodeMatcher.whenSpace,\n connector: (space) =>\n Effect.succeed([\n AppNode.makeGroup({\n id: GraphPath.GroupSegments.system,\n type: GraphPath.GroupTypes.system,\n label: ['nav-tree-group-system.label', { ns: meta.profile.key }],\n icon: 'ph--gear--regular',\n space,\n position: 900,\n }),\n ]),\n }),\n\n // Types section virtual node under the system group.\n AppGraphBuilder.createExtension({\n id: 'databaseSection',\n match: AppNodeMatcher.whenNavTreeGroup(GraphPath.GroupTypes.system),\n connector: (space) => {\n return Effect.succeed([\n AppNode.makeSection({\n id: GraphPath.Segments.database,\n type: DATABASE_SECTION_TYPE,\n label: ['database-section.label', { ns: meta.profile.key }],\n icon: 'ph--database--regular',\n space,\n testId: 'spacePlugin.databaseSection',\n }),\n ]);\n },\n }),\n\n // Schema nodes under the Types virtual node.\n AppGraphBuilder.createExtension({\n id: 'database',\n url: { key: 'type', kind: 'item', path: [GraphPath.GroupSegments.system, GraphPath.Segments.database] },\n match: (node) => {\n const space = isSpace(node.properties.space) ? node.properties.space : undefined;\n return node.type === DATABASE_SECTION_TYPE && space ? Option.some(space) : Option.none();\n },\n connector: (space, get) => {\n // Read settings reactively — same pattern as the translator read below.\n const settingsAtom = get(capabilities.atom(SpaceCapabilities.SettingsAtom)).at(0);\n const showHidden = settingsAtom ? get(settingsAtom).showHidden : false;\n\n // Persisted types live in the space db; static/runtime types live in the shared registry.\n // Fan across both so the space's own types appear without leaking other spaces' types.\n const allSchemas = get(\n space.db.query(Query.select(Filter.type(Type.Type)).from(Scope.space(), Scope.registry())).atom,\n );\n\n const userSchemas = allSchemas.filter((type) => {\n if (!TypeOptions.isUserType(type, { includeHidden: showHidden })) {\n return false;\n }\n if (Type.getTypename(type) === Type.getTypename(Collection.Collection)) {\n return false;\n }\n return true;\n });\n\n const viewIndex = buildViewIndex(get, space, allSchemas);\n\n const visibleSchemas = userSchemas.filter((schema) => {\n if (Type.getDatabase(schema) != null) {\n return true;\n }\n const typeUri = Type.getURI(schema);\n const objects = get(space.db.query(Filter.type(typeUri)).atom);\n if (ViewAnnotation.has(schema)) {\n return objects.some((obj) => !viewIndex.isView(obj));\n }\n return objects.length > 0 || viewIndex.typeUrisWithViews.has(typeUri);\n });\n\n // Sort alphabetically by display name. Static types' labels are `typename.label` translation\n // keys resolved at render; resolve them here via the Translator capability so the order matches\n // what users see. Resolved reactively inside the connector (not at factory setup) so the\n // capability — contributed during startup by the theme plugin — is present when this runs.\n const translator = get(capabilities.atom(AppCapabilities.Translator)).at(0);\n const labelOf = (node: AppGraphNode.NodeArg<Type.AnyEntity>): string => {\n const label = node.properties?.label;\n if (translator && isLabel(label)) {\n return toLocalizedString(label, translator.t);\n }\n return node.data ? Type.getTypename(node.data) : '';\n };\n\n return Effect.succeed(\n visibleSchemas\n .map((schema) => createSchemaNode({ schema, space, get }))\n .toSorted((nodeA, nodeB) => labelOf(nodeA).localeCompare(labelOf(nodeB))),\n );\n },\n }),\n\n // {All} virtual node + view objects under each schema node.\n AppGraphBuilder.createExtension({\n id: 'schemaChildren',\n // Shares `db` with `databaseObjects`: whether an object is a view is data, not shape.\n url: {\n key: 'db',\n kind: 'item',\n path: [GraphPath.GroupSegments.system, GraphPath.Segments.database],\n minDepth: 2,\n },\n match: (node) => {\n const space = isSpace(node.properties.space) ? node.properties.space : undefined;\n // Scoped to the Database section's own type nodes (both static and database schemas — see\n // SCHEMA_NODE_TYPE): other plugins' type nodes (e.g. plugin-crm's virtual type nodes) share the\n // `Type.isType(node.data)` shape but should stay leaf nodes for now.\n return node.type === SCHEMA_NODE_TYPE && space && Type.isType(node.data)\n ? Option.some({ space, schema: node.data })\n : Option.none();\n },\n connector: ({ space, schema }, get) => {\n const client = get(capabilities.atom(ClientCapabilities.Client)).at(0);\n const schemas = client ? get(client.graph.registry.query(Filter.type(Type.Type)).atom) : [];\n const typeUri = Type.getURI(schema);\n\n // View objects are the type node's only visible children; every object of the type (viewed\n // or not) is also reachable via the `databaseObjects` extension below, keyed generically as\n // `obj`. The list of all objects is rendered when the type node is selected (see TypeArticle).\n const viewIndex = buildViewIndex(get, space, schemas);\n const viewNodes = viewIndex\n .getViewsForTypeUri(typeUri)\n .map((object: Obj.Unknown) =>\n AppNode.makeObject({\n get,\n db: space.db,\n object,\n draggable: false,\n droppable: false,\n }),\n )\n .filter(isNonNullable);\n\n return Effect.succeed(viewNodes);\n },\n }),\n\n // Every object of a type — not just its views — as a hidden child of its type node, so\n // `…/database/<slug>/<objectId>` resolves via the generic `db` key even when the type has no\n // dedicated section of its own. Disjoint from `schemaChildren`'s view nodes (`viewIndex.isView`\n // excludes them) so the two connectors never emit a node with the same id under the same parent.\n // The `db` key names the database subgraph — the generic key that guarantees every ECHO object a\n // URL (see the design's \"Unmapped nodes\"); `object` addresses the same object via the collection\n // subgraph.\n AppGraphBuilder.createExtension({\n id: 'databaseObjects',\n url: {\n key: 'db',\n kind: 'item',\n path: [GraphPath.GroupSegments.system, GraphPath.Segments.database],\n minDepth: 2,\n },\n match: (node) => {\n const space = isSpace(node.properties.space) ? node.properties.space : undefined;\n return node.type === SCHEMA_NODE_TYPE && space && Type.isType(node.data)\n ? Option.some({ space, schema: node.data })\n : Option.none();\n },\n connector: ({ space, schema }, get) => {\n const client = get(capabilities.atom(ClientCapabilities.Client)).at(0);\n const schemas = client ? get(client.graph.registry.query(Filter.type(Type.Type)).atom) : [];\n const typeUri = Type.getURI(schema);\n const viewIndex = buildViewIndex(get, space, schemas);\n\n // Feed-only objects (e.g. games appended via Feed.append) are not in the Automerge graph;\n // includeFeeds resolves them too.\n const objects = get(\n space.db.query(Query.select(Filter.type(typeUri)).from(space.db, { includeFeeds: true })).atom,\n );\n\n return Effect.succeed(\n objects\n .filter((object) => !viewIndex.isView(object))\n .map((object) =>\n AppNode.makeObject({\n get,\n db: space.db,\n object,\n disposition: 'hidden',\n draggable: false,\n droppable: false,\n }),\n )\n .filter(isNonNullable),\n );\n },\n }),\n\n // Actions for schema nodes.\n AppGraphBuilder.createExtension({\n id: 'schemaActions',\n match: (node) => {\n const space = isSpace(node.properties.space) ? node.properties.space : undefined;\n return space && Type.isType(node.data) ? Option.some({ space, schema: node.data }) : Option.none();\n },\n actions: ({ space, schema }, get) => {\n const client = get(capabilities.atom(ClientCapabilities.Client)).at(0);\n const schemas = client ? get(client.graph.registry.query(Filter.type(Type.Type)).atom) : [];\n\n const targetUri = Type.getURI(schema);\n const viewIndex = buildViewIndex(get, space, schemas);\n const deletable = Type.getDatabase(schema) != null && viewIndex.getViewsForTypeUri(targetUri).length === 0;\n\n // Tracked read (not a one-shot `getAll`): entry providers may be policy-parked, and the\n // computed actions must refresh when their contributions arrive. Evaluating a schema\n // node's actions is itself a create-flow demand signal, so fire it (outside the reactive\n // computation) to pull the parked providers.\n const createEntries = get(capabilities.atom(SpaceCapabilities.CreateObjectEntry));\n queueMicrotask(() => requestCreateObjectEntries());\n\n return Effect.succeed(createSchemaActions({ type: schema, space, deletable, capabilities, createEntries }));\n },\n }),\n ]);\n});\n\n//\n// Helpers\n//\n\n/** Returns schemas keyed uniquely by typename, preferring later entries. */\nconst uniqueSchemasByTypename = <TSchema extends Type.AnyEntity>(schemas: TSchema[]): TSchema[] => {\n const uniqueSchemas = new Map<string, TSchema>();\n for (const schema of schemas) {\n uniqueSchemas.set(Type.getTypename(schema), schema);\n }\n\n return [...uniqueSchemas.values()];\n};\n\n/** Builds a graph node for a schema in the Types subtree. */\nconst createSchemaNode = ({\n schema,\n space,\n get,\n}: {\n schema: Type.AnyEntity;\n space: Space;\n get: Atom.AtomContext;\n}): AppGraphNode.NodeArg<Type.AnyEntity> => {\n const typename = Type.getTypename(schema);\n // The node id doubles as the `types/<slug>` path segment, so it must be slash- and colon-free:\n // a stored schema's entity id, or a static schema's typename.\n const slug = GraphPath.getTypeSlug(schema);\n const iconAnnotation =\n Type.getDatabase(schema) == null\n ? Option.getOrUndefined(Annotation.IconAnnotation.get(Type.getSchema(schema)))\n : undefined;\n const { label, nodeId } = Match.value(schema).pipe(\n Match.when(\n (value: Type.AnyEntity) => Type.getDatabase(value) != null,\n (mutableSchema) => {\n // Type.AnyEntity has KindId=Type at the type level but is a valid ECHO entity at runtime.\n const snapshot = get(Entity.atom(mutableSchema as unknown as Entity.Unknown));\n return {\n label: (snapshot as { name?: string }).name || [\n 'object-name.placeholder',\n { ns: Type.getTypename(Type.Type) },\n ],\n nodeId: slug,\n };\n },\n ),\n Match.orElse(() => ({\n label: AppNode.getDynamicLabel('typename.label', typename, { count: 2, defaultValue: typename }),\n nodeId: slug,\n })),\n );\n const icon =\n Type.getDatabase(schema) != null ? 'ph--cube--regular' : (iconAnnotation?.icon ?? 'ph--circle-dashed--regular');\n const iconHue = Type.getDatabase(schema) != null ? 'neutral' : iconAnnotation?.hue;\n return AppGraphNode.make({\n id: nodeId,\n type: SCHEMA_NODE_TYPE,\n data: schema,\n properties: {\n label,\n icon,\n iconHue,\n // Selecting the type node opens a list of every object of this type (see TypeArticle);\n // objects resolve on demand as hidden children. View objects are its only visible children, so\n // without a view the node is a leaf (no `role: 'branch'`).\n testId: `spacePlugin.schemaNode.${typename}`,\n selectable: true,\n draggable: false,\n droppable: false,\n childrenDroppable: false,\n space,\n },\n });\n};\n\n/** Builds schema actions (add view, rename, delete, snapshot). */\nconst createSchemaActions = ({\n type,\n space,\n deletable,\n capabilities,\n createEntries,\n}: {\n type: Type.AnyEntity;\n space: Space;\n deletable: boolean;\n capabilities: CapabilityManager.CapabilityManager;\n createEntries: readonly SpaceCapabilities.CreateObjectEntry[];\n}) => {\n const typename = Type.getTypename(type);\n const createEntry = createEntries.find((entry: SpaceCapabilities.CreateObjectEntry) => entry.id === typename);\n\n // For database-persisted object schemas without a dedicated capability, synthesize a generic entry.\n const resolvedEntry: SpaceCapabilities.CreateObjectEntry | undefined =\n createEntry ??\n (Type.getDatabase(type) != null && Type.isObject(type) ? makeCreateObjectEntryForDatabaseType(type) : undefined);\n const createObjectFn = resolvedEntry?.createObject;\n const inputSchema = resolvedEntry?.inputSchema;\n\n const actions: AppGraphNode.NodeArg<AppGraphNode.ActionData<Operation.Service>>[] = [\n ...(createObjectFn\n ? [\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenObjectForm.meta.key,\n data: Effect.fnUntraced(function* () {\n if (inputSchema) {\n yield* Operation.invoke(SpaceOperation.OpenObjectForm, {\n target: space.db,\n typename,\n });\n } else {\n const result = yield* createObjectFn({}, { db: space.db }).pipe(\n Effect.provideService(Capability.Service, capabilities),\n );\n // Nothing to navigate to when the create only starts the work and the object\n // arrives out of band (see `CreateObjectResult.object`).\n if (result.object) {\n const { targets } = yield* Operation.invoke(NavigationOperation.ResolveNavigationTargets, {\n query: { uri: Obj.getURI(result.object) },\n });\n const navigationTarget = targets[0];\n if (navigationTarget) {\n yield* Operation.invoke(LayoutOperation.Open, {\n subject: [navigationTarget.path],\n navigation: 'immediate',\n });\n }\n }\n }\n }),\n properties: {\n // Static plugin types carry a per-typename `add-object.label` (e.g. \"Add event\");\n // database types have no such namespace, so fall back to the plugin's generic label.\n label: AppNode.getDynamicLabel(\n 'add-object.label',\n Type.getDatabase(type) != null ? meta.profile.key : typename,\n ),\n icon: 'ph--plus--regular',\n disposition: 'list-item-primary',\n testId: 'spacePlugin.createObject',\n },\n }),\n ]\n : []),\n AppGraphNode.makeAction({\n id: `${SpaceOperation.AddObject.meta.key}-view`,\n data: () =>\n Operation.invoke(SpaceOperation.OpenObjectForm, {\n target: space.db,\n views: true,\n // The type-picker field value is the type URI (see TypeOptions), so seed the default with\n // the URI — not the bare typename — for the option to be pre-selected.\n defaults: { typename: Type.getURI(type) },\n }),\n properties: {\n label: ADD_VIEW_TO_SCHEMA_LABEL,\n icon: 'ph--circles-three-plus--regular',\n disposition: 'list-item',\n testId: 'spacePlugin.addViewToSchema',\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.RenameObject.meta.key,\n data: (params?: AppGraphNode.InvokeProps) =>\n Type.getDatabase(type) != null\n ? Operation.invoke(SpaceOperation.RenameObject, {\n object: type,\n caller: `${params?.caller}:${params?.parent?.id}`,\n })\n : Effect.fail(new SpaceOperationError({ message: 'Cannot rename immutable schema' })),\n properties: {\n label: AppNode.getDynamicLabel('rename-object.label', Type.getTypename(Type.Type)),\n icon: 'ph--pencil-simple-line--regular',\n disabled: Type.getDatabase(type) == null,\n disposition: 'list-item',\n testId: 'spacePlugin.renameObject',\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.RemoveObjects.meta.key,\n data: () =>\n Type.getDatabase(type) != null\n ? Operation.invoke(\n SpaceOperation.RemoveObjects,\n { objects: [type] },\n { spaceId: Type.getDatabase(type)?.spaceId },\n )\n : Effect.succeed(undefined),\n properties: {\n label: AppNode.getDynamicLabel('delete-object.label', Type.getTypename(Type.Type)),\n icon: 'ph--trash--regular',\n disposition: 'list-item',\n disabled: !deletable,\n testId: 'spacePlugin.deleteObject',\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.Snapshot.meta.key,\n data: Effect.fnUntraced(function* () {\n const result = yield* Operation.invoke(SpaceOperation.Snapshot, {\n db: space.db,\n query: Query.select(Filter.type(type)).ast,\n });\n if (result.snapshot) {\n yield* Effect.tryPromise(() =>\n downloadBlob(result.snapshot, createFilename({ parts: [space.id, Type.getTypename(type)], ext: 'json' })),\n );\n }\n }),\n properties: {\n label: SNAPSHOT_BY_SCHEMA_LABEL,\n icon: 'ph--camera--regular',\n disposition: 'list-item',\n },\n }),\n ];\n\n return actions;\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\nimport type * as Atom from 'effect/reactivity/Atom';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as AppGraphBuilder from '@dxos/app-graph/AppGraphBuilder';\nimport * as AppGraphNode from '@dxos/app-graph/AppGraphNode';\nimport * as AppAnnotation from '@dxos/app-toolkit/AppAnnotation';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\nimport * as AppNode from '@dxos/app-toolkit/AppNode';\nimport * as AppNodeMatcher from '@dxos/app-toolkit/AppNodeMatcher';\nimport * as CollectionOperation from '@dxos/app-toolkit/CollectionOperation';\nimport * as ContainerModel from '@dxos/app-toolkit/ContainerModel';\nimport * as GraphPath from '@dxos/app-toolkit/GraphPath';\nimport * as LayoutOperation from '@dxos/app-toolkit/LayoutOperation';\nimport * as NavigationOperation from '@dxos/app-toolkit/NavigationOperation';\nimport * as TypeOptions from '@dxos/app-toolkit/TypeOptions';\nimport * as UrlPath from '@dxos/app-toolkit/UrlPath';\nimport * as UrlResolution from '@dxos/app-toolkit/UrlResolution';\nimport { isSpace } from '@dxos/client/echo';\nimport * as Operation from '@dxos/compute/Operation';\nimport { Annotation, Collection, Database, type Entity, Obj, Ref, Type } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { SpaceId } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport * as ClientCapabilities from '@dxos/plugin-client/ClientCapabilities';\nimport { ArchivedAnnotation, isArchivable } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport { meta } from '#meta';\nimport { SpaceCapabilities, SpaceOperation } from '#types';\n\nimport { resolveCollectionObjectPath } from '../../../util/index.ts';\nimport {\n ADD_TO_COLLECTION_LABEL,\n ARCHIVE_OBJECT_LABEL,\n COLLECTIONS_SECTION_TYPE,\n COPY_LINK_LABEL,\n CREATE_OBJECT_IN_COLLECTION_LABEL,\n EXPOSE_OBJECT_LABEL,\n REMOVE_FROM_COLLECTION_LABEL,\n SHOW_ORIGINAL_LABEL,\n UNARCHIVE_OBJECT_LABEL,\n} from './shared.ts';\n\n//\n// Extension Factory\n//\n\n/** Creates collection-related extensions: collections section, collections, objects, and object actions. */\n\n/**\n * Typenames available in this build — schemas registered by enabled plugins, plus those stored in the\n * space — so the tree can omit an object whose type has no article rather than offer a row that opens\n * nothing.\n *\n * TODO(wittjosiah): Name the plugin that would render the object instead of hiding it.\n */\nconst getAvailableTypenames = (types: readonly Entity.Unknown[]): ReadonlySet<string> =>\n new Set(\n types\n .filter(Type.isType)\n .map((type) => Type.getTypename(type))\n .filter(isNonNullable),\n );\n\nconst isTypeAvailable = (typenames: ReadonlySet<string>, object: Obj.Unknown): boolean => {\n const typename = Obj.getTypename(object);\n // No typename at all is not an unavailable type — leave those to the renderers.\n return !typename || typenames.has(typename);\n};\n\n/** A collection's members in its order, omitting deleted and archived objects. */\nconst getMembers = (get: Atom.AtomContext, refs: readonly Ref.Ref<Obj.Unknown>[]): Obj.Unknown[] =>\n get(Obj.atomReactive(refs)).filter(\n (object) => !Option.getOrElse(get(Annotation.atom(object, ArchivedAnnotation)), () => false),\n );\n\nexport const createCollectionExtensions = Effect.fnUntraced(function* ({\n shareableLinkOrigin,\n}: {\n shareableLinkOrigin: string;\n}) {\n const capabilities = yield* Capability.Service;\n // Hoisted so connector/action bodies read reactively via `get(...)` instead of a sync\n // `Capability.get`, establishing a dependency that heals once the capability lands.\n const ephemeralCapAtom = yield* Capability.atom(SpaceCapabilities.EphemeralState);\n\n return yield* Effect.all([\n // Content section group — created alongside collections so the group always\n // appears when the space plugin is active and hides when there are no children.\n AppGraphBuilder.createExtension({\n id: GraphPath.GroupSegments.content,\n match: AppNodeMatcher.whenSpace,\n connector: (space) =>\n Effect.succeed([\n AppNode.makeGroup({\n id: GraphPath.GroupSegments.content,\n type: GraphPath.GroupTypes.content,\n label: ['nav-tree-group-content.label', { ns: meta.profile.key }],\n icon: 'ph--files--regular',\n space,\n position: 200,\n }),\n ]),\n }),\n\n // Collections section virtual node under the content group.\n AppGraphBuilder.createExtension({\n id: 'collectionsSection',\n match: AppNodeMatcher.whenNavTreeGroup(GraphPath.GroupTypes.content),\n connector: (space, get) => {\n get(Obj.atom(space.properties));\n const collectionRef = Annotation.get(space.properties, AppAnnotation.RootCollectionAnnotation).pipe(\n Option.getOrUndefined,\n );\n if (collectionRef) {\n get(Obj.atom(collectionRef));\n }\n const rootCollection = collectionRef?.target;\n const collectionPartials = rootCollection\n ? AppNode.getListPartials(ContainerModel.collection(rootCollection), space.db)\n : undefined;\n\n return Effect.succeed([\n AppGraphNode.make({\n id: GraphPath.Segments.collections,\n type: COLLECTIONS_SECTION_TYPE,\n data: null,\n properties: {\n label: ['collections-section.label', { ns: meta.profile.key }],\n icon: 'ph--folder--regular',\n iconHue: 'indigo',\n role: 'branch',\n testId: 'spacePlugin.collectionsSection',\n draggable: false,\n droppable: false,\n space,\n ...collectionPartials,\n },\n }),\n ]);\n },\n }),\n\n // Root collection objects under the Collections virtual node. Shares the `object` urlKey with the\n // nested-collection `objects` connector below so an object is addressed the same way wherever it\n // sits in the collection tree (the key names the *collection subgraph*, not the container's type;\n // the database subgraph addresses the same object under `db`).\n AppGraphBuilder.createExtension({\n id: 'collections',\n url: { key: 'object', kind: 'item', path: [GraphPath.GroupSegments.content, GraphPath.Segments.collections] },\n match: (node) => {\n const space = isSpace(node.properties.space) ? node.properties.space : undefined;\n return node.type === COLLECTIONS_SECTION_TYPE && space ? Option.some(space) : Option.none();\n },\n connector: (space, get) => {\n const [ephemeralAtom] = get(ephemeralCapAtom);\n if (!ephemeralAtom) {\n return Effect.succeed([]);\n }\n const ephemeralState = get(ephemeralAtom);\n\n get(Obj.atom(space.properties));\n const collectionRef = Annotation.get(space.properties, AppAnnotation.RootCollectionAnnotation).pipe(\n Option.getOrUndefined,\n );\n const refs = collectionRef ? get(Obj.atomProperty(collectionRef, 'objects')) : undefined;\n if (!refs) {\n return Effect.succeed([]);\n }\n\n const available = getAvailableTypenames(get(space.db.query(TypeOptions.allTypesQuery).atom));\n const objects = getMembers(get, refs).filter((object) => isTypeAvailable(available, object));\n\n return Effect.succeed(\n objects\n .map((object: Obj.Unknown) =>\n AppNode.makeObject({\n get,\n db: space.db,\n object,\n navigable: true,\n }),\n )\n .filter(isNonNullable),\n );\n },\n }),\n\n // Children of Collection.Collection nodes.\n AppGraphBuilder.createExtension({\n id: 'objects',\n // Recursive over nested collections at any depth, so `object/<id>` addresses any object reachable\n // through a space's collection tree, not just the root collection's direct children. The shape is\n // data-dependent (the object's collection ancestry), so the id is the object's own segment and\n // `resolve` finds the rest — see `resolveCollectionObjectPath`.\n url: {\n key: 'object',\n kind: 'item',\n path: [GraphPath.GroupSegments.content, GraphPath.Segments.collections],\n resolve: ({ id, workspace }) =>\n Effect.gen(function* () {\n if (!SpaceId.isValid(workspace)) {\n return null;\n }\n // Look the Client up lazily (at resolve time) rather than at graph-setup time — it is not yet\n // available when the AppGraphBuilder activates, and forward resolution only runs much later.\n const client = capabilities.get(ClientCapabilities.Client);\n const space = client.spaces.get(workspace);\n if (!space) {\n return null;\n }\n const path = yield* resolveCollectionObjectPath({ objectId: id }).pipe(\n Effect.provide(Database.layer(space.db)),\n );\n return path ?? null;\n }),\n },\n match: (node) => (Obj.instanceOf(Collection.Collection, node.data) ? Option.some(node.data) : Option.none()),\n connector: (collection, get) => {\n const [ephemeralAtom] = get(ephemeralCapAtom);\n if (!ephemeralAtom) {\n return Effect.succeed([]);\n }\n const ephemeralState = get(ephemeralAtom);\n const db = Obj.getDatabase(collection);\n\n const available = db ? getAvailableTypenames(get(db.query(TypeOptions.allTypesQuery).atom)) : undefined;\n const objects = getMembers(get, get(Obj.atomProperty(collection, 'objects'))).filter(\n (object) => !available || isTypeAvailable(available, object),\n );\n\n return Effect.succeed(\n objects\n .map(\n (object: Obj.Unknown) =>\n db &&\n AppNode.makeObject({\n get,\n object,\n db,\n navigable: true,\n }),\n )\n .filter(isNonNullable),\n );\n },\n }),\n\n // Object actions.\n AppGraphBuilder.createExtension({\n id: 'objectActions',\n match: (node) => {\n return node.data != null &&\n Obj.getDatabase(node.data) &&\n Obj.isObject(node.data) &&\n Obj.getTypename(node.data) === node.type\n ? Option.some({ object: node.data, nodeId: node.id })\n : Option.none();\n },\n actions: ({ object, nodeId }, get) => {\n const deletable = !Type.isType(object);\n\n const [appGraph] = get(capabilities.atom(AppCapabilities.AppGraph));\n const [ephemeralAtom] = get(ephemeralCapAtom);\n\n if (!appGraph || !ephemeralAtom) {\n return Effect.succeed([]);\n }\n const ephemeralState = get(ephemeralAtom);\n\n const parentId = nodeId.substring(0, nodeId.lastIndexOf('/'));\n const container = AppNode.getListOf(Option.getOrUndefined(get(appGraph.graph.node(parentId))));\n\n return Effect.succeed(\n constructObjectActions({\n object,\n nodeId,\n deletable,\n navigable: ephemeralState.navigableCollections,\n shareableLinkOrigin,\n container,\n parent: container ? get(Obj.parentAtom(object)) : undefined,\n archived: isArchivable(object)\n ? Option.getOrElse(get(Annotation.atom(object, ArchivedAnnotation)), () => false)\n : undefined,\n }),\n );\n },\n }),\n\n // Action on the collections section header to add an object to the space's root collection.\n AppGraphBuilder.createExtension({\n id: 'collectionsSectionActions',\n match: (node) => {\n const space = isSpace(node.properties.space) ? node.properties.space : undefined;\n return node.type === COLLECTIONS_SECTION_TYPE && space ? Option.some(space) : Option.none();\n },\n actions: (space) =>\n Effect.succeed([\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenObjectForm.meta.key,\n data: () =>\n Effect.gen(function* () {\n // Target the root collection so the create dialog offers collection-eligible types, like\n // any other collection; fall back to the space db if it hasn't been created yet.\n const rootCollection = Annotation.get(space.properties, AppAnnotation.RootCollectionAnnotation).pipe(\n Option.getOrUndefined,\n )?.target;\n yield* Operation.invoke(SpaceOperation.OpenObjectForm, {\n // Qualified id of the collections section node (root/<spaceId>/collections), so the new\n // object's navigation path resolves under the section — the bare segment would not.\n target: rootCollection ?? space.db,\n targetNodeId: GraphPath.getCollectionsPath(space.id),\n });\n }),\n properties: {\n label: CREATE_OBJECT_IN_COLLECTION_LABEL,\n icon: 'ph--plus--regular',\n disposition: 'list-item-primary',\n testId: 'spacePlugin.createObject',\n },\n }),\n ]),\n }),\n ]);\n});\n\n/** Builds the action list for an ECHO object node. */\nconst constructObjectActions = ({\n object,\n nodeId,\n deletable = true,\n navigable = false,\n shareableLinkOrigin,\n container,\n parent,\n archived,\n}: {\n object: Obj.Unknown;\n nodeId: string;\n shareableLinkOrigin: string;\n deletable?: boolean;\n navigable?: boolean;\n container?: ContainerModel.Container;\n parent?: Obj.Unknown;\n /** Current archive state; undefined when the object's type is not archivable. */\n archived?: boolean;\n}) => {\n const db = Obj.getDatabase(object);\n invariant(db, 'Database not found');\n const typename = Obj.getTypename(object);\n invariant(typename, 'Object has no typename');\n const linkedFrom = container && ContainerModel.isLink(container, parent) ? container : undefined;\n const parentCollection =\n container && Obj.instanceOf(Collection.Collection, container.object) ? container.object : undefined;\n\n const actions: AppGraphNode.NodeArg<AppGraphNode.ActionData<Operation.Service | Capability.Service>>[] = [\n ...(Obj.instanceOf(Collection.Collection, object)\n ? [\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenObjectForm.meta.key,\n data: () => Operation.invoke(SpaceOperation.OpenObjectForm, { target: object, targetNodeId: nodeId }),\n properties: {\n label: CREATE_OBJECT_IN_COLLECTION_LABEL,\n icon: 'ph--plus--regular',\n disposition: 'list-item-primary',\n testId: 'spacePlugin.createObject',\n },\n }),\n ]\n : []),\n AppGraphNode.makeAction({\n id: SpaceOperation.RenameObject.meta.key,\n data: (params?: AppGraphNode.InvokeProps) =>\n Operation.invoke(SpaceOperation.RenameObject, { object, caller: `${params?.caller}:${params?.parent?.id}` }),\n properties: {\n label: AppNode.getDynamicLabel('rename-object.label', typename, { defaultValue: 'Rename' }),\n icon: 'ph--pencil-simple-line--regular',\n disposition: 'list-item',\n testId: 'spacePlugin.renameObject',\n },\n }),\n ...(container\n ? [\n AppGraphNode.makeAction({\n id: 'removeFromContainer',\n data: () => Effect.sync(() => ContainerModel.release({ container, object })),\n properties: {\n label: container.removeLabel ?? REMOVE_FROM_COLLECTION_LABEL,\n icon: 'ph--minus-circle--regular',\n disposition: 'list-item',\n testId: 'spacePlugin.removeFromContainer',\n },\n }),\n ]\n : []),\n ...(linkedFrom\n ? [\n AppGraphNode.makeAction({\n id: 'showOriginal',\n data: () =>\n Effect.gen(function* () {\n const { targets } = yield* Operation.invoke(NavigationOperation.ResolveNavigationTargets, {\n query: { uri: Obj.getURI(object) },\n });\n const target = targets[0];\n if (target) {\n yield* Operation.invoke(LayoutOperation.Open, { subject: [target.path], navigation: 'immediate' });\n }\n }),\n properties: {\n label: SHOW_ORIGINAL_LABEL,\n icon: 'ph--arrow-square-out--regular',\n disposition: 'list-item',\n testId: 'spacePlugin.showOriginal',\n },\n }),\n ]\n : [\n AppGraphNode.makeAction({\n id: SpaceOperation.RemoveObjects.meta.key,\n data: () =>\n Operation.invoke(\n SpaceOperation.RemoveObjects,\n { objects: [object], target: parentCollection },\n { spaceId: Obj.getDatabase(object)?.spaceId },\n ),\n properties: {\n label: AppNode.getDynamicLabel('delete-object.label', typename, { defaultValue: 'Delete' }),\n icon: 'ph--trash--regular',\n disposition: 'list-item',\n disabled: !deletable,\n testId: 'spacePlugin.deleteObject',\n },\n }),\n ]),\n ...(TypeOptions.isUserObject(object)\n ? [\n AppGraphNode.makeAction({\n id: CollectionOperation.OpenAddToCollection.meta.key,\n data: () => Operation.invoke(CollectionOperation.OpenAddToCollection, { object }),\n properties: {\n label: ADD_TO_COLLECTION_LABEL,\n icon: CollectionOperation.OpenAddToCollection.meta.icon,\n disposition: 'list-item',\n testId: 'spacePlugin.addToCollection',\n },\n }),\n ]\n : []),\n ...(archived !== undefined\n ? [\n AppGraphNode.makeAction({\n id: SpaceOperation.SetArchived.meta.key,\n data: () => Operation.invoke(SpaceOperation.SetArchived, { objects: [object], archived: !archived }),\n properties: {\n label: archived ? UNARCHIVE_OBJECT_LABEL : ARCHIVE_OBJECT_LABEL,\n icon: archived ? 'ph--tray-arrow-up--regular' : 'ph--archive--regular',\n disposition: 'list-item',\n testId: archived ? 'spacePlugin.unarchiveObject' : 'spacePlugin.archiveObject',\n },\n }),\n ]\n : []),\n ...(navigable || !Obj.instanceOf(Collection.Collection, object)\n ? [\n AppGraphNode.makeAction({\n id: 'copyLink',\n data: () =>\n Effect.gen(function* () {\n const builder = yield* Capability.get(AppCapabilities.AppGraph);\n const path = UrlResolution.getShareableLinkPath(builder, nodeId);\n if (Option.isNone(path)) {\n log.warn('object has no URL representation; cannot copy link', { nodeId });\n return;\n }\n // The title lets the Composer Worker give the link a named preview in messengers.\n const url = UrlPath.withTitle(new URL(path.value, shareableLinkOrigin), Obj.getLabel(object));\n yield* Effect.promise(() => navigator.clipboard.writeText(url.toString()));\n }),\n properties: {\n label: COPY_LINK_LABEL,\n icon: 'ph--link--regular',\n disposition: 'list-item',\n testId: 'spacePlugin.copyLink',\n },\n }),\n ]\n : []),\n AppGraphNode.makeAction({\n id: LayoutOperation.Expose.meta.key,\n data: () => Operation.invoke(LayoutOperation.Expose, { subject: GraphPath.getObjectPathFromObject(object) }),\n properties: {\n label: EXPOSE_OBJECT_LABEL,\n icon: 'ph--eye--regular',\n disposition: 'heading-list-item',\n testId: 'spacePlugin.exposeObject',\n },\n }),\n ];\n\n return actions;\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\n\nimport * as AppGraphBuilder from '@dxos/app-graph/AppGraphBuilder';\nimport * as AppNode from '@dxos/app-toolkit/AppNode';\nimport * as AppNodeMatcher from '@dxos/app-toolkit/AppNodeMatcher';\nimport { Obj, Type } from '@dxos/echo';\nimport type { EchoViewRefPath } from '@dxos/schema';\nimport { ViewAnnotation } from '@dxos/schema';\nimport * as Position from '@dxos/util/Position';\n\nimport { meta } from '#meta';\n\n//\n// Extension Factory\n//\n\n/** Creates companion panel extensions: object settings, related, and selected-objects. */\n// NOTE: Explicit annotation required: d.ts emit cannot portably name the inferred @dxos/plugin-graph types (TS2883).\nexport const createCompanionExtensions: () => Effect.Effect<AppGraphBuilder.BuilderExtension[][]> = Effect.fnUntraced(\n function* () {\n return yield* Effect.all([\n // Object settings plank companion.\n AppGraphBuilder.createExtension({\n id: 'settings',\n relation: AppNode.companion,\n match: AppNodeMatcher.whenEchoObjectMatches,\n connector: (node) =>\n Effect.succeed([\n AppNode.makeCompanion({\n variant: 'settings',\n label: ['object-properties.label', { ns: meta.profile.key }],\n icon: 'ph--sliders--regular',\n data: 'settings', // TODO(burdon): Change to 'object-properties'.\n position: Position.last,\n }),\n ]),\n }),\n\n // Related objects plank companion.\n AppGraphBuilder.createExtension({\n id: 'related',\n relation: AppNode.companion,\n match: AppNodeMatcher.whenEchoObjectMatches,\n connector: (node) =>\n Effect.succeed([\n AppNode.makeCompanion({\n variant: 'related',\n label: ['companion-related.label', { ns: meta.profile.key }],\n icon: 'ph--graph--regular',\n data: 'related',\n position: Position.last,\n }),\n ]),\n }),\n\n // View selected objects companion.\n AppGraphBuilder.createExtension({\n id: 'selectedObjects',\n relation: AppNode.companion,\n match: (node) => {\n // Type/schema node (e.g. a TypeArticle plank): the table's own row selection feeds this\n // companion directly, no view lookup needed.\n if (Type.isType(node.data)) {\n return Option.some(node);\n }\n\n if (!Obj.isObject(node.data)) {\n return Option.none();\n }\n\n const type = Obj.getType(node.data);\n const path = type\n ? ViewAnnotation.get(Type.getSchema(type)).pipe(Option.getOrElse(() => [] as EchoViewRefPath))\n : [];\n const isEchoViewBacked = type && path.length > 0 ? ViewAnnotation.hasRefAlongPath(node.data, path) : false;\n\n if (!isEchoViewBacked) {\n return Option.none();\n }\n\n return Option.some(node);\n },\n connector: (node) =>\n Effect.succeed([\n AppNode.makeCompanion({\n variant: 'selected-objects',\n label: ['companion-selected-objects.label', { ns: meta.profile.key }],\n icon: 'ph--tree-view--regular',\n data: 'selected-objects',\n }),\n ]),\n }),\n ]);\n },\n);\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport * as AppGraphBuilder from '@dxos/app-graph/AppGraphBuilder';\nimport * as AppGraphNode from '@dxos/app-graph/AppGraphNode';\nimport * as AppNode from '@dxos/app-toolkit/AppNode';\nimport * as AppNodeMatcher from '@dxos/app-toolkit/AppNodeMatcher';\nimport { MembershipPolicy } from '@dxos/protocols/buf/dxos/halo/credentials_pb';\nimport * as Position from '@dxos/util/Position';\n\nimport { meta } from '#meta';\nimport { SpaceSchema } from '#types';\n\n//\n// Extension Factory\n//\n\n/**\n * Settings section attached directly under each Space node, plus its children.\n *\n * The virtual `settings` section is pinned to the top via `position: Position.first`\n * so it sits above the un-positioned middle band (collections, mailboxes,\n * automations, integrations, etc.). It groups the panels contributed by this\n * plugin (general, members) and by other plugins (automation, functions).\n */\nexport const createSettingsExtensions = Effect.fnUntraced(function* () {\n const sectionExtension = yield* AppGraphBuilder.createExtension({\n id: 'settingsSection',\n match: AppNodeMatcher.whenSpace,\n connector: (space) =>\n Effect.succeed([\n AppNode.makeSection({\n id: SpaceSchema.SETTINGS_SECTION_ID,\n type: SpaceSchema.SETTINGS_SECTION_TYPE,\n label: ['settings-section.label', { ns: meta.profile.key }],\n icon: 'ph--sliders--regular',\n iconHue: 'emerald',\n space,\n position: Position.first,\n testId: 'spacePlugin.settings',\n }),\n ]),\n });\n\n // General and Members are separate extensions rather than one so each can be an id-less key (a single\n // id-less key can address only one fixed node — its terminal segment IS the key).\n const generalExtension = yield* AppGraphBuilder.createExtension({\n id: 'settingsGeneral',\n url: { key: 'settings', kind: 'singleton', path: [SpaceSchema.SETTINGS_SECTION_ID] },\n match: AppNodeMatcher.whenSpaceSettings,\n connector: (space) =>\n Effect.succeed([\n AppGraphNode.make({\n id: 'settings',\n type: `${meta.profile.key}.general`,\n data: `${meta.profile.key}.general`,\n properties: {\n label: ['space-settings-properties.label', { ns: meta.profile.key }],\n icon: 'ph--brackets-curly--regular',\n iconHue: 'emerald',\n space,\n position: Position.first,\n testId: 'spacePlugin.general',\n },\n }),\n ]),\n });\n\n const membersExtension = yield* AppGraphBuilder.createExtension({\n id: 'settingsMembers',\n url: { key: 'members', kind: 'singleton', path: [SpaceSchema.SETTINGS_SECTION_ID] },\n match: AppNodeMatcher.whenSpaceSettings,\n // A private space is locked at genesis and can never admit members, so it has nothing to manage.\n connector: (space) =>\n Effect.succeed(\n space.membershipPolicy === MembershipPolicy.LOCKED\n ? []\n : [\n AppGraphNode.make({\n id: 'members',\n type: `${meta.profile.key}.members`,\n data: `${meta.profile.key}.members`,\n properties: {\n label: ['members-panel.label', { ns: meta.profile.key }],\n icon: 'ph--users--regular',\n iconHue: 'emerald',\n space,\n position: Position.first,\n testId: 'spacePlugin.members',\n },\n }),\n ],\n ),\n });\n\n return [sectionExtension, generalExtension, membersExtension];\n});\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\n\nimport { SpaceSchema } from '#types';\n\nimport {\n createCollectionExtensions,\n createCompanionExtensions,\n createDatabaseExtensions,\n createSettingsExtensions,\n createSpaceExtensions,\n} from './extensions/index.ts';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* ({ shareableLinkOrigin = window.location.origin }: SpaceSchema.SpacePluginOptions = {}) {\n const extensions = yield* Effect.all([\n createSpaceExtensions(),\n createSettingsExtensions(),\n createDatabaseExtensions(),\n createCollectionExtensions({ shareableLinkOrigin }),\n createCompanionExtensions(),\n ]);\n\n return Capability.contribute(AppCapabilities.AppGraphBuilder, extensions.flat());\n }),\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chunk-app-graph-builder.mjs","names":[],"sources":["../../src/capabilities/app-graph-builder/extensions/shared.ts","../../src/capabilities/app-graph-builder/extensions/spaces.ts","../../src/capabilities/app-graph-builder/extensions/database.ts","../../src/capabilities/app-graph-builder/extensions/collections.ts","../../src/capabilities/app-graph-builder/extensions/companions.ts","../../src/capabilities/app-graph-builder/extensions/settings.ts","../../src/capabilities/app-graph-builder/app-graph-builder.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Option from 'effect/Option';\nimport type * as Atom from 'effect/reactivity/Atom';\n\nimport type * as AppGraphNode from '@dxos/app-graph/AppGraphNode';\nimport { type Space, SpaceState, isSpace } from '@dxos/client/echo';\nimport type * as Operation from '@dxos/compute/Operation';\nimport { Annotation, Filter, Obj, Type } from '@dxos/echo';\nimport { Migrations, MigrationVersionAnnotation } from '@dxos/migrations';\nimport { type TreeData } from '@dxos/react-ui-list';\nimport type { EchoViewRefPath } from '@dxos/schema';\nimport { ViewAnnotation, getTypeURIFromQuery } from '@dxos/schema';\nimport { osTranslations } from '@dxos/ui-theme';\nimport { type Label } from '@dxos/ui-types/translations';\n\nimport { meta } from '#meta';\n\n//\n// Virtual Node Types\n//\n\nexport const DATABASE_SECTION_TYPE = `${meta.profile.key}.database`;\nexport const COLLECTIONS_SECTION_TYPE = `${meta.profile.key}.collections`;\n/** Tags every type node under the Database section — both static (compile-time) and database (dynamic) schemas. */\nexport const SCHEMA_NODE_TYPE = `${meta.profile.key}.static-schema`;\n\n//\n// Constants\n//\n\n/** Shared translation namespace descriptor. */\nexport const META_NS: { ns: string } = { ns: meta.profile.key };\n\n//\n// Stable Callbacks\n//\n\nexport const CAN_DROP_SPACE = (source: TreeData) => Obj.isObject(source.item.data) || isSpace(source.item.data);\n\n//\n// Caches (space-specific, not moved to app-toolkit)\n//\n\nexport const spaceActionsCache = new Map<\n string,\n {\n state: SpaceState;\n hasPendingMigration: boolean;\n migrating: boolean;\n actions: AppGraphNode.NodeArg<AppGraphNode.ActionData<Operation.Service>>[];\n }\n>();\nexport const spaceRearrangeCache = new Map<string, (nextOrder: string[]) => void>();\n\n//\n// Static Labels\n//\n\nexport const ADD_TO_COLLECTION_LABEL: Label = ['add-to-collection.label', { ns: osTranslations }];\nexport const ADD_VIEW_TO_SCHEMA_LABEL: Label = ['add-view-to-schema.label', META_NS];\nexport const ARCHIVE_OBJECT_LABEL: Label = ['archive-object.label', META_NS];\nexport const COPY_LINK_LABEL: Label = ['copy-link.label', META_NS];\nexport const CREATE_OBJECT_IN_COLLECTION_LABEL: Label = ['create-object-in-collection.label', META_NS];\nexport const CREATE_OBJECT_IN_SPACE_LABEL: Label = ['create-object-in-space.label', META_NS];\nexport const EXPOSE_OBJECT_LABEL: Label = ['expose-object.label', META_NS];\nexport const MIGRATE_SPACE_LABEL: Label = ['migrate-space.label', META_NS];\nexport const NEW_TYPE_LABEL: Label = ['new-type.label', META_NS];\nexport const PENDING_SPACE_LABEL: Label = ['pending-space.label', META_NS];\nexport const REMOVE_FROM_COLLECTION_LABEL: Label = ['remove-from-collection.label', META_NS];\nexport const RENAME_SPACE_LABEL: Label = ['rename-space.label', META_NS];\nexport const SHOW_ORIGINAL_LABEL: Label = ['show-original.label', META_NS];\nexport const SETTINGS_PANEL_LABEL: Label = ['settings-panel.label', META_NS];\nexport const SNAPSHOT_BY_SCHEMA_LABEL: Label = ['snapshot-by-schema.label', META_NS];\nexport const UNARCHIVE_OBJECT_LABEL: Label = ['unarchive-object.label', META_NS];\n\n//\n// Helpers\n//\n\nexport const checkPendingMigration = (space: Space) => {\n return (\n space.state.get() === SpaceState.SPACE_REQUIRES_MIGRATION ||\n (space.state.get() === SpaceState.SPACE_READY &&\n !!Migrations.targetVersion &&\n Annotation.get(space.properties, MigrationVersionAnnotation).pipe(Option.getOrUndefined) !==\n Migrations.targetVersion)\n );\n};\n\n//\n// View Index\n//\n\n/**\n * Index of view objects grouped by their target type URI.\n */\nexport type ViewIndex = {\n /** Type URIs that have at least one straightforward view targeting them. */\n typeUrisWithViews: Set<string>;\n /** View objects targeting a specific type URI. */\n getViewsForTypeUri: (typeUri: string) => Obj.Any[];\n /** True when the schema has `ViewAnnotation` and that path resolves non-null on `object`; false otherwise (no annotation, or null/undefined path — e.g. Kanban with unset `view`). */\n isView: (object: Obj.Any) => boolean;\n /** View-annotated type URIs with at least one instance that is not a view. */\n typeUrisWithNonViewObjects: Set<string>;\n};\n\n/**\n * Builds an index of view objects by scanning view-annotated schemas and resolving the target\n * type URI from each view's query AST. Only straightforward views whose query resolves to a\n * type URI via getTypeURIFromQuery are included.\n */\n// TODO(wittjosiah): Make reactive to schema registry changes (currently only object/view mutations trigger updates).\nexport const buildViewIndex = (get: Atom.AtomContext, space: Space, schemas: Type.AnyEntity[]): ViewIndex => {\n const viewSchemas = schemas.filter((schema) => ViewAnnotation.has(schema));\n\n const viewsByTypeUri = new Map<string, Obj.Any[]>();\n // Object IDs whose `ViewAnnotation` path resolves to a non-null value.\n // Used by `isView` to distinguish view instances from regular instances of\n // the same schema (e.g. items-variant Kanban vs view-variant Kanban).\n const viewObjectIds = new Set<string>();\n const typeUrisWithNonViewObjects = new Set<string>();\n\n if (viewSchemas.length > 0) {\n const filter = Filter.or(...viewSchemas.map((schema) => Filter.type(schema)));\n const viewObjects = get(space.db.query(filter).atom);\n\n for (const viewObject of viewObjects) {\n if (!Obj.isObject(viewObject)) {\n continue;\n }\n const holderType = Obj.getType(viewObject);\n const path = holderType\n ? ViewAnnotation.get(Type.getSchema(holderType)).pipe(Option.getOrElse(() => [] as EchoViewRefPath))\n : ([] as EchoViewRefPath);\n\n if (path.length === 0) {\n continue;\n }\n\n const viewSnapshot = get(Obj.atom(viewObject));\n let holder: unknown = viewSnapshot;\n for (const segment of path) {\n holder =\n holder == null || typeof holder !== 'object' ? undefined : (holder as Record<string, unknown>)[segment];\n }\n // Path resolved to a non-null value → this instance is a \"view\". Path\n // resolved to null/undefined → it's a regular object that happens to\n // be of a view-annotated schema.\n if (holder != null) {\n viewObjectIds.add(viewObject.id);\n } else if (holderType) {\n typeUrisWithNonViewObjects.add(Type.getURI(holderType));\n }\n\n const viewTarget = holder != null ? get(Obj.atom(holder as Obj.Any)) : undefined;\n const typeUri = getTypeURIFromQuery(viewTarget?.query?.ast);\n if (typeUri) {\n const existing = viewsByTypeUri.get(typeUri) ?? [];\n existing.push(viewObject);\n viewsByTypeUri.set(typeUri, existing);\n }\n }\n }\n\n return {\n typeUrisWithViews: new Set(viewsByTypeUri.keys()),\n getViewsForTypeUri: (typeUri) => viewsByTypeUri.get(typeUri) ?? [],\n isView: (object) => viewObjectIds.has(object.id),\n typeUrisWithNonViewObjects,\n };\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Atom from 'effect/reactivity/Atom';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as AppGraph from '@dxos/app-graph/AppGraph';\nimport * as AppGraphBuilder from '@dxos/app-graph/AppGraphBuilder';\nimport * as AppGraphNode from '@dxos/app-graph/AppGraphNode';\nimport * as CreateAtom from '@dxos/app-graph/CreateAtom';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\nimport * as AppNode from '@dxos/app-toolkit/AppNode';\nimport * as AppNodeMatcher from '@dxos/app-toolkit/AppNodeMatcher';\nimport * as AppSpace from '@dxos/app-toolkit/AppSpace';\nimport * as GraphPath from '@dxos/app-toolkit/GraphPath';\nimport { type Space, SpaceState } from '@dxos/client/echo';\nimport * as Operation from '@dxos/compute/Operation';\nimport { Filter, Obj } from '@dxos/echo';\nimport * as GraphNode from '@dxos/graph/GraphNode';\nimport * as GraphNodeMatcher from '@dxos/graph/GraphNodeMatcher';\nimport { Migrations } from '@dxos/migrations';\nimport * as ClientCapabilities from '@dxos/plugin-client/ClientCapabilities';\nimport { SpacesService } from '@dxos/protocols/rpc';\nimport { Expando } from '@dxos/schema';\nimport { type Label } from '@dxos/ui-types/translations';\nimport * as Position from '@dxos/util/Position';\n\nimport { meta } from '#meta';\nimport { SpaceCapabilities, SpaceOperation, SpaceSchema } from '#types';\n\nimport { getSpaceDisplayName } from '../../../util/index.ts';\nimport {\n CAN_DROP_SPACE,\n CREATE_OBJECT_IN_SPACE_LABEL,\n MIGRATE_SPACE_LABEL,\n PENDING_SPACE_LABEL,\n RENAME_SPACE_LABEL,\n checkPendingMigration,\n spaceActionsCache,\n spaceRearrangeCache,\n} from './shared.ts';\n\n//\n// Extension Factory\n//\n\n// The label tuple must be a module-level singleton: connectors re-evaluate whenever the matched\n// node emits, and a tuple rebuilt inline each time creates a new array reference, causing the graph\n// to re-emit the node and remount the Home article on every evaluation.\nconst SPACE_HOME_NODE_LABEL = ['space-home-node.label', { ns: meta.profile.key }] as const;\n\nconst SPACE_OPEN_TIMEOUT = 60_000;\n\nconst makeDeadlineAtom = () =>\n Atom.make((get) => {\n const timeout = setTimeout(() => get.setSelf(true), SPACE_OPEN_TIMEOUT);\n get.addFinalizer(() => clearTimeout(timeout));\n return false;\n });\n\n/** Creates space-related extensions: primary actions, space nodes, space actions, and the Home node. */\nexport const createSpaceExtensions = Effect.fnUntraced(function* () {\n const capabilities = yield* Capability.Service;\n // Hoisted so connector/action bodies read reactively via `get(...)` instead of a sync\n // `Capability.get`, establishing a dependency that heals once the capability lands.\n const clientAtom = yield* Capability.atom(ClientCapabilities.Client);\n const stateCapAtom = yield* Capability.atom(SpaceCapabilities.State);\n const ephemeralCapAtom = yield* Capability.atom(SpaceCapabilities.EphemeralState);\n const settingsCapAtom = yield* Capability.atom(SpaceCapabilities.SettingsAtom);\n const appGraphAtom = yield* Capability.atom(AppCapabilities.AppGraph);\n const openDeadlineFamily = Atom.family((_spaceId: string) => makeDeadlineAtom());\n const orderSettledAtom = Atom.make(false).pipe(Atom.keepAlive);\n\n return yield* Effect.all([\n AppGraphBuilder.createExtension({\n id: 'spaceHome',\n position: Position.first,\n url: { key: 'home', kind: 'singleton', path: [] },\n match: AppNodeMatcher.whenSpace,\n connector: (space) =>\n Effect.succeed([\n {\n id: GraphPath.SPACE_HOME_SEGMENT,\n type: SpaceSchema.SPACE_HOME_NODE_TYPE,\n data: SpaceSchema.SPACE_HOME_NODE_TYPE,\n properties: {\n label: SPACE_HOME_NODE_LABEL,\n icon: 'ph--house--regular',\n iconHue: 'emerald',\n testId: 'spacePlugin.spaceHome',\n position: Position.first,\n draggable: false,\n droppable: false,\n space,\n },\n } satisfies AppGraphNode.NodeArg<typeof SpaceSchema.SPACE_HOME_NODE_TYPE>,\n ]),\n }),\n\n AppGraphBuilder.createExtension({\n id: 'primaryActions',\n position: Position.first,\n match: GraphNodeMatcher.whenRoot,\n actions: () =>\n Effect.succeed([\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenCreateSpace.meta.key,\n data: () => Operation.invoke(SpaceOperation.OpenCreateSpace),\n properties: {\n label: ['create-space.label', { ns: meta.profile.key }],\n icon: 'ph--plus--regular',\n testId: 'spacePlugin.createSpace',\n disposition: 'menu',\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.Join.meta.key,\n data: () => Operation.invoke(SpaceOperation.Join, {}),\n properties: {\n label: ['join-space.label', { ns: meta.profile.key }],\n icon: 'ph--sign-in--regular',\n testId: 'spacePlugin.joinSpace',\n disposition: 'menu',\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenImportSpace.meta.key,\n data: () => Operation.invoke(SpaceOperation.OpenImportSpace),\n properties: {\n label: ['import-space.label', { ns: meta.profile.key }],\n icon: 'ph--upload--regular',\n testId: 'spacePlugin.importSpace',\n },\n }),\n AppGraphNode.makeAction({\n id: `${SpaceOperation.ExportSpace.meta.key}.binary`,\n data: Effect.fnUntraced(function* () {\n const client = yield* Capability.get(ClientCapabilities.Client);\n const space = AppSpace.getActiveSpace(client, capabilities) ?? AppSpace.getDefaultSpace(client);\n if (space) {\n yield* Operation.invoke(SpaceOperation.ExportSpace, {\n space,\n format: SpacesService.SpaceArchiveFormat.enums.BINARY,\n });\n }\n }),\n properties: {\n label: ['export-space-binary.label', { ns: meta.profile.key }],\n icon: 'ph--download--regular',\n testId: 'spacePlugin.exportSpaceBinary',\n },\n }),\n AppGraphNode.makeAction({\n id: `${SpaceOperation.ExportSpace.meta.key}.json`,\n data: Effect.fnUntraced(function* () {\n const client = yield* Capability.get(ClientCapabilities.Client);\n const space = AppSpace.getActiveSpace(client, capabilities) ?? AppSpace.getDefaultSpace(client);\n if (space) {\n yield* Operation.invoke(SpaceOperation.ExportSpace, {\n space,\n format: SpacesService.SpaceArchiveFormat.enums.JSON,\n });\n }\n }),\n properties: {\n label: ['export-space-json.label', { ns: meta.profile.key }],\n icon: 'ph--download--regular',\n testId: 'spacePlugin.exportSpaceJson',\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenMembers.meta.key,\n data: Effect.fnUntraced(function* () {\n const client = yield* Capability.get(ClientCapabilities.Client);\n const space = AppSpace.getActiveSpace(client, capabilities) ?? AppSpace.getDefaultSpace(client);\n if (space) {\n yield* Operation.invoke(SpaceOperation.OpenMembers, { space });\n }\n }),\n properties: {\n label: ['share-space.label', { ns: meta.profile.key }],\n icon: 'ph--users--regular',\n testId: 'spacePlugin.shareSpace',\n keyBinding: {\n macos: 'meta+.',\n windows: 'alt+.',\n },\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenSettings.meta.key,\n data: Effect.fnUntraced(function* () {\n const client = yield* Capability.get(ClientCapabilities.Client);\n const space = AppSpace.getActiveSpace(client, capabilities) ?? AppSpace.getDefaultSpace(client);\n if (space) {\n yield* Operation.invoke(SpaceOperation.OpenSettings, { space });\n }\n }),\n properties: {\n label: ['open-current-space-settings.label', { ns: meta.profile.key }],\n icon: 'ph--faders--regular',\n keyBinding: {\n macos: 'meta+shift+,',\n windows: 'ctrl+shift+,',\n },\n },\n }),\n ]),\n }),\n\n AppGraphBuilder.createExtension({\n id: 'spaces',\n match: GraphNodeMatcher.whenRoot,\n connector: (_node, get) => {\n // This reactive connector can recompute once during the teardown window (e.g. when stories\n // swap plugin managers) after the Client capability has been removed; the hoisted atom\n // resolves to an empty array rather than throwing in that case.\n const [client] = get(clientAtom);\n if (!client) {\n return Effect.succeed([]);\n }\n const [stateAtom] = get(stateCapAtom);\n const [ephemeralAtom] = get(ephemeralCapAtom);\n if (!stateAtom || !ephemeralAtom) {\n return Effect.succeed([]);\n }\n const spacesAtom = CreateAtom.fromObservable(client.spaces);\n\n const spaces = get(spacesAtom);\n if (!spaces) {\n return Effect.succeed([]);\n }\n\n const settingsSpace = AppSpace.getSettingsSpace(client);\n const settingsSpaceState = settingsSpace ? get(CreateAtom.fromObservable(settingsSpace.state)) : undefined;\n const orderingSpace = settingsSpaceState === SpaceState.SPACE_READY ? settingsSpace : undefined;\n\n const [settingsAtom] = get(settingsCapAtom);\n if (!settingsAtom) {\n return Effect.succeed([]);\n }\n const settings = get(settingsAtom);\n const state = get(stateAtom);\n const ephemeralState = get(ephemeralAtom);\n\n try {\n const [spacesOrder] = orderingSpace\n ? get(orderingSpace.db.query(Filter.type(Expando.Expando, { key: SpaceSchema.SHARED })).atom)\n : [undefined];\n const [appGraph] = get(appGraphAtom);\n if (!appGraph) {\n return Effect.succeed([]);\n }\n const { graph } = appGraph;\n\n const spacesOrderSnapshot = spacesOrder ? get(Obj.atom(spacesOrder)) : undefined;\n const order: string[] = (spacesOrderSnapshot as any)?.order ?? [];\n const orderMap = new Map(order.map((id, index) => [id, index]));\n const lazySpaceOpen = !!client.config.values.runtime?.client?.lazySpaceOpen;\n const orderSettled = get(orderSettledAtom);\n const orderResolved =\n orderSettled ||\n isOrderResolved({\n found: !!spacesOrder,\n settingsSpaceState,\n lazySpaceOpen,\n timedOut: () => !!settingsSpace && get(openDeadlineFamily(settingsSpace.id)),\n });\n if (!orderSettled && orderResolved && spaces.length > 0) {\n get.set(orderSettledAtom, true);\n }\n\n // Keyed by id rather than position: the array below is re-sorted by `orderMap`, so a\n // positional lookup would test one space's readiness against another's state.\n const spaceStates = new Map(spaces.map((space) => [space.id, get(CreateAtom.fromObservable(space.state))]));\n\n spaces.forEach((space) => {\n if (space.state.get() === SpaceState.SPACE_READY) {\n get(Obj.atom(space.properties));\n }\n });\n\n return Effect.succeed(\n [\n ...spaces\n .filter((space) => orderMap.has(space.id))\n .sort((sortA, sortB) => orderMap.get(sortA.id)! - orderMap.get(sortB.id)!),\n ...spaces.filter((space) => !orderMap.has(space.id)),\n ]\n .filter((space) => AppSpace.isVisibleSpace(space))\n .filter((space) =>\n shouldListSpace({\n state: spaceStates.get(space.id),\n timedOut: () => get(openDeadlineFamily(space.id)),\n lazySpaceOpen,\n }),\n )\n .map((space) =>\n isPendingSpaceNode({ state: spaceStates.get(space.id), orderResolved })\n ? constructPendingSpaceNode({ id: space.id, namesCache: state.spaceNames })\n : constructSpaceNode({\n space,\n navigable: ephemeralState.navigableCollections,\n namesCache: state.spaceNames,\n graph,\n spacesOrder,\n }),\n ),\n );\n } catch {\n return Effect.succeed([]);\n }\n },\n }),\n\n // Communications section group — no single plugin owns this category; it lives here so the\n // group is always present when the space plugin is active. A more specific plugin (e.g. a\n // future plugin-communications) should own this once one exists.\n // TODO(wittjosiah): Move to a dedicated communications plugin when one exists.\n AppGraphBuilder.createExtension({\n id: GraphPath.GroupSegments.communications,\n match: AppNodeMatcher.whenSpace,\n connector: (space) =>\n Effect.succeed([\n AppNode.makeGroup({\n id: GraphPath.GroupSegments.communications,\n type: GraphPath.GroupTypes.communications,\n label: ['nav-tree-group-comm.label', { ns: meta.profile.key }],\n icon: 'ph--chats--regular',\n space,\n position: 100,\n }),\n ]),\n }),\n\n AppGraphBuilder.createExtension({\n id: 'actions',\n match: AppNodeMatcher.whenSpace,\n actions: (space, get) => {\n const [client] = get(clientAtom);\n const [ephemeralAtom] = get(ephemeralCapAtom);\n\n if (!client || !ephemeralAtom) {\n return Effect.succeed([]);\n }\n const ephemeralState = get(ephemeralAtom);\n\n // Recompute actions when a migration completes (state transition or versionProperty stamp).\n get(CreateAtom.fromObservable(space.state));\n if (space.state.get() === SpaceState.SPACE_READY) {\n get(Obj.atom(space.properties));\n }\n\n return Effect.succeed(\n constructSpaceActions({\n space,\n migrating: ephemeralState.sdkMigrationRunning[space.id],\n }),\n );\n },\n }),\n ]);\n});\n\n//\n// Helpers\n//\n\nexport const isPendingSpace = (state: SpaceState | undefined, lazySpaceOpen = false): boolean =>\n state === SpaceState.SPACE_INITIALIZING ||\n (!lazySpaceOpen && (state === SpaceState.SPACE_CLOSED || state === SpaceState.SPACE_CONTROL_ONLY));\n\nexport const shouldListSpace = ({\n state,\n timedOut,\n lazySpaceOpen = false,\n}: {\n state: SpaceState | undefined;\n timedOut: () => boolean;\n lazySpaceOpen?: boolean;\n}): boolean => state === SpaceState.SPACE_READY || (isPendingSpace(state, lazySpaceOpen) && !timedOut());\n\nexport const isOrderResolved = ({\n found,\n settingsSpaceState,\n lazySpaceOpen = false,\n timedOut,\n}: {\n found: boolean;\n settingsSpaceState: SpaceState | undefined;\n lazySpaceOpen?: boolean;\n timedOut: () => boolean;\n}): boolean => {\n if (found) {\n return true;\n }\n const waiting = settingsSpaceState === SpaceState.SPACE_READY || isPendingSpace(settingsSpaceState, lazySpaceOpen);\n return !waiting || timedOut();\n};\n\nexport const isPendingSpaceNode = ({\n state,\n orderResolved,\n}: {\n state: SpaceState | undefined;\n orderResolved: boolean;\n}): boolean => !orderResolved || state !== SpaceState.SPACE_READY;\n\ntype SpaceNodeProperties = {\n label: Label;\n description: string | undefined;\n hue: string | undefined;\n icon: string | undefined;\n iconHue: string | undefined;\n disabled: boolean;\n pending: boolean;\n disposition: 'workspace';\n testId: 'spacePlugin.space' | 'spacePlugin.space.pending';\n onRearrange: ((nextOrder: string[]) => void) | undefined;\n canDrop: typeof CAN_DROP_SPACE | undefined;\n};\n\nexport const constructPendingSpaceNode = ({\n id,\n namesCache,\n}: {\n id: string;\n namesCache?: Record<string, string>;\n}): AppGraphNode.NodeArg<null, SpaceNodeProperties> =>\n AppGraphNode.make({\n id,\n type: SpaceSchema.SPACE_TYPE,\n data: null,\n properties: {\n label: namesCache?.[id] ?? PENDING_SPACE_LABEL,\n description: undefined,\n hue: undefined,\n icon: undefined,\n iconHue: undefined,\n disabled: true,\n pending: true,\n disposition: 'workspace',\n testId: 'spacePlugin.space.pending',\n onRearrange: undefined,\n canDrop: undefined,\n },\n });\n\nexport const constructSpaceNode = ({\n space,\n navigable = false,\n namesCache,\n graph,\n spacesOrder,\n}: {\n space: Space;\n navigable?: boolean;\n namesCache?: Record<string, string>;\n graph?: AppGraph.ExpandableGraph;\n spacesOrder?: Obj.Any;\n}): AppGraphNode.NodeArg<Space, SpaceNodeProperties> => {\n const ready = space.state.get() === SpaceState.SPACE_READY;\n const hasPendingMigration = checkPendingMigration(space);\n\n let onRearrange: ((nextOrder: string[]) => void) | undefined;\n if (graph && spacesOrder) {\n onRearrange = spaceRearrangeCache.get(space.id);\n if (!onRearrange) {\n onRearrange = (nextOrder: string[]) => {\n AppGraph.sortEdges(graph, GraphNode.RootId, 'outbound', nextOrder);\n Obj.update(spacesOrder, (spacesOrder: any) => {\n spacesOrder.order = nextOrder;\n });\n };\n spaceRearrangeCache.set(space.id, onRearrange);\n }\n }\n\n return AppGraphNode.make({\n id: space.id,\n type: SpaceSchema.SPACE_TYPE,\n cacheable: AppNode.CACHEABLE_PROPS,\n data: space,\n properties: {\n label: getSpaceDisplayName(space, { namesCache }),\n description: ready ? space.properties.description : undefined,\n hue: ready ? space.properties.hue : undefined,\n icon: ready && space.properties.icon ? `ph--${space.properties.icon}--regular` : undefined,\n iconHue: ready ? space.properties.iconHue : undefined,\n disabled: !navigable || !ready || hasPendingMigration,\n pending: false,\n disposition: 'workspace',\n testId: 'spacePlugin.space',\n onRearrange,\n canDrop: CAN_DROP_SPACE,\n },\n });\n};\n\n/** Builds the action list for a space node (migrate, create object, rename). */\nconst constructSpaceActions = ({ space, migrating }: { space: Space; migrating?: boolean }) => {\n const state = space.state.get();\n const hasPendingMigration = checkPendingMigration(space);\n const isMigrating = migrating || Migrations.running(space);\n\n const cached = spaceActionsCache.get(space.id);\n if (\n cached &&\n cached.state === state &&\n cached.hasPendingMigration === hasPendingMigration &&\n cached.migrating === isMigrating\n ) {\n return cached.actions;\n }\n\n const actions: AppGraphNode.NodeArg<AppGraphNode.ActionData<Operation.Service>>[] = [];\n\n if (hasPendingMigration) {\n actions.push(\n AppGraphNode.make({\n id: SpaceOperation.Migrate.meta.key,\n type: AppGraphNode.ActionGroupType,\n data: () => Operation.invoke(SpaceOperation.Migrate, { space }),\n properties: {\n label: MIGRATE_SPACE_LABEL,\n icon: 'ph--database--regular',\n disposition: 'list-item-primary',\n disabled: isMigrating,\n },\n }),\n );\n }\n\n if (state === SpaceState.SPACE_READY && !hasPendingMigration) {\n actions.push(\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenObjectForm.meta.key,\n data: () => Operation.invoke(SpaceOperation.OpenObjectForm, { target: space.db }),\n properties: {\n label: CREATE_OBJECT_IN_SPACE_LABEL,\n icon: 'ph--plus--regular',\n disposition: 'list-item-primary',\n testId: 'spacePlugin.createObject',\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.Rename.meta.key,\n data: (params?: AppGraphNode.InvokeProps) =>\n Operation.invoke(SpaceOperation.Rename, { space, caller: `${params?.caller}:${params?.parent?.id}` }),\n properties: {\n label: RENAME_SPACE_LABEL,\n icon: 'ph--pencil-simple-line--regular',\n keyBinding: {\n macos: 'shift+F6',\n windows: 'shift+F6',\n },\n },\n }),\n );\n }\n\n spaceActionsCache.set(space.id, { state, hasPendingMigration, migrating: isMigrating, actions });\n return actions;\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Match from 'effect/Match';\nimport * as Option from 'effect/Option';\nimport type * as Atom from 'effect/reactivity/Atom';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport type * as CapabilityManager from '@dxos/app-framework/CapabilityManager';\nimport * as Plugin from '@dxos/app-framework/Plugin';\nimport * as AppGraphBuilder from '@dxos/app-graph/AppGraphBuilder';\nimport * as AppGraphNode from '@dxos/app-graph/AppGraphNode';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\nimport * as AppNode from '@dxos/app-toolkit/AppNode';\nimport * as AppNodeMatcher from '@dxos/app-toolkit/AppNodeMatcher';\nimport * as GraphPath from '@dxos/app-toolkit/GraphPath';\nimport * as LayoutOperation from '@dxos/app-toolkit/LayoutOperation';\nimport * as NavigationOperation from '@dxos/app-toolkit/NavigationOperation';\nimport * as TypeOptions from '@dxos/app-toolkit/TypeOptions';\nimport { type Space, isSpace } from '@dxos/client/echo';\nimport * as Operation from '@dxos/compute/Operation';\nimport { Annotation, Collection, Entity, Filter, Obj, Query, Scope, Type } from '@dxos/echo';\nimport * as EffectEx from '@dxos/effect/EffectEx';\nimport * as ClientCapabilities from '@dxos/plugin-client/ClientCapabilities';\nimport { ViewAnnotation } from '@dxos/schema';\nimport { isLabel, toLocalizedString } from '@dxos/ui-types/translations';\nimport { createFilename, downloadBlob, isNonNullable } from '@dxos/util';\n\nimport { SPACE_STATS_QUERY, typeUrisWithObjects } from '#dashboard';\nimport { meta } from '#meta';\nimport { SpaceCapabilities, SpaceEvents, SpaceOperation } from '#types';\n\nimport { SpaceOperationError } from '../../../operations/errors.ts';\nimport { makeCreateObjectEntryForDatabaseType } from '../../../util/index.ts';\nimport {\n ADD_VIEW_TO_SCHEMA_LABEL,\n DATABASE_SECTION_TYPE,\n SCHEMA_NODE_TYPE,\n SNAPSHOT_BY_SCHEMA_LABEL,\n buildViewIndex,\n} from './shared.ts';\n\n//\n// Extension Factory\n//\n\n/** Creates database extensions: types section, schema nodes, schema children, and schema actions. */\nexport const createDatabaseExtensions = Effect.fnUntraced(function* () {\n const capabilities = yield* Capability.Service;\n const pluginManager = yield* Plugin.Service;\n // Fired from the schema-actions evaluation below, which re-runs reactively; the scheduler\n // short-circuits a dispatch with nothing left to activate, so repeats cost a lookup.\n const requestCreateObjectEntries = () =>\n EffectEx.runDetached(pluginManager.activate(SpaceEvents.CreateObjectRequested));\n\n return yield* Effect.all([\n // System section group — created alongside database/settings so the group always\n // appears when the space plugin is active and hides when there are no children.\n AppGraphBuilder.createExtension({\n id: GraphPath.GroupSegments.system,\n match: AppNodeMatcher.whenSpace,\n connector: (space) =>\n Effect.succeed([\n AppNode.makeGroup({\n id: GraphPath.GroupSegments.system,\n type: GraphPath.GroupTypes.system,\n label: ['nav-tree-group-system.label', { ns: meta.profile.key }],\n icon: 'ph--gear--regular',\n space,\n position: 900,\n }),\n ]),\n }),\n\n // Types section virtual node under the system group.\n AppGraphBuilder.createExtension({\n id: 'databaseSection',\n match: AppNodeMatcher.whenNavTreeGroup(GraphPath.GroupTypes.system),\n connector: (space) => {\n return Effect.succeed([\n AppNode.makeSection({\n id: GraphPath.Segments.database,\n type: DATABASE_SECTION_TYPE,\n label: ['database-section.label', { ns: meta.profile.key }],\n icon: 'ph--database--regular',\n space,\n testId: 'spacePlugin.databaseSection',\n }),\n ]);\n },\n }),\n\n // Schema nodes under the Types virtual node.\n AppGraphBuilder.createExtension({\n id: 'database',\n url: { key: 'type', kind: 'item', path: [GraphPath.GroupSegments.system, GraphPath.Segments.database] },\n match: (node) => {\n const space = isSpace(node.properties.space) ? node.properties.space : undefined;\n return node.type === DATABASE_SECTION_TYPE && space ? Option.some(space) : Option.none();\n },\n connector: (space, get) => {\n // Read settings reactively — same pattern as the translator read below.\n const settingsAtom = get(capabilities.atom(SpaceCapabilities.SettingsAtom)).at(0);\n const showHidden = settingsAtom ? get(settingsAtom).showHidden : false;\n\n // Persisted types live in the space db; static/runtime types live in the shared registry.\n // Fan across both so the space's own types appear without leaking other spaces' types.\n const allSchemas = get(\n space.db.query(Query.select(Filter.type(Type.Type)).from(Scope.space(), Scope.registry())).atom,\n );\n\n const userSchemas = allSchemas.filter((type) => {\n if (!TypeOptions.isUserType(type, { includeHidden: showHidden })) {\n return false;\n }\n if (Type.getTypename(type) === Type.getTypename(Collection.Collection)) {\n return false;\n }\n return true;\n });\n\n const viewIndex = buildViewIndex(get, space, allSchemas);\n // Index-only per-type counts; the same query as the space dashboard, so both share one result.\n const withObjects = typeUrisWithObjects(get(space.db.query(SPACE_STATS_QUERY).atom));\n\n const visibleSchemas = userSchemas.filter((schema) => {\n if (Type.getDatabase(schema) != null) {\n return true;\n }\n const typeUri = Type.getURI(schema);\n if (ViewAnnotation.has(schema)) {\n return viewIndex.typeUrisWithNonViewObjects.has(typeUri);\n }\n return withObjects.has(typeUri) || viewIndex.typeUrisWithViews.has(typeUri);\n });\n\n // Sort alphabetically by display name. Static types' labels are `typename.label` translation\n // keys resolved at render; resolve them here via the Translator capability so the order matches\n // what users see. Resolved reactively inside the connector (not at factory setup) so the\n // capability — contributed during startup by the theme plugin — is present when this runs.\n const translator = get(capabilities.atom(AppCapabilities.Translator)).at(0);\n const labelOf = (node: AppGraphNode.NodeArg<Type.AnyEntity>): string => {\n const label = node.properties?.label;\n if (translator && isLabel(label)) {\n return toLocalizedString(label, translator.t);\n }\n return node.data ? Type.getTypename(node.data) : '';\n };\n\n return Effect.succeed(\n visibleSchemas\n .map((schema) => createSchemaNode({ schema, space, get }))\n .toSorted((nodeA, nodeB) => labelOf(nodeA).localeCompare(labelOf(nodeB))),\n );\n },\n }),\n\n // {All} virtual node + view objects under each schema node.\n AppGraphBuilder.createExtension({\n id: 'schemaChildren',\n // Shares `db` with `databaseObjects`: whether an object is a view is data, not shape.\n url: {\n key: 'db',\n kind: 'item',\n path: [GraphPath.GroupSegments.system, GraphPath.Segments.database],\n minDepth: 2,\n },\n match: (node) => {\n const space = isSpace(node.properties.space) ? node.properties.space : undefined;\n // Scoped to the Database section's own type nodes (both static and database schemas — see\n // SCHEMA_NODE_TYPE): other plugins' type nodes (e.g. plugin-crm's virtual type nodes) share the\n // `Type.isType(node.data)` shape but should stay leaf nodes for now.\n return node.type === SCHEMA_NODE_TYPE && space && Type.isType(node.data)\n ? Option.some({ space, schema: node.data })\n : Option.none();\n },\n connector: ({ space, schema }, get) => {\n const client = get(capabilities.atom(ClientCapabilities.Client)).at(0);\n const schemas = client ? get(client.graph.registry.query(Filter.type(Type.Type)).atom) : [];\n const typeUri = Type.getURI(schema);\n\n // View objects are the type node's only visible children; every object of the type (viewed\n // or not) is also reachable via the `databaseObjects` extension below, keyed generically as\n // `obj`. The list of all objects is rendered when the type node is selected (see TypeArticle).\n const viewIndex = buildViewIndex(get, space, schemas);\n const viewNodes = viewIndex\n .getViewsForTypeUri(typeUri)\n .map((object: Obj.Unknown) =>\n AppNode.makeObject({\n get,\n db: space.db,\n object,\n draggable: false,\n droppable: false,\n }),\n )\n .filter(isNonNullable);\n\n return Effect.succeed(viewNodes);\n },\n }),\n\n // Every object of a type — not just its views — as a hidden child of its type node, so\n // `…/database/<slug>/<objectId>` resolves via the generic `db` key even when the type has no\n // dedicated section of its own. Disjoint from `schemaChildren`'s view nodes (`viewIndex.isView`\n // excludes them) so the two connectors never emit a node with the same id under the same parent.\n // The `db` key names the database subgraph — the generic key that guarantees every ECHO object a\n // URL (see the design's \"Unmapped nodes\"); `object` addresses the same object via the collection\n // subgraph.\n AppGraphBuilder.createExtension({\n id: 'databaseObjects',\n url: {\n key: 'db',\n kind: 'item',\n path: [GraphPath.GroupSegments.system, GraphPath.Segments.database],\n minDepth: 2,\n },\n match: (node) => {\n const space = isSpace(node.properties.space) ? node.properties.space : undefined;\n return node.type === SCHEMA_NODE_TYPE && space && Type.isType(node.data)\n ? Option.some({ space, schema: node.data })\n : Option.none();\n },\n connector: ({ space, schema }, get) => {\n const client = get(capabilities.atom(ClientCapabilities.Client)).at(0);\n const schemas = client ? get(client.graph.registry.query(Filter.type(Type.Type)).atom) : [];\n const typeUri = Type.getURI(schema);\n const viewIndex = buildViewIndex(get, space, schemas);\n\n // Feed-only objects (e.g. games appended via Feed.append) are not in the Automerge graph;\n // includeFeeds resolves them too.\n const objects = get(\n space.db.query(Query.select(Filter.type(typeUri)).from(space.db, { includeFeeds: true })).atom,\n );\n\n return Effect.succeed(\n objects\n .filter((object) => !viewIndex.isView(object))\n .map((object) =>\n AppNode.makeObject({\n get,\n db: space.db,\n object,\n disposition: 'hidden',\n draggable: false,\n droppable: false,\n }),\n )\n .filter(isNonNullable),\n );\n },\n }),\n\n // Actions for schema nodes.\n AppGraphBuilder.createExtension({\n id: 'schemaActions',\n match: (node) => {\n const space = isSpace(node.properties.space) ? node.properties.space : undefined;\n return space && Type.isType(node.data) ? Option.some({ space, schema: node.data }) : Option.none();\n },\n actions: ({ space, schema }, get) => {\n const client = get(capabilities.atom(ClientCapabilities.Client)).at(0);\n const schemas = client ? get(client.graph.registry.query(Filter.type(Type.Type)).atom) : [];\n\n const targetUri = Type.getURI(schema);\n const viewIndex = buildViewIndex(get, space, schemas);\n const deletable = Type.getDatabase(schema) != null && viewIndex.getViewsForTypeUri(targetUri).length === 0;\n\n // Tracked read (not a one-shot `getAll`): entry providers may be policy-parked, and the\n // computed actions must refresh when their contributions arrive. Evaluating a schema\n // node's actions is itself a create-flow demand signal, so fire it (outside the reactive\n // computation) to pull the parked providers.\n const createEntries = get(capabilities.atom(SpaceCapabilities.CreateObjectEntry));\n queueMicrotask(() => requestCreateObjectEntries());\n\n return Effect.succeed(createSchemaActions({ type: schema, space, deletable, capabilities, createEntries }));\n },\n }),\n ]);\n});\n\n//\n// Helpers\n//\n\n/** Returns schemas keyed uniquely by typename, preferring later entries. */\nconst uniqueSchemasByTypename = <TSchema extends Type.AnyEntity>(schemas: TSchema[]): TSchema[] => {\n const uniqueSchemas = new Map<string, TSchema>();\n for (const schema of schemas) {\n uniqueSchemas.set(Type.getTypename(schema), schema);\n }\n\n return [...uniqueSchemas.values()];\n};\n\n/** Builds a graph node for a schema in the Types subtree. */\nconst createSchemaNode = ({\n schema,\n space,\n get,\n}: {\n schema: Type.AnyEntity;\n space: Space;\n get: Atom.AtomContext;\n}): AppGraphNode.NodeArg<Type.AnyEntity> => {\n const typename = Type.getTypename(schema);\n // The node id doubles as the `types/<slug>` path segment, so it must be slash- and colon-free:\n // a stored schema's entity id, or a static schema's typename.\n const slug = GraphPath.getTypeSlug(schema);\n const iconAnnotation =\n Type.getDatabase(schema) == null\n ? Option.getOrUndefined(Annotation.IconAnnotation.get(Type.getSchema(schema)))\n : undefined;\n const { label, nodeId } = Match.value(schema).pipe(\n Match.when(\n (value: Type.AnyEntity) => Type.getDatabase(value) != null,\n (mutableSchema) => {\n // Type.AnyEntity has KindId=Type at the type level but is a valid ECHO entity at runtime.\n const snapshot = get(Entity.atom(mutableSchema as unknown as Entity.Unknown));\n return {\n label: (snapshot as { name?: string }).name || [\n 'object-name.placeholder',\n { ns: Type.getTypename(Type.Type) },\n ],\n nodeId: slug,\n };\n },\n ),\n Match.orElse(() => ({\n label: AppNode.getDynamicLabel('typename.label', typename, { count: 2, defaultValue: typename }),\n nodeId: slug,\n })),\n );\n const icon =\n Type.getDatabase(schema) != null ? 'ph--cube--regular' : (iconAnnotation?.icon ?? 'ph--circle-dashed--regular');\n const iconHue = Type.getDatabase(schema) != null ? 'neutral' : iconAnnotation?.hue;\n return AppGraphNode.make({\n id: nodeId,\n type: SCHEMA_NODE_TYPE,\n data: schema,\n properties: {\n label,\n icon,\n iconHue,\n // Selecting the type node opens a list of every object of this type (see TypeArticle);\n // objects resolve on demand as hidden children. View objects are its only visible children, so\n // without a view the node is a leaf (no `role: 'branch'`).\n testId: `spacePlugin.schemaNode.${typename}`,\n selectable: true,\n draggable: false,\n droppable: false,\n childrenDroppable: false,\n space,\n },\n });\n};\n\n/** Builds schema actions (add view, rename, delete, snapshot). */\nconst createSchemaActions = ({\n type,\n space,\n deletable,\n capabilities,\n createEntries,\n}: {\n type: Type.AnyEntity;\n space: Space;\n deletable: boolean;\n capabilities: CapabilityManager.CapabilityManager;\n createEntries: readonly SpaceCapabilities.CreateObjectEntry[];\n}) => {\n const typename = Type.getTypename(type);\n const createEntry = createEntries.find((entry: SpaceCapabilities.CreateObjectEntry) => entry.id === typename);\n\n // For database-persisted object schemas without a dedicated capability, synthesize a generic entry.\n const resolvedEntry: SpaceCapabilities.CreateObjectEntry | undefined =\n createEntry ??\n (Type.getDatabase(type) != null && Type.isObject(type) ? makeCreateObjectEntryForDatabaseType(type) : undefined);\n const createObjectFn = resolvedEntry?.createObject;\n const inputSchema = resolvedEntry?.inputSchema;\n\n const actions: AppGraphNode.NodeArg<AppGraphNode.ActionData<Operation.Service>>[] = [\n ...(createObjectFn\n ? [\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenObjectForm.meta.key,\n data: Effect.fnUntraced(function* () {\n if (inputSchema) {\n yield* Operation.invoke(SpaceOperation.OpenObjectForm, {\n target: space.db,\n typename,\n });\n } else {\n const result = yield* createObjectFn({}, { db: space.db }).pipe(\n Effect.provideService(Capability.Service, capabilities),\n );\n // Nothing to navigate to when the create only starts the work and the object\n // arrives out of band (see `CreateObjectResult.object`).\n if (result.object) {\n const { targets } = yield* Operation.invoke(NavigationOperation.ResolveNavigationTargets, {\n query: { uri: Obj.getURI(result.object) },\n });\n const navigationTarget = targets[0];\n if (navigationTarget) {\n yield* Operation.invoke(LayoutOperation.Open, {\n subject: [navigationTarget.path],\n navigation: 'immediate',\n });\n }\n }\n }\n }),\n properties: {\n // Static plugin types carry a per-typename `add-object.label` (e.g. \"Add event\");\n // database types have no such namespace, so fall back to the plugin's generic label.\n label: AppNode.getDynamicLabel(\n 'add-object.label',\n Type.getDatabase(type) != null ? meta.profile.key : typename,\n ),\n icon: 'ph--plus--regular',\n disposition: 'list-item-primary',\n testId: 'spacePlugin.createObject',\n },\n }),\n ]\n : []),\n AppGraphNode.makeAction({\n id: `${SpaceOperation.AddObject.meta.key}-view`,\n data: () =>\n Operation.invoke(SpaceOperation.OpenObjectForm, {\n target: space.db,\n views: true,\n // The type-picker field value is the type URI (see TypeOptions), so seed the default with\n // the URI — not the bare typename — for the option to be pre-selected.\n defaults: { typename: Type.getURI(type) },\n }),\n properties: {\n label: ADD_VIEW_TO_SCHEMA_LABEL,\n icon: 'ph--circles-three-plus--regular',\n disposition: 'list-item',\n testId: 'spacePlugin.addViewToSchema',\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.RenameObject.meta.key,\n data: (params?: AppGraphNode.InvokeProps) =>\n Type.getDatabase(type) != null\n ? Operation.invoke(SpaceOperation.RenameObject, {\n object: type,\n caller: `${params?.caller}:${params?.parent?.id}`,\n })\n : Effect.fail(new SpaceOperationError({ message: 'Cannot rename immutable schema' })),\n properties: {\n label: AppNode.getDynamicLabel('rename-object.label', Type.getTypename(Type.Type)),\n icon: 'ph--pencil-simple-line--regular',\n disabled: Type.getDatabase(type) == null,\n disposition: 'list-item',\n testId: 'spacePlugin.renameObject',\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.RemoveObjects.meta.key,\n data: () =>\n Type.getDatabase(type) != null\n ? Operation.invoke(\n SpaceOperation.RemoveObjects,\n { objects: [type] },\n { spaceId: Type.getDatabase(type)?.spaceId },\n )\n : Effect.succeed(undefined),\n properties: {\n label: AppNode.getDynamicLabel('delete-object.label', Type.getTypename(Type.Type)),\n icon: 'ph--trash--regular',\n disposition: 'list-item',\n disabled: !deletable,\n testId: 'spacePlugin.deleteObject',\n },\n }),\n AppGraphNode.makeAction({\n id: SpaceOperation.Snapshot.meta.key,\n data: Effect.fnUntraced(function* () {\n const result = yield* Operation.invoke(SpaceOperation.Snapshot, {\n db: space.db,\n query: Query.select(Filter.type(type)).ast,\n });\n if (result.snapshot) {\n yield* Effect.tryPromise(() =>\n downloadBlob(result.snapshot, createFilename({ parts: [space.id, Type.getTypename(type)], ext: 'json' })),\n );\n }\n }),\n properties: {\n label: SNAPSHOT_BY_SCHEMA_LABEL,\n icon: 'ph--camera--regular',\n disposition: 'list-item',\n },\n }),\n ];\n\n return actions;\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\nimport type * as Atom from 'effect/reactivity/Atom';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as AppGraphBuilder from '@dxos/app-graph/AppGraphBuilder';\nimport * as AppGraphNode from '@dxos/app-graph/AppGraphNode';\nimport * as AppAnnotation from '@dxos/app-toolkit/AppAnnotation';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\nimport * as AppNode from '@dxos/app-toolkit/AppNode';\nimport * as AppNodeMatcher from '@dxos/app-toolkit/AppNodeMatcher';\nimport * as CollectionOperation from '@dxos/app-toolkit/CollectionOperation';\nimport * as ContainerModel from '@dxos/app-toolkit/ContainerModel';\nimport * as GraphPath from '@dxos/app-toolkit/GraphPath';\nimport * as LayoutOperation from '@dxos/app-toolkit/LayoutOperation';\nimport * as NavigationOperation from '@dxos/app-toolkit/NavigationOperation';\nimport * as TypeOptions from '@dxos/app-toolkit/TypeOptions';\nimport * as UrlPath from '@dxos/app-toolkit/UrlPath';\nimport * as UrlResolution from '@dxos/app-toolkit/UrlResolution';\nimport { isSpace } from '@dxos/client/echo';\nimport * as Operation from '@dxos/compute/Operation';\nimport { Annotation, Collection, Database, type Entity, Obj, Ref, Type } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { SpaceId } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport * as ClientCapabilities from '@dxos/plugin-client/ClientCapabilities';\nimport { ArchivedAnnotation, isArchivable } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport { meta } from '#meta';\nimport { SpaceCapabilities, SpaceOperation } from '#types';\n\nimport { resolveCollectionObjectPath } from '../../../util/index.ts';\nimport {\n ADD_TO_COLLECTION_LABEL,\n ARCHIVE_OBJECT_LABEL,\n COLLECTIONS_SECTION_TYPE,\n COPY_LINK_LABEL,\n CREATE_OBJECT_IN_COLLECTION_LABEL,\n EXPOSE_OBJECT_LABEL,\n REMOVE_FROM_COLLECTION_LABEL,\n SHOW_ORIGINAL_LABEL,\n UNARCHIVE_OBJECT_LABEL,\n} from './shared.ts';\n\n//\n// Extension Factory\n//\n\n/** Creates collection-related extensions: collections section, collections, objects, and object actions. */\n\n/**\n * Typenames available in this build — schemas registered by enabled plugins, plus those stored in the\n * space — so the tree can omit an object whose type has no article rather than offer a row that opens\n * nothing.\n *\n * TODO(wittjosiah): Name the plugin that would render the object instead of hiding it.\n */\nconst getAvailableTypenames = (types: readonly Entity.Unknown[]): ReadonlySet<string> =>\n new Set(\n types\n .filter(Type.isType)\n .map((type) => Type.getTypename(type))\n .filter(isNonNullable),\n );\n\nconst isTypeAvailable = (typenames: ReadonlySet<string>, object: Obj.Unknown): boolean => {\n const typename = Obj.getTypename(object);\n // No typename at all is not an unavailable type — leave those to the renderers.\n return !typename || typenames.has(typename);\n};\n\n/** A collection's members in its order, omitting deleted and archived objects. */\nconst getMembers = (get: Atom.AtomContext, refs: readonly Ref.Ref<Obj.Unknown>[]): Obj.Unknown[] =>\n get(Obj.atomReactive(refs)).filter(\n (object) => !Option.getOrElse(get(Annotation.atom(object, ArchivedAnnotation)), () => false),\n );\n\nexport const createCollectionExtensions = Effect.fnUntraced(function* ({\n shareableLinkOrigin,\n}: {\n shareableLinkOrigin: string;\n}) {\n const capabilities = yield* Capability.Service;\n // Hoisted so connector/action bodies read reactively via `get(...)` instead of a sync\n // `Capability.get`, establishing a dependency that heals once the capability lands.\n const ephemeralCapAtom = yield* Capability.atom(SpaceCapabilities.EphemeralState);\n\n return yield* Effect.all([\n // Content section group — created alongside collections so the group always\n // appears when the space plugin is active and hides when there are no children.\n AppGraphBuilder.createExtension({\n id: GraphPath.GroupSegments.content,\n match: AppNodeMatcher.whenSpace,\n connector: (space) =>\n Effect.succeed([\n AppNode.makeGroup({\n id: GraphPath.GroupSegments.content,\n type: GraphPath.GroupTypes.content,\n label: ['nav-tree-group-content.label', { ns: meta.profile.key }],\n icon: 'ph--files--regular',\n space,\n position: 200,\n }),\n ]),\n }),\n\n // Collections section virtual node under the content group.\n AppGraphBuilder.createExtension({\n id: 'collectionsSection',\n match: AppNodeMatcher.whenNavTreeGroup(GraphPath.GroupTypes.content),\n connector: (space, get) => {\n get(Obj.atom(space.properties));\n const collectionRef = Annotation.get(space.properties, AppAnnotation.RootCollectionAnnotation).pipe(\n Option.getOrUndefined,\n );\n if (collectionRef) {\n get(Obj.atom(collectionRef));\n }\n const rootCollection = collectionRef?.target;\n const collectionPartials = rootCollection\n ? AppNode.getListPartials(ContainerModel.collection(rootCollection), space.db)\n : undefined;\n\n return Effect.succeed([\n AppGraphNode.make({\n id: GraphPath.Segments.collections,\n type: COLLECTIONS_SECTION_TYPE,\n data: null,\n properties: {\n label: ['collections-section.label', { ns: meta.profile.key }],\n icon: 'ph--folder--regular',\n iconHue: 'indigo',\n role: 'branch',\n testId: 'spacePlugin.collectionsSection',\n draggable: false,\n droppable: false,\n space,\n ...collectionPartials,\n },\n }),\n ]);\n },\n }),\n\n // Root collection objects under the Collections virtual node. Shares the `object` urlKey with the\n // nested-collection `objects` connector below so an object is addressed the same way wherever it\n // sits in the collection tree (the key names the *collection subgraph*, not the container's type;\n // the database subgraph addresses the same object under `db`).\n AppGraphBuilder.createExtension({\n id: 'collections',\n url: { key: 'object', kind: 'item', path: [GraphPath.GroupSegments.content, GraphPath.Segments.collections] },\n match: (node) => {\n const space = isSpace(node.properties.space) ? node.properties.space : undefined;\n return node.type === COLLECTIONS_SECTION_TYPE && space ? Option.some(space) : Option.none();\n },\n connector: (space, get) => {\n const [ephemeralAtom] = get(ephemeralCapAtom);\n if (!ephemeralAtom) {\n return Effect.succeed([]);\n }\n const ephemeralState = get(ephemeralAtom);\n\n get(Obj.atom(space.properties));\n const collectionRef = Annotation.get(space.properties, AppAnnotation.RootCollectionAnnotation).pipe(\n Option.getOrUndefined,\n );\n const refs = collectionRef ? get(Obj.atomProperty(collectionRef, 'objects')) : undefined;\n if (!refs) {\n return Effect.succeed([]);\n }\n\n const available = getAvailableTypenames(get(space.db.query(TypeOptions.allTypesQuery).atom));\n const objects = getMembers(get, refs).filter((object) => isTypeAvailable(available, object));\n\n return Effect.succeed(\n objects\n .map((object: Obj.Unknown) =>\n AppNode.makeObject({\n get,\n db: space.db,\n object,\n navigable: true,\n }),\n )\n .filter(isNonNullable),\n );\n },\n }),\n\n // Children of Collection.Collection nodes.\n AppGraphBuilder.createExtension({\n id: 'objects',\n // Recursive over nested collections at any depth, so `object/<id>` addresses any object reachable\n // through a space's collection tree, not just the root collection's direct children. The shape is\n // data-dependent (the object's collection ancestry), so the id is the object's own segment and\n // `resolve` finds the rest — see `resolveCollectionObjectPath`.\n url: {\n key: 'object',\n kind: 'item',\n path: [GraphPath.GroupSegments.content, GraphPath.Segments.collections],\n resolve: ({ id, workspace }) =>\n Effect.gen(function* () {\n if (!SpaceId.isValid(workspace)) {\n return null;\n }\n // Look the Client up lazily (at resolve time) rather than at graph-setup time — it is not yet\n // available when the AppGraphBuilder activates, and forward resolution only runs much later.\n const client = capabilities.get(ClientCapabilities.Client);\n const space = client.spaces.get(workspace);\n if (!space) {\n return null;\n }\n const path = yield* resolveCollectionObjectPath({ objectId: id }).pipe(\n Effect.provide(Database.layer(space.db)),\n );\n return path ?? null;\n }),\n },\n match: (node) => (Obj.instanceOf(Collection.Collection, node.data) ? Option.some(node.data) : Option.none()),\n connector: (collection, get) => {\n const [ephemeralAtom] = get(ephemeralCapAtom);\n if (!ephemeralAtom) {\n return Effect.succeed([]);\n }\n const ephemeralState = get(ephemeralAtom);\n const db = Obj.getDatabase(collection);\n\n const available = db ? getAvailableTypenames(get(db.query(TypeOptions.allTypesQuery).atom)) : undefined;\n const objects = getMembers(get, get(Obj.atomProperty(collection, 'objects'))).filter(\n (object) => !available || isTypeAvailable(available, object),\n );\n\n return Effect.succeed(\n objects\n .map(\n (object: Obj.Unknown) =>\n db &&\n AppNode.makeObject({\n get,\n object,\n db,\n navigable: true,\n }),\n )\n .filter(isNonNullable),\n );\n },\n }),\n\n // Object actions.\n AppGraphBuilder.createExtension({\n id: 'objectActions',\n match: (node) => {\n return node.data != null &&\n Obj.getDatabase(node.data) &&\n Obj.isObject(node.data) &&\n Obj.getTypename(node.data) === node.type\n ? Option.some({ object: node.data, nodeId: node.id })\n : Option.none();\n },\n actions: ({ object, nodeId }, get) => {\n const deletable = !Type.isType(object);\n\n const [appGraph] = get(capabilities.atom(AppCapabilities.AppGraph));\n const [ephemeralAtom] = get(ephemeralCapAtom);\n\n if (!appGraph || !ephemeralAtom) {\n return Effect.succeed([]);\n }\n const ephemeralState = get(ephemeralAtom);\n\n const parentId = nodeId.substring(0, nodeId.lastIndexOf('/'));\n const container = AppNode.getListOf(Option.getOrUndefined(get(appGraph.graph.node(parentId))));\n\n return Effect.succeed(\n constructObjectActions({\n object,\n nodeId,\n deletable,\n navigable: ephemeralState.navigableCollections,\n shareableLinkOrigin,\n container,\n parent: container ? get(Obj.parentAtom(object)) : undefined,\n archived: isArchivable(object)\n ? Option.getOrElse(get(Annotation.atom(object, ArchivedAnnotation)), () => false)\n : undefined,\n }),\n );\n },\n }),\n\n // Action on the collections section header to add an object to the space's root collection.\n AppGraphBuilder.createExtension({\n id: 'collectionsSectionActions',\n match: (node) => {\n const space = isSpace(node.properties.space) ? node.properties.space : undefined;\n return node.type === COLLECTIONS_SECTION_TYPE && space ? Option.some(space) : Option.none();\n },\n actions: (space) =>\n Effect.succeed([\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenObjectForm.meta.key,\n data: () =>\n Effect.gen(function* () {\n // Target the root collection so the create dialog offers collection-eligible types, like\n // any other collection; fall back to the space db if it hasn't been created yet.\n const rootCollection = Annotation.get(space.properties, AppAnnotation.RootCollectionAnnotation).pipe(\n Option.getOrUndefined,\n )?.target;\n yield* Operation.invoke(SpaceOperation.OpenObjectForm, {\n // Qualified id of the collections section node (root/<spaceId>/collections), so the new\n // object's navigation path resolves under the section — the bare segment would not.\n target: rootCollection ?? space.db,\n targetNodeId: GraphPath.getCollectionsPath(space.id),\n });\n }),\n properties: {\n label: CREATE_OBJECT_IN_COLLECTION_LABEL,\n icon: 'ph--plus--regular',\n disposition: 'list-item-primary',\n testId: 'spacePlugin.createObject',\n },\n }),\n ]),\n }),\n ]);\n});\n\n/** Builds the action list for an ECHO object node. */\nconst constructObjectActions = ({\n object,\n nodeId,\n deletable = true,\n navigable = false,\n shareableLinkOrigin,\n container,\n parent,\n archived,\n}: {\n object: Obj.Unknown;\n nodeId: string;\n shareableLinkOrigin: string;\n deletable?: boolean;\n navigable?: boolean;\n container?: ContainerModel.Container;\n parent?: Obj.Unknown;\n /** Current archive state; undefined when the object's type is not archivable. */\n archived?: boolean;\n}) => {\n const db = Obj.getDatabase(object);\n invariant(db, 'Database not found');\n const typename = Obj.getTypename(object);\n invariant(typename, 'Object has no typename');\n const linkedFrom = container && ContainerModel.isLink(container, parent) ? container : undefined;\n const parentCollection =\n container && Obj.instanceOf(Collection.Collection, container.object) ? container.object : undefined;\n\n const actions: AppGraphNode.NodeArg<AppGraphNode.ActionData<Operation.Service | Capability.Service>>[] = [\n ...(Obj.instanceOf(Collection.Collection, object)\n ? [\n AppGraphNode.makeAction({\n id: SpaceOperation.OpenObjectForm.meta.key,\n data: () => Operation.invoke(SpaceOperation.OpenObjectForm, { target: object, targetNodeId: nodeId }),\n properties: {\n label: CREATE_OBJECT_IN_COLLECTION_LABEL,\n icon: 'ph--plus--regular',\n disposition: 'list-item-primary',\n testId: 'spacePlugin.createObject',\n },\n }),\n ]\n : []),\n AppGraphNode.makeAction({\n id: SpaceOperation.RenameObject.meta.key,\n data: (params?: AppGraphNode.InvokeProps) =>\n Operation.invoke(SpaceOperation.RenameObject, { object, caller: `${params?.caller}:${params?.parent?.id}` }),\n properties: {\n label: AppNode.getDynamicLabel('rename-object.label', typename, { defaultValue: 'Rename' }),\n icon: 'ph--pencil-simple-line--regular',\n disposition: 'list-item',\n testId: 'spacePlugin.renameObject',\n },\n }),\n ...(container\n ? [\n AppGraphNode.makeAction({\n id: 'removeFromContainer',\n data: () => Effect.sync(() => ContainerModel.release({ container, object })),\n properties: {\n label: container.removeLabel ?? REMOVE_FROM_COLLECTION_LABEL,\n icon: 'ph--minus-circle--regular',\n disposition: 'list-item',\n testId: 'spacePlugin.removeFromContainer',\n },\n }),\n ]\n : []),\n ...(linkedFrom\n ? [\n AppGraphNode.makeAction({\n id: 'showOriginal',\n data: () =>\n Effect.gen(function* () {\n const { targets } = yield* Operation.invoke(NavigationOperation.ResolveNavigationTargets, {\n query: { uri: Obj.getURI(object) },\n });\n const target = targets[0];\n if (target) {\n yield* Operation.invoke(LayoutOperation.Open, { subject: [target.path], navigation: 'immediate' });\n }\n }),\n properties: {\n label: SHOW_ORIGINAL_LABEL,\n icon: 'ph--arrow-square-out--regular',\n disposition: 'list-item',\n testId: 'spacePlugin.showOriginal',\n },\n }),\n ]\n : [\n AppGraphNode.makeAction({\n id: SpaceOperation.RemoveObjects.meta.key,\n data: () =>\n Operation.invoke(\n SpaceOperation.RemoveObjects,\n { objects: [object], target: parentCollection },\n { spaceId: Obj.getDatabase(object)?.spaceId },\n ),\n properties: {\n label: AppNode.getDynamicLabel('delete-object.label', typename, { defaultValue: 'Delete' }),\n icon: 'ph--trash--regular',\n disposition: 'list-item',\n disabled: !deletable,\n testId: 'spacePlugin.deleteObject',\n },\n }),\n ]),\n ...(TypeOptions.isUserObject(object)\n ? [\n AppGraphNode.makeAction({\n id: CollectionOperation.OpenAddToCollection.meta.key,\n data: () => Operation.invoke(CollectionOperation.OpenAddToCollection, { object }),\n properties: {\n label: ADD_TO_COLLECTION_LABEL,\n icon: CollectionOperation.OpenAddToCollection.meta.icon,\n disposition: 'list-item',\n testId: 'spacePlugin.addToCollection',\n },\n }),\n ]\n : []),\n ...(archived !== undefined\n ? [\n AppGraphNode.makeAction({\n id: SpaceOperation.SetArchived.meta.key,\n data: () => Operation.invoke(SpaceOperation.SetArchived, { objects: [object], archived: !archived }),\n properties: {\n label: archived ? UNARCHIVE_OBJECT_LABEL : ARCHIVE_OBJECT_LABEL,\n icon: archived ? 'ph--tray-arrow-up--regular' : 'ph--archive--regular',\n disposition: 'list-item',\n testId: archived ? 'spacePlugin.unarchiveObject' : 'spacePlugin.archiveObject',\n },\n }),\n ]\n : []),\n ...(navigable || !Obj.instanceOf(Collection.Collection, object)\n ? [\n AppGraphNode.makeAction({\n id: 'copyLink',\n data: () =>\n Effect.gen(function* () {\n const builder = yield* Capability.get(AppCapabilities.AppGraph);\n const path = UrlResolution.getShareableLinkPath(builder, nodeId);\n if (Option.isNone(path)) {\n log.warn('object has no URL representation; cannot copy link', { nodeId });\n return;\n }\n // The title lets the Composer Worker give the link a named preview in messengers.\n const url = UrlPath.withTitle(new URL(path.value, shareableLinkOrigin), Obj.getLabel(object));\n yield* Effect.promise(() => navigator.clipboard.writeText(url.toString()));\n }),\n properties: {\n label: COPY_LINK_LABEL,\n icon: 'ph--link--regular',\n disposition: 'list-item',\n testId: 'spacePlugin.copyLink',\n },\n }),\n ]\n : []),\n AppGraphNode.makeAction({\n id: LayoutOperation.Expose.meta.key,\n data: () => Operation.invoke(LayoutOperation.Expose, { subject: GraphPath.getObjectPathFromObject(object) }),\n properties: {\n label: EXPOSE_OBJECT_LABEL,\n icon: 'ph--eye--regular',\n disposition: 'heading-list-item',\n testId: 'spacePlugin.exposeObject',\n },\n }),\n ];\n\n return actions;\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\n\nimport * as AppGraphBuilder from '@dxos/app-graph/AppGraphBuilder';\nimport * as AppNode from '@dxos/app-toolkit/AppNode';\nimport * as AppNodeMatcher from '@dxos/app-toolkit/AppNodeMatcher';\nimport { Obj, Type } from '@dxos/echo';\nimport type { EchoViewRefPath } from '@dxos/schema';\nimport { ViewAnnotation } from '@dxos/schema';\nimport * as Position from '@dxos/util/Position';\n\nimport { meta } from '#meta';\n\n//\n// Extension Factory\n//\n\n/** Creates companion panel extensions: object settings, related, and selected-objects. */\n// NOTE: Explicit annotation required: d.ts emit cannot portably name the inferred @dxos/plugin-graph types (TS2883).\nexport const createCompanionExtensions: () => Effect.Effect<AppGraphBuilder.BuilderExtension[][]> = Effect.fnUntraced(\n function* () {\n return yield* Effect.all([\n // Object settings plank companion.\n AppGraphBuilder.createExtension({\n id: 'settings',\n relation: AppNode.companion,\n match: AppNodeMatcher.whenEchoObjectMatches,\n connector: (node) =>\n Effect.succeed([\n AppNode.makeCompanion({\n variant: 'settings',\n label: ['object-properties.label', { ns: meta.profile.key }],\n icon: 'ph--sliders--regular',\n data: 'settings', // TODO(burdon): Change to 'object-properties'.\n position: Position.last,\n }),\n ]),\n }),\n\n // Related objects plank companion.\n AppGraphBuilder.createExtension({\n id: 'related',\n relation: AppNode.companion,\n match: AppNodeMatcher.whenEchoObjectMatches,\n connector: (node) =>\n Effect.succeed([\n AppNode.makeCompanion({\n variant: 'related',\n label: ['companion-related.label', { ns: meta.profile.key }],\n icon: 'ph--graph--regular',\n data: 'related',\n position: Position.last,\n }),\n ]),\n }),\n\n // View selected objects companion.\n AppGraphBuilder.createExtension({\n id: 'selectedObjects',\n relation: AppNode.companion,\n match: (node) => {\n // Type/schema node (e.g. a TypeArticle plank): the table's own row selection feeds this\n // companion directly, no view lookup needed.\n if (Type.isType(node.data)) {\n return Option.some(node);\n }\n\n if (!Obj.isObject(node.data)) {\n return Option.none();\n }\n\n const type = Obj.getType(node.data);\n const path = type\n ? ViewAnnotation.get(Type.getSchema(type)).pipe(Option.getOrElse(() => [] as EchoViewRefPath))\n : [];\n const isEchoViewBacked = type && path.length > 0 ? ViewAnnotation.hasRefAlongPath(node.data, path) : false;\n\n if (!isEchoViewBacked) {\n return Option.none();\n }\n\n return Option.some(node);\n },\n connector: (node) =>\n Effect.succeed([\n AppNode.makeCompanion({\n variant: 'selected-objects',\n label: ['companion-selected-objects.label', { ns: meta.profile.key }],\n icon: 'ph--tree-view--regular',\n data: 'selected-objects',\n }),\n ]),\n }),\n ]);\n },\n);\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport * as AppGraphBuilder from '@dxos/app-graph/AppGraphBuilder';\nimport * as AppGraphNode from '@dxos/app-graph/AppGraphNode';\nimport * as AppNode from '@dxos/app-toolkit/AppNode';\nimport * as AppNodeMatcher from '@dxos/app-toolkit/AppNodeMatcher';\nimport { MembershipPolicy } from '@dxos/protocols/buf/dxos/halo/credentials_pb';\nimport * as Position from '@dxos/util/Position';\n\nimport { meta } from '#meta';\nimport { SpaceSchema } from '#types';\n\n//\n// Extension Factory\n//\n\n/**\n * Settings section attached directly under each Space node, plus its children.\n *\n * The virtual `settings` section is pinned to the top via `position: Position.first`\n * so it sits above the un-positioned middle band (collections, mailboxes,\n * automations, integrations, etc.). It groups the panels contributed by this\n * plugin (general, members) and by other plugins (automation, functions).\n */\nexport const createSettingsExtensions = Effect.fnUntraced(function* () {\n const sectionExtension = yield* AppGraphBuilder.createExtension({\n id: 'settingsSection',\n match: AppNodeMatcher.whenSpace,\n connector: (space) =>\n Effect.succeed([\n AppNode.makeSection({\n id: SpaceSchema.SETTINGS_SECTION_ID,\n type: SpaceSchema.SETTINGS_SECTION_TYPE,\n label: ['settings-section.label', { ns: meta.profile.key }],\n icon: 'ph--sliders--regular',\n iconHue: 'emerald',\n space,\n position: Position.first,\n testId: 'spacePlugin.settings',\n }),\n ]),\n });\n\n // General and Members are separate extensions rather than one so each can be an id-less key (a single\n // id-less key can address only one fixed node — its terminal segment IS the key).\n const generalExtension = yield* AppGraphBuilder.createExtension({\n id: 'settingsGeneral',\n url: { key: 'settings', kind: 'singleton', path: [SpaceSchema.SETTINGS_SECTION_ID] },\n match: AppNodeMatcher.whenSpaceSettings,\n connector: (space) =>\n Effect.succeed([\n AppGraphNode.make({\n id: 'settings',\n type: `${meta.profile.key}.general`,\n data: `${meta.profile.key}.general`,\n properties: {\n label: ['space-settings-properties.label', { ns: meta.profile.key }],\n icon: 'ph--brackets-curly--regular',\n iconHue: 'emerald',\n space,\n position: Position.first,\n testId: 'spacePlugin.general',\n },\n }),\n ]),\n });\n\n const membersExtension = yield* AppGraphBuilder.createExtension({\n id: 'settingsMembers',\n url: { key: 'members', kind: 'singleton', path: [SpaceSchema.SETTINGS_SECTION_ID] },\n match: AppNodeMatcher.whenSpaceSettings,\n // A private space is locked at genesis and can never admit members, so it has nothing to manage.\n connector: (space) =>\n Effect.succeed(\n space.membershipPolicy === MembershipPolicy.LOCKED\n ? []\n : [\n AppGraphNode.make({\n id: 'members',\n type: `${meta.profile.key}.members`,\n data: `${meta.profile.key}.members`,\n properties: {\n label: ['members-panel.label', { ns: meta.profile.key }],\n icon: 'ph--users--regular',\n iconHue: 'emerald',\n space,\n position: Position.first,\n testId: 'spacePlugin.members',\n },\n }),\n ],\n ),\n });\n\n return [sectionExtension, generalExtension, membersExtension];\n});\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\n\nimport { SpaceSchema } from '#types';\n\nimport {\n createCollectionExtensions,\n createCompanionExtensions,\n createDatabaseExtensions,\n createSettingsExtensions,\n createSpaceExtensions,\n} from './extensions/index.ts';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* ({ shareableLinkOrigin = window.location.origin }: SpaceSchema.SpacePluginOptions = {}) {\n const extensions = yield* Effect.all([\n createSpaceExtensions(),\n createSettingsExtensions(),\n createDatabaseExtensions(),\n createCollectionExtensions({ shareableLinkOrigin }),\n createCompanionExtensions(),\n ]);\n\n return Capability.contribute(AppCapabilities.AppGraphBuilder, extensions.flat());\n }),\n);\n"],"mappings":"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"}
|
package/dist/lib/components.mjs
CHANGED
|
@@ -150,8 +150,9 @@ var SelectType = ({ options, onChange }) => {
|
|
|
150
150
|
icon: option.icon ?? "ph--circle-dashed--regular",
|
|
151
151
|
size: "xl",
|
|
152
152
|
classNames: getIconHueStyles(option.iconHue)
|
|
153
|
-
}), /* @__PURE__ */ jsxs(
|
|
154
|
-
|
|
153
|
+
}), /* @__PURE__ */ jsxs(Layout.Flex, {
|
|
154
|
+
column: true,
|
|
155
|
+
classNames: "min-w-0 grow gap-0.5",
|
|
155
156
|
children: [/* @__PURE__ */ jsx("span", {
|
|
156
157
|
className: "truncate",
|
|
157
158
|
children: option.label
|