@dxos/plugin-assistant 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/PLUGIN.mdl +25 -0
  2. package/dist/lib/AssistantCapabilities.mjs +8 -1
  3. package/dist/lib/AssistantCapabilities.mjs.map +1 -1
  4. package/dist/lib/Settings.mjs +4 -0
  5. package/dist/lib/Settings.mjs.map +1 -1
  6. package/dist/lib/TurnReviewSkill.mjs +55 -0
  7. package/dist/lib/TurnReviewSkill.mjs.map +1 -0
  8. package/dist/lib/chunk-AgentArticle.mjs +1 -1
  9. package/dist/lib/chunk-AssistantSettings.mjs +1 -1
  10. package/dist/lib/chunk-AssistantSettings.mjs.map +1 -1
  11. package/dist/lib/chunk-Chat.mjs +322 -174
  12. package/dist/lib/chunk-Chat.mjs.map +1 -1
  13. package/dist/lib/chunk-ChatArticle.mjs +14 -7
  14. package/dist/lib/chunk-ChatArticle.mjs.map +1 -1
  15. package/dist/lib/chunk-ChatDialog.mjs +5 -4
  16. package/dist/lib/chunk-ChatDialog.mjs.map +1 -1
  17. package/dist/lib/chunk-IntegrationPrompt.mjs +1 -1
  18. package/dist/lib/chunk-PLUGIN.mjs +1 -1
  19. package/dist/lib/chunk-PluginUrlPrompt.mjs +1 -1
  20. package/dist/lib/chunk-QuestionSurface.mjs +1 -1
  21. package/dist/lib/chunk-SpaceHomePrompt.mjs +116 -60
  22. package/dist/lib/chunk-SpaceHomePrompt.mjs.map +1 -1
  23. package/dist/lib/chunk-TriggerStatus.mjs +1 -1
  24. package/dist/lib/chunk-agent-service.mjs +3 -1
  25. package/dist/lib/chunk-agent-service.mjs.map +1 -1
  26. package/dist/lib/chunk-analyze-turn.mjs +220 -0
  27. package/dist/lib/chunk-analyze-turn.mjs.map +1 -0
  28. package/dist/lib/{chunk-processor.mjs → chunk-chat-model.mjs} +95 -43
  29. package/dist/lib/chunk-chat-model.mjs.map +1 -0
  30. package/dist/lib/chunk-context.mjs.map +1 -1
  31. package/dist/lib/chunk-create-chat.mjs +5 -19
  32. package/dist/lib/chunk-create-chat.mjs.map +1 -1
  33. package/dist/lib/chunk-create-object.mjs +1 -1
  34. package/dist/lib/chunk-default-skills.mjs +28 -0
  35. package/dist/lib/chunk-default-skills.mjs.map +1 -0
  36. package/dist/lib/chunk-generate-home-suggestions.mjs +8 -6
  37. package/dist/lib/chunk-generate-home-suggestions.mjs.map +1 -1
  38. package/dist/lib/chunk-presets.mjs +1 -1
  39. package/dist/lib/chunk-presets.mjs.map +1 -1
  40. package/dist/lib/chunk-question-resumer.mjs +1 -1
  41. package/dist/lib/chunk-react-surface.mjs +1 -1
  42. package/dist/lib/chunk-run-prompt-in-chat.mjs +2 -1
  43. package/dist/lib/chunk-run-prompt-in-chat.mjs.map +1 -1
  44. package/dist/lib/chunk-run-prompt-in-new-chat.mjs +1 -1
  45. package/dist/lib/chunk-schema-defs.mjs +2 -2
  46. package/dist/lib/chunk-skill-definition.mjs +3 -2
  47. package/dist/lib/chunk-skill-definition.mjs.map +1 -1
  48. package/dist/lib/components.mjs +13 -13
  49. package/dist/lib/components.mjs.map +1 -1
  50. package/dist/lib/hooks.mjs +40 -31
  51. package/dist/lib/hooks.mjs.map +1 -1
  52. package/dist/lib/operations.mjs +3 -1
  53. package/dist/lib/operations.mjs.map +1 -1
  54. package/dist/lib/skills.mjs +2 -1
  55. package/dist/lib/translations.mjs +4 -2
  56. package/dist/lib/translations.mjs.map +1 -1
  57. package/dist/types/src/Chat.d.ts +1 -1
  58. package/dist/types/src/capabilities/agent-service.d.ts.map +1 -1
  59. package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -1
  60. package/dist/types/src/{processor/processor.d.ts → chat-model/chat-model.d.ts} +24 -22
  61. package/dist/types/src/chat-model/chat-model.d.ts.map +1 -0
  62. package/dist/types/src/chat-model/chat-model.edge.test.d.ts +2 -0
  63. package/dist/types/src/chat-model/chat-model.edge.test.d.ts.map +1 -0
  64. package/dist/types/src/chat-model/chat-model.node.test.d.ts +2 -0
  65. package/dist/types/src/chat-model/chat-model.node.test.d.ts.map +1 -0
  66. package/dist/types/src/chat-model/chat-model.scripted.node.test.d.ts +2 -0
  67. package/dist/types/src/chat-model/chat-model.scripted.node.test.d.ts.map +1 -0
  68. package/dist/types/src/{processor → chat-model}/index.d.ts +1 -1
  69. package/dist/types/src/chat-model/index.d.ts.map +1 -0
  70. package/dist/types/src/chat-model/outbox.d.ts.map +1 -0
  71. package/dist/types/src/chat-model/outbox.test.d.ts.map +1 -0
  72. package/dist/types/src/chat-model/presets.d.ts.map +1 -0
  73. package/dist/types/src/chat-model/presets.test.d.ts.map +1 -0
  74. package/dist/types/src/{processor → chat-model}/prompt.d.ts +2 -2
  75. package/dist/types/src/chat-model/prompt.d.ts.map +1 -0
  76. package/dist/types/src/chat-model/prompt.test.d.ts.map +1 -0
  77. package/dist/types/src/chat-model/streaming.node.test.d.ts.map +1 -0
  78. package/dist/types/src/chat-model/testing/chat-model-recorder.d.ts +58 -0
  79. package/dist/types/src/chat-model/testing/chat-model-recorder.d.ts.map +1 -0
  80. package/dist/types/src/chat-model/testing/harness.d.ts +22 -0
  81. package/dist/types/src/chat-model/testing/harness.d.ts.map +1 -0
  82. package/dist/types/src/chat-model/thread.d.ts.map +1 -0
  83. package/dist/types/src/chat-model/thread.test.d.ts.map +1 -0
  84. package/dist/types/src/components/Chat/Chat.d.ts +6 -6
  85. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  86. package/dist/types/src/components/Chat/context.d.ts +5 -3
  87. package/dist/types/src/components/Chat/context.d.ts.map +1 -1
  88. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts +1 -1
  89. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
  90. package/dist/types/src/components/ChatPrompt/ChatMcpErrors.d.ts +3 -3
  91. package/dist/types/src/components/ChatPrompt/ChatMcpErrors.d.ts.map +1 -1
  92. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts +3 -1
  93. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts.map +1 -1
  94. package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts +4 -3
  95. package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts.map +1 -1
  96. package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts +15 -5
  97. package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts.map +1 -1
  98. package/dist/types/src/components/ChatPrompt/ChatPrompt.stories.d.ts +1 -1
  99. package/dist/types/src/components/ChatPrompt/ChatStatus.d.ts +1 -1
  100. package/dist/types/src/components/ChatPrompt/ChatStatus.d.ts.map +1 -1
  101. package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.d.ts +9 -0
  102. package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.d.ts.map +1 -1
  103. package/dist/types/src/components/Toolbox/Toolbox.d.ts +3 -3
  104. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  105. package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts.map +1 -1
  106. package/dist/types/src/containers/ChatArticle/ChatArticle.stories.d.ts +1 -1
  107. package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts.map +1 -1
  108. package/dist/types/src/hooks/index.d.ts +2 -2
  109. package/dist/types/src/hooks/index.d.ts.map +1 -1
  110. package/dist/types/src/hooks/{useChatProcessor.d.ts → useChatModel.d.ts} +6 -6
  111. package/dist/types/src/hooks/useChatModel.d.ts.map +1 -0
  112. package/dist/types/src/hooks/useDebug.d.ts +3 -3
  113. package/dist/types/src/hooks/useDebug.d.ts.map +1 -1
  114. package/dist/types/src/hooks/useHomeSuggestions.d.ts +3 -3
  115. package/dist/types/src/hooks/useHomeSuggestions.d.ts.map +1 -1
  116. package/dist/types/src/hooks/usePresets.d.ts +1 -1
  117. package/dist/types/src/hooks/usePresets.d.ts.map +1 -1
  118. package/dist/types/src/hooks/useSelectionContext.d.ts +3 -3
  119. package/dist/types/src/hooks/useSelectionContext.d.ts.map +1 -1
  120. package/dist/types/src/operations/analyze-turn.d.ts +5 -0
  121. package/dist/types/src/operations/analyze-turn.d.ts.map +1 -0
  122. package/dist/types/src/operations/analyze-turn.test.d.ts +2 -0
  123. package/dist/types/src/operations/analyze-turn.test.d.ts.map +1 -0
  124. package/dist/types/src/operations/create-chat.d.ts.map +1 -1
  125. package/dist/types/src/operations/generate-home-suggestions.d.ts.map +1 -1
  126. package/dist/types/src/operations/index.d.ts.map +1 -1
  127. package/dist/types/src/operations/run-prompt-in-chat.d.ts.map +1 -1
  128. package/dist/types/src/review/turn-review.d.ts +58 -0
  129. package/dist/types/src/review/turn-review.d.ts.map +1 -0
  130. package/dist/types/src/review/turn-review.test.d.ts +2 -0
  131. package/dist/types/src/review/turn-review.test.d.ts.map +1 -0
  132. package/dist/types/src/skills/index.d.ts +1 -0
  133. package/dist/types/src/skills/index.d.ts.map +1 -1
  134. package/dist/types/src/skills/turn-review/TurnReviewSkill.d.ts +21 -0
  135. package/dist/types/src/skills/turn-review/TurnReviewSkill.d.ts.map +1 -0
  136. package/dist/types/src/skills/turn-review/index.d.ts +2 -0
  137. package/dist/types/src/skills/turn-review/index.d.ts.map +1 -0
  138. package/dist/types/src/translations.d.ts.map +1 -1
  139. package/dist/types/src/types/Assistant.d.ts +1 -0
  140. package/dist/types/src/types/Assistant.d.ts.map +1 -1
  141. package/dist/types/src/types/AssistantCapabilities.d.ts +7 -1
  142. package/dist/types/src/types/AssistantCapabilities.d.ts.map +1 -1
  143. package/dist/types/src/types/Settings.d.ts +1 -0
  144. package/dist/types/src/types/Settings.d.ts.map +1 -1
  145. package/dist/types/src/util/agent-options.d.ts +27 -0
  146. package/dist/types/src/util/agent-options.d.ts.map +1 -0
  147. package/dist/types/src/util/agent-options.test.d.ts +2 -0
  148. package/dist/types/src/util/agent-options.test.d.ts.map +1 -0
  149. package/dist/types/src/util/default-skills.d.ts +10 -0
  150. package/dist/types/src/util/default-skills.d.ts.map +1 -0
  151. package/dist/types/tsconfig.tsbuildinfo +1 -1
  152. package/package.json +89 -80
  153. package/src/capabilities/agent-service.ts +2 -1
  154. package/src/capabilities/skill-definition.ts +2 -1
  155. package/src/chat-model/chat-model.edge.test.ts +301 -0
  156. package/src/{processor/processor.node.test.ts → chat-model/chat-model.node.test.ts} +19 -9
  157. package/src/chat-model/chat-model.scripted.node.test.ts +441 -0
  158. package/src/{processor/processor.ts → chat-model/chat-model.ts} +140 -45
  159. package/src/{processor → chat-model}/index.ts +1 -1
  160. package/src/{processor → chat-model}/prompt.ts +2 -2
  161. package/src/{processor → chat-model}/streaming.node.test.ts +108 -116
  162. package/src/chat-model/testing/chat-model-recorder.ts +249 -0
  163. package/src/chat-model/testing/harness.ts +81 -0
  164. package/src/{processor → chat-model}/thread.test.ts +1 -1
  165. package/src/components/Chat/Chat.tsx +44 -38
  166. package/src/components/Chat/Error.stories.tsx +1 -1
  167. package/src/components/Chat/context.ts +5 -3
  168. package/src/components/ChatPrompt/ChatActions.tsx +1 -1
  169. package/src/components/ChatPrompt/ChatMcpErrors.tsx +6 -6
  170. package/src/components/ChatPrompt/ChatOptions.stories.tsx +37 -3
  171. package/src/components/ChatPrompt/ChatOptions.tsx +118 -10
  172. package/src/components/ChatPrompt/ChatPrompt.stories.tsx +10 -10
  173. package/src/components/ChatPrompt/ChatPrompt.tsx +44 -27
  174. package/src/components/ChatPrompt/ChatStatus.tsx +8 -7
  175. package/src/components/Toolbox/Toolbox.tsx +12 -13
  176. package/src/containers/AssistantSettings/AssistantSettings.tsx +1 -1
  177. package/src/containers/ChatArticle/ChatArticle.stories.tsx +1 -1
  178. package/src/containers/ChatArticle/ChatArticle.tsx +16 -6
  179. package/src/containers/ChatDialog/ChatDialog.tsx +4 -4
  180. package/src/containers/SpaceHomePrompt/SpaceHomePrompt.tsx +110 -57
  181. package/src/hooks/index.ts +2 -2
  182. package/src/hooks/{useChatProcessor.ts → useChatModel.ts} +16 -14
  183. package/src/hooks/useDebug.ts +8 -8
  184. package/src/hooks/useHomeSuggestions.ts +14 -9
  185. package/src/hooks/usePresets.ts +2 -2
  186. package/src/hooks/useProcessEphemeralStatus.ts +1 -1
  187. package/src/hooks/useSelectionContext.ts +3 -5
  188. package/src/operations/analyze-turn.test.ts +194 -0
  189. package/src/operations/analyze-turn.ts +96 -0
  190. package/src/operations/create-chat.ts +4 -36
  191. package/src/operations/generate-home-suggestions.test.ts +1 -2
  192. package/src/operations/generate-home-suggestions.ts +17 -9
  193. package/src/operations/index.ts +2 -0
  194. package/src/operations/run-prompt-in-chat.ts +3 -2
  195. package/src/review/turn-review.test.ts +92 -0
  196. package/src/review/turn-review.ts +213 -0
  197. package/src/skills/index.ts +1 -0
  198. package/src/skills/turn-review/TurnReviewSkill.ts +46 -0
  199. package/src/skills/turn-review/index.ts +5 -0
  200. package/src/translations.ts +2 -0
  201. package/src/types/AssistantCapabilities.ts +8 -1
  202. package/src/types/Settings.ts +7 -0
  203. package/src/util/agent-options.test.ts +54 -0
  204. package/src/util/agent-options.ts +60 -0
  205. package/src/util/default-skills.ts +35 -0
  206. package/dist/lib/chunk-processor.mjs.map +0 -1
  207. package/dist/types/src/hooks/useChatProcessor.d.ts.map +0 -1
  208. package/dist/types/src/processor/index.d.ts.map +0 -1
  209. package/dist/types/src/processor/outbox.d.ts.map +0 -1
  210. package/dist/types/src/processor/outbox.test.d.ts.map +0 -1
  211. package/dist/types/src/processor/presets.d.ts.map +0 -1
  212. package/dist/types/src/processor/presets.test.d.ts.map +0 -1
  213. package/dist/types/src/processor/processor.d.ts.map +0 -1
  214. package/dist/types/src/processor/processor.node.test.d.ts +0 -2
  215. package/dist/types/src/processor/processor.node.test.d.ts.map +0 -1
  216. package/dist/types/src/processor/prompt.d.ts.map +0 -1
  217. package/dist/types/src/processor/prompt.test.d.ts.map +0 -1
  218. package/dist/types/src/processor/streaming.node.test.d.ts.map +0 -1
  219. package/dist/types/src/processor/thread.d.ts.map +0 -1
  220. package/dist/types/src/processor/thread.test.d.ts.map +0 -1
  221. /package/dist/types/src/{processor → chat-model}/outbox.d.ts +0 -0
  222. /package/dist/types/src/{processor → chat-model}/outbox.test.d.ts +0 -0
  223. /package/dist/types/src/{processor → chat-model}/presets.d.ts +0 -0
  224. /package/dist/types/src/{processor → chat-model}/presets.test.d.ts +0 -0
  225. /package/dist/types/src/{processor → chat-model}/prompt.test.d.ts +0 -0
  226. /package/dist/types/src/{processor → chat-model}/streaming.node.test.d.ts +0 -0
  227. /package/dist/types/src/{processor → chat-model}/thread.d.ts +0 -0
  228. /package/dist/types/src/{processor → chat-model}/thread.test.d.ts +0 -0
  229. /package/src/{processor → chat-model}/outbox.test.ts +0 -0
  230. /package/src/{processor → chat-model}/outbox.ts +0 -0
  231. /package/src/{processor → chat-model}/presets.test.ts +0 -0
  232. /package/src/{processor → chat-model}/presets.ts +0 -0
  233. /package/src/{processor → chat-model}/prompt.test.ts +0 -0
  234. /package/src/{processor → chat-model}/thread.ts +0 -0
@@ -2,8 +2,8 @@ import * as Capability from "@dxos/app-framework/Capability";
2
2
  import * as AppCapabilities from "@dxos/app-toolkit/AppCapabilities";
3
3
  import * as RoutineCapabilities from "@dxos/plugin-routine/RoutineCapabilities";
4
4
  import * as Effect from "effect/Effect";
5
+ import { AssistantSkill, PluginManagerSkill, TurnReviewSkill } from "#skills";
5
6
  import * as Plugin from "@dxos/app-framework/Plugin";
6
- import { AssistantSkill, PluginManagerSkill } from "#skills";
7
7
  import * as AgentSkill from "@dxos/assistant-toolkit/AgentSkill";
8
8
  import * as AlarmSkill from "@dxos/assistant-toolkit/AlarmSkill";
9
9
  import * as ChatContextSkill from "@dxos/assistant-toolkit/ChatContextSkill";
@@ -33,7 +33,8 @@ var skillDefinition = Effect.fnUntraced(function* () {
33
33
  AutomationSkill,
34
34
  SkillManagerSkill,
35
35
  DelegationSkill,
36
- AlarmSkill
36
+ AlarmSkill,
37
+ TurnReviewSkill
37
38
  ]), Capability.contribute(RoutineCapabilities.AgentDelegationStrategy, DelegationStrategy.make())];
38
39
  });
39
40
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"chunk-skill-definition.mjs","names":[],"sources":["../../src/capabilities/skill-definition.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as Plugin from '@dxos/app-framework/Plugin';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\nimport * as AgentSkill from '@dxos/assistant-toolkit/AgentSkill';\nimport * as AlarmSkill from '@dxos/assistant-toolkit/AlarmSkill';\nimport * as AutomationSkill from '@dxos/assistant-toolkit/AutomationSkill';\nimport * as BrowserSkill from '@dxos/assistant-toolkit/BrowserSkill';\nimport * as ChatContextSkill from '@dxos/assistant-toolkit/ChatContextSkill';\nimport * as DelegationSkill from '@dxos/assistant-toolkit/DelegationSkill';\nimport * as DelegationStrategy from '@dxos/assistant-toolkit/DelegationStrategy';\nimport * as MemorySkill from '@dxos/assistant-toolkit/MemorySkill';\nimport * as PlanningSkill from '@dxos/assistant-toolkit/PlanningSkill';\nimport * as SkillManagerSkill from '@dxos/assistant-toolkit/SkillManagerSkill';\nimport * as WebSearchSkill from '@dxos/assistant-toolkit/WebSearchSkill';\nimport * as RegistryPlugin from '@dxos/plugin-registry/RegistryPlugin';\nimport * as RoutineCapabilities from '@dxos/plugin-routine/RoutineCapabilities';\nimport * as DatabaseSkill from '@dxos/plugin-space/DatabaseSkill';\n\nimport { AssistantSkill, PluginManagerSkill } from '#skills';\n\nconst skillDefinition = Effect.fnUntraced(function* () {\n const manager = yield* Plugin.Service;\n // The plugin-manager tools resolve to handlers the registry plugin contributes, and only an\n // extensible host has one: the curated production and mobile sets ship a fixed plugin list, where\n // the skill would advertise verbs that cannot run.\n const registryPresent = manager\n .getPlugins()\n .some((plugin) => plugin.meta.profile.key === RegistryPlugin.meta.profile.key);\n\n return [\n Capability.contributeAll(AppCapabilities.SkillDefinition, [\n AssistantSkill,\n ...(registryPresent ? [PluginManagerSkill] : []),\n BrowserSkill,\n DatabaseSkill,\n ChatContextSkill,\n WebSearchSkill,\n AgentSkill,\n PlanningSkill,\n MemorySkill,\n AutomationSkill,\n SkillManagerSkill,\n DelegationSkill,\n AlarmSkill,\n ]),\n\n // Run the conversational agent as a supervisor: delegate in-progress plan tasks to sub-agents\n // and fold their results back into the conversation (consumed by the AgentService LayerSpec).\n Capability.contribute(RoutineCapabilities.AgentDelegationStrategy, DelegationStrategy.make()),\n ];\n});\n\nexport default skillDefinition;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA0BA,IAAM,kBAAkB,OAAO,WAAW,aAAa;CAKrD,MAAM,mBAAkB,OAJD,OAAO,QAAA,CAK3B,WAAW,CAAA,CACX,MAAM,WAAW,OAAO,KAAK,QAAQ,QAAQ,eAAe,KAAK,QAAQ,GAAG;CAE/E,OAAO,CACL,WAAW,cAAc,gBAAgB,iBAAiB;EACxD;EACA,GAAI,kBAAkB,CAAC,kBAAkB,IAAI,CAAC;EAC9C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,GAID,WAAW,WAAW,oBAAoB,yBAAyB,mBAAmB,KAAK,CAAC,CAC9F;AACF,CAAC"}
1
+ {"version":3,"file":"chunk-skill-definition.mjs","names":[],"sources":["../../src/capabilities/skill-definition.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as Plugin from '@dxos/app-framework/Plugin';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\nimport * as AgentSkill from '@dxos/assistant-toolkit/AgentSkill';\nimport * as AlarmSkill from '@dxos/assistant-toolkit/AlarmSkill';\nimport * as AutomationSkill from '@dxos/assistant-toolkit/AutomationSkill';\nimport * as BrowserSkill from '@dxos/assistant-toolkit/BrowserSkill';\nimport * as ChatContextSkill from '@dxos/assistant-toolkit/ChatContextSkill';\nimport * as DelegationSkill from '@dxos/assistant-toolkit/DelegationSkill';\nimport * as DelegationStrategy from '@dxos/assistant-toolkit/DelegationStrategy';\nimport * as MemorySkill from '@dxos/assistant-toolkit/MemorySkill';\nimport * as PlanningSkill from '@dxos/assistant-toolkit/PlanningSkill';\nimport * as SkillManagerSkill from '@dxos/assistant-toolkit/SkillManagerSkill';\nimport * as WebSearchSkill from '@dxos/assistant-toolkit/WebSearchSkill';\nimport * as RegistryPlugin from '@dxos/plugin-registry/RegistryPlugin';\nimport * as RoutineCapabilities from '@dxos/plugin-routine/RoutineCapabilities';\nimport * as DatabaseSkill from '@dxos/plugin-space/DatabaseSkill';\n\nimport { AssistantSkill, PluginManagerSkill, TurnReviewSkill } from '#skills';\n\nconst skillDefinition = Effect.fnUntraced(function* () {\n const manager = yield* Plugin.Service;\n // The plugin-manager tools resolve to handlers the registry plugin contributes, and only an\n // extensible host has one: the curated production and mobile sets ship a fixed plugin list, where\n // the skill would advertise verbs that cannot run.\n const registryPresent = manager\n .getPlugins()\n .some((plugin) => plugin.meta.profile.key === RegistryPlugin.meta.profile.key);\n\n return [\n Capability.contributeAll(AppCapabilities.SkillDefinition, [\n AssistantSkill,\n ...(registryPresent ? [PluginManagerSkill] : []),\n BrowserSkill,\n DatabaseSkill,\n ChatContextSkill,\n WebSearchSkill,\n AgentSkill,\n PlanningSkill,\n MemorySkill,\n AutomationSkill,\n SkillManagerSkill,\n DelegationSkill,\n AlarmSkill,\n TurnReviewSkill,\n ]),\n\n // Run the conversational agent as a supervisor: delegate in-progress plan tasks to sub-agents\n // and fold their results back into the conversation (consumed by the AgentService LayerSpec).\n Capability.contribute(RoutineCapabilities.AgentDelegationStrategy, DelegationStrategy.make()),\n ];\n});\n\nexport default skillDefinition;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA0BA,IAAM,kBAAkB,OAAO,WAAW,aAAa;CAKrD,MAAM,mBAAkB,OAJD,OAAO,QAAA,CAK3B,WAAW,CAAA,CACX,MAAM,WAAW,OAAO,KAAK,QAAQ,QAAQ,eAAe,KAAK,QAAQ,GAAG;CAE/E,OAAO,CACL,WAAW,cAAc,gBAAgB,iBAAiB;EACxD;EACA,GAAI,kBAAkB,CAAC,kBAAkB,IAAI,CAAC;EAC9C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,GAID,WAAW,WAAW,oBAAoB,yBAAyB,mBAAmB,KAAK,CAAC,CAC9F;AACF,CAAC"}
@@ -14,9 +14,9 @@ import { jsx, jsxs } from "react/jsx-runtime";
14
14
  import { log } from "@dxos/log";
15
15
  import { ActionMenu, useGraphMenuActions, useMenuGraph } from "@dxos/react-ui-menu";
16
16
  import * as Hooks$1 from "@dxos/react-ui/Hooks";
17
+ import * as Layout from "@dxos/react-ui/Layout";
17
18
  import * as Operation from "@dxos/compute/Operation";
18
19
  import * as Button from "@dxos/react-ui/Button";
19
- import { mx } from "@dxos/ui-theme";
20
20
  import { Connection } from "@dxos/link";
21
21
  import * as Field from "@dxos/react-ui/Field";
22
22
  import * as Input from "@dxos/react-ui/Input";
@@ -170,16 +170,15 @@ var Toolbox = Util.composable(({ functions, services, skills, activeSkills, ...p
170
170
  });
171
171
  Toolbox.displayName = "Toolbox";
172
172
  var Section = ({ title, items, striped }) => {
173
- const stripeClassNames = "odd:bg-neutral-50 dark:odd:bg-neutral-800";
174
- const gridClassNames = "grid grid-cols-[8rem_1fr]";
175
- const subGridClassNames = mx("col-span-full grid grid-cols-subgrid text-xs px-2", striped && stripeClassNames);
173
+ const subGridClassNames = ["text-xs px-2", striped && "odd:bg-neutral-50 dark:odd:bg-neutral-800"];
176
174
  return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h1", {
177
175
  className: "px-2 text-sm",
178
176
  children: title
179
- }), /* @__PURE__ */ jsx("div", {
180
- className: gridClassNames,
181
- children: items.map(({ name, description, subitems }, i) => /* @__PURE__ */ jsxs(Fragment, { children: [name && /* @__PURE__ */ jsxs("div", {
182
- className: subGridClassNames,
177
+ }), /* @__PURE__ */ jsx(Layout.Grid, {
178
+ cols: ["8rem", "fill"],
179
+ children: items.map(({ name, description, subitems }, i) => /* @__PURE__ */ jsxs(Fragment, { children: [name && /* @__PURE__ */ jsxs(Layout.Grid, {
180
+ cols: "subgrid",
181
+ classNames: subGridClassNames,
183
182
  children: [/* @__PURE__ */ jsx("div", {
184
183
  className: "truncate text-accent-text",
185
184
  children: name
@@ -187,8 +186,9 @@ var Section = ({ title, items, striped }) => {
187
186
  className: "line-clamp-2",
188
187
  children: description
189
188
  })]
190
- }), subitems?.map(({ name, description }, i) => /* @__PURE__ */ jsxs("div", {
191
- className: mx(subGridClassNames, striped && stripeClassNames),
189
+ }), subitems?.map(({ name, description }, i) => /* @__PURE__ */ jsxs(Layout.Grid, {
190
+ cols: "subgrid",
191
+ classNames: subGridClassNames,
192
192
  children: [/* @__PURE__ */ jsx("div", {
193
193
  className: "truncate",
194
194
  children: name
@@ -199,14 +199,14 @@ var Section = ({ title, items, striped }) => {
199
199
  }, i))] }, i))
200
200
  })] });
201
201
  };
202
- var ToolboxPanel = ({ classNames, db, processor }) => {
202
+ var ToolboxPanel = ({ classNames, db, chatModel }) => {
203
203
  const services = useQuery(db, Filter.type(AssistantService.ServiceType));
204
204
  const [serviceTools, setServiceTools] = useState([]);
205
205
  useEffect(() => {
206
206
  log("creating service tools...", { services: services.length }, {
207
207
  "~LogMeta": "~LogMeta",
208
208
  F: __dxlog_file,
209
- L: 123,
209
+ L: 122,
210
210
  S: void 0
211
211
  });
212
212
  queueMicrotask(async () => {});
@@ -214,7 +214,7 @@ var ToolboxPanel = ({ classNames, db, processor }) => {
214
214
  const functions = useQuery(db, Filter.type(Operation.PersistentOperation));
215
215
  return /* @__PURE__ */ jsx(Toolbox, {
216
216
  classNames,
217
- skills: processor?.context.getSkills(),
217
+ skills: chatModel?.context.getSkills(),
218
218
  services: serviceTools,
219
219
  functions
220
220
  });
@@ -1 +1 @@
1
- {"version":3,"file":"components.mjs","names":[],"sources":["../../src/components/AgentProperties/AgentProperties.tsx","../../src/components/ConnectorAuthMenu/ConnectorAuthMenu.tsx","../../src/components/Toolbox/Toolbox.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport type * as Agent from '@dxos/assistant/Agent';\nimport * as Trigger from '@dxos/compute/Trigger';\nimport { Filter, Obj, Ref, Type } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { URI } from '@dxos/keys';\nimport { Form } from '@dxos/react-ui-form';\nimport * as Field from '@dxos/react-ui/Field';\nimport * as Hooks from '@dxos/react-ui/Hooks';\nimport * as Input from '@dxos/react-ui/Input';\nimport { isFeedOwnerSchema } from '@dxos/schema';\n\nimport { meta } from '#meta';\n\n/** Mirrors the foreign keys stamped by the agent skill's automation compiler (`sync-automation`). */\nconst AGENT_TRIGGER_EXTENSION_KEY = 'org.dxos.extension.AgentTrigger';\nconst AGENT_TRIGGER_TARGET_EXTENSION_KEY = 'org.dxos.extension.AgentTriggerTarget';\n\nexport type AgentPropertiesProps = {\n agent: Agent.Agent;\n /** Invoked with the FULL next subscription set when the user toggles one. */\n onSubscriptionsChanged?: (subscriptions: Ref.Ref<Obj.Unknown>[]) => void;\n};\n\nexport const AgentProperties = ({ agent, onSubscriptionsChanged }: AgentPropertiesProps) => {\n const { t } = Hooks.useTranslation(meta.profile.key);\n const db = Obj.getDatabase(agent);\n\n // Build a filter matching objects of any schema annotated as a feed.\n const feedFilter = useMemo(() => {\n if (!db) {\n return Filter.nothing();\n }\n\n const schemas = db.graph.registry.list().filter(Type.isType);\n const feedSchemas = schemas.filter(isFeedOwnerSchema);\n\n return feedSchemas.length === 0\n ? Filter.nothing()\n : Filter.or(...feedSchemas.map((schema: Type.AnyEntity) => Filter.type(schema)));\n }, [db]);\n\n const subscribedObjects = useQuery(db, feedFilter);\n\n // The subscription state lives on the compiled automation (routine triggers), not the agent:\n // a trigger's target foreign key holds the subscribed object's URI (`timer:` keys are schedules).\n const triggers = useQuery(\n db,\n Filter.foreignKeys(Trigger.Trigger, [{ source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id }]),\n );\n const subscribedUris = useMemo(\n () =>\n new Set(\n triggers\n .map(\n (trigger) => Obj.getMeta(trigger).keys.find((key) => key.source === AGENT_TRIGGER_TARGET_EXTENSION_KEY)?.id,\n )\n .filter((id): id is string => id !== undefined && !id.startsWith('timer:')),\n ),\n [triggers],\n );\n\n // Toggle recompiles the full subscription set (see `sync-automation`'s per-category reconcile).\n const handleSubscriptionChange = useCallback(\n (object: Obj.Unknown, checked: boolean) => {\n const next = new Set(subscribedUris);\n const uri = Obj.getURI(object);\n if (checked) {\n next.add(uri);\n } else {\n next.delete(uri);\n }\n onSubscriptionsChanged?.([...next].map((subscription) => Ref.fromURI(URI.make(subscription))));\n },\n [subscribedUris, onSubscriptionsChanged],\n );\n\n if (subscribedObjects.length === 0) {\n return null;\n }\n\n return (\n <Form.FieldSet>\n <Field.Root>\n <Field.Label classNames='mt-form-gap'>{t('subscriptions.label')}</Field.Label>\n </Field.Root>\n\n {subscribedObjects.map((object) => (\n <Input.Checkbox\n key={object.id}\n checked={subscribedUris.has(Obj.getURI(object))}\n onCheckedChange={({ checked }) => {\n handleSubscriptionChange(object, checked === true);\n }}\n label={Obj.getLabel(object) ?? object.id}\n />\n ))}\n </Form.FieldSet>\n );\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { RegistryContext } from '@effect/atom-react/RegistryContext';\nimport React, { useCallback, useContext } from 'react';\n\nimport * as Hooks from '@dxos/app-framework/Hooks';\nimport * as AppGraph from '@dxos/app-graph/AppGraph';\nimport { type Database, Filter, type Obj, type Ref } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { Connection } from '@dxos/link';\nimport * as ConnectorAuth from '@dxos/plugin-connector/ConnectorAuth';\nimport * as ConnectorSpec from '@dxos/plugin-connector/ConnectorSpec';\nimport * as GraphHooks from '@dxos/plugin-graph/Hooks';\nimport { ActionMenu, useGraphMenuActions, useMenuGraph } from '@dxos/react-ui-menu';\nimport * as Button from '@dxos/react-ui/Button';\nimport * as UiHooks from '@dxos/react-ui/Hooks';\n\nimport { meta } from '#meta';\n\n/** Root node the connector-auth group hangs off in the component's local graph. */\nconst NODE_ID = 'connector-auth-root';\n\nexport type ConnectorAuthMenuProps = {\n /** Stable ids of the {@link ConnectorSpec.Connector} entries this menu offers: existing connections from any of\n * them are offered for reuse, and each (with an auth flow) gets a \"Connect X\" entry. */\n connectorIds: readonly string[];\n /** Omitted when there is no active database yet (e.g. no space selected) — nothing is offered. */\n db: Database.Database | undefined;\n /** Existing local object to wire up as the new connection's first sync target. */\n existingTarget?: Ref.Ref<Obj.Unknown>;\n /**\n * Called when the user picks an entry, before the action runs. The flows themselves complete out\n * of band (an OAuth popup, a credential dialog), so this is the only point at which a caller can\n * tell that the user started one.\n */\n onSelect?: () => void;\n};\n\n/**\n * Standalone connector-auth menu: a trigger button that opens a dropdown of the same\n * {@link ConnectorAuth.actions} owning plugins contribute to object toolbars. Existing\n * {@link Connection}s are offered for reuse (bind inline) alongside a \"Connect X\" entry per connector\n * with an auth flow. Renders nothing when there is nothing to offer.\n */\nexport const ConnectorAuthMenu = ({ connectorIds, db, existingTarget, onSelect }: ConnectorAuthMenuProps) => {\n const { t } = UiHooks.useTranslation(meta.profile.key);\n const registry = useContext(RegistryContext);\n const runAction = GraphHooks.useActionRunner();\n const allConnectors = Hooks.useCapabilities(ConnectorSpec.Connector).flat();\n const allConnections = useQuery(db, Filter.type(Connection.Connection));\n\n const graph = useMenuGraph(() => {\n if (!db) {\n return undefined;\n }\n const actions = ConnectorAuth.actions({\n connectorIds,\n db,\n spaceId: db.spaceId,\n existingTarget,\n allConnectors,\n allConnections,\n });\n if (actions.length === 0) {\n return undefined;\n }\n const nextGraph = AppGraph.make({ registry });\n AppGraph.addNodes(nextGraph, [{ id: NODE_ID, type: NODE_ID, data: null, properties: {}, actions }]);\n return nextGraph;\n }, [registry, connectorIds, db, existingTarget, allConnectors, allConnections]);\n\n // Read the group's children (reuse / connect entries) as the menu content.\n const menuActions = useGraphMenuActions(graph, ConnectorAuth.GROUP_ID);\n\n const handleAction = useCallback<typeof runAction>(\n (action) => {\n onSelect?.();\n return runAction(action);\n },\n [onSelect, runAction],\n );\n\n if (!graph) {\n return null;\n }\n\n return (\n <ActionMenu {...menuActions} onAction={handleAction}>\n <Button.Root variant='ghost' icon='ph--plugs--regular' label={t('connect.label')} />\n </ActionMenu>\n );\n};\n\nConnectorAuthMenu.displayName = 'ConnectorAuthMenu';\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { Fragment, useEffect, useState } from 'react';\n\nimport * as Operation from '@dxos/compute/Operation';\nimport type * as Skill from '@dxos/compute/Skill';\nimport { type Database, Filter, type Ref } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { log } from '@dxos/log';\nimport * as ScrollArea from '@dxos/react-ui/ScrollArea';\nimport * as Util from '@dxos/react-ui/Util';\nimport { mx } from '@dxos/ui-theme';\n\nimport { AssistantService } from '#types';\n\nimport { type AiChatProcessor } from '../../processor/index.ts';\n\nexport type ToolboxProps = {\n services?: { service: AssistantService.ServiceType }[];\n functions?: Operation.PersistentOperation[];\n // TODO(burdon): Combine into single array.\n skills?: readonly Skill.Skill[];\n activeSkills?: readonly Ref.Ref<Skill.Skill>[];\n};\n\nexport const Toolbox = Util.composable<HTMLDivElement, ToolboxProps>(\n ({ functions, services, skills, activeSkills, ...props }, forwardedRef) => {\n return (\n <ScrollArea.Root {...Util.composableProps(props)} orientation='vertical' ref={forwardedRef}>\n <ScrollArea.Viewport>\n {skills && skills.length > 0 && (\n <Section\n title='Skills'\n items={skills.map(({ name, description, tools }) => ({\n name,\n description,\n subitems: tools.map((toolId) => ({ name: `∙ ${safeToolId(toolId)}` })),\n }))}\n />\n )}\n\n {activeSkills && activeSkills.length > 0 && (\n <Section\n title='Skills'\n items={activeSkills.map(({ target }) => ({\n name: target?.name ?? '',\n description: target?.description ?? '',\n subitems: target?.tools.map((toolId) => ({ name: `∙ ${safeToolId(toolId)}` })),\n }))}\n />\n )}\n\n {services && services.length > 0 && (\n <Section\n title='Services'\n items={services.map(({ service: { serviceId, name, description } }) => ({\n name: name ?? serviceId,\n description,\n // subitems: tools.map(({ name, description }) => ({ name: `∙ ${name}`, description })),\n }))}\n />\n )}\n\n {functions && functions.length > 0 && (\n <Section title='Functions' items={functions.map(({ name, description }) => ({ name, description }))} />\n )}\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n );\n },\n);\n\nToolbox.displayName = 'Toolbox';\n\ntype SectionProps = {\n title: string;\n items: { name: string; description?: string; subitems?: { name: string; description?: string }[] }[];\n striped?: boolean;\n};\n\nconst Section = ({ title, items, striped }: SectionProps) => {\n const stripeClassNames = 'odd:bg-neutral-50 dark:odd:bg-neutral-800';\n const gridClassNames = 'grid grid-cols-[8rem_1fr]';\n const subGridClassNames = mx('col-span-full grid grid-cols-subgrid text-xs px-2', striped && stripeClassNames);\n\n return (\n <div>\n <h1 className='px-2 text-sm'>{title}</h1>\n <div className={gridClassNames}>\n {items.map(({ name, description, subitems }, i) => (\n <Fragment key={i}>\n {name && (\n <div className={subGridClassNames}>\n <div className='truncate text-accent-text'>{name}</div>\n <div className='line-clamp-2'>{description}</div>\n </div>\n )}\n {subitems?.map(({ name, description }, i) => (\n <div key={i} className={mx(subGridClassNames, striped && stripeClassNames)}>\n <div className='truncate'>{name}</div>\n <div className='line-clamp-3 text-fg-subtle'>{description}</div>\n </div>\n ))}\n </Fragment>\n ))}\n </div>\n </div>\n );\n};\n\nexport type ToolboxPanelProps = Util.ThemedClassName<{\n db?: Database.Database;\n processor?: AiChatProcessor;\n}>;\n\nexport const ToolboxPanel = ({ classNames, db, processor }: ToolboxPanelProps) => {\n // Registered services.\n const services = useQuery(db, Filter.type(AssistantService.ServiceType));\n const [serviceTools, setServiceTools] = useState<{ service: AssistantService.ServiceType }[]>([]);\n useEffect(() => {\n log('creating service tools...', { services: services.length });\n queueMicrotask(async () => {\n // TODO(burdon): Fix.\n // const tools = await Promise.all(\n // services.map(async (service) => ({ service, tools: await createToolsFromService(service) })),\n // );\n // setServiceTools(tools);\n });\n }, [services]);\n\n // Deployed functions.\n const functions = useQuery(db, Filter.type(Operation.PersistentOperation));\n\n return (\n <Toolbox\n classNames={classNames}\n skills={processor?.context.getSkills()}\n services={serviceTools}\n functions={functions}\n />\n );\n};\n\nconst safeToolId = (name: string) => {\n return name.split('_').pop();\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"components.mjs","names":[],"sources":["../../src/components/AgentProperties/AgentProperties.tsx","../../src/components/ConnectorAuthMenu/ConnectorAuthMenu.tsx","../../src/components/Toolbox/Toolbox.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport type * as Agent from '@dxos/assistant/Agent';\nimport * as Trigger from '@dxos/compute/Trigger';\nimport { Filter, Obj, Ref, Type } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { URI } from '@dxos/keys';\nimport { Form } from '@dxos/react-ui-form';\nimport * as Field from '@dxos/react-ui/Field';\nimport * as Hooks from '@dxos/react-ui/Hooks';\nimport * as Input from '@dxos/react-ui/Input';\nimport { isFeedOwnerSchema } from '@dxos/schema';\n\nimport { meta } from '#meta';\n\n/** Mirrors the foreign keys stamped by the agent skill's automation compiler (`sync-automation`). */\nconst AGENT_TRIGGER_EXTENSION_KEY = 'org.dxos.extension.AgentTrigger';\nconst AGENT_TRIGGER_TARGET_EXTENSION_KEY = 'org.dxos.extension.AgentTriggerTarget';\n\nexport type AgentPropertiesProps = {\n agent: Agent.Agent;\n /** Invoked with the FULL next subscription set when the user toggles one. */\n onSubscriptionsChanged?: (subscriptions: Ref.Ref<Obj.Unknown>[]) => void;\n};\n\nexport const AgentProperties = ({ agent, onSubscriptionsChanged }: AgentPropertiesProps) => {\n const { t } = Hooks.useTranslation(meta.profile.key);\n const db = Obj.getDatabase(agent);\n\n // Build a filter matching objects of any schema annotated as a feed.\n const feedFilter = useMemo(() => {\n if (!db) {\n return Filter.nothing();\n }\n\n const schemas = db.graph.registry.list().filter(Type.isType);\n const feedSchemas = schemas.filter(isFeedOwnerSchema);\n\n return feedSchemas.length === 0\n ? Filter.nothing()\n : Filter.or(...feedSchemas.map((schema: Type.AnyEntity) => Filter.type(schema)));\n }, [db]);\n\n const subscribedObjects = useQuery(db, feedFilter);\n\n // The subscription state lives on the compiled automation (routine triggers), not the agent:\n // a trigger's target foreign key holds the subscribed object's URI (`timer:` keys are schedules).\n const triggers = useQuery(\n db,\n Filter.foreignKeys(Trigger.Trigger, [{ source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id }]),\n );\n const subscribedUris = useMemo(\n () =>\n new Set(\n triggers\n .map(\n (trigger) => Obj.getMeta(trigger).keys.find((key) => key.source === AGENT_TRIGGER_TARGET_EXTENSION_KEY)?.id,\n )\n .filter((id): id is string => id !== undefined && !id.startsWith('timer:')),\n ),\n [triggers],\n );\n\n // Toggle recompiles the full subscription set (see `sync-automation`'s per-category reconcile).\n const handleSubscriptionChange = useCallback(\n (object: Obj.Unknown, checked: boolean) => {\n const next = new Set(subscribedUris);\n const uri = Obj.getURI(object);\n if (checked) {\n next.add(uri);\n } else {\n next.delete(uri);\n }\n onSubscriptionsChanged?.([...next].map((subscription) => Ref.fromURI(URI.make(subscription))));\n },\n [subscribedUris, onSubscriptionsChanged],\n );\n\n if (subscribedObjects.length === 0) {\n return null;\n }\n\n return (\n <Form.FieldSet>\n <Field.Root>\n <Field.Label classNames='mt-form-gap'>{t('subscriptions.label')}</Field.Label>\n </Field.Root>\n\n {subscribedObjects.map((object) => (\n <Input.Checkbox\n key={object.id}\n checked={subscribedUris.has(Obj.getURI(object))}\n onCheckedChange={({ checked }) => {\n handleSubscriptionChange(object, checked === true);\n }}\n label={Obj.getLabel(object) ?? object.id}\n />\n ))}\n </Form.FieldSet>\n );\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { RegistryContext } from '@effect/atom-react/RegistryContext';\nimport React, { useCallback, useContext } from 'react';\n\nimport * as Hooks from '@dxos/app-framework/Hooks';\nimport * as AppGraph from '@dxos/app-graph/AppGraph';\nimport { type Database, Filter, type Obj, type Ref } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { Connection } from '@dxos/link';\nimport * as ConnectorAuth from '@dxos/plugin-connector/ConnectorAuth';\nimport * as ConnectorSpec from '@dxos/plugin-connector/ConnectorSpec';\nimport * as GraphHooks from '@dxos/plugin-graph/Hooks';\nimport { ActionMenu, useGraphMenuActions, useMenuGraph } from '@dxos/react-ui-menu';\nimport * as Button from '@dxos/react-ui/Button';\nimport * as UiHooks from '@dxos/react-ui/Hooks';\n\nimport { meta } from '#meta';\n\n/** Root node the connector-auth group hangs off in the component's local graph. */\nconst NODE_ID = 'connector-auth-root';\n\nexport type ConnectorAuthMenuProps = {\n /** Stable ids of the {@link ConnectorSpec.Connector} entries this menu offers: existing connections from any of\n * them are offered for reuse, and each (with an auth flow) gets a \"Connect X\" entry. */\n connectorIds: readonly string[];\n /** Omitted when there is no active database yet (e.g. no space selected) — nothing is offered. */\n db: Database.Database | undefined;\n /** Existing local object to wire up as the new connection's first sync target. */\n existingTarget?: Ref.Ref<Obj.Unknown>;\n /**\n * Called when the user picks an entry, before the action runs. The flows themselves complete out\n * of band (an OAuth popup, a credential dialog), so this is the only point at which a caller can\n * tell that the user started one.\n */\n onSelect?: () => void;\n};\n\n/**\n * Standalone connector-auth menu: a trigger button that opens a dropdown of the same\n * {@link ConnectorAuth.actions} owning plugins contribute to object toolbars. Existing\n * {@link Connection}s are offered for reuse (bind inline) alongside a \"Connect X\" entry per connector\n * with an auth flow. Renders nothing when there is nothing to offer.\n */\nexport const ConnectorAuthMenu = ({ connectorIds, db, existingTarget, onSelect }: ConnectorAuthMenuProps) => {\n const { t } = UiHooks.useTranslation(meta.profile.key);\n const registry = useContext(RegistryContext);\n const runAction = GraphHooks.useActionRunner();\n const allConnectors = Hooks.useCapabilities(ConnectorSpec.Connector).flat();\n const allConnections = useQuery(db, Filter.type(Connection.Connection));\n\n const graph = useMenuGraph(() => {\n if (!db) {\n return undefined;\n }\n const actions = ConnectorAuth.actions({\n connectorIds,\n db,\n spaceId: db.spaceId,\n existingTarget,\n allConnectors,\n allConnections,\n });\n if (actions.length === 0) {\n return undefined;\n }\n const nextGraph = AppGraph.make({ registry });\n AppGraph.addNodes(nextGraph, [{ id: NODE_ID, type: NODE_ID, data: null, properties: {}, actions }]);\n return nextGraph;\n }, [registry, connectorIds, db, existingTarget, allConnectors, allConnections]);\n\n // Read the group's children (reuse / connect entries) as the menu content.\n const menuActions = useGraphMenuActions(graph, ConnectorAuth.GROUP_ID);\n\n const handleAction = useCallback<typeof runAction>(\n (action) => {\n onSelect?.();\n return runAction(action);\n },\n [onSelect, runAction],\n );\n\n if (!graph) {\n return null;\n }\n\n return (\n <ActionMenu {...menuActions} onAction={handleAction}>\n <Button.Root variant='ghost' icon='ph--plugs--regular' label={t('connect.label')} />\n </ActionMenu>\n );\n};\n\nConnectorAuthMenu.displayName = 'ConnectorAuthMenu';\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { Fragment, useEffect, useState } from 'react';\n\nimport * as Operation from '@dxos/compute/Operation';\nimport type * as Skill from '@dxos/compute/Skill';\nimport { type Database, Filter, type Ref } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { log } from '@dxos/log';\nimport * as Layout from '@dxos/react-ui/Layout';\nimport * as ScrollArea from '@dxos/react-ui/ScrollArea';\nimport * as Util from '@dxos/react-ui/Util';\n\nimport { AssistantService } from '#types';\n\nimport { type ChatModel } from '../../chat-model/index.ts';\n\nexport type ToolboxProps = {\n services?: { service: AssistantService.ServiceType }[];\n functions?: Operation.PersistentOperation[];\n // TODO(burdon): Combine into single array.\n skills?: readonly Skill.Skill[];\n activeSkills?: readonly Ref.Ref<Skill.Skill>[];\n};\n\nexport const Toolbox = Util.composable<HTMLDivElement, ToolboxProps>(\n ({ functions, services, skills, activeSkills, ...props }, forwardedRef) => {\n return (\n <ScrollArea.Root {...Util.composableProps(props)} orientation='vertical' ref={forwardedRef}>\n <ScrollArea.Viewport>\n {skills && skills.length > 0 && (\n <Section\n title='Skills'\n items={skills.map(({ name, description, tools }) => ({\n name,\n description,\n subitems: tools.map((toolId) => ({ name: `∙ ${safeToolId(toolId)}` })),\n }))}\n />\n )}\n\n {activeSkills && activeSkills.length > 0 && (\n <Section\n title='Skills'\n items={activeSkills.map(({ target }) => ({\n name: target?.name ?? '',\n description: target?.description ?? '',\n subitems: target?.tools.map((toolId) => ({ name: `∙ ${safeToolId(toolId)}` })),\n }))}\n />\n )}\n\n {services && services.length > 0 && (\n <Section\n title='Services'\n items={services.map(({ service: { serviceId, name, description } }) => ({\n name: name ?? serviceId,\n description,\n // subitems: tools.map(({ name, description }) => ({ name: `∙ ${name}`, description })),\n }))}\n />\n )}\n\n {functions && functions.length > 0 && (\n <Section title='Functions' items={functions.map(({ name, description }) => ({ name, description }))} />\n )}\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n );\n },\n);\n\nToolbox.displayName = 'Toolbox';\n\ntype SectionProps = {\n title: string;\n items: { name: string; description?: string; subitems?: { name: string; description?: string }[] }[];\n striped?: boolean;\n};\n\nconst Section = ({ title, items, striped }: SectionProps) => {\n const stripeClassNames = 'odd:bg-neutral-50 dark:odd:bg-neutral-800';\n const subGridClassNames = ['text-xs px-2', striped && stripeClassNames];\n\n return (\n <div>\n <h1 className='px-2 text-sm'>{title}</h1>\n <Layout.Grid cols={['8rem', 'fill']}>\n {items.map(({ name, description, subitems }, i) => (\n <Fragment key={i}>\n {name && (\n <Layout.Grid cols='subgrid' classNames={subGridClassNames}>\n <div className='truncate text-accent-text'>{name}</div>\n <div className='line-clamp-2'>{description}</div>\n </Layout.Grid>\n )}\n {subitems?.map(({ name, description }, i) => (\n <Layout.Grid key={i} cols='subgrid' classNames={subGridClassNames}>\n <div className='truncate'>{name}</div>\n <div className='line-clamp-3 text-fg-subtle'>{description}</div>\n </Layout.Grid>\n ))}\n </Fragment>\n ))}\n </Layout.Grid>\n </div>\n );\n};\n\nexport type ToolboxPanelProps = Util.ThemedClassName<{\n db?: Database.Database;\n chatModel?: ChatModel;\n}>;\n\nexport const ToolboxPanel = ({ classNames, db, chatModel }: ToolboxPanelProps) => {\n // Registered services.\n const services = useQuery(db, Filter.type(AssistantService.ServiceType));\n const [serviceTools, setServiceTools] = useState<{ service: AssistantService.ServiceType }[]>([]);\n useEffect(() => {\n log('creating service tools...', { services: services.length });\n queueMicrotask(async () => {\n // TODO(burdon): Fix.\n // const tools = await Promise.all(\n // services.map(async (service) => ({ service, tools: await createToolsFromService(service) })),\n // );\n // setServiceTools(tools);\n });\n }, [services]);\n\n // Deployed functions.\n const functions = useQuery(db, Filter.type(Operation.PersistentOperation));\n\n return (\n <Toolbox\n classNames={classNames}\n skills={chatModel?.context.getSkills()}\n services={serviceTools}\n functions={functions}\n />\n );\n};\n\nconst safeToolId = (name: string) => {\n return name.split('_').pop();\n};\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { i as useChatContext } from "./chunk-context.mjs";
2
- import { t as AiChatProcessor } from "./chunk-processor.mjs";
2
+ import { n as ChatModel } from "./chunk-chat-model.mjs";
3
3
  import { a as providerForModel, i as presetsForProvider, n as defaultsKeyForProvider, o as resolveProvider, r as pickPreset } from "./chunk-presets.mjs";
4
4
  import * as AppCapabilities from "@dxos/app-toolkit/AppCapabilities";
5
5
  import { AssistantCapabilities, AssistantEvents, AssistantOperation, Ollama } from "#types";
@@ -30,10 +30,11 @@ import * as Effect from "effect/Effect";
30
30
  import * as Fiber from "effect/Fiber";
31
31
  import * as Stream from "effect/Stream";
32
32
  import * as AgentService from "@dxos/compute/AgentService";
33
+ import * as Skill from "@dxos/compute/Skill";
33
34
  import * as EffectEx from "@dxos/effect/EffectEx";
34
35
  import * as McpServer from "@dxos/compute/McpServer";
35
36
  import { useClient } from "@dxos/react-client";
36
- import * as Skill from "@dxos/compute/Skill";
37
+ import * as Schema from "effect/Schema";
37
38
  import { RegistryContext } from "@effect/atom-react/RegistryContext";
38
39
  import * as Layer from "effect/Layer";
39
40
  import * as Credential from "@dxos/compute/Credential";
@@ -42,7 +43,6 @@ import * as AppSpace from "@dxos/app-toolkit/AppSpace";
42
43
  import { invariant } from "@dxos/invariant";
43
44
  import * as TypeOptions from "@dxos/app-toolkit/TypeOptions";
44
45
  import * as Deferred from "effect/Deferred";
45
- import * as Schema from "effect/Schema";
46
46
  import { McpOAuth, McpToolkit } from "@dxos/mcp-client";
47
47
  import * as DeckCapabilities from "@dxos/plugin-deck/DeckCapabilities";
48
48
  import { Selection } from "@dxos/react-ui-attention/types";
@@ -152,12 +152,12 @@ var useChatKeymapExtensions = ({ event }) => {
152
152
  }, [event]);
153
153
  };
154
154
  //#endregion
155
- //#region src/hooks/useChatProcessor.ts
156
- var __dxlog_file$2 = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/hooks/useChatProcessor.ts";
155
+ //#region src/hooks/useChatModel.ts
156
+ var __dxlog_file$2 = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/hooks/useChatModel.ts";
157
157
  /**
158
- * Configure and create AiChatProcessor.
158
+ * Configure and create ChatModel.
159
159
  */
160
- var useChatProcessor = ({ db, chat, preset, runtime, registry, settings, sender }) => {
160
+ var useChatModel = ({ db, chat, preset, runtime, registry, settings, sender }) => {
161
161
  const observableRegistry = useContext(RegistryContext);
162
162
  const [feedSnapshot] = useObject(chat?.feed);
163
163
  const feed = Obj.getReactiveOrUndefined(feedSnapshot);
@@ -194,20 +194,21 @@ var useChatProcessor = ({ db, chat, preset, runtime, registry, settings, sender
194
194
  const serviceResolver = Hooks.useCapability(Capabilities.ServiceResolver);
195
195
  const senderName = sender?.name;
196
196
  const senderDid = sender?.identityDid;
197
- const processor = useMemo(() => {
197
+ const reportStruggles = settings?.reportStruggles ?? false;
198
+ const chatModel = useMemo(() => {
198
199
  if (!runtime || !session || !chat || !feed || !db) return;
199
200
  const spaceLayer = ServiceResolver.provide({ space: db.spaceId }, Database.Service, Credential.CredentialsService, AiService.AiService, AgentService.AgentService, Registry.Service, OpaqueToolkit.OpaqueToolkitProvider).pipe(Layer.provide(Layer.succeed(ServiceResolver.ServiceResolver, serviceResolver)));
200
- log("creating processor", {
201
+ log("creating chat model", {
201
202
  preset,
202
203
  model: preset?.model,
203
204
  settings
204
205
  }, {
205
206
  "~LogMeta": "~LogMeta",
206
207
  F: __dxlog_file$2,
207
- L: 101,
208
+ L: 102,
208
209
  S: void 0
209
210
  });
210
- return new AiChatProcessor(session, runtime, feed, spaceLayer, {
211
+ return new ChatModel(session, runtime, feed, spaceLayer, {
211
212
  chat: chat ? Ref.make(chat) : void 0,
212
213
  observableRegistry,
213
214
  registry,
@@ -216,7 +217,8 @@ var useChatProcessor = ({ db, chat, preset, runtime, registry, settings, sender
216
217
  sender: senderName || senderDid ? {
217
218
  ...senderName ? { name: senderName } : {},
218
219
  ...senderDid ? { identityDid: senderDid } : {}
219
- } : void 0
220
+ } : void 0,
221
+ reportStruggles
220
222
  });
221
223
  }, [
222
224
  runtime,
@@ -227,10 +229,11 @@ var useChatProcessor = ({ db, chat, preset, runtime, registry, settings, sender
227
229
  feed,
228
230
  db?.spaceId,
229
231
  senderName,
230
- senderDid
232
+ senderDid,
233
+ reportStruggles
231
234
  ]);
232
- useEffect(() => processor?.adopt(), [processor]);
233
- return processor;
235
+ useEffect(() => chatModel?.adopt(), [chatModel]);
236
+ return chatModel;
234
237
  };
235
238
  //#endregion
236
239
  //#region src/hooks/useChatServices.ts
@@ -393,13 +396,13 @@ var useContextObjects = ({ db, context }) => {
393
396
  * and resolved tools to the browser console under a collapsible group.
394
397
  * Used by the chat's debug-toggle event handler.
395
398
  */
396
- var useDebug = ({ processor }) => {
399
+ var useDebug = ({ chatModel }) => {
397
400
  return useCallback(async () => {
398
- if (!processor) return;
399
- const objects = processor.context.getObjects();
400
- const skills = processor.context.getSkills();
401
- const system = await processor.getSystemPrompt();
402
- const tools = await processor.getTools() ?? {};
401
+ if (!chatModel) return;
402
+ const objects = chatModel.context.getObjects();
403
+ const skills = chatModel.context.getSkills();
404
+ const system = await chatModel.getSystemPrompt();
405
+ const tools = await chatModel.getTools() ?? {};
403
406
  console.group("Chat", {
404
407
  objects,
405
408
  skills
@@ -416,7 +419,7 @@ var useDebug = ({ processor }) => {
416
419
  } finally {
417
420
  console.groupEnd();
418
421
  }
419
- }, [processor]);
422
+ }, [chatModel]);
420
423
  };
421
424
  //#endregion
422
425
  //#region src/hooks/useFilteredTypes.ts
@@ -754,24 +757,30 @@ var useSelectionContext = (companionTo) => {
754
757
  //#region src/hooks/useHomeSuggestions.ts
755
758
  var FALLBACK_SUGGESTION_KEYS = ["space-home.suggestion-magazine.label", "space-home.suggestion-kanban.label"];
756
759
  /**
757
- * Returns starter prompts for the space Home page. Returns undefined while the request is in flight
758
- * so the section stays hidden until settled. On success yields generated prompts; on empty result or
759
- * error falls back to the hardcoded defaults.
760
+ * Returns starter prompts for the space Home page: the space's cached prompts at once, then the
761
+ * operation's answer once it settles (generated prompts, or the hardcoded defaults on an empty result
762
+ * or error). Undefined while nothing is cached and the request is in flight.
760
763
  */
761
764
  var useHomeSuggestions = (space) => {
762
765
  const { t } = UiHooks.useTranslation(meta.profile.key);
763
766
  const { invokePromise } = Hooks.useOperationInvoker();
767
+ const cache = Hooks.useOptionalAtomCapability(AssistantCapabilities.HomeSuggestionsCache);
764
768
  const fallbacks = useMemo(() => FALLBACK_SUGGESTION_KEYS.map((key) => t(key)), [t]);
765
- const [suggestions, setSuggestions] = useState(void 0);
769
+ const [settled, setSettled] = useState();
766
770
  UiHooks.useAsyncEffect(async (controller) => {
767
- setSuggestions(void 0);
768
771
  if (!space) return;
769
- const result = await invokePromise(AssistantOperation.GenerateHomeSuggestions, {}, { spaceId: space.db.spaceId });
772
+ const spaceId = space.db.spaceId;
773
+ const result = await invokePromise(AssistantOperation.GenerateHomeSuggestions, {}, { spaceId });
770
774
  if (controller.signal.aborted) return;
771
775
  const prompts = result.data?.prompts;
772
- setSuggestions(prompts && prompts.length > 0 ? prompts : fallbacks);
776
+ setSettled({
777
+ spaceId,
778
+ prompts: prompts && prompts.length > 0 ? prompts : fallbacks
779
+ });
773
780
  }, [space, invokePromise]);
774
- return suggestions;
781
+ const spaceId = space?.db.spaceId;
782
+ if (!spaceId) return;
783
+ return settled?.spaceId === spaceId ? settled.prompts : cache?.[spaceId]?.prompts;
775
784
  };
776
785
  //#endregion
777
786
  //#region src/hooks/useProcessEphemeralStatus.ts
@@ -911,6 +920,6 @@ var useSessionTimeline = (space, { chats, tasks }) => {
911
920
  });
912
921
  };
913
922
  //#endregion
914
- export { getSelectionContext, getSkillId, isTerminalActivityLine, sessionFromChat, useActiveSkills, useChatKeymapExtensions, useChatProcessor, useChatServices, useChatToolbarActions, useContextBinder, useContextObjects, useDebug, useFilteredTypes, useHomeSuggestions, useMcpServerSignIn, useMcpServerStatus, usePlatform, usePresets, useProcessEphemeralStatus, useReferencesProvider, useSelectionContext, useSessionTimeline, useSkillHandlers, useSkills };
923
+ export { getSelectionContext, getSkillId, isTerminalActivityLine, sessionFromChat, useActiveSkills, useChatKeymapExtensions, useChatModel, useChatServices, useChatToolbarActions, useContextBinder, useContextObjects, useDebug, useFilteredTypes, useHomeSuggestions, useMcpServerSignIn, useMcpServerStatus, usePlatform, usePresets, useProcessEphemeralStatus, useReferencesProvider, useSelectionContext, useSessionTimeline, useSkillHandlers, useSkills };
915
924
 
916
925
  //# sourceMappingURL=hooks.mjs.map