@dxos/plugin-automation 0.7.5-labs.8a82073 → 0.7.5-labs.c0e040f

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 (139) hide show
  1. package/dist/lib/browser/AutomationPanel-VW2XIUPU.mjs +8 -0
  2. package/dist/lib/browser/ChatContainer-OLRZNGWK.mjs +12 -0
  3. package/dist/lib/browser/{ai-client-UJLNYP7B.mjs → ai-client-5CNY6JBF.mjs} +3 -3
  4. package/dist/lib/browser/{app-graph-builder-3H5TCRG4.mjs → app-graph-builder-6H7MDCXE.mjs} +39 -4
  5. package/dist/lib/browser/app-graph-builder-6H7MDCXE.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-BQHXJZ4K.mjs → chunk-2H2EUYXL.mjs} +2 -2
  7. package/dist/lib/browser/{chunk-N4SSCQ7P.mjs → chunk-ITG6CBKL.mjs} +10 -10
  8. package/dist/lib/browser/chunk-ITG6CBKL.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-MRBC5J4T.mjs +518 -0
  10. package/dist/lib/browser/chunk-MRBC5J4T.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-6KJRL5KV.mjs → chunk-NQFZ6XRX.mjs} +2 -2
  12. package/dist/lib/browser/{chunk-43WRHV2L.mjs → chunk-Q4IMHYGH.mjs} +2 -2
  13. package/dist/lib/browser/{chunk-DQ7ZSYJJ.mjs → chunk-R4JH4TLE.mjs} +3 -1
  14. package/dist/lib/browser/chunk-R4JH4TLE.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +10 -6
  16. package/dist/lib/browser/index.mjs.map +1 -1
  17. package/dist/lib/browser/{intent-resolver-5YVZJFS3.mjs → intent-resolver-BWAXKT27.mjs} +3 -3
  18. package/dist/lib/browser/meta.json +1 -1
  19. package/dist/lib/browser/{react-surface-RRTZFTKR.mjs → react-surface-O6SHIBCA.mjs} +15 -7
  20. package/dist/lib/browser/react-surface-O6SHIBCA.mjs.map +7 -0
  21. package/dist/lib/browser/types/index.mjs +2 -2
  22. package/dist/lib/node/{AutomationPanel-BCEY3YXO.cjs → AutomationPanel-G6EDDYWW.cjs} +7 -7
  23. package/dist/lib/node/{AutomationPanel-BCEY3YXO.cjs.map → AutomationPanel-G6EDDYWW.cjs.map} +2 -2
  24. package/dist/lib/node/{ChatContainer-QUWFEBTI.cjs → ChatContainer-GRZDJIG5.cjs} +10 -10
  25. package/dist/lib/node/ChatContainer-GRZDJIG5.cjs.map +7 -0
  26. package/dist/lib/node/{ai-client-AOB6TLNW.cjs → ai-client-FKLPDELV.cjs} +7 -7
  27. package/dist/lib/node/{app-graph-builder-CDEQJEHY.cjs → app-graph-builder-7JMJLZIE.cjs} +48 -14
  28. package/dist/lib/node/app-graph-builder-7JMJLZIE.cjs.map +7 -0
  29. package/dist/lib/node/{chunk-DKGNORZK.cjs → chunk-CFBERLTN.cjs} +21 -21
  30. package/dist/lib/node/chunk-CFBERLTN.cjs.map +7 -0
  31. package/dist/lib/node/{chunk-TQEDPRY5.cjs → chunk-EQYHOTGG.cjs} +7 -4
  32. package/dist/lib/node/chunk-EQYHOTGG.cjs.map +7 -0
  33. package/dist/lib/node/chunk-FQUY77HT.cjs +527 -0
  34. package/dist/lib/node/chunk-FQUY77HT.cjs.map +7 -0
  35. package/dist/lib/node/{chunk-H3RSMGJG.cjs → chunk-GB7245FH.cjs} +6 -6
  36. package/dist/lib/node/{chunk-IPCNJYQL.cjs → chunk-QXIHYOMF.cjs} +7 -7
  37. package/dist/lib/node/{chunk-AWZVJZ2I.cjs → chunk-U5Z7LFWB.cjs} +6 -6
  38. package/dist/lib/node/index.cjs +75 -71
  39. package/dist/lib/node/index.cjs.map +1 -1
  40. package/dist/lib/node/{intent-resolver-MJFZT5IU.cjs → intent-resolver-C6OKFVEW.cjs} +8 -8
  41. package/dist/lib/node/meta.json +1 -1
  42. package/dist/lib/node/{react-surface-BVZ63QP4.cjs → react-surface-JT6SVCPK.cjs} +23 -17
  43. package/dist/lib/node/react-surface-JT6SVCPK.cjs.map +7 -0
  44. package/dist/lib/node/types/index.cjs +11 -11
  45. package/dist/lib/node/types/index.cjs.map +1 -1
  46. package/dist/lib/node-esm/{AutomationPanel-YTIZ74RI.mjs → AutomationPanel-V3IWQAMO.mjs} +3 -3
  47. package/dist/lib/node-esm/{ChatContainer-QSMDZRDU.mjs → ChatContainer-ORVWQPJO.mjs} +5 -5
  48. package/dist/lib/node-esm/{ai-client-RUCCJ7JZ.mjs → ai-client-XGNA6SJ5.mjs} +3 -3
  49. package/dist/lib/node-esm/{app-graph-builder-GR3URVNX.mjs → app-graph-builder-C6NUQGCU.mjs} +39 -4
  50. package/dist/lib/node-esm/app-graph-builder-C6NUQGCU.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-2OKJZ4ZW.mjs +519 -0
  52. package/dist/lib/node-esm/chunk-2OKJZ4ZW.mjs.map +7 -0
  53. package/dist/lib/node-esm/{chunk-CZXU4CFK.mjs → chunk-6HLBYDUI.mjs} +2 -2
  54. package/dist/lib/node-esm/{chunk-D7RARVTS.mjs → chunk-7VPT3OO3.mjs} +10 -10
  55. package/dist/lib/node-esm/chunk-7VPT3OO3.mjs.map +7 -0
  56. package/dist/lib/node-esm/{chunk-7JO77AAS.mjs → chunk-DNCXRGAF.mjs} +2 -2
  57. package/dist/lib/node-esm/{chunk-JFHI22MF.mjs → chunk-EMVA6QUT.mjs} +3 -1
  58. package/dist/lib/node-esm/chunk-EMVA6QUT.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-LSSWQIQD.mjs → chunk-IJRTDSKN.mjs} +2 -2
  60. package/dist/lib/node-esm/index.mjs +10 -6
  61. package/dist/lib/node-esm/index.mjs.map +1 -1
  62. package/dist/lib/node-esm/{intent-resolver-FCKNRTKQ.mjs → intent-resolver-DCP4ZDBA.mjs} +3 -3
  63. package/dist/lib/node-esm/meta.json +1 -1
  64. package/dist/lib/node-esm/{react-surface-Y5LQHUQN.mjs → react-surface-DSVM33SA.mjs} +15 -7
  65. package/dist/lib/node-esm/react-surface-DSVM33SA.mjs.map +7 -0
  66. package/dist/lib/node-esm/types/index.mjs +2 -2
  67. package/dist/types/src/capabilities/app-graph-builder.d.ts +23 -22
  68. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  70. package/dist/types/src/components/AmbientChatDialog/AmbientChatDialog.d.ts +3 -0
  71. package/dist/types/src/components/AmbientChatDialog/AmbientChatDialog.d.ts.map +1 -0
  72. package/dist/types/src/components/AmbientChatDialog/AmbientChatDialog.stories.d.ts +8 -0
  73. package/dist/types/src/components/AmbientChatDialog/AmbientChatDialog.stories.d.ts.map +1 -0
  74. package/dist/types/src/components/AmbientChatDialog/index.d.ts +2 -0
  75. package/dist/types/src/components/AmbientChatDialog/index.d.ts.map +1 -0
  76. package/dist/types/src/components/Prompt/Prompt.d.ts +3 -3
  77. package/dist/types/src/components/Prompt/Prompt.d.ts.map +1 -1
  78. package/dist/types/src/components/Prompt/prompt-autocomplete.d.ts +1 -1
  79. package/dist/types/src/components/Prompt/prompt-autocomplete.d.ts.map +1 -1
  80. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts.map +1 -1
  81. package/dist/types/src/components/index.d.ts +1 -0
  82. package/dist/types/src/components/index.d.ts.map +1 -1
  83. package/dist/types/src/meta.d.ts +1 -0
  84. package/dist/types/src/meta.d.ts.map +1 -1
  85. package/package.json +52 -51
  86. package/src/capabilities/app-graph-builder.ts +34 -3
  87. package/src/capabilities/react-surface.tsx +8 -2
  88. package/src/components/AmbientChatDialog/AmbientChatDialog.stories.tsx +44 -0
  89. package/src/components/AmbientChatDialog/AmbientChatDialog.tsx +63 -0
  90. package/src/components/AmbientChatDialog/index.ts +5 -0
  91. package/src/components/Prompt/Prompt.tsx +6 -3
  92. package/src/components/Prompt/prompt-autocomplete.ts +2 -2
  93. package/src/components/PromptEditor/PromptEditor.tsx +3 -3
  94. package/src/components/ServiceRegistry/ServiceRegistry.tsx +1 -0
  95. package/src/components/Thread/Thread.stories.tsx +1 -1
  96. package/src/components/index.ts +1 -0
  97. package/src/hooks/useChatProcessor.tsx +2 -2
  98. package/src/meta.ts +2 -0
  99. package/src/tools/openapi.test.ts +3 -6
  100. package/dist/lib/browser/AutomationPanel-CL2TWZT5.mjs +0 -8
  101. package/dist/lib/browser/ChatContainer-EJ3IWL7Y.mjs +0 -12
  102. package/dist/lib/browser/app-graph-builder-3H5TCRG4.mjs.map +0 -7
  103. package/dist/lib/browser/chunk-4M74P6YW.mjs +0 -284
  104. package/dist/lib/browser/chunk-4M74P6YW.mjs.map +0 -7
  105. package/dist/lib/browser/chunk-DQ7ZSYJJ.mjs.map +0 -7
  106. package/dist/lib/browser/chunk-N4SSCQ7P.mjs.map +0 -7
  107. package/dist/lib/browser/react-surface-RRTZFTKR.mjs.map +0 -7
  108. package/dist/lib/node/ChatContainer-QUWFEBTI.cjs.map +0 -7
  109. package/dist/lib/node/app-graph-builder-CDEQJEHY.cjs.map +0 -7
  110. package/dist/lib/node/chunk-DKGNORZK.cjs.map +0 -7
  111. package/dist/lib/node/chunk-LC6KNDPQ.cjs +0 -302
  112. package/dist/lib/node/chunk-LC6KNDPQ.cjs.map +0 -7
  113. package/dist/lib/node/chunk-TQEDPRY5.cjs.map +0 -7
  114. package/dist/lib/node/react-surface-BVZ63QP4.cjs.map +0 -7
  115. package/dist/lib/node-esm/app-graph-builder-GR3URVNX.mjs.map +0 -7
  116. package/dist/lib/node-esm/chunk-CQPQXIJP.mjs +0 -285
  117. package/dist/lib/node-esm/chunk-CQPQXIJP.mjs.map +0 -7
  118. package/dist/lib/node-esm/chunk-D7RARVTS.mjs.map +0 -7
  119. package/dist/lib/node-esm/chunk-JFHI22MF.mjs.map +0 -7
  120. package/dist/lib/node-esm/react-surface-Y5LQHUQN.mjs.map +0 -7
  121. /package/dist/lib/browser/{AutomationPanel-CL2TWZT5.mjs.map → AutomationPanel-VW2XIUPU.mjs.map} +0 -0
  122. /package/dist/lib/browser/{ChatContainer-EJ3IWL7Y.mjs.map → ChatContainer-OLRZNGWK.mjs.map} +0 -0
  123. /package/dist/lib/browser/{ai-client-UJLNYP7B.mjs.map → ai-client-5CNY6JBF.mjs.map} +0 -0
  124. /package/dist/lib/browser/{chunk-BQHXJZ4K.mjs.map → chunk-2H2EUYXL.mjs.map} +0 -0
  125. /package/dist/lib/browser/{chunk-6KJRL5KV.mjs.map → chunk-NQFZ6XRX.mjs.map} +0 -0
  126. /package/dist/lib/browser/{chunk-43WRHV2L.mjs.map → chunk-Q4IMHYGH.mjs.map} +0 -0
  127. /package/dist/lib/browser/{intent-resolver-5YVZJFS3.mjs.map → intent-resolver-BWAXKT27.mjs.map} +0 -0
  128. /package/dist/lib/node/{ai-client-AOB6TLNW.cjs.map → ai-client-FKLPDELV.cjs.map} +0 -0
  129. /package/dist/lib/node/{chunk-H3RSMGJG.cjs.map → chunk-GB7245FH.cjs.map} +0 -0
  130. /package/dist/lib/node/{chunk-IPCNJYQL.cjs.map → chunk-QXIHYOMF.cjs.map} +0 -0
  131. /package/dist/lib/node/{chunk-AWZVJZ2I.cjs.map → chunk-U5Z7LFWB.cjs.map} +0 -0
  132. /package/dist/lib/node/{intent-resolver-MJFZT5IU.cjs.map → intent-resolver-C6OKFVEW.cjs.map} +0 -0
  133. /package/dist/lib/node-esm/{AutomationPanel-YTIZ74RI.mjs.map → AutomationPanel-V3IWQAMO.mjs.map} +0 -0
  134. /package/dist/lib/node-esm/{ChatContainer-QSMDZRDU.mjs.map → ChatContainer-ORVWQPJO.mjs.map} +0 -0
  135. /package/dist/lib/node-esm/{ai-client-RUCCJ7JZ.mjs.map → ai-client-XGNA6SJ5.mjs.map} +0 -0
  136. /package/dist/lib/node-esm/{chunk-CZXU4CFK.mjs.map → chunk-6HLBYDUI.mjs.map} +0 -0
  137. /package/dist/lib/node-esm/{chunk-7JO77AAS.mjs.map → chunk-DNCXRGAF.mjs.map} +0 -0
  138. /package/dist/lib/node-esm/{chunk-LSSWQIQD.mjs.map → chunk-IJRTDSKN.mjs.map} +0 -0
  139. /package/dist/lib/node-esm/{intent-resolver-FCKNRTKQ.mjs.map → intent-resolver-DCP4ZDBA.mjs.map} +0 -0
@@ -1,17 +1,52 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
+ AMBIENT_CHAT_DIALOG,
3
4
  AUTOMATION_PLUGIN
4
- } from "./chunk-JFHI22MF.mjs";
5
+ } from "./chunk-EMVA6QUT.mjs";
5
6
 
6
7
  // packages/plugins/experimental/plugin-automation/src/capabilities/app-graph-builder.ts
7
- import { Capabilities, contributes } from "@dxos/app-framework";
8
+ import { Capabilities, contributes, createIntent, LayoutAction } from "@dxos/app-framework";
8
9
  import { ClientCapabilities } from "@dxos/plugin-client";
9
- import { createExtension, toSignal } from "@dxos/plugin-graph";
10
+ import { createExtension, ROOT_ID, toSignal } from "@dxos/plugin-graph";
10
11
  import { memoizeQuery } from "@dxos/plugin-space";
11
12
  import { getTypename, parseId, SpaceState } from "@dxos/react-client/echo";
12
13
  var app_graph_builder_default = (context) => {
13
14
  const resolve = (typename) => context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
14
15
  return contributes(Capabilities.AppGraphBuilder, [
16
+ createExtension({
17
+ id: `${AUTOMATION_PLUGIN}/ambient-chat`,
18
+ filter: (node) => node.id === ROOT_ID,
19
+ actions: () => [
20
+ {
21
+ id: `${LayoutAction.UpdateDialog._tag}/ambient-chat/open`,
22
+ data: async () => {
23
+ const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
24
+ await dispatch(createIntent(LayoutAction.UpdateDialog, {
25
+ part: "dialog",
26
+ subject: AMBIENT_CHAT_DIALOG,
27
+ options: {
28
+ state: true,
29
+ blockAlign: "end"
30
+ }
31
+ }));
32
+ },
33
+ properties: {
34
+ label: [
35
+ "open ambient chat label",
36
+ {
37
+ ns: AUTOMATION_PLUGIN
38
+ }
39
+ ],
40
+ icon: "ph--chat-centered-text--regular",
41
+ disposition: "pin-end",
42
+ keyBinding: {
43
+ macos: "shift+meta+k",
44
+ windows: "shift+ctrl+k"
45
+ }
46
+ }
47
+ }
48
+ ]
49
+ }),
15
50
  createExtension({
16
51
  id: `${AUTOMATION_PLUGIN}/service-registry`,
17
52
  resolver: ({ id }) => {
@@ -160,4 +195,4 @@ var app_graph_builder_default = (context) => {
160
195
  export {
161
196
  app_graph_builder_default as default
162
197
  };
163
- //# sourceMappingURL=app-graph-builder-GR3URVNX.mjs.map
198
+ //# sourceMappingURL=app-graph-builder-C6NUQGCU.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 { Capabilities, contributes, createIntent, LayoutAction, type PluginsContext } from '@dxos/app-framework';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { createExtension, type Node, ROOT_ID, toSignal } from '@dxos/plugin-graph';\nimport { memoizeQuery } from '@dxos/plugin-space';\nimport { getTypename, parseId, SpaceState } from '@dxos/react-client/echo';\n\nimport { AMBIENT_CHAT_DIALOG, AUTOMATION_PLUGIN } from '../meta';\n\nexport default (context: PluginsContext) => {\n const resolve = (typename: string) =>\n context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};\n\n return contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${AUTOMATION_PLUGIN}/ambient-chat`,\n filter: (node): node is Node<null> => node.id === ROOT_ID,\n actions: () => [\n {\n id: `${LayoutAction.UpdateDialog._tag}/ambient-chat/open`,\n data: async () => {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n await dispatch(\n createIntent(LayoutAction.UpdateDialog, {\n part: 'dialog',\n subject: AMBIENT_CHAT_DIALOG,\n options: {\n state: true,\n blockAlign: 'end',\n },\n }),\n );\n },\n properties: {\n label: ['open ambient chat label', { ns: AUTOMATION_PLUGIN }],\n icon: 'ph--chat-centered-text--regular',\n disposition: 'pin-end',\n keyBinding: {\n macos: 'shift+meta+k',\n windows: 'shift+ctrl+k',\n },\n },\n },\n ],\n }),\n createExtension({\n id: `${AUTOMATION_PLUGIN}/service-registry`,\n resolver: ({ id }) => {\n if (!id.endsWith('~service-registry')) {\n return;\n }\n\n const type = 'orphan-settings-for-subject';\n const icon = 'ph--plugs--regular';\n\n const client = context.requestCapability(ClientCapabilities.Client);\n const [subjectId] = id.split('~');\n const { spaceId } = parseId(subjectId);\n const spaces = toSignal(\n (onChange) => client.spaces.subscribe(() => onChange()).unsubscribe,\n () => client.spaces.get(),\n );\n const space = spaces?.find((space) => space.id === spaceId && space.state.get() === SpaceState.SPACE_READY);\n return {\n id,\n type,\n data: null,\n properties: {\n icon,\n label: ['service registry label', { ns: AUTOMATION_PLUGIN }],\n object: null,\n space,\n },\n };\n },\n }),\n createExtension({\n id: `${AUTOMATION_PLUGIN}/automation-for-subject`,\n resolver: ({ id }) => {\n if (!id.endsWith('~automation')) {\n return;\n }\n\n const type = 'orphan-settings-for-subject';\n const icon = 'ph--magic-wand--regular';\n\n const client = context.requestCapability(ClientCapabilities.Client);\n const [subjectId] = id.split('~');\n const { spaceId, objectId } = parseId(subjectId);\n const spaces = toSignal(\n (onChange) => client.spaces.subscribe(() => onChange()).unsubscribe,\n () => client.spaces.get(),\n );\n const space = spaces?.find((space) => space.id === spaceId && space.state.get() === SpaceState.SPACE_READY);\n if (!objectId) {\n // TODO(burdon): Ref SPACE_PLUGIN ns.\n const label = space\n ? space.properties.name || ['unnamed space label', { ns: AUTOMATION_PLUGIN }]\n : ['unnamed object settings label', { ns: AUTOMATION_PLUGIN }];\n\n // TODO(wittjosiah): Support comments for arbitrary subjects.\n // This is to ensure that the comments panel is not stuck on an old object.\n return {\n id,\n type,\n data: null,\n properties: {\n icon,\n label,\n showResolvedThreads: false,\n object: null,\n space,\n },\n };\n }\n\n const [object] = memoizeQuery(space, { id: objectId });\n if (!object || !subjectId) {\n return;\n }\n\n const meta = resolve(getTypename(object) ?? '');\n const label = meta.label?.(object) ||\n object.name ||\n meta.placeholder || ['unnamed object settings label', { ns: AUTOMATION_PLUGIN }];\n\n return {\n id,\n type,\n data: null,\n properties: {\n icon,\n label,\n object,\n },\n };\n },\n }),\n createExtension({\n id: `${AUTOMATION_PLUGIN}/assistant-for-subject`,\n resolver: ({ id }) => {\n if (!id.endsWith('~assistant')) {\n return;\n }\n\n const client = context.requestCapability(ClientCapabilities.Client);\n const [subjectId] = id.split('~');\n const { spaceId, objectId } = parseId(subjectId);\n const spaces = toSignal(\n (onChange) => client.spaces.subscribe(() => onChange()).unsubscribe,\n () => client.spaces.get(),\n );\n const space = spaces?.find((space) => space.id === spaceId && space.state.get() === SpaceState.SPACE_READY);\n if (!objectId) {\n // TODO(wittjosiah): Support assistant for arbitrary subjects.\n // This is to ensure that the assistant panel is not stuck on an old object.\n return {\n id,\n type: 'orphan-automation-for-subject',\n data: null,\n properties: {\n icon: 'ph--atom--regular',\n label: ['assistant panel label', { ns: AUTOMATION_PLUGIN }],\n object: null,\n space,\n },\n };\n }\n\n const [object] = memoizeQuery(space, { id: objectId });\n return {\n id,\n type: 'orphan-automation-for-subject',\n data: null,\n properties: {\n icon: 'ph--atom--regular',\n label: ['assistant panel label', { ns: AUTOMATION_PLUGIN }],\n object,\n },\n };\n },\n }),\n ]);\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["Capabilities", "contributes", "createIntent", "LayoutAction", "ClientCapabilities", "createExtension", "ROOT_ID", "toSignal", "memoizeQuery", "getTypename", "parseId", "SpaceState", "context", "resolve", "typename", "requestCapabilities", "Capabilities", "Metadata", "find", "id", "metadata", "contributes", "AppGraphBuilder", "createExtension", "AUTOMATION_PLUGIN", "filter", "node", "ROOT_ID", "actions", "LayoutAction", "UpdateDialog", "_tag", "data", "dispatchPromise", "dispatch", "requestCapability", "IntentDispatcher", "createIntent", "part", "subject", "AMBIENT_CHAT_DIALOG", "options", "state", "blockAlign", "properties", "label", "ns", "icon", "disposition", "keyBinding", "macos", "windows", "resolver", "endsWith", "type", "client", "ClientCapabilities", "Client", "subjectId", "split", "spaceId", "parseId", "spaces", "toSignal", "onChange", "subscribe", "unsubscribe", "get", "space", "SpaceState", "SPACE_READY", "object", "objectId", "name", "showResolvedThreads", "memoizeQuery", "meta", "getTypename", "placeholder"]
7
+ }
@@ -0,0 +1,519 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ useServices
4
+ } from "./chunk-7VPT3OO3.mjs";
5
+ import {
6
+ ChainInputType,
7
+ ServiceType,
8
+ categoryIcons
9
+ } from "./chunk-DNCXRGAF.mjs";
10
+ import {
11
+ AUTOMATION_PLUGIN
12
+ } from "./chunk-EMVA6QUT.mjs";
13
+
14
+ // packages/plugins/experimental/plugin-automation/src/components/AmbientChatDialog/AmbientChatDialog.tsx
15
+ import React2, { useState } from "react";
16
+ import { Dialog, Icon, IconButton, useTranslation } from "@dxos/react-ui";
17
+ import { resizeAttributes, ResizeHandle, sizeStyle } from "@dxos/react-ui-dnd";
18
+
19
+ // packages/plugins/experimental/plugin-automation/src/components/Prompt/Prompt.tsx
20
+ import React from "react";
21
+ import { useThemeContext } from "@dxos/react-ui";
22
+ import { createBasicExtensions, createThemeExtensions, useTextEditor } from "@dxos/react-ui-editor";
23
+ import { mx } from "@dxos/react-ui-theme";
24
+
25
+ // packages/plugins/experimental/plugin-automation/src/components/Prompt/prompt-autocomplete.ts
26
+ import { Prec } from "@codemirror/state";
27
+ import { EditorView, Decoration, ViewPlugin, keymap, WidgetType } from "@codemirror/view";
28
+ var InlineSuggestionWidget = class extends WidgetType {
29
+ constructor(suffix) {
30
+ super();
31
+ this.suffix = suffix;
32
+ }
33
+ toDOM() {
34
+ const span = document.createElement("span");
35
+ span.textContent = this.suffix;
36
+ span.className = "cm-inline-suggestion";
37
+ return span;
38
+ }
39
+ eq(other) {
40
+ return other.suffix === this.suffix;
41
+ }
42
+ };
43
+ var createAutocompleteExtension = ({ onEnter, onSuggest }) => {
44
+ const suggestionPlugin = ViewPlugin.fromClass(class {
45
+ constructor(view) {
46
+ this._currentSuggestion = null;
47
+ this._decorations = this.computeDecorations(view);
48
+ }
49
+ update(update) {
50
+ if (update.docChanged || update.selectionSet) {
51
+ this._decorations = this.computeDecorations(update.view);
52
+ }
53
+ }
54
+ computeDecorations(view) {
55
+ const text = view.state.doc.toString();
56
+ const suggestions = onSuggest?.(text) ?? [];
57
+ if (!suggestions.length) {
58
+ this._currentSuggestion = null;
59
+ return Decoration.none;
60
+ }
61
+ this._currentSuggestion = suggestions[0];
62
+ const suffix = this._currentSuggestion.slice(text.length);
63
+ if (!suffix) {
64
+ return Decoration.none;
65
+ }
66
+ return Decoration.set([
67
+ Decoration.widget({
68
+ widget: new InlineSuggestionWidget(suffix),
69
+ side: 1
70
+ }).range(view.state.doc.length)
71
+ ]);
72
+ }
73
+ completeSuggestion(view) {
74
+ if (!this._currentSuggestion) {
75
+ return false;
76
+ }
77
+ const text = view.state.doc.toString();
78
+ const suffix = this._currentSuggestion.slice(text.length);
79
+ if (!suffix) {
80
+ return false;
81
+ }
82
+ view.dispatch({
83
+ changes: {
84
+ from: view.state.doc.length,
85
+ insert: suffix
86
+ },
87
+ selection: {
88
+ anchor: view.state.doc.length + suffix.length
89
+ }
90
+ });
91
+ return true;
92
+ }
93
+ }, {
94
+ decorations: (v) => v._decorations
95
+ });
96
+ return [
97
+ suggestionPlugin,
98
+ EditorView.theme({
99
+ ".cm-inline-suggestion": {
100
+ opacity: 0.4
101
+ }
102
+ }),
103
+ // Accept the current suggestion.
104
+ Prec.highest(keymap.of([
105
+ {
106
+ key: "Tab",
107
+ run: (view) => {
108
+ const plugin = view.plugin(suggestionPlugin);
109
+ return plugin?.completeSuggestion(view) ?? false;
110
+ }
111
+ },
112
+ {
113
+ key: "ArrowRight",
114
+ run: (view) => {
115
+ if (view.state.selection.main.head !== view.state.doc.length) {
116
+ return false;
117
+ }
118
+ const plugin = view.plugin(suggestionPlugin);
119
+ return plugin?.completeSuggestion(view) ?? false;
120
+ }
121
+ },
122
+ {
123
+ key: "Enter",
124
+ preventDefault: true,
125
+ run: (view) => {
126
+ const text = view.state.doc.toString();
127
+ if (onEnter) {
128
+ onEnter(text);
129
+ view.dispatch({
130
+ changes: {
131
+ from: 0,
132
+ to: view.state.doc.length,
133
+ insert: ""
134
+ }
135
+ });
136
+ return true;
137
+ }
138
+ return false;
139
+ }
140
+ },
141
+ {
142
+ key: "Shift-Enter",
143
+ run: (view) => {
144
+ view.dispatch({
145
+ changes: {
146
+ from: view.state.selection.main.head,
147
+ insert: "\n"
148
+ }
149
+ });
150
+ return true;
151
+ }
152
+ },
153
+ {
154
+ key: "Escape",
155
+ run: (view) => {
156
+ view.dispatch({
157
+ changes: {
158
+ from: 0,
159
+ to: view.state.doc.length,
160
+ insert: ""
161
+ }
162
+ });
163
+ return true;
164
+ }
165
+ }
166
+ ]))
167
+ ];
168
+ };
169
+
170
+ // packages/plugins/experimental/plugin-automation/src/components/Prompt/Prompt.tsx
171
+ var Prompt = ({ classNames, autoFocus, lineWrapping = false, onEnter, onSuggest }) => {
172
+ const { themeMode } = useThemeContext();
173
+ const { parentRef } = useTextEditor({
174
+ autoFocus,
175
+ extensions: [
176
+ createBasicExtensions({
177
+ bracketMatching: false,
178
+ lineWrapping,
179
+ placeholder: "Ask a question..."
180
+ }),
181
+ createThemeExtensions({
182
+ themeMode
183
+ }),
184
+ createAutocompleteExtension({
185
+ onEnter,
186
+ onSuggest
187
+ })
188
+ ]
189
+ });
190
+ return /* @__PURE__ */ React.createElement("div", {
191
+ ref: parentRef,
192
+ className: mx(classNames)
193
+ });
194
+ };
195
+
196
+ // packages/plugins/experimental/plugin-automation/src/components/AmbientChatDialog/AmbientChatDialog.tsx
197
+ var preventDefault = (event) => event.preventDefault();
198
+ var AmbientChatDialog = ({ children }) => {
199
+ const { t } = useTranslation(AUTOMATION_PLUGIN);
200
+ const [size, setSize] = useState("min-content");
201
+ const [iter, setIter] = useState(0);
202
+ return /* @__PURE__ */ React2.createElement("div", {
203
+ role: "none",
204
+ className: "dx-dialog__overlay bg-transparent pointer-events-none",
205
+ "data-block-align": "end"
206
+ }, /* @__PURE__ */ React2.createElement(Dialog.Content, {
207
+ onInteractOutside: preventDefault,
208
+ classNames: "pointer-events-auto relative overflow-hidden is-[500px] max-is-none",
209
+ inOverlayLayout: true,
210
+ ...resizeAttributes,
211
+ style: {
212
+ ...sizeStyle(size, "vertical"),
213
+ maxBlockSize: "calc(100dvh - env(safe-area-inset-bottom) - env(safe-area-inset-top) - 8rem)"
214
+ }
215
+ }, /* @__PURE__ */ React2.createElement(ResizeHandle, {
216
+ key: iter,
217
+ side: "block-start",
218
+ defaultSize: "min-content",
219
+ minSize: 5,
220
+ fallbackSize: 5,
221
+ iconPosition: "center",
222
+ onSizeChange: setSize
223
+ }), /* @__PURE__ */ React2.createElement("div", {
224
+ className: "flex w-full items-center"
225
+ }, /* @__PURE__ */ React2.createElement(Dialog.Title, {
226
+ classNames: "sr-only"
227
+ }, t("ambient chat dialog title")), /* @__PURE__ */ React2.createElement(Dialog.Close, null, /* @__PURE__ */ React2.createElement(Icon, {
228
+ icon: "ph--x--regular",
229
+ size: 4
230
+ })), /* @__PURE__ */ React2.createElement("div", {
231
+ className: "grow"
232
+ }), /* @__PURE__ */ React2.createElement(IconButton, {
233
+ variant: "ghost",
234
+ icon: "ph--caret-down--regular",
235
+ iconOnly: true,
236
+ label: "Shrink",
237
+ onClick: () => {
238
+ setIter((iter2) => iter2 + 1);
239
+ setSize("min-content");
240
+ }
241
+ })), /* @__PURE__ */ React2.createElement(Prompt, {
242
+ autoFocus: true,
243
+ lineWrapping: true
244
+ })));
245
+ };
246
+
247
+ // packages/plugins/experimental/plugin-automation/src/components/PromptEditor/PromptEditor.tsx
248
+ import React3, { useEffect } from "react";
249
+ import { createDocAccessor } from "@dxos/react-client/echo";
250
+ import { Input, Select, useThemeContext as useThemeContext2, useTranslation as useTranslation2 } from "@dxos/react-ui";
251
+ import { createBasicExtensions as createBasicExtensions2, createDataExtensions, createThemeExtensions as createThemeExtensions2, useTextEditor as useTextEditor2 } from "@dxos/react-ui-editor";
252
+ import { attentionSurface, groupBorder, mx as mx3 } from "@dxos/react-ui-theme";
253
+ import { isNonNullable } from "@dxos/util";
254
+
255
+ // packages/plugins/experimental/plugin-automation/src/components/PromptEditor/prompt-extension.ts
256
+ import { HighlightStyle, StreamLanguage, syntaxHighlighting } from "@codemirror/language";
257
+ import { tags } from "@dxos/react-ui-editor";
258
+ import { mx as mx2 } from "@dxos/react-ui-theme";
259
+ var nameRegex = /\{([\w-]+)}/;
260
+ var parser = StreamLanguage.define({
261
+ token: (stream) => {
262
+ if (stream.eatSpace()) {
263
+ return null;
264
+ }
265
+ if (stream.match(/^#.*/)) {
266
+ return "lineComment";
267
+ }
268
+ if (stream.match(/^-+$/)) {
269
+ return "lineComment";
270
+ }
271
+ if (stream.match(nameRegex)) {
272
+ return "variableName";
273
+ }
274
+ stream.next();
275
+ return null;
276
+ }
277
+ });
278
+ var highlightStyles = HighlightStyle.define([
279
+ {
280
+ tag: tags.variableName,
281
+ class: mx2("rounded border border-yellow-500 bg-yellow-100 text-black font-mono text-sm")
282
+ }
283
+ ]);
284
+ var promptExtension = [
285
+ parser,
286
+ syntaxHighlighting(highlightStyles)
287
+ ];
288
+
289
+ // packages/plugins/experimental/plugin-automation/src/components/PromptEditor/PromptEditor.tsx
290
+ var inputTypes = [
291
+ {
292
+ value: ChainInputType.VALUE,
293
+ label: "Value"
294
+ },
295
+ {
296
+ value: ChainInputType.PASS_THROUGH,
297
+ label: "Pass through"
298
+ },
299
+ {
300
+ value: ChainInputType.RETRIEVER,
301
+ label: "Retriever"
302
+ },
303
+ // {
304
+ // value: ChainInputType.FUNCTION,
305
+ // label: 'Function',
306
+ // },
307
+ // {
308
+ // value: ChainInputType.QUERY,
309
+ // label: 'Query',
310
+ // },
311
+ {
312
+ value: ChainInputType.RESOLVER,
313
+ label: "Resolver"
314
+ },
315
+ {
316
+ value: ChainInputType.CONTEXT,
317
+ label: "Context"
318
+ },
319
+ {
320
+ value: ChainInputType.SCHEMA,
321
+ label: "Schema"
322
+ }
323
+ ];
324
+ var getInputType = (type) => inputTypes.find(({ value }) => String(value) === type)?.value;
325
+ var usePromptInputs = (prompt) => {
326
+ useEffect(() => {
327
+ const text = prompt.template ?? "";
328
+ if (!prompt.inputs) {
329
+ prompt.inputs = [];
330
+ }
331
+ const regex = new RegExp(nameRegex, "g");
332
+ const variables = new Set([
333
+ ...text.matchAll(regex)
334
+ ].map((m) => m[1]));
335
+ const unclaimed = new Map(prompt.inputs?.filter(isNonNullable).map((input) => [
336
+ input.name,
337
+ input
338
+ ]));
339
+ const missing = [];
340
+ Array.from(variables.values()).forEach((name) => {
341
+ if (unclaimed.has(name)) {
342
+ unclaimed.delete(name);
343
+ } else {
344
+ missing.push(name);
345
+ }
346
+ });
347
+ const values = unclaimed.values();
348
+ missing.forEach((name) => {
349
+ const next = values.next().value;
350
+ if (next) {
351
+ next.name = name;
352
+ } else {
353
+ prompt.inputs?.push({
354
+ name
355
+ });
356
+ }
357
+ });
358
+ for (const input of values) {
359
+ prompt.inputs.splice(prompt.inputs.indexOf(input), 1);
360
+ }
361
+ }, [
362
+ prompt.template
363
+ ]);
364
+ };
365
+ var PromptEditor = ({ prompt, commandEditable = true }) => {
366
+ const { t } = useTranslation2(AUTOMATION_PLUGIN);
367
+ const { themeMode } = useThemeContext2();
368
+ const { parentRef } = useTextEditor2(() => ({
369
+ initialValue: prompt.template,
370
+ extensions: [
371
+ createDataExtensions({
372
+ id: prompt.id,
373
+ text: prompt.template !== void 0 ? createDocAccessor(prompt, [
374
+ "template"
375
+ ]) : void 0
376
+ }),
377
+ createBasicExtensions2({
378
+ bracketMatching: false,
379
+ lineWrapping: true,
380
+ placeholder: t("template placeholder")
381
+ }),
382
+ createThemeExtensions2({
383
+ themeMode,
384
+ slots: {
385
+ content: {
386
+ className: "!p-3"
387
+ }
388
+ }
389
+ }),
390
+ promptExtension
391
+ ]
392
+ }), [
393
+ themeMode,
394
+ prompt
395
+ ]);
396
+ usePromptInputs(prompt);
397
+ return /* @__PURE__ */ React3.createElement("div", {
398
+ className: mx3("flex flex-col w-full overflow-hidden gap-4", groupBorder)
399
+ }, commandEditable && /* @__PURE__ */ React3.createElement("div", {
400
+ className: "flex items-center pl-4"
401
+ }, /* @__PURE__ */ React3.createElement("span", {
402
+ className: "text-neutral-500"
403
+ }, "/"), /* @__PURE__ */ React3.createElement(Input.Root, null, /* @__PURE__ */ React3.createElement(Input.TextInput, {
404
+ placeholder: t("command placeholder"),
405
+ classNames: mx3("is-full bg-transparent m-2"),
406
+ value: prompt.command ?? "",
407
+ onChange: (event) => {
408
+ prompt.command = event.target.value.replace(/\w/g, "");
409
+ }
410
+ }))), /* @__PURE__ */ React3.createElement("div", {
411
+ ref: parentRef,
412
+ className: mx3(attentionSurface, "rounded", "min-h-[120px]")
413
+ }), (prompt.inputs?.length ?? 0) > 0 && /* @__PURE__ */ React3.createElement("div", {
414
+ className: "flex flex-col"
415
+ }, /* @__PURE__ */ React3.createElement("table", {
416
+ className: "w-full table-fixed border-collapse my-2"
417
+ }, /* @__PURE__ */ React3.createElement("tbody", null, prompt.inputs?.filter(isNonNullable).map((input) => /* @__PURE__ */ React3.createElement("tr", {
418
+ key: input.name
419
+ }, /* @__PURE__ */ React3.createElement("td", {
420
+ className: "w-[160px] p-1 font-mono text-sm whitespace-nowrap truncate"
421
+ }, /* @__PURE__ */ React3.createElement("code", {
422
+ className: "px-2"
423
+ }, input.name)), /* @__PURE__ */ React3.createElement("td", {
424
+ className: "w-[120px] p-1"
425
+ }, /* @__PURE__ */ React3.createElement(Input.Root, null, /* @__PURE__ */ React3.createElement(Select.Root, {
426
+ value: String(input.type),
427
+ onValueChange: (type) => {
428
+ input.type = getInputType(type) ?? ChainInputType.VALUE;
429
+ }
430
+ }, /* @__PURE__ */ React3.createElement(Select.TriggerButton, {
431
+ placeholder: "Type",
432
+ classNames: "is-full"
433
+ }), /* @__PURE__ */ React3.createElement(Select.Portal, null, /* @__PURE__ */ React3.createElement(Select.Content, null, /* @__PURE__ */ React3.createElement(Select.Viewport, null, inputTypes.map(({ value, label }) => /* @__PURE__ */ React3.createElement(Select.Option, {
434
+ key: value,
435
+ value: String(value)
436
+ }, label)))))))), /* @__PURE__ */ React3.createElement("td", {
437
+ className: "p-1 pr-2"
438
+ }, input.type !== void 0 && [
439
+ ChainInputType.VALUE,
440
+ ChainInputType.CONTEXT,
441
+ ChainInputType.RESOLVER,
442
+ ChainInputType.SCHEMA
443
+ ].includes(input.type) && /* @__PURE__ */ React3.createElement("div", null, /* @__PURE__ */ React3.createElement(Input.Root, null, /* @__PURE__ */ React3.createElement(Input.TextInput, {
444
+ placeholder: t("command placeholder"),
445
+ classNames: mx3("is-full bg-transparent"),
446
+ value: input.value ?? "",
447
+ onChange: (event) => {
448
+ input.value = event.target.value;
449
+ }
450
+ }))))))))));
451
+ };
452
+
453
+ // packages/plugins/experimental/plugin-automation/src/components/ServiceRegistry/ServiceRegistry.tsx
454
+ import React4, { useMemo } from "react";
455
+ import { Filter } from "@dxos/client/echo";
456
+ import { useQuery } from "@dxos/react-client/echo";
457
+ import { Icon as Icon2, Input as Input2, List, ListItem } from "@dxos/react-ui";
458
+ var ServiceRegistry = ({ space }) => {
459
+ const matchingServices = useServices(space);
460
+ const enabledServices = useQuery(space, Filter.schema(ServiceType));
461
+ const services = useMemo(() => {
462
+ return matchingServices.map((service) => enabledServices.find((s) => s.serviceId === service.serviceId) ?? service);
463
+ }, [
464
+ matchingServices,
465
+ enabledServices
466
+ ]);
467
+ const handleSetEnabled = (service, enabled) => {
468
+ if (enabled) {
469
+ space.db.add(service);
470
+ } else {
471
+ space.db.remove(service);
472
+ }
473
+ };
474
+ return /* @__PURE__ */ React4.createElement(List, {
475
+ classNames: "h-full grid auto-rows-[5rem] gap-2 p-2 pis-2 pie-2 overflow-y-auto scrollbar-thin"
476
+ }, services.map((service) => /* @__PURE__ */ React4.createElement(ServiceItem, {
477
+ key: service.serviceId,
478
+ service,
479
+ enabled: service.enabled,
480
+ setEnabled: (enabled) => handleSetEnabled(service, enabled)
481
+ })));
482
+ };
483
+ var ServiceItem = ({ service, enabled, setEnabled }) => {
484
+ return /* @__PURE__ */ React4.createElement(ListItem.Root, {
485
+ classNames: "flex flex-col gap-1 p-1 overflow-hidden rounded-md border border-separator"
486
+ }, /* @__PURE__ */ React4.createElement("div", {
487
+ className: "grid grid-cols-[40px_1fr_40px]"
488
+ }, /* @__PURE__ */ React4.createElement("div", {
489
+ className: "flex gow justify-center items-center"
490
+ }, /* @__PURE__ */ React4.createElement(Icon2, {
491
+ icon: categoryIcons[service.category ?? "default"] ?? "ph--placeholder--regular",
492
+ size: 6
493
+ })), /* @__PURE__ */ React4.createElement("div", {
494
+ className: "grow items-center truncate mie-2"
495
+ }, service.name), /* @__PURE__ */ React4.createElement("div", {
496
+ className: "flex gow justify-center items-center"
497
+ }, /* @__PURE__ */ React4.createElement(Input2.Root, null, /* @__PURE__ */ React4.createElement(Input2.Switch, {
498
+ checked: enabled,
499
+ onClick: () => setEnabled?.(!enabled)
500
+ })))), /* @__PURE__ */ React4.createElement("div", {
501
+ className: "grid grid-cols-[40px_1fr]"
502
+ }, /* @__PURE__ */ React4.createElement("div", null), /* @__PURE__ */ React4.createElement("div", {
503
+ className: "text-sm text-subdued line-clamp-2 mie-1"
504
+ }, service.description)));
505
+ };
506
+
507
+ // packages/plugins/experimental/plugin-automation/src/components/index.ts
508
+ import { lazy } from "react";
509
+ var AutomationPanel = lazy(() => import("./AutomationPanel-V3IWQAMO.mjs"));
510
+ var ChatContainer = lazy(() => import("./ChatContainer-ORVWQPJO.mjs"));
511
+
512
+ export {
513
+ AmbientChatDialog,
514
+ PromptEditor,
515
+ ServiceRegistry,
516
+ AutomationPanel,
517
+ ChatContainer
518
+ };
519
+ //# sourceMappingURL=chunk-2OKJZ4ZW.mjs.map