@dxos/plugin-thread 0.9.1-main.c7dcc2e112 → 0.9.1-staging.ee54ba693a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/lib/neutral/ThreadPlugin.mjs +2 -0
  2. package/dist/lib/neutral/ThreadPlugin.mjs.map +3 -3
  3. package/dist/lib/neutral/{app-graph-builder-U4ZDM6GK.mjs → app-graph-builder-NZOWDFE5.mjs} +14 -35
  4. package/dist/lib/neutral/app-graph-builder-NZOWDFE5.mjs.map +7 -0
  5. package/dist/lib/neutral/{append-channel-message-2OZYIIFL.mjs → append-channel-message-YIIJY6GX.mjs} +2 -2
  6. package/dist/lib/neutral/capabilities/index.mjs +4 -4
  7. package/dist/lib/neutral/{channel-backend-feed-ALIPAEPT.mjs → channel-backend-feed-TOS55NID.mjs} +7 -8
  8. package/dist/lib/neutral/channel-backend-feed-TOS55NID.mjs.map +7 -0
  9. package/dist/lib/neutral/{chunk-UYINIL64.mjs → chunk-5VTDNDBV.mjs} +3 -3
  10. package/dist/lib/neutral/{chunk-UYINIL64.mjs.map → chunk-5VTDNDBV.mjs.map} +3 -3
  11. package/dist/lib/neutral/{chunk-GQCMB5ZC.mjs → chunk-GM3SGQMJ.mjs} +2 -2
  12. package/dist/lib/neutral/{chunk-DM2T6BH5.mjs → chunk-J7OTCRYF.mjs} +4 -2
  13. package/dist/lib/neutral/{chunk-DM2T6BH5.mjs.map → chunk-J7OTCRYF.mjs.map} +3 -3
  14. package/dist/lib/neutral/{chunk-KUO5HUCH.mjs → chunk-XPUQE4Y7.mjs} +2 -2
  15. package/dist/lib/neutral/components/index.mjs +1 -1
  16. package/dist/lib/neutral/components/index.mjs.map +3 -3
  17. package/dist/lib/neutral/{create-channel-Y6D7YGVX.mjs → create-channel-4CA7P2M5.mjs} +2 -2
  18. package/dist/lib/neutral/{create-object-LOZBRZAF.mjs → create-object-O3TZ2MCJ.mjs} +3 -4
  19. package/dist/lib/neutral/{create-object-LOZBRZAF.mjs.map → create-object-O3TZ2MCJ.mjs.map} +3 -3
  20. package/dist/lib/neutral/hooks/index.mjs +2 -2
  21. package/dist/lib/neutral/index.mjs +3 -3
  22. package/dist/lib/neutral/meta.json +1 -1
  23. package/dist/lib/neutral/{navigation-resolver-VNFRIC7W.mjs → navigation-resolver-LSTZL32O.mjs} +7 -3
  24. package/dist/lib/neutral/navigation-resolver-LSTZL32O.mjs.map +7 -0
  25. package/dist/lib/neutral/operations/index.mjs +1 -1
  26. package/dist/lib/neutral/plugin.mjs +1 -1
  27. package/dist/lib/neutral/types/index.mjs +1 -1
  28. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  29. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -2
  30. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  31. package/dist/types/src/capabilities/channel-backend-feed.d.ts +1 -1
  32. package/dist/types/src/capabilities/channel-backend-feed.d.ts.map +1 -1
  33. package/dist/types/src/capabilities/create-object.d.ts +1 -7
  34. package/dist/types/src/capabilities/create-object.d.ts.map +1 -1
  35. package/dist/types/src/capabilities/navigation-resolver.d.ts +1 -2
  36. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +1 -1
  37. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  38. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  39. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts.map +1 -1
  40. package/dist/types/src/meta.d.ts +4 -0
  41. package/dist/types/src/meta.d.ts.map +1 -1
  42. package/dist/types/src/paths.d.ts +1 -1
  43. package/dist/types/src/paths.d.ts.map +1 -1
  44. package/dist/types/src/types/ThreadOperation.d.ts +4 -68
  45. package/dist/types/src/types/ThreadOperation.d.ts.map +1 -1
  46. package/dist/types/tsconfig.tsbuildinfo +1 -1
  47. package/package.json +36 -36
  48. package/src/ThreadPlugin.tsx +2 -1
  49. package/src/capabilities/app-graph-builder.ts +13 -31
  50. package/src/capabilities/channel-backend-feed.ts +2 -3
  51. package/src/capabilities/create-object.ts +0 -1
  52. package/src/capabilities/navigation-resolver.ts +7 -5
  53. package/src/components/Chat/Chat.tsx +1 -1
  54. package/src/containers/ChannelArticle/ChannelArticle.stories.tsx +3 -4
  55. package/src/containers/ThreadArticle/ThreadArticle.stories.tsx +1 -1
  56. package/src/paths.ts +2 -1
  57. package/src/types/ThreadOperation.ts +6 -3
  58. package/dist/lib/neutral/app-graph-builder-U4ZDM6GK.mjs.map +0 -7
  59. package/dist/lib/neutral/channel-backend-feed-ALIPAEPT.mjs.map +0 -7
  60. package/dist/lib/neutral/navigation-resolver-VNFRIC7W.mjs.map +0 -7
  61. /package/dist/lib/neutral/{append-channel-message-2OZYIIFL.mjs.map → append-channel-message-YIIJY6GX.mjs.map} +0 -0
  62. /package/dist/lib/neutral/{chunk-GQCMB5ZC.mjs.map → chunk-GM3SGQMJ.mjs.map} +0 -0
  63. /package/dist/lib/neutral/{chunk-KUO5HUCH.mjs.map → chunk-XPUQE4Y7.mjs.map} +0 -0
  64. /package/dist/lib/neutral/{create-channel-Y6D7YGVX.mjs.map → create-channel-4CA7P2M5.mjs.map} +0 -0
@@ -3,6 +3,7 @@ import "./chunk-J5LGTIGS.mjs";
3
3
  // src/ThreadPlugin.tsx
4
4
  import { ActivationEvents, Plugin } from "@dxos/app-framework";
5
5
  import { AppPlugin } from "@dxos/app-toolkit";
6
+ import { ClientEvents } from "@dxos/plugin-client";
6
7
  import { translations as threadTranslations } from "@dxos/react-ui-thread/translations";
7
8
  import { Channel, Message, Thread } from "@dxos/types";
8
9
  import { AppGraphBuilder, ChannelBackendFeed, CreateObject, NavigationResolver, OperationHandler, ReactSurface } from "#capabilities";
@@ -18,6 +19,7 @@ var ThreadPlugin = Plugin.define(meta).pipe(
18
19
  activate: AppGraphBuilder
19
20
  }),
20
21
  AppPlugin.addNavigationResolverModule({
22
+ activatesOn: ClientEvents.ClientReady,
21
23
  activate: NavigationResolver
22
24
  }),
23
25
  AppPlugin.addCreateObjectModule({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/ThreadPlugin.tsx", "raw-loader:/__w/dxos/dxos/packages/plugins/plugin-thread/PLUGIN.mdl"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { ActivationEvents, Plugin } from '@dxos/app-framework';\nimport { AppPlugin } from '@dxos/app-toolkit';\nimport { translations as threadTranslations } from '@dxos/react-ui-thread/translations';\nimport { Channel, Message, Thread } from '@dxos/types';\n\nimport {\n AppGraphBuilder,\n ChannelBackendFeed,\n CreateObject,\n NavigationResolver,\n OperationHandler,\n ReactSurface,\n} from '#capabilities';\nimport { meta } from '#meta';\nimport { translations } from '#translations';\n\n// eslint-disable-next-line import/no-relative-packages\nimport pluginSpec from '../PLUGIN.mdl?raw';\n\n// TODO(wittjosiah): Rename to ChatPlugin.\n\nexport const ThreadPlugin = Plugin.define(meta).pipe(\n AppPlugin.addAppGraphModule({ activate: AppGraphBuilder }),\n AppPlugin.addNavigationResolverModule({ activate: NavigationResolver }),\n AppPlugin.addCreateObjectModule({ activate: CreateObject }),\n AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),\n AppPlugin.addSchemaModule({\n schema: [Channel.Channel, Message.Message, Thread.Thread],\n }),\n AppPlugin.addSurfaceModule({ activate: ReactSurface }),\n AppPlugin.addTranslationsModule({ translations: [...translations, ...threadTranslations] }),\n // Default local-feed channel backend. Other plugins contribute additional\n // `ChannelBackend` providers (e.g. ATProto) earlier in plugin order.\n Plugin.addModule({\n id: 'channel-backend-feed',\n activatesOn: ActivationEvents.Startup,\n activate: ChannelBackendFeed,\n }),\n AppPlugin.addPluginAssetModule({\n asset: { pluginId: meta.profile.key, path: 'PLUGIN.mdl', content: pluginSpec, mimeType: 'application/x-mdl' },\n }),\n Plugin.make,\n);\n\nexport default ThreadPlugin;\n", "---\nid: org.dxos.plugin.thread\nname: ThreadPlugin\nversion: 0.1.0\n---\n\nThreadPlugin provides chat: channels backed by an ECHO feed and free-standing message threads.\nIt renders the channel article + companion surfaces and a thread surface, and contributes the\noperations that create a channel and append messages. Shared message/thread UI comes from\n`@dxos/react-ui-thread`, and the `Channel`/`Message`/`Thread` schema comes from `@dxos/types`.\nDocument comments and the comment-thread AI agent live in `@dxos/plugin-comments`.\n\n## Extensions\n\nThe following extension dialects are used in this document.\n\n| Term | URI |\n|-------------|--------------------------------|\n| `type` | `org.dxos.mdl.type@1.0` |\n| `feat` | `org.dxos.mdl.feat@1.0` |\n| `op` | `org.dxos.mdl.op@1.0` |\n\n## Types\n\n```mdl\ntype Channel\n desc: |\n A chat channel. Defined in @dxos/types. Carries an optional `feed` Ref whose\n queue holds the channel's Message objects in order.\n```\n\n## Operations\n\n```mdl\nop OnCreateSpace\n key: org.dxos.plugin.thread.operation.onCreateSpace\n desc: On space creation, create a default \"General\" channel in the root collection.\n```\n\n```mdl\nop CreateChannel\n key: org.dxos.plugin.thread.operation.createChannel\n desc: Create a new Channel in the given space.\n in:\n spaceId: SpaceId\n name?: String\n out:\n object: Channel\n```\n\n```mdl\nop AppendChannelMessage\n key: org.dxos.plugin.thread.operation.appendChannelMessage\n desc: Append a Message authored by `sender` to the channel's feed.\n in:\n channel: Channel\n sender: Actor\n text: String\n```\n\n## Features\n\n```mdl\nfeat F-1: Channel chat\n req F-1.1: A Channel article MUST render its feed messages newest-last with a\n pinned composer; sending invokes AppendChannelMessage.\n req F-1.2: Externally-synced channels (those carrying foreign-key Obj.Meta) MUST\n render read-only \u2014 the composer is suppressed.\n```\n\n```mdl\nfeat F-2: Thread chat\n req F-2.1: A Thread article MUST render the thread's messages and append new\n messages by pushing onto `thread.messages`.\n```\n"],
5
- "mappings": ";;;AAIA,SAASA,kBAAkBC,cAAc;AACzC,SAASC,iBAAiB;AAC1B,SAASC,gBAAgBC,0BAA0B;AACnD,SAASC,SAASC,SAASC,cAAc;AAEzC,SACEC,iBACAC,oBACAC,cACAC,oBACAC,kBACAC,oBACK;AACP,SAASC,YAAY;AACrB,SAASX,oBAAoB;;;AClB7B;;;ADyBO,IAAMY,eAAeC,OAAOC,OAAOC,IAAAA,EAAMC;EAC9CC,UAAUC,kBAAkB;IAAEC,UAAUC;EAAgB,CAAA;EACxDH,UAAUI,4BAA4B;IAAEF,UAAUG;EAAmB,CAAA;EACrEL,UAAUM,sBAAsB;IAAEJ,UAAUK;EAAa,CAAA;EACzDP,UAAUQ,0BAA0B;IAAEN,UAAUO;EAAiB,CAAA;EACjET,UAAUU,gBAAgB;IACxBC,QAAQ;MAACC,QAAQA;MAASC,QAAQA;MAASC,OAAOA;;EACpD,CAAA;EACAd,UAAUe,iBAAiB;IAAEb,UAAUc;EAAa,CAAA;EACpDhB,UAAUiB,sBAAsB;IAAEC,cAAc;SAAIA;SAAiBC;;EAAoB,CAAA;;;EAGzFvB,OAAOwB,UAAU;IACfC,IAAI;IACJC,aAAaC,iBAAiBC;IAC9BtB,UAAUuB;EACZ,CAAA;EACAzB,UAAU0B,qBAAqB;IAC7BC,OAAO;MAAEC,UAAU9B,KAAK+B,QAAQC;MAAKC,MAAM;MAAcC,SAASC;MAAYC,UAAU;IAAoB;EAC9G,CAAA;EACAtC,OAAOuC;AAAI;AAGb,IAAA,uBAAexC;",
6
- "names": ["ActivationEvents", "Plugin", "AppPlugin", "translations", "threadTranslations", "Channel", "Message", "Thread", "AppGraphBuilder", "ChannelBackendFeed", "CreateObject", "NavigationResolver", "OperationHandler", "ReactSurface", "meta", "ThreadPlugin", "Plugin", "define", "meta", "pipe", "AppPlugin", "addAppGraphModule", "activate", "AppGraphBuilder", "addNavigationResolverModule", "NavigationResolver", "addCreateObjectModule", "CreateObject", "addOperationHandlerModule", "OperationHandler", "addSchemaModule", "schema", "Channel", "Message", "Thread", "addSurfaceModule", "ReactSurface", "addTranslationsModule", "translations", "threadTranslations", "addModule", "id", "activatesOn", "ActivationEvents", "Startup", "ChannelBackendFeed", "addPluginAssetModule", "asset", "pluginId", "profile", "key", "path", "content", "pluginSpec", "mimeType", "make"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { ActivationEvents, Plugin } from '@dxos/app-framework';\nimport { AppPlugin } from '@dxos/app-toolkit';\nimport { ClientEvents } from '@dxos/plugin-client';\nimport { translations as threadTranslations } from '@dxos/react-ui-thread/translations';\nimport { Channel, Message, Thread } from '@dxos/types';\n\nimport {\n AppGraphBuilder,\n ChannelBackendFeed,\n CreateObject,\n NavigationResolver,\n OperationHandler,\n ReactSurface,\n} from '#capabilities';\nimport { meta } from '#meta';\nimport { translations } from '#translations';\n\n// eslint-disable-next-line import/no-relative-packages\nimport pluginSpec from '../PLUGIN.mdl?raw';\n\n// TODO(wittjosiah): Rename to ChatPlugin.\n\nexport const ThreadPlugin = Plugin.define(meta).pipe(\n AppPlugin.addAppGraphModule({ activate: AppGraphBuilder }),\n AppPlugin.addNavigationResolverModule({ activatesOn: ClientEvents.ClientReady, activate: NavigationResolver }),\n AppPlugin.addCreateObjectModule({ activate: CreateObject }),\n AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),\n AppPlugin.addSchemaModule({\n schema: [Channel.Channel, Message.Message, Thread.Thread],\n }),\n AppPlugin.addSurfaceModule({ activate: ReactSurface }),\n AppPlugin.addTranslationsModule({ translations: [...translations, ...threadTranslations] }),\n // Default local-feed channel backend. Other plugins contribute additional\n // `ChannelBackend` providers (e.g. ATProto) earlier in plugin order.\n Plugin.addModule({\n id: 'channel-backend-feed',\n activatesOn: ActivationEvents.Startup,\n activate: ChannelBackendFeed,\n }),\n AppPlugin.addPluginAssetModule({\n asset: { pluginId: meta.profile.key, path: 'PLUGIN.mdl', content: pluginSpec, mimeType: 'application/x-mdl' },\n }),\n Plugin.make,\n);\n\nexport default ThreadPlugin;\n", "---\nid: org.dxos.plugin.thread\nname: ThreadPlugin\nversion: 0.1.0\n---\n\nThreadPlugin provides chat: channels backed by an ECHO feed and free-standing message threads.\nIt renders the channel article + companion surfaces and a thread surface, and contributes the\noperations that create a channel and append messages. Shared message/thread UI comes from\n`@dxos/react-ui-thread`, and the `Channel`/`Message`/`Thread` schema comes from `@dxos/types`.\nDocument comments and the comment-thread AI agent live in `@dxos/plugin-comments`.\n\n## Extensions\n\nThe following extension dialects are used in this document.\n\n| Term | URI |\n|-------------|--------------------------------|\n| `type` | `org.dxos.mdl.type@1.0` |\n| `feat` | `org.dxos.mdl.feat@1.0` |\n| `op` | `org.dxos.mdl.op@1.0` |\n\n## Types\n\n```mdl\ntype Channel\n desc: |\n A chat channel. Defined in @dxos/types. Carries an optional `feed` Ref whose\n queue holds the channel's Message objects in order.\n```\n\n## Operations\n\n```mdl\nop OnCreateSpace\n key: org.dxos.plugin.thread.operation.onCreateSpace\n desc: On space creation, create a default \"General\" channel in the root collection.\n```\n\n```mdl\nop CreateChannel\n key: org.dxos.plugin.thread.operation.createChannel\n desc: Create a new Channel in the given space.\n in:\n spaceId: SpaceId\n name?: String\n out:\n object: Channel\n```\n\n```mdl\nop AppendChannelMessage\n key: org.dxos.plugin.thread.operation.appendChannelMessage\n desc: Append a Message authored by `sender` to the channel's feed.\n in:\n channel: Channel\n sender: Actor\n text: String\n```\n\n## Features\n\n```mdl\nfeat F-1: Channel chat\n req F-1.1: A Channel article MUST render its feed messages newest-last with a\n pinned composer; sending invokes AppendChannelMessage.\n req F-1.2: Externally-synced channels (those carrying foreign-key Obj.Meta) MUST\n render read-only \u2014 the composer is suppressed.\n```\n\n```mdl\nfeat F-2: Thread chat\n req F-2.1: A Thread article MUST render the thread's messages and append new\n messages by pushing onto `thread.messages`.\n```\n"],
5
+ "mappings": ";;;AAIA,SAASA,kBAAkBC,cAAc;AACzC,SAASC,iBAAiB;AAC1B,SAASC,oBAAoB;AAC7B,SAASC,gBAAgBC,0BAA0B;AACnD,SAASC,SAASC,SAASC,cAAc;AAEzC,SACEC,iBACAC,oBACAC,cACAC,oBACAC,kBACAC,oBACK;AACP,SAASC,YAAY;AACrB,SAASX,oBAAoB;;;ACnB7B;;;AD0BO,IAAMY,eAAeC,OAAOC,OAAOC,IAAAA,EAAMC;EAC9CC,UAAUC,kBAAkB;IAAEC,UAAUC;EAAgB,CAAA;EACxDH,UAAUI,4BAA4B;IAAEC,aAAaC,aAAaC;IAAaL,UAAUM;EAAmB,CAAA;EAC5GR,UAAUS,sBAAsB;IAAEP,UAAUQ;EAAa,CAAA;EACzDV,UAAUW,0BAA0B;IAAET,UAAUU;EAAiB,CAAA;EACjEZ,UAAUa,gBAAgB;IACxBC,QAAQ;MAACC,QAAQA;MAASC,QAAQA;MAASC,OAAOA;;EACpD,CAAA;EACAjB,UAAUkB,iBAAiB;IAAEhB,UAAUiB;EAAa,CAAA;EACpDnB,UAAUoB,sBAAsB;IAAEC,cAAc;SAAIA;SAAiBC;;EAAoB,CAAA;;;EAGzF1B,OAAO2B,UAAU;IACfC,IAAI;IACJnB,aAAaoB,iBAAiBC;IAC9BxB,UAAUyB;EACZ,CAAA;EACA3B,UAAU4B,qBAAqB;IAC7BC,OAAO;MAAEC,UAAUhC,KAAKiC,QAAQC;MAAKC,MAAM;MAAcC,SAASC;MAAYC,UAAU;IAAoB;EAC9G,CAAA;EACAxC,OAAOyC;AAAI;AAGb,IAAA,uBAAe1C;",
6
+ "names": ["ActivationEvents", "Plugin", "AppPlugin", "ClientEvents", "translations", "threadTranslations", "Channel", "Message", "Thread", "AppGraphBuilder", "ChannelBackendFeed", "CreateObject", "NavigationResolver", "OperationHandler", "ReactSurface", "meta", "ThreadPlugin", "Plugin", "define", "meta", "pipe", "AppPlugin", "addAppGraphModule", "activate", "AppGraphBuilder", "addNavigationResolverModule", "activatesOn", "ClientEvents", "ClientReady", "NavigationResolver", "addCreateObjectModule", "CreateObject", "addOperationHandlerModule", "OperationHandler", "addSchemaModule", "schema", "Channel", "Message", "Thread", "addSurfaceModule", "ReactSurface", "addTranslationsModule", "translations", "threadTranslations", "addModule", "id", "ActivationEvents", "Startup", "ChannelBackendFeed", "addPluginAssetModule", "asset", "pluginId", "profile", "key", "path", "content", "pluginSpec", "mimeType", "make"]
7
7
  }
@@ -1,26 +1,32 @@
1
1
  import {
2
2
  getChannelsPath
3
- } from "./chunk-DM2T6BH5.mjs";
3
+ } from "./chunk-J7OTCRYF.mjs";
4
4
  import "./chunk-J5LGTIGS.mjs";
5
5
 
6
6
  // src/capabilities/app-graph-builder.ts
7
7
  import * as Effect from "effect/Effect";
8
- import * as Option from "effect/Option";
9
8
  import { Capability } from "@dxos/app-framework";
10
- import { AppCapabilities, AppNode, TypeSection } from "@dxos/app-toolkit";
11
- import { isSpace } from "@dxos/client/echo";
9
+ import { AppCapabilities, AppNode, AppNodeMatcher, Paths, TypeSection } from "@dxos/app-toolkit";
12
10
  import { Operation } from "@dxos/compute";
13
11
  import { Obj, Type } from "@dxos/echo";
14
12
  import { CallsCapabilities } from "@dxos/plugin-calls/types";
15
- import { GraphBuilder, Node } from "@dxos/plugin-graph";
13
+ import { GraphBuilder } from "@dxos/plugin-graph";
16
14
  import { SpaceOperation } from "@dxos/plugin-space";
17
15
  import { Channel } from "@dxos/types";
16
+ import { Position } from "@dxos/util";
18
17
  import { meta } from "#meta";
19
18
  var channelTypename = Type.getTypename(Channel.Channel);
20
19
  var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function* () {
21
20
  const capabilities = yield* Capability.Service;
22
21
  const extensions = yield* Effect.all([
23
- TypeSection.createTypeSectionExtension(Channel.Channel),
22
+ TypeSection.createTypeSectionExtension(Channel.Channel, {
23
+ match: AppNodeMatcher.whenNavTreeGroup(Paths.GroupTypes.communications),
24
+ createObject: (space) => Operation.invoke(SpaceOperation.OpenCreateObject, {
25
+ target: space.db,
26
+ typename: channelTypename,
27
+ targetNodeId: getChannelsPath(space.db.spaceId)
28
+ })
29
+ }),
24
30
  GraphBuilder.createTypeExtension({
25
31
  id: "channelChatCompanion",
26
32
  type: Channel.Channel,
@@ -45,37 +51,10 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
45
51
  ],
46
52
  icon: "ph--hash--regular",
47
53
  data: "chat",
48
- position: "first"
54
+ position: Position.first
49
55
  })
50
56
  ]);
51
57
  }
52
- }),
53
- GraphBuilder.createExtension({
54
- id: "channelsSectionActions",
55
- match: (node) => {
56
- const space = isSpace(node.properties.space) ? node.properties.space : void 0;
57
- return node.type === channelTypename && space ? Option.some(space) : Option.none();
58
- },
59
- actions: (space) => Effect.succeed([
60
- Node.makeAction({
61
- id: "create-channel",
62
- data: () => Operation.invoke(SpaceOperation.OpenCreateObject, {
63
- target: space.db,
64
- typename: channelTypename,
65
- targetNodeId: getChannelsPath(space.db.spaceId)
66
- }),
67
- properties: {
68
- label: [
69
- "add-object.label",
70
- {
71
- ns: channelTypename
72
- }
73
- ],
74
- icon: "ph--plus--regular",
75
- disposition: "list-item-primary"
76
- }
77
- })
78
- ])
79
58
  })
80
59
  ]);
81
60
  return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);
@@ -83,4 +62,4 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
83
62
  export {
84
63
  app_graph_builder_default as default
85
64
  };
86
- //# sourceMappingURL=app-graph-builder-U4ZDM6GK.mjs.map
65
+ //# sourceMappingURL=app-graph-builder-NZOWDFE5.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities, AppNode, AppNodeMatcher, Paths, TypeSection } from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { Obj, Type } from '@dxos/echo';\nimport { CallsCapabilities } from '@dxos/plugin-calls/types';\nimport { GraphBuilder } from '@dxos/plugin-graph';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { Channel } from '@dxos/types';\nimport { Position } from '@dxos/util';\n\nimport { meta } from '#meta';\n\nimport { getChannelsPath } from '../paths';\n\nconst channelTypename = Type.getTypename(Channel.Channel);\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const capabilities = yield* Capability.Service;\n\n const extensions = yield* Effect.all([\n TypeSection.createTypeSectionExtension(Channel.Channel, {\n match: AppNodeMatcher.whenNavTreeGroup(Paths.GroupTypes.communications),\n createObject: (space) =>\n Operation.invoke(SpaceOperation.OpenCreateObject, {\n target: space.db,\n typename: channelTypename,\n targetNodeId: getChannelsPath(space.db.spaceId),\n }),\n }),\n\n GraphBuilder.createTypeExtension({\n id: 'channelChatCompanion',\n type: Channel.Channel,\n connector: (channel, get) => {\n const [callManager] = get(capabilities.atom(CallsCapabilities.Manager));\n if (!callManager) {\n return Effect.succeed([]);\n }\n const joined = get(callManager.joinedAtom);\n const roomId = get(callManager.roomIdAtom);\n if (!joined || roomId !== Obj.getURI(channel)) {\n return Effect.succeed([]);\n }\n\n return Effect.succeed([\n AppNode.makeCompanion({\n id: 'chat',\n label: ['channel-companion.label', { ns: meta.profile.key }],\n icon: 'ph--hash--regular',\n data: 'chat',\n position: Position.first,\n }),\n ]);\n },\n }),\n ]);\n\n return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);\n }),\n);\n"],
5
+ "mappings": ";;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,iBAAiBC,SAASC,gBAAgBC,OAAOC,mBAAmB;AAC7E,SAASC,iBAAiB;AAC1B,SAASC,KAAKC,YAAY;AAC1B,SAASC,yBAAyB;AAClC,SAASC,oBAAoB;AAC7B,SAASC,sBAAsB;AAC/B,SAASC,eAAe;AACxB,SAASC,gBAAgB;AAEzB,SAASC,YAAY;AAIrB,IAAMC,kBAAkBC,KAAKC,YAAYC,QAAQA,OAAO;AAExD,IAAA,4BAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,QAAMC,eAAe,OAAOH,WAAWI;AAEvC,QAAMC,aAAa,OAAcC,WAAI;IACnCC,YAAYC,2BAA2BT,QAAQA,SAAS;MACtDU,OAAOC,eAAeC,iBAAiBC,MAAMC,WAAWC,cAAc;MACtEC,cAAc,CAACC,UACbC,UAAUC,OAAOC,eAAeC,kBAAkB;QAChDC,QAAQL,MAAMM;QACdC,UAAU3B;QACV4B,cAAcC,gBAAgBT,MAAMM,GAAGI,OAAO;MAChD,CAAA;IACJ,CAAA;IAEAC,aAAaC,oBAAoB;MAC/BC,IAAI;MACJC,MAAM/B,QAAQA;MACdgC,WAAW,CAACC,SAASC,QAAAA;AACnB,cAAM,CAACC,WAAAA,IAAeD,IAAI9B,aAAagC,KAAKC,kBAAkBC,OAAO,CAAA;AACrE,YAAI,CAACH,aAAa;AAChB,iBAAcI,eAAQ,CAAA,CAAE;QAC1B;AACA,cAAMC,SAASN,IAAIC,YAAYM,UAAU;AACzC,cAAMC,SAASR,IAAIC,YAAYQ,UAAU;AACzC,YAAI,CAACH,UAAUE,WAAWE,IAAIC,OAAOZ,OAAAA,GAAU;AAC7C,iBAAcM,eAAQ,CAAA,CAAE;QAC1B;AAEA,eAAcA,eAAQ;UACpBO,QAAQC,cAAc;YACpBjB,IAAI;YACJkB,OAAO;cAAC;cAA2B;gBAAEC,IAAIC,KAAKC,QAAQC;cAAI;;YAC1DC,MAAM;YACNC,MAAM;YACNC,UAAUC,SAASC;UACrB,CAAA;SACD;MACH;IACF,CAAA;GACD;AAED,SAAOxD,WAAWyD,YAAYC,gBAAgBC,iBAAiBtD,UAAAA;AACjE,CAAA,CAAA;",
6
+ "names": ["Effect", "Capability", "AppCapabilities", "AppNode", "AppNodeMatcher", "Paths", "TypeSection", "Operation", "Obj", "Type", "CallsCapabilities", "GraphBuilder", "SpaceOperation", "Channel", "Position", "meta", "channelTypename", "Type", "getTypename", "Channel", "Capability", "makeModule", "fnUntraced", "capabilities", "Service", "extensions", "all", "TypeSection", "createTypeSectionExtension", "match", "AppNodeMatcher", "whenNavTreeGroup", "Paths", "GroupTypes", "communications", "createObject", "space", "Operation", "invoke", "SpaceOperation", "OpenCreateObject", "target", "db", "typename", "targetNodeId", "getChannelsPath", "spaceId", "GraphBuilder", "createTypeExtension", "id", "type", "connector", "channel", "get", "callManager", "atom", "CallsCapabilities", "Manager", "succeed", "joined", "joinedAtom", "roomId", "roomIdAtom", "Obj", "getURI", "AppNode", "makeCompanion", "label", "ns", "meta", "profile", "key", "icon", "data", "position", "Position", "first", "contributes", "AppCapabilities", "AppGraphBuilder"]
7
+ }
@@ -2,7 +2,7 @@ import {
2
2
  ThreadCapabilities_exports,
3
3
  ThreadOperation_exports,
4
4
  resolveProvider
5
- } from "./chunk-UYINIL64.mjs";
5
+ } from "./chunk-5VTDNDBV.mjs";
6
6
  import "./chunk-J5LGTIGS.mjs";
7
7
 
8
8
  // src/operations/append-channel-message.ts
@@ -31,4 +31,4 @@ var append_channel_message_default = handler;
31
31
  export {
32
32
  append_channel_message_default as default
33
33
  };
34
- //# sourceMappingURL=append-channel-message-2OZYIIFL.mjs.map
34
+ //# sourceMappingURL=append-channel-message-YIIJY6GX.mjs.map
@@ -2,10 +2,10 @@ import "../chunk-J5LGTIGS.mjs";
2
2
 
3
3
  // src/capabilities/index.ts
4
4
  import { Capability } from "@dxos/app-framework";
5
- var AppGraphBuilder = Capability.lazy("AppGraphBuilder", () => import("../app-graph-builder-U4ZDM6GK.mjs"));
6
- var NavigationResolver = Capability.lazy("NavigationResolver", () => import("../navigation-resolver-VNFRIC7W.mjs"));
7
- var ChannelBackendFeed = Capability.lazy("ChannelBackendFeed", () => import("../channel-backend-feed-ALIPAEPT.mjs"));
8
- var CreateObject = Capability.lazy("CreateObject", () => import("../create-object-LOZBRZAF.mjs"));
5
+ var AppGraphBuilder = Capability.lazy("AppGraphBuilder", () => import("../app-graph-builder-NZOWDFE5.mjs"));
6
+ var NavigationResolver = Capability.lazy("NavigationResolver", () => import("../navigation-resolver-LSTZL32O.mjs"));
7
+ var ChannelBackendFeed = Capability.lazy("ChannelBackendFeed", () => import("../channel-backend-feed-TOS55NID.mjs"));
8
+ var CreateObject = Capability.lazy("CreateObject", () => import("../create-object-O3TZ2MCJ.mjs"));
9
9
  var OperationHandler = Capability.lazy("OperationHandler", () => import("../operation-handler-RU6K2S4L.mjs"));
10
10
  var ReactSurface = Capability.lazy("ReactSurface", () => import("../react-surface-H2EKIMSK.mjs"));
11
11
  export {
@@ -1,14 +1,13 @@
1
1
  import {
2
2
  ThreadCapabilities_exports
3
- } from "./chunk-UYINIL64.mjs";
3
+ } from "./chunk-5VTDNDBV.mjs";
4
4
  import "./chunk-J5LGTIGS.mjs";
5
5
 
6
6
  // src/capabilities/channel-backend-feed.ts
7
7
  import * as Effect from "effect/Effect";
8
8
  import * as Schema from "effect/Schema";
9
9
  import { Capability } from "@dxos/app-framework";
10
- import { Feed, Filter, Obj, Query } from "@dxos/echo";
11
- import { createFeedServiceLayer } from "@dxos/echo-client";
10
+ import { Database, Feed, Filter, Obj, Query } from "@dxos/echo";
12
11
  import { invariant } from "@dxos/invariant";
13
12
  import { ClientCapabilities } from "@dxos/plugin-client";
14
13
  import { Channel, Message } from "@dxos/types";
@@ -34,15 +33,15 @@ var feedChannelBackend = {
34
33
  },
35
34
  send: (channel, message) => Effect.gen(function* () {
36
35
  const db = Obj.getDatabase(channel);
37
- invariant(db, "Database not found", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 37, S: this, A: ["db", "'Database not found'"] });
36
+ invariant(db, "Database not found", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 36, S: this, A: ["db", "'Database not found'"] });
38
37
  const client = yield* Capability.get(ClientCapabilities.Client);
39
38
  const space = client.spaces.get(db.spaceId);
40
- invariant(space, "Space not found", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 40, S: this, A: ["space", "'Space not found'"] });
39
+ invariant(space, "Space not found", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 39, S: this, A: ["space", "'Space not found'"] });
41
40
  const feed = Channel.getFeed(channel);
42
- invariant(feed, "Channel is not feed-backed", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 42, S: this, A: ["feed", "'Channel is not feed-backed'"] });
41
+ invariant(feed, "Channel is not feed-backed", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 41, S: this, A: ["feed", "'Channel is not feed-backed'"] });
43
42
  yield* Feed.append(feed, [
44
43
  message
45
- ]).pipe(Effect.provide(createFeedServiceLayer(space.db)));
44
+ ]).pipe(Effect.provide(Database.layer(space.db)));
46
45
  }),
47
46
  readOnly: (channel) => Obj.getMeta(channel).keys.length > 0
48
47
  };
@@ -55,4 +54,4 @@ export {
55
54
  channel_backend_feed_default as default,
56
55
  feedChannelBackend
57
56
  };
58
- //# sourceMappingURL=channel-backend-feed-ALIPAEPT.mjs.map
57
+ //# sourceMappingURL=channel-backend-feed-TOS55NID.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/channel-backend-feed.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Database, Feed, Filter, Obj, Query } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { Channel, Message } from '@dxos/types';\n\nimport { ThreadCapabilities } from '../types';\n\n/**\n * Default local ECHO-feed-backed channel provider. Stores messages in a `Feed`\n * (`makeConfig` → `Feed.make()`), reads them via a reactive database query, and\n * writes via `Feed.append`. This is the backend `Channel.make()` defaults to.\n */\nexport const feedChannelBackend: ThreadCapabilities.ChannelBackendProvider = {\n kind: Channel.FeedBackendKind,\n label: 'Feed',\n icon: 'ph--rows--regular',\n createFields: Schema.Struct({}),\n makeConfig: () => Feed.make(),\n subscribe: (channel, onMessages) => {\n const feed = Channel.getFeed(channel);\n const db = Obj.getDatabase(channel);\n if (!feed || !db) {\n onMessages([]);\n return () => {};\n }\n\n const result = db.query(Query.select(Filter.type(Message.Message)).from(feed));\n return result.subscribe(() => onMessages(result.results), { fire: true });\n },\n send: (channel, message) =>\n Effect.gen(function* () {\n const db = Obj.getDatabase(channel);\n invariant(db, 'Database not found');\n const client = yield* Capability.get(ClientCapabilities.Client);\n const space = client.spaces.get(db.spaceId);\n invariant(space, 'Space not found');\n const feed = Channel.getFeed(channel);\n invariant(feed, 'Channel is not feed-backed');\n yield* Feed.append(feed, [message]).pipe(Effect.provide(Database.layer(space.db)));\n }),\n readOnly: (channel) => Obj.getMeta(channel).keys.length > 0,\n};\n\n/** Contributes the default feed-backed channel provider. */\nexport const ChannelBackendFeed = Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(ThreadCapabilities.ChannelBackend, feedChannelBackend);\n }),\n);\n\nexport default ChannelBackendFeed;\n"],
5
+ "mappings": ";;;;;;AAIA,YAAYA,YAAY;AACxB,YAAYC,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,UAAUC,MAAMC,QAAQC,KAAKC,aAAa;AACnD,SAASC,iBAAiB;AAC1B,SAASC,0BAA0B;AACnC,SAASC,SAASC,eAAe;AAIjC,IAAA,eAAA;AAOS,IAAA,qBAAA;EACPC,MAAM,QAAA;EACNC,OAAAA;EACAC,MAAAA;EACAC,cAAqBC,cAAAA,CAAAA,CAAAA;cACbC,MAAAA,KAAOC,KAAQC;aACfC,CAAAA,SAASC,eAAYC;AAC3B,UAAKL,OAAQ,QAAK,QAAA,OAAA;UAChBD,KAAAA,IAAW,YAAE,OAAA;QACb,CAAA,QAAO,CAAA,IAAO;AAChB,iBAAA,CAAA,CAAA;AAEA,aAAMO,MAASH;MAAAA;IACf;UAA4DI,SAAM,GAAA,MAAA,MAAA,OAAA,OAAA,KAAA,QAAA,OAAA,CAAA,EAAA,KAAA,IAAA,CAAA;AAAK,WAAA,OAAA,UAAA,MAAA,WAAA,OAAA,OAAA,GAAA;MACzE,MAAA;IACAC,CAAAA;;kBAGIC,YAAc,WAAA,aAAA;AACd,UAAMC,KAAAA,IAAS,YAAOC,OAAWC;AACjC,cAAMC,IAAQH,sBAAqBI,EAAAA,YAAO,YAAA,GAAA,cAAA,GAAA,IAAA,GAAA,MAAA,GAAA,CAAA,MAAA,sBAAA,EAAA,CAAA;AAC1CL,UAAAA,SAAUI,OAAO,WAAA,IAAA,mBAAA,MAAA;AACjB,UAAMb,QAAOC,OAAQC,OAAO,IAACG,GAAAA,OAAAA;AAC7BI,cAAUT,OAAM,mBAAA,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,IAAA,GAAA,MAAA,GAAA,CAAA,SAAA,mBAAA,EAAA,CAAA;AAChB,UAAA,OAAYe,QAAOf,QAAM,OAAA;cAACgB,MAAAA,8BAAAA,EAAAA,YAAAA,YAAAA,GAAAA,cAAAA,GAAAA,IAAAA,GAAAA,MAAAA,GAAAA,CAAAA,QAAAA,8BAAAA,EAAAA,CAAAA;WAAc,KAACC,OAAOC,MAAQC;MAC1D;IACFC,CAAAA,EAAWf,KAAYgB,eAAIC,SAAQjB,MAAa,MAACkB,EAAM,CAAA,CAAG;EAC1D,CAAA;EAEF,UAAA,CAAA,YAAA,IAAA,QAAA,OAAA,EAAA,KAAA,SAA0D;;AAKxD,IAAA,qBAAA,WAAA,WAAA,kBAAA,aAAA;AAEF,SAAA,WAAeC,YAAmB,2BAAA,gBAAA,kBAAA;;;",
6
+ "names": ["Effect", "Schema", "Capability", "Database", "Feed", "Filter", "Obj", "Query", "invariant", "ClientCapabilities", "Channel", "Message", "icon", "createFields", "makeConfig", "subscribe", "onMessages", "feed", "Channel", "getFeed", "db", "getDatabase", "channel", "result", "fire", "send", "invariant", "client", "Capability", "get", "space", "spaceId", "append", "message", "Effect", "provide", "Database", "readOnly", "Obj", "getMeta", "length", "ChannelBackendFeed"]
7
+ }
@@ -52,7 +52,7 @@ __export(ThreadOperation_exports, {
52
52
  import * as Schema2 from "effect/Schema";
53
53
  import { Capability as Capability2 } from "@dxos/app-framework";
54
54
  import { Operation } from "@dxos/compute";
55
- import { Key, Type, DXN } from "@dxos/echo";
55
+ import { DXN, Key, Type } from "@dxos/echo";
56
56
  import { Actor, Channel } from "@dxos/types";
57
57
  import { meta as meta2 } from "#meta";
58
58
  var makeKey = (name) => DXN.make(`${meta2.profile.key}.operation.${name}`);
@@ -86,7 +86,7 @@ var AppendChannelMessage = Operation.make({
86
86
  name: "Append Channel Message",
87
87
  icon: "ph--chat-text--regular"
88
88
  },
89
- // Note: Feed.FeedService is provided inside the handler from space.db, not at the
89
+ // Note: Database.Service is provided inside the handler from space.db, not at the
90
90
  // operation level — the runtime can't fulfill it without a space context.
91
91
  services: [
92
92
  Capability2.Service
@@ -106,4 +106,4 @@ export {
106
106
  ThreadCapabilities_exports,
107
107
  ThreadOperation_exports
108
108
  };
109
- //# sourceMappingURL=chunk-UYINIL64.mjs.map
109
+ //# sourceMappingURL=chunk-5VTDNDBV.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/types/channel-backend.ts", "../../../src/types/ThreadCapabilities.ts", "../../../src/types/ThreadOperation.ts"],
4
- "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport * as ThreadCapabilities from './ThreadCapabilities';\n\n/** Finds the provider matching a `Channel.backend.kind`. */\nexport const resolveProvider = (\n providers: readonly ThreadCapabilities.ChannelBackendProvider[],\n kind: string,\n): ThreadCapabilities.ChannelBackendProvider | undefined => providers.find((provider) => provider.kind === kind);\n\n/** Throws if two providers share a `kind` (which would make resolution order-dependent). */\nexport const assertUniqueKinds = (providers: readonly ThreadCapabilities.ChannelBackendProvider[]): void => {\n const seen = new Set<string>();\n for (const provider of providers) {\n if (seen.has(provider.kind)) {\n throw new Error(`Duplicate channel backend kind: ${provider.kind}`);\n }\n seen.add(provider.kind);\n }\n};\n\n/**\n * Builds the create-channel form schema from the registered providers.\n *\n * With a single provider whose create-fields are empty the form is just a\n * `name` field (today's behaviour). With multiple providers (or extra fields)\n * it becomes `{ name?, backend: Union(<{ kind: Literal(p.kind) } & p.createFields>) }`,\n * which react-ui-form renders as a `kind` Select plus the selected branch's fields.\n */\nexport const buildChannelFormSchema = (\n providers: readonly ThreadCapabilities.ChannelBackendProvider[],\n): Schema.Schema.AnyNoContext => {\n assertUniqueKinds(providers);\n const needsSelector = providers.length > 1 || providers.some((provider) => fieldCount(provider.createFields) > 0);\n if (!needsSelector) {\n return Schema.Struct({ name: Schema.optional(Schema.String) });\n }\n\n const branches = providers.map((provider) =>\n Schema.extend(Schema.Struct({ kind: Schema.Literal(provider.kind) }), provider.createFields),\n );\n const backend = branches.length === 1 ? branches[0] : Schema.Union(...branches);\n return Schema.Struct({\n name: Schema.optional(Schema.String),\n backend,\n });\n};\n\nconst fieldCount = (schema: Schema.Schema.AnyNoContext): number => SchemaAST.getPropertySignatures(schema.ast).length;\n", "//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Effect from 'effect/Effect';\nimport type * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { type Obj } from '@dxos/echo';\nimport { type Channel, type Message } from '@dxos/types';\n\nimport { meta } from '#meta';\n\n/**\n * A pluggable message backend for a `Channel`. Providers are contributed by\n * plugins and resolved by `Channel.backend.kind`.\n */\nexport interface ChannelBackendProvider {\n /** Stable backend id; matches `Channel.backend.kind`. */\n kind: string;\n /** Human-readable label shown in the create-channel form. */\n label: string;\n /** Icon name (phosphor) for the create-channel form. */\n icon?: string;\n /**\n * Per-backend create-form inputs (a struct; excludes the `kind` discriminant\n * and the channel `name`, which the panel adds). Empty struct when the backend\n * needs no extra input (e.g. the local feed).\n */\n createFields: Schema.Schema.AnyNoContext;\n /** Builds the provider's config object from the collected create-form inputs. */\n makeConfig: (options: Record<string, unknown>) => Obj.Any;\n /**\n * Subscribes to the channel's messages. Invokes `onMessages` with the current\n * list immediately and on every change. Returns an unsubscribe function.\n */\n subscribe: (channel: Channel.Channel, onMessages: (messages: readonly Message.Message[]) => void) => () => void;\n /** Sends a message through the backend. */\n send: (channel: Channel.Channel, message: Message.Message) => Effect.Effect<void, Error, Capability.Service>;\n /** Whether the channel is read-only. Defaults to \"channel has foreign-key Obj.Meta\". */\n readOnly?: (channel: Channel.Channel) => boolean;\n}\n\n/** Registry of channel-message backends. Collect with `Capability.getAll`. */\nexport const ChannelBackend = Capability.make<ChannelBackendProvider>(`${meta.profile.key}.capability.channel-backend`);\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Key, Type, DXN } from '@dxos/echo';\nimport { Actor, Channel } from '@dxos/types';\n\nimport { meta } from '#meta';\n\nconst makeKey = (name: string) => DXN.make(`${meta.profile.key}.operation.${name}`);\n\nexport const CreateChannel = Operation.make({\n meta: { key: makeKey('createChannel'), name: 'Create Channel', icon: 'ph--hash--regular' },\n services: [Capability.Service],\n input: Schema.Struct({\n spaceId: Key.SpaceId,\n name: Schema.optional(Schema.String),\n /** Backend provider id; defaults to the local feed backend. */\n kind: Schema.optional(Schema.String),\n /** Per-backend create options passed to the provider's makeConfig. */\n options: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n }),\n output: Schema.Struct({\n object: Type.getSchema(Channel.Channel),\n }),\n});\n\nexport const AppendChannelMessage = Operation.make({\n meta: {\n key: makeKey('appendChannelMessage'),\n name: 'Append Channel Message',\n icon: 'ph--chat-text--regular',\n },\n // Note: Feed.FeedService is provided inside the handler from space.db, not at the\n // operation level — the runtime can't fulfill it without a space context.\n services: [Capability.Service],\n input: Schema.Struct({\n channel: Type.getSchema(Channel.Channel),\n sender: Actor.Actor,\n text: Schema.String,\n }),\n output: Schema.Void,\n});\n"],
5
- "mappings": ";;;;;AAIA,YAAYA,YAAY;AACxB,YAAYC,eAAe;AAKpB,IAAMC,kBAAkB,CAC7BC,WACAC,SAC0DD,UAAUE,KAAK,CAACC,aAAaA,SAASF,SAASA,IAAAA;AAGpG,IAAMG,oBAAoB,CAACJ,cAAAA;AAChC,QAAMK,OAAO,oBAAIC,IAAAA;AACjB,aAAWH,YAAYH,WAAW;AAChC,QAAIK,KAAKE,IAAIJ,SAASF,IAAI,GAAG;AAC3B,YAAM,IAAIO,MAAM,mCAAmCL,SAASF,IAAI,EAAE;IACpE;AACAI,SAAKI,IAAIN,SAASF,IAAI;EACxB;AACF;AAUO,IAAMS,yBAAyB,CACpCV,cAAAA;AAEAI,oBAAkBJ,SAAAA;AAClB,QAAMW,gBAAgBX,UAAUY,SAAS,KAAKZ,UAAUa,KAAK,CAACV,aAAaW,WAAWX,SAASY,YAAY,IAAI,CAAA;AAC/G,MAAI,CAACJ,eAAe;AAClB,WAAcK,cAAO;MAAEC,MAAaC,gBAAgBC,aAAM;IAAE,CAAA;EAC9D;AAEA,QAAMC,WAAWpB,UAAUqB,IAAI,CAAClB,aACvBmB,cAAcN,cAAO;IAAEf,MAAasB,eAAQpB,SAASF,IAAI;EAAE,CAAA,GAAIE,SAASY,YAAY,CAAA;AAE7F,QAAMS,UAAUJ,SAASR,WAAW,IAAIQ,SAAS,CAAA,IAAYK,aAAK,GAAIL,QAAAA;AACtE,SAAcJ,cAAO;IACnBC,MAAaC,gBAAgBC,aAAM;IACnCK;EACF,CAAA;AACF;AAEA,IAAMV,aAAa,CAACY,WAAyDC,gCAAsBD,OAAOE,GAAG,EAAEhB;;;ACrD/G;;;;AASA,SAASiB,kBAAkB;AAI3B,SAASC,YAAY;AAiCd,IAAMC,iBAAiBF,WAAWG,KAA6B,GAAGF,KAAKG,QAAQC,GAAG,6BAA6B;;;AC9CtH;;;;;AAMA,YAAYC,aAAY;AAExB,SAASC,cAAAA,mBAAkB;AAC3B,SAASC,iBAAiB;AAC1B,SAASC,KAAKC,MAAMC,WAAW;AAC/B,SAASC,OAAOC,eAAe;AAE/B,SAASC,QAAAA,aAAY;AAErB,IAAMC,UAAU,CAACC,SAAiBL,IAAIM,KAAK,GAAGH,MAAKI,QAAQC,GAAG,cAAcH,IAAAA,EAAM;AAE3E,IAAMI,gBAAgBZ,UAAUS,KAAK;EAC1CH,MAAM;IAAEK,KAAKJ,QAAQ,eAAA;IAAkBC,MAAM;IAAkBK,MAAM;EAAoB;EACzFC,UAAU;IAACf,YAAWgB;;EACtBC,OAAcC,eAAO;IACnBC,SAASjB,IAAIkB;IACbX,MAAaY,iBAAgBC,cAAM;;IAEnCC,MAAaF,iBAAgBC,cAAM;;IAEnCE,SAAgBH,iBAAgBI,eAAO;MAAEb,KAAYU;MAAQI,OAAcC;IAAI,CAAA,CAAA;EACjF,CAAA;EACAC,QAAeV,eAAO;IACpBW,QAAQ1B,KAAK2B,UAAUxB,QAAQA,OAAO;EACxC,CAAA;AACF,CAAA;AAEO,IAAMyB,uBAAuB9B,UAAUS,KAAK;EACjDH,MAAM;IACJK,KAAKJ,QAAQ,sBAAA;IACbC,MAAM;IACNK,MAAM;EACR;;;EAGAC,UAAU;IAACf,YAAWgB;;EACtBC,OAAcC,eAAO;IACnBc,SAAS7B,KAAK2B,UAAUxB,QAAQA,OAAO;IACvC2B,QAAQ5B,MAAMA;IACd6B,MAAaZ;EACf,CAAA;EACAM,QAAeO;AACjB,CAAA;",
6
- "names": ["Schema", "SchemaAST", "resolveProvider", "providers", "kind", "find", "provider", "assertUniqueKinds", "seen", "Set", "has", "Error", "add", "buildChannelFormSchema", "needsSelector", "length", "some", "fieldCount", "createFields", "Struct", "name", "optional", "String", "branches", "map", "extend", "Literal", "backend", "Union", "schema", "getPropertySignatures", "ast", "Capability", "meta", "ChannelBackend", "make", "profile", "key", "Schema", "Capability", "Operation", "Key", "Type", "DXN", "Actor", "Channel", "meta", "makeKey", "name", "make", "profile", "key", "CreateChannel", "icon", "services", "Service", "input", "Struct", "spaceId", "SpaceId", "optional", "String", "kind", "options", "Record", "value", "Any", "output", "object", "getSchema", "AppendChannelMessage", "channel", "sender", "text", "Void"]
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport * as ThreadCapabilities from './ThreadCapabilities';\n\n/** Finds the provider matching a `Channel.backend.kind`. */\nexport const resolveProvider = (\n providers: readonly ThreadCapabilities.ChannelBackendProvider[],\n kind: string,\n): ThreadCapabilities.ChannelBackendProvider | undefined => providers.find((provider) => provider.kind === kind);\n\n/** Throws if two providers share a `kind` (which would make resolution order-dependent). */\nexport const assertUniqueKinds = (providers: readonly ThreadCapabilities.ChannelBackendProvider[]): void => {\n const seen = new Set<string>();\n for (const provider of providers) {\n if (seen.has(provider.kind)) {\n throw new Error(`Duplicate channel backend kind: ${provider.kind}`);\n }\n seen.add(provider.kind);\n }\n};\n\n/**\n * Builds the create-channel form schema from the registered providers.\n *\n * With a single provider whose create-fields are empty the form is just a\n * `name` field (today's behaviour). With multiple providers (or extra fields)\n * it becomes `{ name?, backend: Union(<{ kind: Literal(p.kind) } & p.createFields>) }`,\n * which react-ui-form renders as a `kind` Select plus the selected branch's fields.\n */\nexport const buildChannelFormSchema = (\n providers: readonly ThreadCapabilities.ChannelBackendProvider[],\n): Schema.Schema.AnyNoContext => {\n assertUniqueKinds(providers);\n const needsSelector = providers.length > 1 || providers.some((provider) => fieldCount(provider.createFields) > 0);\n if (!needsSelector) {\n return Schema.Struct({ name: Schema.optional(Schema.String) });\n }\n\n const branches = providers.map((provider) =>\n Schema.extend(Schema.Struct({ kind: Schema.Literal(provider.kind) }), provider.createFields),\n );\n const backend = branches.length === 1 ? branches[0] : Schema.Union(...branches);\n return Schema.Struct({\n name: Schema.optional(Schema.String),\n backend,\n });\n};\n\nconst fieldCount = (schema: Schema.Schema.AnyNoContext): number => SchemaAST.getPropertySignatures(schema.ast).length;\n", "//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Effect from 'effect/Effect';\nimport type * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { type Obj } from '@dxos/echo';\nimport { type Channel, type Message } from '@dxos/types';\n\nimport { meta } from '#meta';\n\n/**\n * A pluggable message backend for a `Channel`. Providers are contributed by\n * plugins and resolved by `Channel.backend.kind`.\n */\nexport interface ChannelBackendProvider {\n /** Stable backend id; matches `Channel.backend.kind`. */\n kind: string;\n /** Human-readable label shown in the create-channel form. */\n label: string;\n /** Icon name (phosphor) for the create-channel form. */\n icon?: string;\n /**\n * Per-backend create-form inputs (a struct; excludes the `kind` discriminant\n * and the channel `name`, which the panel adds). Empty struct when the backend\n * needs no extra input (e.g. the local feed).\n */\n createFields: Schema.Schema.AnyNoContext;\n /** Builds the provider's config object from the collected create-form inputs. */\n makeConfig: (options: Record<string, unknown>) => Obj.Any;\n /**\n * Subscribes to the channel's messages. Invokes `onMessages` with the current\n * list immediately and on every change. Returns an unsubscribe function.\n */\n subscribe: (channel: Channel.Channel, onMessages: (messages: readonly Message.Message[]) => void) => () => void;\n /** Sends a message through the backend. */\n send: (channel: Channel.Channel, message: Message.Message) => Effect.Effect<void, Error, Capability.Service>;\n /** Whether the channel is read-only. Defaults to \"channel has foreign-key Obj.Meta\". */\n readOnly?: (channel: Channel.Channel) => boolean;\n}\n\n/** Registry of channel-message backends. Collect with `Capability.getAll`. */\nexport const ChannelBackend = Capability.make<ChannelBackendProvider>(`${meta.profile.key}.capability.channel-backend`);\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { DXN, Key, Type } from '@dxos/echo';\n// Person is referenced in Actor.Actor's inferred type; importing it allows TypeScript to name\n// it in the emitted .d.ts for AppendChannelMessage.\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport { Actor, Channel, type Person } from '@dxos/types';\n\nimport { meta } from '#meta';\n\nconst makeKey = (name: string) => DXN.make(`${meta.profile.key}.operation.${name}`);\n\nexport const CreateChannel = Operation.make({\n meta: { key: makeKey('createChannel'), name: 'Create Channel', icon: 'ph--hash--regular' },\n services: [Capability.Service],\n input: Schema.Struct({\n spaceId: Key.SpaceId,\n name: Schema.optional(Schema.String),\n /** Backend provider id; defaults to the local feed backend. */\n kind: Schema.optional(Schema.String),\n /** Per-backend create options passed to the provider's makeConfig. */\n options: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n }),\n output: Schema.Struct({\n object: Type.getSchema(Channel.Channel),\n }),\n});\n\nexport const AppendChannelMessage = Operation.make({\n meta: {\n key: makeKey('appendChannelMessage'),\n name: 'Append Channel Message',\n icon: 'ph--chat-text--regular',\n },\n // Note: Database.Service is provided inside the handler from space.db, not at the\n // operation level — the runtime can't fulfill it without a space context.\n services: [Capability.Service],\n input: Schema.Struct({\n channel: Type.getSchema(Channel.Channel),\n sender: Actor.Actor,\n text: Schema.String,\n }),\n output: Schema.Void,\n});\n"],
5
+ "mappings": ";;;;;AAIA,YAAYA,YAAY;AACxB,YAAYC,eAAe;AAKpB,IAAMC,kBAAkB,CAC7BC,WACAC,SAC0DD,UAAUE,KAAK,CAACC,aAAaA,SAASF,SAASA,IAAAA;AAGpG,IAAMG,oBAAoB,CAACJ,cAAAA;AAChC,QAAMK,OAAO,oBAAIC,IAAAA;AACjB,aAAWH,YAAYH,WAAW;AAChC,QAAIK,KAAKE,IAAIJ,SAASF,IAAI,GAAG;AAC3B,YAAM,IAAIO,MAAM,mCAAmCL,SAASF,IAAI,EAAE;IACpE;AACAI,SAAKI,IAAIN,SAASF,IAAI;EACxB;AACF;AAUO,IAAMS,yBAAyB,CACpCV,cAAAA;AAEAI,oBAAkBJ,SAAAA;AAClB,QAAMW,gBAAgBX,UAAUY,SAAS,KAAKZ,UAAUa,KAAK,CAACV,aAAaW,WAAWX,SAASY,YAAY,IAAI,CAAA;AAC/G,MAAI,CAACJ,eAAe;AAClB,WAAcK,cAAO;MAAEC,MAAaC,gBAAgBC,aAAM;IAAE,CAAA;EAC9D;AAEA,QAAMC,WAAWpB,UAAUqB,IAAI,CAAClB,aACvBmB,cAAcN,cAAO;IAAEf,MAAasB,eAAQpB,SAASF,IAAI;EAAE,CAAA,GAAIE,SAASY,YAAY,CAAA;AAE7F,QAAMS,UAAUJ,SAASR,WAAW,IAAIQ,SAAS,CAAA,IAAYK,aAAK,GAAIL,QAAAA;AACtE,SAAcJ,cAAO;IACnBC,MAAaC,gBAAgBC,aAAM;IACnCK;EACF,CAAA;AACF;AAEA,IAAMV,aAAa,CAACY,WAAyDC,gCAAsBD,OAAOE,GAAG,EAAEhB;;;ACrD/G;;;;AASA,SAASiB,kBAAkB;AAI3B,SAASC,YAAY;AAiCd,IAAMC,iBAAiBF,WAAWG,KAA6B,GAAGF,KAAKG,QAAQC,GAAG,6BAA6B;;;AC9CtH;;;;;AAMA,YAAYC,aAAY;AAExB,SAASC,cAAAA,mBAAkB;AAC3B,SAASC,iBAAiB;AAC1B,SAASC,KAAKC,KAAKC,YAAY;AAI/B,SAASC,OAAOC,eAA4B;AAE5C,SAASC,QAAAA,aAAY;AAErB,IAAMC,UAAU,CAACC,SAAiBP,IAAIQ,KAAK,GAAGH,MAAKI,QAAQC,GAAG,cAAcH,IAAAA,EAAM;AAE3E,IAAMI,gBAAgBZ,UAAUS,KAAK;EAC1CH,MAAM;IAAEK,KAAKJ,QAAQ,eAAA;IAAkBC,MAAM;IAAkBK,MAAM;EAAoB;EACzFC,UAAU;IAACf,YAAWgB;;EACtBC,OAAcC,eAAO;IACnBC,SAAShB,IAAIiB;IACbX,MAAaY,iBAAgBC,cAAM;;IAEnCC,MAAaF,iBAAgBC,cAAM;;IAEnCE,SAAgBH,iBAAgBI,eAAO;MAAEb,KAAYU;MAAQI,OAAcC;IAAI,CAAA,CAAA;EACjF,CAAA;EACAC,QAAeV,eAAO;IACpBW,QAAQzB,KAAK0B,UAAUxB,QAAQA,OAAO;EACxC,CAAA;AACF,CAAA;AAEO,IAAMyB,uBAAuB9B,UAAUS,KAAK;EACjDH,MAAM;IACJK,KAAKJ,QAAQ,sBAAA;IACbC,MAAM;IACNK,MAAM;EACR;;;EAGAC,UAAU;IAACf,YAAWgB;;EACtBC,OAAcC,eAAO;IACnBc,SAAS5B,KAAK0B,UAAUxB,QAAQA,OAAO;IACvC2B,QAAQ5B,MAAMA;IACd6B,MAAaZ;EACf,CAAA;EACAM,QAAeO;AACjB,CAAA;",
6
+ "names": ["Schema", "SchemaAST", "resolveProvider", "providers", "kind", "find", "provider", "assertUniqueKinds", "seen", "Set", "has", "Error", "add", "buildChannelFormSchema", "needsSelector", "length", "some", "fieldCount", "createFields", "Struct", "name", "optional", "String", "branches", "map", "extend", "Literal", "backend", "Union", "schema", "getPropertySignatures", "ast", "Capability", "meta", "ChannelBackend", "make", "profile", "key", "Schema", "Capability", "Operation", "DXN", "Key", "Type", "Actor", "Channel", "meta", "makeKey", "name", "make", "profile", "key", "CreateChannel", "icon", "services", "Service", "input", "Struct", "spaceId", "SpaceId", "optional", "String", "kind", "options", "Record", "value", "Any", "output", "object", "getSchema", "AppendChannelMessage", "channel", "sender", "text", "Void"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ThreadCapabilities_exports,
3
3
  resolveProvider
4
- } from "./chunk-UYINIL64.mjs";
4
+ } from "./chunk-5VTDNDBV.mjs";
5
5
 
6
6
  // src/hooks/useMessages.ts
7
7
  import { useCallback, useMemo, useRef, useSyncExternalStore } from "react";
@@ -66,4 +66,4 @@ export {
66
66
  useMessages,
67
67
  useStatus
68
68
  };
69
- //# sourceMappingURL=chunk-GQCMB5ZC.mjs.map
69
+ //# sourceMappingURL=chunk-GM3SGQMJ.mjs.map
@@ -1,10 +1,12 @@
1
1
  // src/paths.ts
2
2
  import { Paths } from "@dxos/app-toolkit";
3
3
  import { Channel } from "@dxos/types";
4
- var { getSectionPath: getChannelsPath, getObjectPath: getChannelPath } = Paths.createTypeSectionPaths(Channel.Channel);
4
+ var { getSectionPath: getChannelsPath, getObjectPath: getChannelPath } = Paths.createTypeSectionPaths(Channel.Channel, {
5
+ groupId: Paths.GroupSegments.communications
6
+ });
5
7
 
6
8
  export {
7
9
  getChannelsPath,
8
10
  getChannelPath
9
11
  };
10
- //# sourceMappingURL=chunk-DM2T6BH5.mjs.map
12
+ //# sourceMappingURL=chunk-J7OTCRYF.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/paths.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Paths } from '@dxos/app-toolkit';\nimport { Channel } from '@dxos/types';\n\nconst { getSectionPath: getChannelsPath, getObjectPath: getChannelPath } = Paths.createTypeSectionPaths(\n Channel.Channel,\n);\n\nexport { getChannelsPath, getChannelPath };\n"],
5
- "mappings": ";AAIA,SAASA,aAAa;AACtB,SAASC,eAAe;AAExB,IAAM,EAAEC,gBAAgBC,iBAAiBC,eAAeC,eAAc,IAAKL,MAAMM,uBAC/EL,QAAQA,OAAO;",
6
- "names": ["Paths", "Channel", "getSectionPath", "getChannelsPath", "getObjectPath", "getChannelPath", "createTypeSectionPaths"]
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Paths } from '@dxos/app-toolkit';\nimport { Channel } from '@dxos/types';\n\nconst { getSectionPath: getChannelsPath, getObjectPath: getChannelPath } = Paths.createTypeSectionPaths(\n Channel.Channel,\n { groupId: Paths.GroupSegments.communications },\n);\n\nexport { getChannelPath, getChannelsPath };\n"],
5
+ "mappings": ";AAIA,SAASA,aAAa;AACtB,SAASC,eAAe;AAExB,IAAM,EAAEC,gBAAgBC,iBAAiBC,eAAeC,eAAc,IAAKL,MAAMM,uBAC/EL,QAAQA,SACR;EAAEM,SAASP,MAAMQ,cAAcC;AAAe,CAAA;",
6
+ "names": ["Paths", "Channel", "getSectionPath", "getChannelsPath", "getObjectPath", "getChannelPath", "createTypeSectionPaths", "groupId", "GroupSegments", "communications"]
7
7
  }
@@ -1,8 +1,8 @@
1
1
  // src/operations/index.ts
2
2
  import { OperationHandlerSet } from "@dxos/compute";
3
- var ThreadOperationHandlerSet = OperationHandlerSet.lazy(() => import("./append-channel-message-2OZYIIFL.mjs"), () => import("./create-channel-Y6D7YGVX.mjs"));
3
+ var ThreadOperationHandlerSet = OperationHandlerSet.lazy(() => import("./append-channel-message-YIIJY6GX.mjs"), () => import("./create-channel-4CA7P2M5.mjs"));
4
4
 
5
5
  export {
6
6
  ThreadOperationHandlerSet
7
7
  };
8
- //# sourceMappingURL=chunk-KUO5HUCH.mjs.map
8
+ //# sourceMappingURL=chunk-XPUQE4Y7.mjs.map
@@ -5,7 +5,7 @@ import React, { useCallback, useMemo } from "react";
5
5
  import { Surface } from "@dxos/app-framework/ui";
6
6
  import { AppSurface } from "@dxos/app-toolkit/ui";
7
7
  import { PublicKey } from "@dxos/react-client";
8
- import { composable, Card, useTranslation } from "@dxos/react-ui";
8
+ import { Card, composable, useTranslation } from "@dxos/react-ui";
9
9
  import { Thread } from "@dxos/react-ui-thread";
10
10
  import { hoverableControls, hoverableFocusedWithinControls, mx } from "@dxos/ui-theme";
11
11
  import { meta } from "#meta";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/Chat/Chat.tsx", "../../../../src/util.ts"],
4
- "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { PublicKey } from '@dxos/react-client';\nimport { type SpaceMember } from '@dxos/react-client/echo';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { composable, Card, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { type ObjectTileComponent, Thread } from '@dxos/react-ui-thread';\nimport { type Message } from '@dxos/types';\nimport { hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\n\nimport { getMessageMetadata } from '../../util';\n\nexport type ChatProps = ThemedClassName<{\n /** Stable id used for the underlying thread root and message metadata. */\n id: string;\n /** Identity used to attribute outgoing messages in the textbox metadata. */\n identity?: Identity;\n /** Space members for rendering sender names/avatars on incoming messages. */\n members: SpaceMember[];\n /** Messages to render in order. */\n messages: readonly Message.Message[];\n /** Activity indicator (e.g. processing) shown beneath the textbox. */\n activity?: boolean;\n /** Autofocus textbox */\n autoFocus?: boolean;\n /** Marks the thread as the current/attended one. */\n current?: boolean | string;\n /**\n * When true, hide the composer textbox and activity indicator. Used for\n * channels whose source-of-truth lives elsewhere (e.g. externally-synced\n * Slack/Discord channels keyed by a foreign id) — sending isn't meaningful\n * because there is no local-write path back to the source.\n */\n readOnly?: boolean;\n /**\n * Called with the user's textbox content when they press send.\n * Returning `true` signals the message was accepted; the textbox is then cleared.\n */\n onSend: (text: string) => boolean;\n}>;\n\n/**\n * Pure chat UI: message list + composer textbox + activity indicator, built on\n * the `@dxos/react-ui-thread` primitives. Does not load data or invoke\n * operations — the caller passes messages and an `onSend` callback. Used by\n * `ChannelArticle` and `ThreadArticle`.\n */\nexport const Chat = composable<HTMLDivElement, ChatProps>(\n ({ id, identity, members, messages, activity, onSend, autoFocus, current, readOnly, classNames }, forwardedRef) => {\n const { t } = useTranslation(meta.profile.key);\n\n const components = useMemo(() => ({ Object: ObjectTile }), []);\n\n const textboxMetadata = useMemo(() => getMessageMetadata(id, identity), [id, identity]);\n\n const getMetadata = useCallback(\n (message: Message.Message) => {\n // TODO(burdon): Factor out.\n const sender = members.find(\n (member) =>\n (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||\n (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),\n );\n\n // Pass `message.sender` as the fallback so externally-synced messages\n // (Slack, etc.) display the source-side sender name instead of \"Anonymous\"\n // when no DXOS identity matches.\n return getMessageMetadata(message.id, sender?.identity, message.sender);\n },\n [members],\n );\n\n return (\n <Thread.Root getMetadata={getMetadata} components={components} identityDid={identity?.did} editable={false}>\n <Thread.Content id={id} current={current} classNames={['dx-container', classNames]} ref={forwardedRef}>\n <Thread.Messages messages={messages} />\n {!readOnly && (\n <>\n <Thread.Textbox\n {...textboxMetadata}\n autoFocus={autoFocus}\n placeholder={t('message.placeholder')}\n onSend={onSend}\n />\n <Thread.Status activity={activity}>{t('activity.message')}</Thread.Status>\n </>\n )}\n </Thread.Content>\n </Thread.Root>\n );\n },\n);\n\n/**\n * Object/reference message-block tile, injected into `Thread.Root` so that\n * `@dxos/react-ui-thread` stays free of `@dxos/app-framework`. Renders the\n * referenced subject via an app-framework `Surface` (the card role).\n */\nconst ObjectTile: ObjectTileComponent = ({ subject }) => {\n const Fallback = useCallback(() => <span className='p-1 text-sm text-description'>{subject.id}</span>, [subject]);\n return (\n <Card.Root className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}>\n <Surface.Surface\n type={AppSurface.CardContent}\n limit={1}\n data={{ subject } satisfies AppSurface.ObjectCardData}\n fallback={Fallback}\n />\n </Card.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { generateName } from '@dxos/display-name';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { type MessageMetadata } from '@dxos/react-ui-thread';\nimport { hexToFallback, toFallback } from '@dxos/util';\n\n/**\n * Stable hash for an arbitrary string — used as the avatar-fallback seed for\n * external senders who have no DXOS identity (e.g. Slack/Discord-synced\n * messages). djb2-ish, only stability matters.\n *\n * Coerced to unsigned 32-bit via `>>> 0` because `toFallback` does a plain\n * modulo against `idEmoji.length * idHue.length` and JavaScript's `%`\n * preserves the sign of the dividend — a negative hash would index\n * `idEmoji[-x]` and `idHue[-x]` to `undefined`, causing the avatar to fall\n * through to `Avatar.Content`'s default red/ghost.\n */\nconst hashString = (s: string): number => {\n let h = 0;\n for (let i = 0; i < s.length; i++) {\n h = (h * 31 + s.charCodeAt(i)) | 0;\n }\n return h >>> 0;\n};\n\nexport const getMessageMetadata = (\n id: string,\n identity?: Identity,\n /**\n * Externally-sourced sender info (Slack/Discord/etc). Used only when no\n * matching DXOS `identity` is available — provides `name`/`email` for the\n * author label and a stable seed for the avatar fallback.\n */\n fallbackSender?: { name?: string; email?: string },\n): MessageMetadata => {\n const fallback = identity?.identityKey\n ? hexToFallback(identity.identityKey.toHex())\n : toFallback(hashString(fallbackSender?.name ?? fallbackSender?.email ?? '0'));\n return {\n id,\n authorId: identity?.did,\n authorName:\n identity?.profile?.displayName ??\n (identity?.identityKey ? generateName(identity.identityKey.toHex()) : undefined) ??\n fallbackSender?.name ??\n fallbackSender?.email,\n authorAvatarProps: {\n hue: identity?.profile?.data?.hue ?? fallback.hue,\n emoji: identity?.profile?.data?.emoji ?? fallback.emoji,\n },\n };\n};\n"],
5
- "mappings": "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",
6
- "names": ["React", "useCallback", "useMemo", "Surface", "AppSurface", "PublicKey", "composable", "Card", "useTranslation", "Thread", "hoverableControls", "hoverableFocusedWithinControls", "mx", "meta", "generateName", "hexToFallback", "toFallback", "hashString", "s", "h", "i", "length", "charCodeAt", "getMessageMetadata", "id", "identity", "fallbackSender", "fallback", "identityKey", "toHex", "name", "email", "authorId", "did", "authorName", "profile", "displayName", "undefined", "authorAvatarProps", "hue", "data", "emoji", "Chat", "composable", "id", "identity", "members", "messages", "activity", "onSend", "autoFocus", "current", "readOnly", "classNames", "forwardedRef", "t", "useTranslation", "meta", "profile", "key", "components", "useMemo", "Object", "ObjectTile", "textboxMetadata", "getMessageMetadata", "getMetadata", "useCallback", "message", "sender", "find", "member", "identityDid", "did", "identityKey", "PublicKey", "equals", "Thread", "Root", "editable", "Content", "ref", "Messages", "Textbox", "placeholder", "Status", "subject", "Fallback", "span", "className", "Card", "mx", "hoverableControls", "hoverableFocusedWithinControls", "Surface", "type", "AppSurface", "CardContent", "limit", "data", "fallback"]
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { PublicKey } from '@dxos/react-client';\nimport { type SpaceMember } from '@dxos/react-client/echo';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { Card, type ThemedClassName, composable, useTranslation } from '@dxos/react-ui';\nimport { type ObjectTileComponent, Thread } from '@dxos/react-ui-thread';\nimport { type Message } from '@dxos/types';\nimport { hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\n\nimport { getMessageMetadata } from '../../util';\n\nexport type ChatProps = ThemedClassName<{\n /** Stable id used for the underlying thread root and message metadata. */\n id: string;\n /** Identity used to attribute outgoing messages in the textbox metadata. */\n identity?: Identity;\n /** Space members for rendering sender names/avatars on incoming messages. */\n members: SpaceMember[];\n /** Messages to render in order. */\n messages: readonly Message.Message[];\n /** Activity indicator (e.g. processing) shown beneath the textbox. */\n activity?: boolean;\n /** Autofocus textbox */\n autoFocus?: boolean;\n /** Marks the thread as the current/attended one. */\n current?: boolean | string;\n /**\n * When true, hide the composer textbox and activity indicator. Used for\n * channels whose source-of-truth lives elsewhere (e.g. externally-synced\n * Slack/Discord channels keyed by a foreign id) — sending isn't meaningful\n * because there is no local-write path back to the source.\n */\n readOnly?: boolean;\n /**\n * Called with the user's textbox content when they press send.\n * Returning `true` signals the message was accepted; the textbox is then cleared.\n */\n onSend: (text: string) => boolean;\n}>;\n\n/**\n * Pure chat UI: message list + composer textbox + activity indicator, built on\n * the `@dxos/react-ui-thread` primitives. Does not load data or invoke\n * operations — the caller passes messages and an `onSend` callback. Used by\n * `ChannelArticle` and `ThreadArticle`.\n */\nexport const Chat = composable<HTMLDivElement, ChatProps>(\n ({ id, identity, members, messages, activity, onSend, autoFocus, current, readOnly, classNames }, forwardedRef) => {\n const { t } = useTranslation(meta.profile.key);\n\n const components = useMemo(() => ({ Object: ObjectTile }), []);\n\n const textboxMetadata = useMemo(() => getMessageMetadata(id, identity), [id, identity]);\n\n const getMetadata = useCallback(\n (message: Message.Message) => {\n // TODO(burdon): Factor out.\n const sender = members.find(\n (member) =>\n (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||\n (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),\n );\n\n // Pass `message.sender` as the fallback so externally-synced messages\n // (Slack, etc.) display the source-side sender name instead of \"Anonymous\"\n // when no DXOS identity matches.\n return getMessageMetadata(message.id, sender?.identity, message.sender);\n },\n [members],\n );\n\n return (\n <Thread.Root getMetadata={getMetadata} components={components} identityDid={identity?.did} editable={false}>\n <Thread.Content id={id} current={current} classNames={['dx-container', classNames]} ref={forwardedRef}>\n <Thread.Messages messages={messages} />\n {!readOnly && (\n <>\n <Thread.Textbox\n {...textboxMetadata}\n autoFocus={autoFocus}\n placeholder={t('message.placeholder')}\n onSend={onSend}\n />\n <Thread.Status activity={activity}>{t('activity.message')}</Thread.Status>\n </>\n )}\n </Thread.Content>\n </Thread.Root>\n );\n },\n);\n\n/**\n * Object/reference message-block tile, injected into `Thread.Root` so that\n * `@dxos/react-ui-thread` stays free of `@dxos/app-framework`. Renders the\n * referenced subject via an app-framework `Surface` (the card role).\n */\nconst ObjectTile: ObjectTileComponent = ({ subject }) => {\n const Fallback = useCallback(() => <span className='p-1 text-sm text-description'>{subject.id}</span>, [subject]);\n return (\n <Card.Root className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}>\n <Surface.Surface\n type={AppSurface.CardContent}\n limit={1}\n data={{ subject } satisfies AppSurface.ObjectCardData}\n fallback={Fallback}\n />\n </Card.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { generateName } from '@dxos/display-name';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { type MessageMetadata } from '@dxos/react-ui-thread';\nimport { hexToFallback, toFallback } from '@dxos/util';\n\n/**\n * Stable hash for an arbitrary string — used as the avatar-fallback seed for\n * external senders who have no DXOS identity (e.g. Slack/Discord-synced\n * messages). djb2-ish, only stability matters.\n *\n * Coerced to unsigned 32-bit via `>>> 0` because `toFallback` does a plain\n * modulo against `idEmoji.length * idHue.length` and JavaScript's `%`\n * preserves the sign of the dividend — a negative hash would index\n * `idEmoji[-x]` and `idHue[-x]` to `undefined`, causing the avatar to fall\n * through to `Avatar.Content`'s default red/ghost.\n */\nconst hashString = (s: string): number => {\n let h = 0;\n for (let i = 0; i < s.length; i++) {\n h = (h * 31 + s.charCodeAt(i)) | 0;\n }\n return h >>> 0;\n};\n\nexport const getMessageMetadata = (\n id: string,\n identity?: Identity,\n /**\n * Externally-sourced sender info (Slack/Discord/etc). Used only when no\n * matching DXOS `identity` is available — provides `name`/`email` for the\n * author label and a stable seed for the avatar fallback.\n */\n fallbackSender?: { name?: string; email?: string },\n): MessageMetadata => {\n const fallback = identity?.identityKey\n ? hexToFallback(identity.identityKey.toHex())\n : toFallback(hashString(fallbackSender?.name ?? fallbackSender?.email ?? '0'));\n return {\n id,\n authorId: identity?.did,\n authorName:\n identity?.profile?.displayName ??\n (identity?.identityKey ? generateName(identity.identityKey.toHex()) : undefined) ??\n fallbackSender?.name ??\n fallbackSender?.email,\n authorAvatarProps: {\n hue: identity?.profile?.data?.hue ?? fallback.hue,\n emoji: identity?.profile?.data?.emoji ?? fallback.emoji,\n },\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useCallback", "useMemo", "Surface", "AppSurface", "PublicKey", "Card", "composable", "useTranslation", "Thread", "hoverableControls", "hoverableFocusedWithinControls", "mx", "meta", "generateName", "hexToFallback", "toFallback", "hashString", "s", "h", "i", "length", "charCodeAt", "getMessageMetadata", "id", "identity", "fallbackSender", "fallback", "identityKey", "toHex", "name", "email", "authorId", "did", "authorName", "profile", "displayName", "undefined", "authorAvatarProps", "hue", "data", "emoji", "Chat", "composable", "id", "identity", "members", "messages", "activity", "onSend", "autoFocus", "current", "readOnly", "classNames", "forwardedRef", "t", "useTranslation", "meta", "profile", "key", "components", "useMemo", "Object", "ObjectTile", "textboxMetadata", "getMessageMetadata", "getMetadata", "useCallback", "message", "sender", "find", "member", "identityDid", "did", "identityKey", "PublicKey", "equals", "Thread", "Root", "editable", "Content", "ref", "Messages", "Textbox", "placeholder", "Status", "subject", "Fallback", "span", "className", "Card", "mx", "hoverableControls", "hoverableFocusedWithinControls", "Surface", "type", "AppSurface", "CardContent", "limit", "data", "fallback"]
7
7
  }
@@ -2,7 +2,7 @@ import {
2
2
  ThreadCapabilities_exports,
3
3
  ThreadOperation_exports,
4
4
  resolveProvider
5
- } from "./chunk-UYINIL64.mjs";
5
+ } from "./chunk-5VTDNDBV.mjs";
6
6
  import "./chunk-J5LGTIGS.mjs";
7
7
 
8
8
  // src/operations/create-channel.ts
@@ -38,4 +38,4 @@ var create_channel_default = handler;
38
38
  export {
39
39
  create_channel_default as default
40
40
  };
41
- //# sourceMappingURL=create-channel-Y6D7YGVX.mjs.map
41
+ //# sourceMappingURL=create-channel-4CA7P2M5.mjs.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  getChannelsPath
3
- } from "./chunk-DM2T6BH5.mjs";
3
+ } from "./chunk-J7OTCRYF.mjs";
4
4
  import {
5
5
  ThreadCapabilities_exports,
6
6
  resolveProvider
7
- } from "./chunk-UYINIL64.mjs";
7
+ } from "./chunk-5VTDNDBV.mjs";
8
8
  import "./chunk-J5LGTIGS.mjs";
9
9
 
10
10
  // src/capabilities/create-object.ts
@@ -34,7 +34,6 @@ var create_object_default = Capability.makeModule(Effect.fnUntraced(function* ()
34
34
  return yield* Operation.invoke(SpaceOperation.AddObject, {
35
35
  object,
36
36
  target: opts.target,
37
- hidden: true,
38
37
  targetNodeId: opts.targetNodeId ?? getChannelsPath(opts.db.spaceId)
39
38
  });
40
39
  })
@@ -43,4 +42,4 @@ var create_object_default = Capability.makeModule(Effect.fnUntraced(function* ()
43
42
  export {
44
43
  create_object_default as default
45
44
  };
46
- //# sourceMappingURL=create-object-LOZBRZAF.mjs.map
45
+ //# sourceMappingURL=create-object-O3TZ2MCJ.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/capabilities/create-object.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Type } from '@dxos/echo';\nimport { SpaceCapabilities, SpaceOperation } from '@dxos/plugin-space';\nimport { Channel } from '@dxos/types';\n\n// Lazily loaded (via the #containers barrel) so the react-ui-form dependency\n// graph isn't pulled into this capability module's evaluation.\nimport { ChannelCreatePanel } from '#containers';\n\nimport { getChannelsPath } from '../paths';\nimport { ThreadCapabilities, resolveProvider } from '../types';\n\ntype CreateOptions = Parameters<SpaceCapabilities.CreateObjectEntry['createObject']>[1];\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(Channel.Channel),\n customPanel: ChannelCreatePanel,\n createObject: (\n { name, kind, options }: { name?: string; kind?: string; options?: Record<string, unknown> },\n opts: CreateOptions,\n ) =>\n Effect.gen(function* () {\n const providers = yield* Capability.getAll(ThreadCapabilities.ChannelBackend);\n const provider = kind ? resolveProvider(providers, kind) : undefined;\n const object = provider\n ? Channel.make({ name, backend: { kind: provider.kind, config: provider.makeConfig(options ?? {}) } })\n : Channel.make({ name });\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: opts.target,\n hidden: true,\n targetNodeId: opts.targetNodeId ?? getChannelsPath(opts.db.spaceId),\n });\n }),\n });\n }),\n);\n"],
5
- "mappings": ";;;;;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,iBAAiB;AAC1B,SAASC,YAAY;AACrB,SAASC,mBAAmBC,sBAAsB;AAClD,SAASC,eAAe;AAIxB,SAASC,0BAA0B;AAOnC,IAAA,wBAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,SAAOF,WAAWG,YAAYC,kBAAkBC,mBAAmB;IACjEC,IAAIC,KAAKC,YAAYC,QAAQA,OAAO;IACpCC,aAAaC;IACbC,cAAc,CACZ,EAAEC,MAAMC,MAAMC,QAAO,GACrBC,SAEOC,WAAI,aAAA;AACT,YAAMC,YAAY,OAAOlB,WAAWmB,OAAOC,2BAAmBC,cAAc;AAC5E,YAAMC,WAAWR,OAAOS,gBAAgBL,WAAWJ,IAAAA,IAAQU;AAC3D,YAAMC,SAASH,WACXb,QAAQiB,KAAK;QAAEb;QAAMc,SAAS;UAAEb,MAAMQ,SAASR;UAAMc,QAAQN,SAASO,WAAWd,WAAW,CAAC,CAAA;QAAG;MAAE,CAAA,IAClGN,QAAQiB,KAAK;QAAEb;MAAK,CAAA;AACxB,aAAO,OAAOiB,UAAUC,OAAOC,eAAeC,WAAW;QACvDR;QACAS,QAAQlB,KAAKkB;QACbC,QAAQ;QACRC,cAAcpB,KAAKoB,gBAAgBC,gBAAgBrB,KAAKsB,GAAGC,OAAO;MACpE,CAAA;IACF,CAAA;EACJ,CAAA;AACF,CAAA,CAAA;",
6
- "names": ["Effect", "Capability", "Operation", "Type", "SpaceCapabilities", "SpaceOperation", "Channel", "ChannelCreatePanel", "Capability", "makeModule", "fnUntraced", "contributes", "SpaceCapabilities", "CreateObjectEntry", "id", "Type", "getTypename", "Channel", "customPanel", "ChannelCreatePanel", "createObject", "name", "kind", "options", "opts", "gen", "providers", "getAll", "ThreadCapabilities", "ChannelBackend", "provider", "resolveProvider", "undefined", "object", "make", "backend", "config", "makeConfig", "Operation", "invoke", "SpaceOperation", "AddObject", "target", "hidden", "targetNodeId", "getChannelsPath", "db", "spaceId"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Type } from '@dxos/echo';\nimport { SpaceCapabilities, SpaceOperation } from '@dxos/plugin-space';\nimport { Channel } from '@dxos/types';\n\n// Lazily loaded (via the #containers barrel) so the react-ui-form dependency\n// graph isn't pulled into this capability module's evaluation.\nimport { ChannelCreatePanel } from '#containers';\n\nimport { getChannelsPath } from '../paths';\nimport { ThreadCapabilities, resolveProvider } from '../types';\n\ntype CreateOptions = Parameters<SpaceCapabilities.CreateObjectEntry['createObject']>[1];\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(Channel.Channel),\n customPanel: ChannelCreatePanel,\n createObject: (\n { name, kind, options }: { name?: string; kind?: string; options?: Record<string, unknown> },\n opts: CreateOptions,\n ) =>\n Effect.gen(function* () {\n const providers = yield* Capability.getAll(ThreadCapabilities.ChannelBackend);\n const provider = kind ? resolveProvider(providers, kind) : undefined;\n const object = provider\n ? Channel.make({ name, backend: { kind: provider.kind, config: provider.makeConfig(options ?? {}) } })\n : Channel.make({ name });\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: opts.target,\n targetNodeId: opts.targetNodeId ?? getChannelsPath(opts.db.spaceId),\n });\n }),\n });\n }),\n);\n"],
5
+ "mappings": ";;;;;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,iBAAiB;AAC1B,SAASC,YAAY;AACrB,SAASC,mBAAmBC,sBAAsB;AAClD,SAASC,eAAe;AAIxB,SAASC,0BAA0B;AAOnC,IAAA,wBAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,SAAOF,WAAWG,YAAYC,kBAAkBC,mBAAmB;IACjEC,IAAIC,KAAKC,YAAYC,QAAQA,OAAO;IACpCC,aAAaC;IACbC,cAAc,CACZ,EAAEC,MAAMC,MAAMC,QAAO,GACrBC,SAEOC,WAAI,aAAA;AACT,YAAMC,YAAY,OAAOlB,WAAWmB,OAAOC,2BAAmBC,cAAc;AAC5E,YAAMC,WAAWR,OAAOS,gBAAgBL,WAAWJ,IAAAA,IAAQU;AAC3D,YAAMC,SAASH,WACXb,QAAQiB,KAAK;QAAEb;QAAMc,SAAS;UAAEb,MAAMQ,SAASR;UAAMc,QAAQN,SAASO,WAAWd,WAAW,CAAC,CAAA;QAAG;MAAE,CAAA,IAClGN,QAAQiB,KAAK;QAAEb;MAAK,CAAA;AACxB,aAAO,OAAOiB,UAAUC,OAAOC,eAAeC,WAAW;QACvDR;QACAS,QAAQlB,KAAKkB;QACbC,cAAcnB,KAAKmB,gBAAgBC,gBAAgBpB,KAAKqB,GAAGC,OAAO;MACpE,CAAA;IACF,CAAA;EACJ,CAAA;AACF,CAAA,CAAA;",
6
+ "names": ["Effect", "Capability", "Operation", "Type", "SpaceCapabilities", "SpaceOperation", "Channel", "ChannelCreatePanel", "Capability", "makeModule", "fnUntraced", "contributes", "SpaceCapabilities", "CreateObjectEntry", "id", "Type", "getTypename", "Channel", "customPanel", "ChannelCreatePanel", "createObject", "name", "kind", "options", "opts", "gen", "providers", "getAll", "ThreadCapabilities", "ChannelBackend", "provider", "resolveProvider", "undefined", "object", "make", "backend", "config", "makeConfig", "Operation", "invoke", "SpaceOperation", "AddObject", "target", "targetNodeId", "getChannelsPath", "db", "spaceId"]
7
7
  }
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  useMessages,
3
3
  useStatus
4
- } from "../chunk-GQCMB5ZC.mjs";
5
- import "../chunk-UYINIL64.mjs";
4
+ } from "../chunk-GM3SGQMJ.mjs";
5
+ import "../chunk-5VTDNDBV.mjs";
6
6
  import "../chunk-J5LGTIGS.mjs";
7
7
  export {
8
8
  useMessages,
@@ -5,18 +5,18 @@ import {
5
5
  import {
6
6
  getChannelPath,
7
7
  getChannelsPath
8
- } from "./chunk-DM2T6BH5.mjs";
8
+ } from "./chunk-J7OTCRYF.mjs";
9
9
  import {
10
10
  useMessages,
11
11
  useStatus
12
- } from "./chunk-GQCMB5ZC.mjs";
12
+ } from "./chunk-GM3SGQMJ.mjs";
13
13
  import {
14
14
  ThreadCapabilities_exports,
15
15
  ThreadOperation_exports,
16
16
  assertUniqueKinds,
17
17
  buildChannelFormSchema,
18
18
  resolveProvider
19
- } from "./chunk-UYINIL64.mjs";
19
+ } from "./chunk-5VTDNDBV.mjs";
20
20
  import "./chunk-J5LGTIGS.mjs";
21
21
  export {
22
22
  THREAD_ITEM,