@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.
- package/PLUGIN.mdl +25 -0
- package/dist/lib/AssistantCapabilities.mjs +8 -1
- package/dist/lib/AssistantCapabilities.mjs.map +1 -1
- package/dist/lib/Settings.mjs +4 -0
- package/dist/lib/Settings.mjs.map +1 -1
- package/dist/lib/TurnReviewSkill.mjs +55 -0
- package/dist/lib/TurnReviewSkill.mjs.map +1 -0
- package/dist/lib/chunk-AgentArticle.mjs +1 -1
- package/dist/lib/chunk-AssistantSettings.mjs +1 -1
- package/dist/lib/chunk-AssistantSettings.mjs.map +1 -1
- package/dist/lib/chunk-Chat.mjs +322 -174
- package/dist/lib/chunk-Chat.mjs.map +1 -1
- package/dist/lib/chunk-ChatArticle.mjs +14 -7
- package/dist/lib/chunk-ChatArticle.mjs.map +1 -1
- package/dist/lib/chunk-ChatDialog.mjs +5 -4
- package/dist/lib/chunk-ChatDialog.mjs.map +1 -1
- package/dist/lib/chunk-IntegrationPrompt.mjs +1 -1
- package/dist/lib/chunk-PLUGIN.mjs +1 -1
- package/dist/lib/chunk-PluginUrlPrompt.mjs +1 -1
- package/dist/lib/chunk-QuestionSurface.mjs +1 -1
- package/dist/lib/chunk-SpaceHomePrompt.mjs +116 -60
- package/dist/lib/chunk-SpaceHomePrompt.mjs.map +1 -1
- package/dist/lib/chunk-TriggerStatus.mjs +1 -1
- package/dist/lib/chunk-agent-service.mjs +3 -1
- package/dist/lib/chunk-agent-service.mjs.map +1 -1
- package/dist/lib/chunk-analyze-turn.mjs +220 -0
- package/dist/lib/chunk-analyze-turn.mjs.map +1 -0
- package/dist/lib/{chunk-processor.mjs → chunk-chat-model.mjs} +95 -43
- package/dist/lib/chunk-chat-model.mjs.map +1 -0
- package/dist/lib/chunk-context.mjs.map +1 -1
- package/dist/lib/chunk-create-chat.mjs +5 -19
- package/dist/lib/chunk-create-chat.mjs.map +1 -1
- package/dist/lib/chunk-create-object.mjs +1 -1
- package/dist/lib/chunk-default-skills.mjs +28 -0
- package/dist/lib/chunk-default-skills.mjs.map +1 -0
- package/dist/lib/chunk-generate-home-suggestions.mjs +8 -6
- package/dist/lib/chunk-generate-home-suggestions.mjs.map +1 -1
- package/dist/lib/chunk-presets.mjs +1 -1
- package/dist/lib/chunk-presets.mjs.map +1 -1
- package/dist/lib/chunk-question-resumer.mjs +1 -1
- package/dist/lib/chunk-react-surface.mjs +1 -1
- package/dist/lib/chunk-run-prompt-in-chat.mjs +2 -1
- package/dist/lib/chunk-run-prompt-in-chat.mjs.map +1 -1
- package/dist/lib/chunk-run-prompt-in-new-chat.mjs +1 -1
- package/dist/lib/chunk-schema-defs.mjs +2 -2
- package/dist/lib/chunk-skill-definition.mjs +3 -2
- package/dist/lib/chunk-skill-definition.mjs.map +1 -1
- package/dist/lib/components.mjs +13 -13
- package/dist/lib/components.mjs.map +1 -1
- package/dist/lib/hooks.mjs +40 -31
- package/dist/lib/hooks.mjs.map +1 -1
- package/dist/lib/operations.mjs +3 -1
- package/dist/lib/operations.mjs.map +1 -1
- package/dist/lib/skills.mjs +2 -1
- package/dist/lib/translations.mjs +4 -2
- package/dist/lib/translations.mjs.map +1 -1
- package/dist/types/src/Chat.d.ts +1 -1
- package/dist/types/src/capabilities/agent-service.d.ts.map +1 -1
- package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -1
- package/dist/types/src/{processor/processor.d.ts → chat-model/chat-model.d.ts} +24 -22
- package/dist/types/src/chat-model/chat-model.d.ts.map +1 -0
- package/dist/types/src/chat-model/chat-model.edge.test.d.ts +2 -0
- package/dist/types/src/chat-model/chat-model.edge.test.d.ts.map +1 -0
- package/dist/types/src/chat-model/chat-model.node.test.d.ts +2 -0
- package/dist/types/src/chat-model/chat-model.node.test.d.ts.map +1 -0
- package/dist/types/src/chat-model/chat-model.scripted.node.test.d.ts +2 -0
- package/dist/types/src/chat-model/chat-model.scripted.node.test.d.ts.map +1 -0
- package/dist/types/src/{processor → chat-model}/index.d.ts +1 -1
- package/dist/types/src/chat-model/index.d.ts.map +1 -0
- package/dist/types/src/chat-model/outbox.d.ts.map +1 -0
- package/dist/types/src/chat-model/outbox.test.d.ts.map +1 -0
- package/dist/types/src/chat-model/presets.d.ts.map +1 -0
- package/dist/types/src/chat-model/presets.test.d.ts.map +1 -0
- package/dist/types/src/{processor → chat-model}/prompt.d.ts +2 -2
- package/dist/types/src/chat-model/prompt.d.ts.map +1 -0
- package/dist/types/src/chat-model/prompt.test.d.ts.map +1 -0
- package/dist/types/src/chat-model/streaming.node.test.d.ts.map +1 -0
- package/dist/types/src/chat-model/testing/chat-model-recorder.d.ts +58 -0
- package/dist/types/src/chat-model/testing/chat-model-recorder.d.ts.map +1 -0
- package/dist/types/src/chat-model/testing/harness.d.ts +22 -0
- package/dist/types/src/chat-model/testing/harness.d.ts.map +1 -0
- package/dist/types/src/chat-model/thread.d.ts.map +1 -0
- package/dist/types/src/chat-model/thread.test.d.ts.map +1 -0
- package/dist/types/src/components/Chat/Chat.d.ts +6 -6
- package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
- package/dist/types/src/components/Chat/context.d.ts +5 -3
- package/dist/types/src/components/Chat/context.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/ChatActions.d.ts +1 -1
- package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/ChatMcpErrors.d.ts +3 -3
- package/dist/types/src/components/ChatPrompt/ChatMcpErrors.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts +3 -1
- package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts +4 -3
- package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts +15 -5
- package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/ChatPrompt.stories.d.ts +1 -1
- package/dist/types/src/components/ChatPrompt/ChatStatus.d.ts +1 -1
- package/dist/types/src/components/ChatPrompt/ChatStatus.d.ts.map +1 -1
- package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.d.ts +9 -0
- package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.d.ts.map +1 -1
- package/dist/types/src/components/Toolbox/Toolbox.d.ts +3 -3
- package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
- package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts.map +1 -1
- package/dist/types/src/containers/ChatArticle/ChatArticle.stories.d.ts +1 -1
- package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +2 -2
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/{useChatProcessor.d.ts → useChatModel.d.ts} +6 -6
- package/dist/types/src/hooks/useChatModel.d.ts.map +1 -0
- package/dist/types/src/hooks/useDebug.d.ts +3 -3
- package/dist/types/src/hooks/useDebug.d.ts.map +1 -1
- package/dist/types/src/hooks/useHomeSuggestions.d.ts +3 -3
- package/dist/types/src/hooks/useHomeSuggestions.d.ts.map +1 -1
- package/dist/types/src/hooks/usePresets.d.ts +1 -1
- package/dist/types/src/hooks/usePresets.d.ts.map +1 -1
- package/dist/types/src/hooks/useSelectionContext.d.ts +3 -3
- package/dist/types/src/hooks/useSelectionContext.d.ts.map +1 -1
- package/dist/types/src/operations/analyze-turn.d.ts +5 -0
- package/dist/types/src/operations/analyze-turn.d.ts.map +1 -0
- package/dist/types/src/operations/analyze-turn.test.d.ts +2 -0
- package/dist/types/src/operations/analyze-turn.test.d.ts.map +1 -0
- package/dist/types/src/operations/create-chat.d.ts.map +1 -1
- package/dist/types/src/operations/generate-home-suggestions.d.ts.map +1 -1
- package/dist/types/src/operations/index.d.ts.map +1 -1
- package/dist/types/src/operations/run-prompt-in-chat.d.ts.map +1 -1
- package/dist/types/src/review/turn-review.d.ts +58 -0
- package/dist/types/src/review/turn-review.d.ts.map +1 -0
- package/dist/types/src/review/turn-review.test.d.ts +2 -0
- package/dist/types/src/review/turn-review.test.d.ts.map +1 -0
- package/dist/types/src/skills/index.d.ts +1 -0
- package/dist/types/src/skills/index.d.ts.map +1 -1
- package/dist/types/src/skills/turn-review/TurnReviewSkill.d.ts +21 -0
- package/dist/types/src/skills/turn-review/TurnReviewSkill.d.ts.map +1 -0
- package/dist/types/src/skills/turn-review/index.d.ts +2 -0
- package/dist/types/src/skills/turn-review/index.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Assistant.d.ts +1 -0
- package/dist/types/src/types/Assistant.d.ts.map +1 -1
- package/dist/types/src/types/AssistantCapabilities.d.ts +7 -1
- package/dist/types/src/types/AssistantCapabilities.d.ts.map +1 -1
- package/dist/types/src/types/Settings.d.ts +1 -0
- package/dist/types/src/types/Settings.d.ts.map +1 -1
- package/dist/types/src/util/agent-options.d.ts +27 -0
- package/dist/types/src/util/agent-options.d.ts.map +1 -0
- package/dist/types/src/util/agent-options.test.d.ts +2 -0
- package/dist/types/src/util/agent-options.test.d.ts.map +1 -0
- package/dist/types/src/util/default-skills.d.ts +10 -0
- package/dist/types/src/util/default-skills.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +89 -80
- package/src/capabilities/agent-service.ts +2 -1
- package/src/capabilities/skill-definition.ts +2 -1
- package/src/chat-model/chat-model.edge.test.ts +301 -0
- package/src/{processor/processor.node.test.ts → chat-model/chat-model.node.test.ts} +19 -9
- package/src/chat-model/chat-model.scripted.node.test.ts +441 -0
- package/src/{processor/processor.ts → chat-model/chat-model.ts} +140 -45
- package/src/{processor → chat-model}/index.ts +1 -1
- package/src/{processor → chat-model}/prompt.ts +2 -2
- package/src/{processor → chat-model}/streaming.node.test.ts +108 -116
- package/src/chat-model/testing/chat-model-recorder.ts +249 -0
- package/src/chat-model/testing/harness.ts +81 -0
- package/src/{processor → chat-model}/thread.test.ts +1 -1
- package/src/components/Chat/Chat.tsx +44 -38
- package/src/components/Chat/Error.stories.tsx +1 -1
- package/src/components/Chat/context.ts +5 -3
- package/src/components/ChatPrompt/ChatActions.tsx +1 -1
- package/src/components/ChatPrompt/ChatMcpErrors.tsx +6 -6
- package/src/components/ChatPrompt/ChatOptions.stories.tsx +37 -3
- package/src/components/ChatPrompt/ChatOptions.tsx +118 -10
- package/src/components/ChatPrompt/ChatPrompt.stories.tsx +10 -10
- package/src/components/ChatPrompt/ChatPrompt.tsx +44 -27
- package/src/components/ChatPrompt/ChatStatus.tsx +8 -7
- package/src/components/Toolbox/Toolbox.tsx +12 -13
- package/src/containers/AssistantSettings/AssistantSettings.tsx +1 -1
- package/src/containers/ChatArticle/ChatArticle.stories.tsx +1 -1
- package/src/containers/ChatArticle/ChatArticle.tsx +16 -6
- package/src/containers/ChatDialog/ChatDialog.tsx +4 -4
- package/src/containers/SpaceHomePrompt/SpaceHomePrompt.tsx +110 -57
- package/src/hooks/index.ts +2 -2
- package/src/hooks/{useChatProcessor.ts → useChatModel.ts} +16 -14
- package/src/hooks/useDebug.ts +8 -8
- package/src/hooks/useHomeSuggestions.ts +14 -9
- package/src/hooks/usePresets.ts +2 -2
- package/src/hooks/useProcessEphemeralStatus.ts +1 -1
- package/src/hooks/useSelectionContext.ts +3 -5
- package/src/operations/analyze-turn.test.ts +194 -0
- package/src/operations/analyze-turn.ts +96 -0
- package/src/operations/create-chat.ts +4 -36
- package/src/operations/generate-home-suggestions.test.ts +1 -2
- package/src/operations/generate-home-suggestions.ts +17 -9
- package/src/operations/index.ts +2 -0
- package/src/operations/run-prompt-in-chat.ts +3 -2
- package/src/review/turn-review.test.ts +92 -0
- package/src/review/turn-review.ts +213 -0
- package/src/skills/index.ts +1 -0
- package/src/skills/turn-review/TurnReviewSkill.ts +46 -0
- package/src/skills/turn-review/index.ts +5 -0
- package/src/translations.ts +2 -0
- package/src/types/AssistantCapabilities.ts +8 -1
- package/src/types/Settings.ts +7 -0
- package/src/util/agent-options.test.ts +54 -0
- package/src/util/agent-options.ts +60 -0
- package/src/util/default-skills.ts +35 -0
- package/dist/lib/chunk-processor.mjs.map +0 -1
- package/dist/types/src/hooks/useChatProcessor.d.ts.map +0 -1
- package/dist/types/src/processor/index.d.ts.map +0 -1
- package/dist/types/src/processor/outbox.d.ts.map +0 -1
- package/dist/types/src/processor/outbox.test.d.ts.map +0 -1
- package/dist/types/src/processor/presets.d.ts.map +0 -1
- package/dist/types/src/processor/presets.test.d.ts.map +0 -1
- package/dist/types/src/processor/processor.d.ts.map +0 -1
- package/dist/types/src/processor/processor.node.test.d.ts +0 -2
- package/dist/types/src/processor/processor.node.test.d.ts.map +0 -1
- package/dist/types/src/processor/prompt.d.ts.map +0 -1
- package/dist/types/src/processor/prompt.test.d.ts.map +0 -1
- package/dist/types/src/processor/streaming.node.test.d.ts.map +0 -1
- package/dist/types/src/processor/thread.d.ts.map +0 -1
- package/dist/types/src/processor/thread.test.d.ts.map +0 -1
- /package/dist/types/src/{processor → chat-model}/outbox.d.ts +0 -0
- /package/dist/types/src/{processor → chat-model}/outbox.test.d.ts +0 -0
- /package/dist/types/src/{processor → chat-model}/presets.d.ts +0 -0
- /package/dist/types/src/{processor → chat-model}/presets.test.d.ts +0 -0
- /package/dist/types/src/{processor → chat-model}/prompt.test.d.ts +0 -0
- /package/dist/types/src/{processor → chat-model}/streaming.node.test.d.ts +0 -0
- /package/dist/types/src/{processor → chat-model}/thread.d.ts +0 -0
- /package/dist/types/src/{processor → chat-model}/thread.test.d.ts +0 -0
- /package/src/{processor → chat-model}/outbox.test.ts +0 -0
- /package/src/{processor → chat-model}/outbox.ts +0 -0
- /package/src/{processor → chat-model}/presets.test.ts +0 -0
- /package/src/{processor → chat-model}/presets.ts +0 -0
- /package/src/{processor → chat-model}/prompt.test.ts +0 -0
- /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"}
|
package/dist/lib/components.mjs
CHANGED
|
@@ -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
|
|
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(
|
|
180
|
-
|
|
181
|
-
children: items.map(({ name, description, subitems }, i) => /* @__PURE__ */ jsxs(Fragment, { children: [name && /* @__PURE__ */ jsxs(
|
|
182
|
-
|
|
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(
|
|
191
|
-
|
|
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,
|
|
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:
|
|
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:
|
|
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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"}
|
package/dist/lib/hooks.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { i as useChatContext } from "./chunk-context.mjs";
|
|
2
|
-
import {
|
|
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
|
|
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/
|
|
156
|
-
var __dxlog_file$2 = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/hooks/
|
|
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
|
|
158
|
+
* Configure and create ChatModel.
|
|
159
159
|
*/
|
|
160
|
-
var
|
|
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
|
|
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
|
|
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:
|
|
208
|
+
L: 102,
|
|
208
209
|
S: void 0
|
|
209
210
|
});
|
|
210
|
-
return new
|
|
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(() =>
|
|
233
|
-
return
|
|
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 = ({
|
|
399
|
+
var useDebug = ({ chatModel }) => {
|
|
397
400
|
return useCallback(async () => {
|
|
398
|
-
if (!
|
|
399
|
-
const objects =
|
|
400
|
-
const skills =
|
|
401
|
-
const system = await
|
|
402
|
-
const tools = await
|
|
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
|
-
}, [
|
|
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
|
|
758
|
-
*
|
|
759
|
-
* error
|
|
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 [
|
|
769
|
+
const [settled, setSettled] = useState();
|
|
766
770
|
UiHooks.useAsyncEffect(async (controller) => {
|
|
767
|
-
setSuggestions(void 0);
|
|
768
771
|
if (!space) return;
|
|
769
|
-
const
|
|
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
|
-
|
|
776
|
+
setSettled({
|
|
777
|
+
spaceId,
|
|
778
|
+
prompts: prompts && prompts.length > 0 ? prompts : fallbacks
|
|
779
|
+
});
|
|
773
780
|
}, [space, invokePromise]);
|
|
774
|
-
|
|
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,
|
|
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
|