@dxos/plugin-assistant 0.8.4-staging.60fe92afc8 → 0.9.1-main.c7dcc2e112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/neutral/{AgentArticle-K7XM46OQ.mjs → AgentArticle-2BEPWUMN.mjs} +9 -7
- package/dist/lib/neutral/AgentArticle-2BEPWUMN.mjs.map +7 -0
- package/dist/lib/neutral/AssistantPlugin.mjs +1 -1
- package/dist/lib/neutral/{AssistantSettings-GG52BLKS.mjs → AssistantSettings-7ALY4BMS.mjs} +3 -3
- package/dist/lib/neutral/AssistantSettings-7ALY4BMS.mjs.map +7 -0
- package/dist/lib/neutral/{ChatArticle-VNVZCDUR.mjs → ChatArticle-KT46SUFU.mjs} +2 -2
- package/dist/lib/neutral/{ChatCompanion-LBUHYWQG.mjs → ChatCompanion-YHC43RYQ.mjs} +4 -4
- package/dist/lib/neutral/ChatCompanion-YHC43RYQ.mjs.map +7 -0
- package/dist/lib/neutral/{ChatDialog-DCA6FLOV.mjs → ChatDialog-YZDZLIQA.mjs} +5 -4
- package/dist/lib/neutral/ChatDialog-YZDZLIQA.mjs.map +7 -0
- package/dist/lib/neutral/{PlanArticle-TS5ULWYS.mjs → PlanArticle-VPK2IYWU.mjs} +8 -2
- package/dist/lib/neutral/PlanArticle-VPK2IYWU.mjs.map +7 -0
- package/dist/lib/neutral/{RoutineArticle-5NYXHRG6.mjs → RoutineArticle-FK5BXQN5.mjs} +3 -3
- package/dist/lib/neutral/RoutineArticle-FK5BXQN5.mjs.map +7 -0
- package/dist/lib/neutral/SpaceHomePrompt-HTWQKLGI.mjs +113 -0
- package/dist/lib/neutral/SpaceHomePrompt-HTWQKLGI.mjs.map +7 -0
- package/dist/lib/neutral/SpaceHomeSuggestions-6G4E7GNJ.mjs +50 -0
- package/dist/lib/neutral/SpaceHomeSuggestions-6G4E7GNJ.mjs.map +7 -0
- package/dist/lib/neutral/TracePanel-T552TAOH.mjs +12 -0
- package/dist/lib/neutral/TracePanel-T552TAOH.mjs.map +7 -0
- package/dist/lib/neutral/{TriggerStatus-X7Y5JFZJ.mjs → TriggerStatus-RBOHHDOK.mjs} +3 -3
- package/dist/lib/neutral/TriggerStatus-RBOHHDOK.mjs.map +7 -0
- package/dist/lib/neutral/{agent-service-WCAP5MLI.mjs → agent-service-WV5CSHAG.mjs} +4 -2
- package/dist/lib/neutral/{agent-service-WCAP5MLI.mjs.map → agent-service-WV5CSHAG.mjs.map} +3 -3
- package/dist/lib/neutral/{app-graph-builder-WUFHQH3Y.mjs → app-graph-builder-PTSRZXRN.mjs} +13 -13
- package/dist/lib/neutral/app-graph-builder-PTSRZXRN.mjs.map +7 -0
- package/dist/lib/neutral/{blueprint-definition-MH2QLYQH.mjs → blueprint-definition-2XPYI35X.mjs} +4 -3
- package/dist/lib/neutral/blueprint-definition-2XPYI35X.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +8 -8
- package/dist/lib/neutral/capabilities/index.mjs.map +2 -2
- package/dist/lib/neutral/{chunk-HLANPOBA.mjs → chunk-35EL65O4.mjs} +3 -3
- package/dist/lib/neutral/chunk-35EL65O4.mjs.map +7 -0
- package/dist/lib/neutral/chunk-54W7N6M6.mjs +445 -0
- package/dist/lib/neutral/chunk-54W7N6M6.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-YXRGZYYH.mjs → chunk-5KB2WRI2.mjs} +6 -6
- package/dist/lib/neutral/chunk-5KB2WRI2.mjs.map +7 -0
- package/dist/lib/neutral/{TracePanel-KTZJ6JNR.mjs → chunk-5LKNH7FD.mjs} +5 -20
- package/dist/lib/neutral/chunk-5LKNH7FD.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-SMFJD7BP.mjs → chunk-7FQT4XMI.mjs} +2 -2
- package/dist/lib/neutral/{chunk-RKVVK3R3.mjs → chunk-H77JTXAN.mjs} +17 -9
- package/dist/lib/neutral/chunk-H77JTXAN.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-QAZMOFPI.mjs → chunk-IQZJ5TTM.mjs} +4 -4
- package/dist/lib/neutral/chunk-IQZJ5TTM.mjs.map +7 -0
- package/dist/lib/neutral/chunk-ZNDQVYUN.mjs +53 -0
- package/dist/lib/neutral/chunk-ZNDQVYUN.mjs.map +7 -0
- package/dist/lib/neutral/components/index.mjs +296 -109
- package/dist/lib/neutral/components/index.mjs.map +3 -3
- package/dist/lib/neutral/containers/index.mjs +12 -8
- package/dist/lib/neutral/containers/index.mjs.map +3 -3
- package/dist/lib/neutral/{create-chat-SGGQ6HVN.mjs → create-chat-Z3FNA6OJ.mjs} +2 -2
- package/dist/lib/neutral/{create-chat-SGGQ6HVN.mjs.map → create-chat-Z3FNA6OJ.mjs.map} +2 -2
- package/dist/lib/neutral/{create-object-U2SOFZLR.mjs → create-object-BJUDDKQQ.mjs} +2 -2
- package/dist/lib/neutral/execution-graph/index.mjs +156 -0
- package/dist/lib/neutral/execution-graph/index.mjs.map +4 -4
- package/dist/lib/neutral/{fork-chat-34KEF4ZJ.mjs → fork-chat-UYXYT6BT.mjs} +4 -4
- package/dist/lib/neutral/fork-chat-UYXYT6BT.mjs.map +7 -0
- package/dist/lib/neutral/hooks/index.mjs +233 -438
- package/dist/lib/neutral/hooks/index.mjs.map +4 -4
- package/dist/lib/neutral/index.mjs +3 -3
- package/dist/lib/neutral/markdown-extension-IJ5RQMQ4.mjs +126 -0
- package/dist/lib/neutral/markdown-extension-IJ5RQMQ4.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/meta.mjs +1 -1
- package/dist/lib/neutral/operations/index.mjs +1 -1
- package/dist/lib/neutral/plugin.mjs +2 -2
- package/dist/lib/neutral/{react-surface-XRTBW5OJ.mjs → react-surface-ES7UHZ65.mjs} +29 -17
- package/dist/lib/neutral/react-surface-ES7UHZ65.mjs.map +7 -0
- package/dist/lib/neutral/{run-prompt-in-new-chat-D5IIE2C7.mjs → run-prompt-in-new-chat-NIAGCKQV.mjs} +11 -8
- package/dist/lib/neutral/run-prompt-in-new-chat-NIAGCKQV.mjs.map +7 -0
- package/dist/lib/neutral/{settings-W4BLWQ53.mjs → settings-7Q3RITIT.mjs} +3 -3
- package/dist/lib/neutral/{settings-W4BLWQ53.mjs.map → settings-7Q3RITIT.mjs.map} +3 -3
- package/dist/lib/neutral/{state-H3G7QCU6.mjs → state-XO2UYSSG.mjs} +2 -2
- package/dist/lib/neutral/{state-H3G7QCU6.mjs.map → state-XO2UYSSG.mjs.map} +3 -3
- package/dist/lib/neutral/testing.mjs +1 -1
- package/dist/lib/neutral/translations.mjs +18 -11
- package/dist/lib/neutral/translations.mjs.map +3 -3
- package/dist/lib/neutral/types/index.mjs +1 -1
- package/dist/types/dx.config.d.ts +28 -0
- package/dist/types/dx.config.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +17 -57
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/components/Chat/Chat.d.ts +6 -3
- package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
- package/dist/types/src/components/Chat/Chat.stories.d.ts +32 -0
- package/dist/types/src/components/Chat/Chat.stories.d.ts.map +1 -0
- package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts.map +1 -1
- package/dist/types/src/components/ProcessTree/ProcessTree.d.ts +6 -0
- package/dist/types/src/components/ProcessTree/ProcessTree.d.ts.map +1 -1
- package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts +1 -0
- package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts.map +1 -1
- package/dist/types/src/components/TaskList/TaskList.d.ts +8 -0
- package/dist/types/src/components/TaskList/TaskList.d.ts.map +1 -1
- package/dist/types/src/components/TaskList/TaskList.stories.d.ts +3 -0
- package/dist/types/src/components/TaskList/TaskList.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts +2 -2
- package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts.map +1 -1
- package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts +2 -2
- package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts.map +1 -1
- package/dist/types/src/containers/PlanArticle/PlanArticle.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts +15 -0
- package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceHomePrompt/index.d.ts +2 -0
- package/dist/types/src/containers/SpaceHomePrompt/index.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts +13 -0
- package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceHomeSuggestions/index.d.ts +2 -0
- package/dist/types/src/containers/SpaceHomeSuggestions/index.d.ts.map +1 -0
- package/dist/types/src/containers/TracePanel/TracePanel.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +2 -0
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/execution-graph/execution-graph.d.ts +18 -0
- package/dist/types/src/execution-graph/execution-graph.d.ts.map +1 -1
- package/dist/types/src/execution-graph/index.d.ts +2 -1
- package/dist/types/src/execution-graph/index.d.ts.map +1 -1
- package/dist/types/src/execution-graph/pending-block-status.d.ts +26 -0
- package/dist/types/src/execution-graph/pending-block-status.d.ts.map +1 -0
- package/dist/types/src/execution-graph/pending-block-status.test.d.ts +2 -0
- package/dist/types/src/execution-graph/pending-block-status.test.d.ts.map +1 -0
- package/dist/types/src/extensions/prompt-extension.d.ts +1 -1
- package/dist/types/src/extensions/prompt-extension.d.ts.map +1 -1
- package/dist/types/src/feed-logger.d.ts +3 -2
- package/dist/types/src/feed-logger.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +2 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useProcessEphemeralStatus.d.ts +10 -0
- package/dist/types/src/hooks/useProcessEphemeralStatus.d.ts.map +1 -0
- package/dist/types/src/hooks/useTraceMessages.d.ts +12 -0
- package/dist/types/src/hooks/useTraceMessages.d.ts.map +1 -0
- package/dist/types/src/meta.d.ts +28 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/operations/run-prompt-in-new-chat.d.ts.map +1 -1
- package/dist/types/src/paths.d.ts.map +1 -1
- package/dist/types/src/processor/processor.d.ts +23 -0
- package/dist/types/src/processor/processor.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Assistant.d.ts +1 -1
- package/dist/types/src/types/AssistantCapabilities.d.ts.map +1 -1
- package/dist/types/src/types/AssistantEvents.d.ts.map +1 -1
- package/dist/types/src/types/AssistantOperation.d.ts +7 -7
- package/dist/types/src/util/error-cause.d.ts +3 -0
- package/dist/types/src/util/error-cause.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +38 -0
- package/package.json +71 -70
- package/src/AssistantPlugin.conversations.json +1 -1
- package/src/AssistantPlugin.test.ts +1 -1
- package/src/AssistantPlugin.ts +2 -2
- package/src/capabilities/agent-service.ts +5 -1
- package/src/capabilities/app-graph-builder.ts +15 -20
- package/src/capabilities/blueprint-definition.ts +2 -0
- package/src/capabilities/index.ts +1 -7
- package/src/capabilities/markdown-extension.ts +5 -1
- package/src/capabilities/react-surface.tsx +38 -23
- package/src/capabilities/settings.ts +2 -2
- package/src/capabilities/state.ts +1 -1
- package/src/components/AgentProperties/AgentProperties.tsx +1 -1
- package/src/components/AssistantSettings/AssistantSettings.tsx +2 -2
- package/src/components/Chat/Chat.stories.tsx +94 -0
- package/src/components/Chat/Chat.tsx +39 -6
- package/src/components/ChatPrompt/ChatActions.tsx +4 -2
- package/src/components/ChatPrompt/ChatMcpErrors.tsx +1 -1
- package/src/components/ChatPrompt/ChatOptions.tsx +26 -29
- package/src/components/ChatPrompt/ChatPrompt.tsx +1 -1
- package/src/components/ChatPrompt/ChatReferences.tsx +1 -1
- package/src/components/ChatThread/Anchor.stories.tsx +1 -1
- package/src/components/ChatThread/ChatThread.stories.tsx +1 -1
- package/src/components/ChatThread/DEBUG.md +23 -0
- package/src/components/ChatThread/widgets/SummaryWidget.tsx +1 -1
- package/src/components/ChatThread/widgets/ToolWidget.tsx +1 -1
- package/src/components/ProcessTree/ProcessTree.stories.tsx +7 -0
- package/src/components/ProcessTree/ProcessTree.tsx +191 -88
- package/src/components/TaskList/TaskList.stories.tsx +23 -2
- package/src/components/TaskList/TaskList.tsx +122 -28
- package/src/components/TemplateEditor/TemplateEditor.tsx +1 -1
- package/src/components/TemplateEditor/TemplateForm.tsx +1 -1
- package/src/components/ToolBlock/ToolBlock.tsx +1 -1
- package/src/components/index.ts +1 -0
- package/src/containers/AgentArticle/AgentArticle.stories.tsx +4 -4
- package/src/containers/AgentArticle/AgentArticle.tsx +9 -9
- package/src/containers/ChatArticle/ChatArticle.tsx +18 -10
- package/src/containers/ChatCompanion/ChatCompanion.tsx +2 -2
- package/src/containers/ChatDialog/ChatDialog.tsx +5 -3
- package/src/containers/PlanArticle/PlanArticle.tsx +5 -1
- package/src/containers/RoutineArticle/RoutineArticle.tsx +2 -2
- package/src/containers/SpaceHomePrompt/SpaceHomePrompt.tsx +105 -0
- package/src/containers/SpaceHomePrompt/index.ts +5 -0
- package/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.tsx +69 -0
- package/src/containers/SpaceHomeSuggestions/index.ts +5 -0
- package/src/containers/TracePanel/TracePanel.tsx +3 -30
- package/src/containers/TriggerStatus/TriggerStatus.tsx +2 -2
- package/src/containers/index.ts +2 -0
- package/src/execution-graph/execution-graph.ts +130 -0
- package/src/execution-graph/index.ts +10 -0
- package/src/execution-graph/pending-block-status.test.ts +114 -0
- package/src/execution-graph/pending-block-status.ts +88 -0
- package/src/execution-graph/sub-agent-delegation.test.ts +16 -1
- package/src/extensions/prompt-extension.ts +102 -73
- package/src/feed-logger.ts +21 -19
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useChatProcessor.ts +1 -1
- package/src/hooks/useChatServices.ts +2 -2
- package/src/hooks/useChatToolbarActions.ts +5 -5
- package/src/hooks/useContextBinder.ts +1 -1
- package/src/hooks/useProcessEphemeralStatus.ts +192 -0
- package/src/hooks/useTraceMessages.ts +41 -0
- package/src/meta.ts +3 -31
- package/src/operations/create-chat.ts +1 -1
- package/src/operations/fork-chat.ts +3 -3
- package/src/operations/run-prompt-in-new-chat.ts +5 -3
- package/src/paths.ts +2 -2
- package/src/processor/processor.node.test.ts +71 -1
- package/src/processor/processor.ts +58 -2
- package/src/testing/data/trace-timeline-multiple.dx.json +1 -1
- package/src/testing/data/trace-timeline-remote.dx.json +1 -1
- package/src/testing/data/trace-timeline.dx.json +0 -1
- package/src/translations.ts +18 -10
- package/src/types/AssistantCapabilities.ts +3 -3
- package/src/types/AssistantEvents.ts +1 -1
- package/src/types/AssistantOperation.ts +1 -1
- package/src/util/error-cause.ts +21 -0
- package/dist/lib/neutral/AgentArticle-K7XM46OQ.mjs.map +0 -7
- package/dist/lib/neutral/AssistantSettings-GG52BLKS.mjs.map +0 -7
- package/dist/lib/neutral/ChatCompanion-LBUHYWQG.mjs.map +0 -7
- package/dist/lib/neutral/ChatDialog-DCA6FLOV.mjs.map +0 -7
- package/dist/lib/neutral/PlanArticle-TS5ULWYS.mjs.map +0 -7
- package/dist/lib/neutral/RoutineArticle-5NYXHRG6.mjs.map +0 -7
- package/dist/lib/neutral/TracePanel-KTZJ6JNR.mjs.map +0 -7
- package/dist/lib/neutral/TriggerStatus-X7Y5JFZJ.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-WUFHQH3Y.mjs.map +0 -7
- package/dist/lib/neutral/blueprint-definition-MH2QLYQH.mjs.map +0 -7
- package/dist/lib/neutral/chunk-HLANPOBA.mjs.map +0 -7
- package/dist/lib/neutral/chunk-QAZMOFPI.mjs.map +0 -7
- package/dist/lib/neutral/chunk-RKVVK3R3.mjs.map +0 -7
- package/dist/lib/neutral/chunk-VTK5R4H3.mjs +0 -9
- package/dist/lib/neutral/chunk-VTK5R4H3.mjs.map +0 -7
- package/dist/lib/neutral/chunk-XYHPOGTK.mjs +0 -43
- package/dist/lib/neutral/chunk-XYHPOGTK.mjs.map +0 -7
- package/dist/lib/neutral/chunk-YXRGZYYH.mjs.map +0 -7
- package/dist/lib/neutral/fork-chat-34KEF4ZJ.mjs.map +0 -7
- package/dist/lib/neutral/markdown-extension-YMIFDMYF.mjs +0 -110
- package/dist/lib/neutral/markdown-extension-YMIFDMYF.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-XRTBW5OJ.mjs.map +0 -7
- package/dist/lib/neutral/run-prompt-in-new-chat-D5IIE2C7.mjs.map +0 -7
- package/src/testing/trace-timeline.node.conversations.json +0 -1
- /package/dist/lib/neutral/{ChatArticle-VNVZCDUR.mjs.map → ChatArticle-KT46SUFU.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-SMFJD7BP.mjs.map → chunk-7FQT4XMI.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-object-U2SOFZLR.mjs.map → create-object-BJUDDKQQ.mjs.map} +0 -0
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
// src/processor/presets.ts
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
var ModelProviders = [
|
|
4
|
+
"dxos-local",
|
|
5
|
+
"dxos-remote",
|
|
6
|
+
"lm-studio",
|
|
7
|
+
"ollama"
|
|
8
|
+
];
|
|
9
|
+
var ModelProvider = Schema.Literal(...ModelProviders);
|
|
10
|
+
var createModelLabel = (model) => {
|
|
11
|
+
const parts = model.split(".");
|
|
12
|
+
return parts[parts.length - 1];
|
|
13
|
+
};
|
|
14
|
+
var AiServicePresets = [
|
|
15
|
+
// Sonnet is first so it is the default selection.
|
|
16
|
+
{
|
|
17
|
+
provider: "dxos-remote",
|
|
18
|
+
model: "ai.claude.model.claude-sonnet-4-6",
|
|
19
|
+
label: "Claude Sonnet"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
provider: "dxos-remote",
|
|
23
|
+
model: "ai.claude.model.claude-opus-4-8",
|
|
24
|
+
label: "Claude Opus"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
provider: "dxos-remote",
|
|
28
|
+
model: "ai.claude.model.claude-haiku-4-5",
|
|
29
|
+
label: "Claude Haiku"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
provider: "ollama",
|
|
33
|
+
model: "ai.ollama.model.gpt-oss:20b"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
provider: "ollama",
|
|
37
|
+
model: "ai.ollama.model.gemma4:latest"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
provider: "lm-studio",
|
|
41
|
+
model: "ai.google.model.gemma-3-27b"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
provider: "lm-studio",
|
|
45
|
+
model: "ai.meta.model.llama-3.2-3b-instruct"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
model: "ai.ollama.model.deepseek-r1:latest",
|
|
49
|
+
provider: "dxos-local"
|
|
50
|
+
}
|
|
51
|
+
].map(({ model, provider, label }, i) => ({
|
|
52
|
+
id: `preset-${i}`,
|
|
53
|
+
provider,
|
|
54
|
+
model,
|
|
55
|
+
label: label ?? createModelLabel(model)
|
|
56
|
+
}));
|
|
57
|
+
|
|
58
|
+
// src/processor/processor.ts
|
|
59
|
+
import { Atom, Registry as AtomRegistry } from "@effect-atom/atom-react";
|
|
60
|
+
import * as AiError from "@effect/ai/AiError";
|
|
61
|
+
import * as Cause from "effect/Cause";
|
|
62
|
+
import * as Effect from "effect/Effect";
|
|
63
|
+
import * as Exit from "effect/Exit";
|
|
64
|
+
import * as Fiber from "effect/Fiber";
|
|
65
|
+
import * as Option from "effect/Option";
|
|
66
|
+
import * as Stream from "effect/Stream";
|
|
67
|
+
import { DEFAULT_EDGE_MODEL } from "@dxos/ai";
|
|
68
|
+
import { AiContext, createSystemPrompt, formatSystemPrompt, McpServerError, PartialBlock, ToolExecutionServices } from "@dxos/assistant";
|
|
69
|
+
import { Operation, Trace } from "@dxos/compute";
|
|
70
|
+
import { Obj } from "@dxos/echo";
|
|
71
|
+
import { UsageQuotaExceededError } from "@dxos/edge-client";
|
|
72
|
+
import { EffectEx } from "@dxos/effect";
|
|
73
|
+
import { AgentService } from "@dxos/functions-runtime";
|
|
74
|
+
import { log } from "@dxos/log";
|
|
75
|
+
import { Message } from "@dxos/types";
|
|
76
|
+
import { AssistantOperation } from "#types";
|
|
77
|
+
|
|
78
|
+
// src/util/error-cause.ts
|
|
79
|
+
var findInCause = (error, predicate) => {
|
|
80
|
+
let current = error;
|
|
81
|
+
const visited = /* @__PURE__ */ new Set();
|
|
82
|
+
while (current) {
|
|
83
|
+
if (visited.has(current)) {
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
visited.add(current);
|
|
87
|
+
if (predicate(current)) {
|
|
88
|
+
return current;
|
|
89
|
+
}
|
|
90
|
+
current = current instanceof Error ? current.cause : void 0;
|
|
91
|
+
}
|
|
92
|
+
return void 0;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// src/processor/processor.ts
|
|
96
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/processor/processor.ts";
|
|
97
|
+
var defaultOptions = {
|
|
98
|
+
model: DEFAULT_EDGE_MODEL
|
|
99
|
+
};
|
|
100
|
+
var QUOTA_EXCEEDED_MESSAGE = "You have reached your AI usage limit for this period.";
|
|
101
|
+
var AiUsageQuotaError = class extends Error {
|
|
102
|
+
action = {
|
|
103
|
+
labelKey: "view-usage.label"
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
var QUOTA_PATTERN = /\b429\b|rate.?limit|too many requests|usage quota|quota exceeded/i;
|
|
107
|
+
var isQuotaError = (err) => {
|
|
108
|
+
if (AiError.isAiError(err)) {
|
|
109
|
+
if (err._tag === "HttpResponseError" && err.response.status === 429) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
return QUOTA_PATTERN.test(err.description ?? err.message);
|
|
113
|
+
}
|
|
114
|
+
return typeof err === "string" && QUOTA_PATTERN.test(err);
|
|
115
|
+
};
|
|
116
|
+
var parseError = (err) => {
|
|
117
|
+
const quotaError = findInCause(err, UsageQuotaExceededError.is);
|
|
118
|
+
if (quotaError || isQuotaError(err)) {
|
|
119
|
+
return new AiUsageQuotaError(quotaError?.message?.trim() || QUOTA_EXCEEDED_MESSAGE, {
|
|
120
|
+
cause: err
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
let message;
|
|
124
|
+
if (AiError.isAiError(err)) {
|
|
125
|
+
message = err.description?.trim() || err.message;
|
|
126
|
+
} else if (typeof err === "string") {
|
|
127
|
+
const [, model] = err.match(/model\s+'([^']+)'\s+not\s+found/i) || [];
|
|
128
|
+
if (model) {
|
|
129
|
+
message = `The model is not available: ${model}`;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (!message) {
|
|
133
|
+
message = "An unexpected error occurred.";
|
|
134
|
+
}
|
|
135
|
+
return new Error(message, {
|
|
136
|
+
cause: err
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
var AiChatProcessor = class {
|
|
140
|
+
_conversation;
|
|
141
|
+
_runtime;
|
|
142
|
+
_feed;
|
|
143
|
+
_spaceLayer;
|
|
144
|
+
_options;
|
|
145
|
+
#registry;
|
|
146
|
+
/** Pending messages (finalized, non-streaming). */
|
|
147
|
+
#pending = Atom.make([]);
|
|
148
|
+
/** Currently streaming messages (from ephemeral trace events). */
|
|
149
|
+
#streaming = Atom.make([]);
|
|
150
|
+
/** Set of message IDs that have been finalized (non-pending delivered via ephemeral). */
|
|
151
|
+
#finalizedIds = /* @__PURE__ */ new Set();
|
|
152
|
+
/** Currently active request fiber. */
|
|
153
|
+
#requestFiber;
|
|
154
|
+
/** Last request (for retries). */
|
|
155
|
+
#lastRequest;
|
|
156
|
+
/** Streaming state. */
|
|
157
|
+
streaming = Atom.make((get) => get(this.#streaming).length > 0);
|
|
158
|
+
/** Active state. */
|
|
159
|
+
active = Atom.make(false);
|
|
160
|
+
/** Array of Messages (incl. the current message being streamed). */
|
|
161
|
+
messages = Atom.make((get) => [
|
|
162
|
+
...get(this.#pending),
|
|
163
|
+
...get(this.#streaming)
|
|
164
|
+
]);
|
|
165
|
+
/** Last error. */
|
|
166
|
+
error = Atom.make(Option.none());
|
|
167
|
+
/**
|
|
168
|
+
* MCP server connection errors observed during the most recent request.
|
|
169
|
+
* Misconfigured/unreachable servers are dropped from the toolkit so the chat
|
|
170
|
+
* keeps working; the entries here let the UI display which servers failed.
|
|
171
|
+
*/
|
|
172
|
+
mcpErrors = Atom.make([]);
|
|
173
|
+
constructor(_conversation, _runtime, _feed, _spaceLayer, _options = defaultOptions) {
|
|
174
|
+
this._conversation = _conversation;
|
|
175
|
+
this._runtime = _runtime;
|
|
176
|
+
this._feed = _feed;
|
|
177
|
+
this._spaceLayer = _spaceLayer;
|
|
178
|
+
this._options = _options;
|
|
179
|
+
this.#registry = this._options.observableRegistry ?? AtomRegistry.make();
|
|
180
|
+
if (this._options.model && !this._options.system) {
|
|
181
|
+
const capabilities = this._options.modelRegistry?.getCapabilities(this._options.model) ?? {};
|
|
182
|
+
this._options.system = createSystemPrompt(capabilities);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
get context() {
|
|
186
|
+
return this._conversation.context;
|
|
187
|
+
}
|
|
188
|
+
get conversation() {
|
|
189
|
+
return this._conversation;
|
|
190
|
+
}
|
|
191
|
+
get registry() {
|
|
192
|
+
return this._options.registry;
|
|
193
|
+
}
|
|
194
|
+
get system() {
|
|
195
|
+
return this._options.system ?? "";
|
|
196
|
+
}
|
|
197
|
+
async getTools() {
|
|
198
|
+
return this._runtime.runPromise(Effect.provide(this._conversation.getTools(), ToolExecutionServices).pipe(Effect.provide(this._spaceLayer)));
|
|
199
|
+
}
|
|
200
|
+
async getSystemPrompt() {
|
|
201
|
+
return this._runtime.runPromise(Effect.gen(this, function* () {
|
|
202
|
+
const blueprints = this.context.getBlueprints();
|
|
203
|
+
const objects = this.context.getObjects();
|
|
204
|
+
return yield* formatSystemPrompt({
|
|
205
|
+
system: this._options.system,
|
|
206
|
+
blueprints,
|
|
207
|
+
objects
|
|
208
|
+
});
|
|
209
|
+
}).pipe(Effect.provideService(AiContext.Service, {
|
|
210
|
+
binder: this.context
|
|
211
|
+
}), Effect.provide(this._spaceLayer), Effect.orDie));
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Initiates a new request via AgentService.
|
|
215
|
+
*/
|
|
216
|
+
async request(requestProp) {
|
|
217
|
+
if (this.#requestFiber) {
|
|
218
|
+
await this.cancel();
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
this.#lastRequest = requestProp;
|
|
222
|
+
this.#registry.set(this.error, Option.none());
|
|
223
|
+
this.#registry.set(this.mcpErrors, []);
|
|
224
|
+
this.#registry.set(this.active, true);
|
|
225
|
+
const effect = Effect.gen(this, function* () {
|
|
226
|
+
log.info("init agent session", {
|
|
227
|
+
feed: Obj.getURI(this._feed),
|
|
228
|
+
model: this._options.model
|
|
229
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 173, S: this });
|
|
230
|
+
const session = yield* AgentService.getSession(this._feed, {
|
|
231
|
+
model: this._options.model
|
|
232
|
+
});
|
|
233
|
+
const ephemeralStream = session.subscribeEphemeral();
|
|
234
|
+
yield* ephemeralStream.pipe(Stream.runForEach((message) => Effect.sync(() => {
|
|
235
|
+
for (const event of message.events) {
|
|
236
|
+
if (Trace.isOfType(PartialBlock, event)) {
|
|
237
|
+
this.#handleEphemeralMessage(event.data);
|
|
238
|
+
} else if (Trace.isOfType(McpServerError, event)) {
|
|
239
|
+
this.#handleMcpError(event.data);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
})), Effect.fork);
|
|
243
|
+
log("chat processor submitting prompt", {
|
|
244
|
+
length: requestProp.message.length
|
|
245
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 190, S: this });
|
|
246
|
+
yield* session.submitPrompt(requestProp.message);
|
|
247
|
+
log("chat processor submitPrompt returned, waiting for agent", {}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 194, S: this });
|
|
248
|
+
if (!this._options.chat?.target?.name) {
|
|
249
|
+
yield* this.#updateChatName(requestProp.message);
|
|
250
|
+
}
|
|
251
|
+
yield* session.waitForCompletion();
|
|
252
|
+
log.info("session complete", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 201, S: this });
|
|
253
|
+
this.#flushStreaming();
|
|
254
|
+
});
|
|
255
|
+
this.#requestFiber = this._runtime.runFork(effect.pipe(Effect.provide(this._spaceLayer)));
|
|
256
|
+
const exit = await this._runtime.runPromise(Fiber.await(this.#requestFiber));
|
|
257
|
+
if (Exit.isFailure(exit)) {
|
|
258
|
+
if (Cause.isInterruptedOnly(exit.cause)) {
|
|
259
|
+
this.#discardStreaming();
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
throw EffectEx.causeToError(exit.cause);
|
|
263
|
+
}
|
|
264
|
+
this.#registry.set(this.error, Option.none());
|
|
265
|
+
this.#lastRequest = void 0;
|
|
266
|
+
this.#requestFiber = void 0;
|
|
267
|
+
} catch (err) {
|
|
268
|
+
log.error("request failed", {
|
|
269
|
+
error: err
|
|
270
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 221, S: this });
|
|
271
|
+
this.#registry.set(this.error, Option.some(parseError(err)));
|
|
272
|
+
} finally {
|
|
273
|
+
log.info("setting active to false", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 226, S: this });
|
|
274
|
+
this.#registry.set(this.active, false);
|
|
275
|
+
this.#requestFiber = void 0;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Cancels the current request.
|
|
280
|
+
*/
|
|
281
|
+
async cancel() {
|
|
282
|
+
await EffectEx.runAndForwardErrors(Effect.gen(this, function* () {
|
|
283
|
+
log.info("cancelling request", {
|
|
284
|
+
fiber: this.#requestFiber
|
|
285
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 235, S: this });
|
|
286
|
+
if (this.#requestFiber) {
|
|
287
|
+
yield* Fiber.interrupt(this.#requestFiber);
|
|
288
|
+
}
|
|
289
|
+
const session = yield* AgentService.getSession(this._feed);
|
|
290
|
+
yield* session.terminate();
|
|
291
|
+
}).pipe(Effect.provide(this._spaceLayer)));
|
|
292
|
+
this.#requestFiber = void 0;
|
|
293
|
+
this.#discardStreaming();
|
|
294
|
+
this.#registry.set(this.active, false);
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Retry last failed request.
|
|
298
|
+
*/
|
|
299
|
+
async retry() {
|
|
300
|
+
if (this.#lastRequest) {
|
|
301
|
+
return this.request(this.#lastRequest);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Clears the recorded MCP server errors (e.g. after the user dismisses the warning banner).
|
|
306
|
+
*/
|
|
307
|
+
dismissMcpErrors() {
|
|
308
|
+
this.#registry.set(this.mcpErrors, []);
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Update the current chat's name.
|
|
312
|
+
*/
|
|
313
|
+
async updateName(chat) {
|
|
314
|
+
const spaceId = Obj.getDatabase(chat)?.spaceId;
|
|
315
|
+
if (!spaceId) {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
EffectEx.unwrapExit(await this._runtime.runPromiseExit(Operation.invoke(AssistantOperation.UpdateChatName, {
|
|
319
|
+
chat
|
|
320
|
+
}, {
|
|
321
|
+
spaceId
|
|
322
|
+
}).pipe(Effect.provide(this._spaceLayer))));
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Handles an ephemeral message from the agent process.
|
|
326
|
+
* Both pending and completed blocks arrive here. Completed blocks are deduped
|
|
327
|
+
* against messages already written to the feed queue to handle the race between
|
|
328
|
+
* ephemeral delivery and feed replication.
|
|
329
|
+
*/
|
|
330
|
+
#handleEphemeralMessage(event) {
|
|
331
|
+
const isPending = event.block.pending;
|
|
332
|
+
const message = Obj.make(Message.Message, {
|
|
333
|
+
id: event.messageId,
|
|
334
|
+
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
335
|
+
sender: {
|
|
336
|
+
role: event.role
|
|
337
|
+
},
|
|
338
|
+
blocks: [
|
|
339
|
+
event.block
|
|
340
|
+
]
|
|
341
|
+
});
|
|
342
|
+
if (isPending) {
|
|
343
|
+
if (this.#finalizedIds.has(event.messageId)) {
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
this.#registry.update(this.#streaming, (streaming) => {
|
|
347
|
+
const idx = streaming.findIndex((existing) => existing.id === event.messageId);
|
|
348
|
+
if (idx >= 0) {
|
|
349
|
+
const updated = [
|
|
350
|
+
...streaming
|
|
351
|
+
];
|
|
352
|
+
updated[idx] = message;
|
|
353
|
+
return updated;
|
|
354
|
+
}
|
|
355
|
+
return [
|
|
356
|
+
...streaming,
|
|
357
|
+
message
|
|
358
|
+
];
|
|
359
|
+
});
|
|
360
|
+
} else {
|
|
361
|
+
this.#finalizedIds.add(event.messageId);
|
|
362
|
+
this.#registry.update(this.#streaming, (streaming) => streaming.filter((existing) => existing.id !== message.id));
|
|
363
|
+
this.#registry.update(this.#pending, (pending) => {
|
|
364
|
+
if (pending.some((existing) => existing.id === message.id)) {
|
|
365
|
+
return pending;
|
|
366
|
+
}
|
|
367
|
+
return [
|
|
368
|
+
...pending,
|
|
369
|
+
message
|
|
370
|
+
];
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Records a per-server MCP failure, deduped by url+protocol so repeat misconfigurations
|
|
376
|
+
* across turns do not spam the UI.
|
|
377
|
+
*/
|
|
378
|
+
#handleMcpError(event) {
|
|
379
|
+
log.warn("MCP server error", event, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 326, S: this });
|
|
380
|
+
this.#registry.update(this.mcpErrors, (errors) => {
|
|
381
|
+
if (errors.some((existing) => existing.url === event.url && existing.protocol === event.protocol)) {
|
|
382
|
+
return errors;
|
|
383
|
+
}
|
|
384
|
+
return [
|
|
385
|
+
...errors,
|
|
386
|
+
event
|
|
387
|
+
];
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Drop in-flight streaming messages (cancel/interrupt — partial blocks are discarded).
|
|
392
|
+
*/
|
|
393
|
+
#discardStreaming() {
|
|
394
|
+
this.#registry.set(this.#streaming, []);
|
|
395
|
+
this.#finalizedIds.clear();
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Move remaining streaming messages to pending (called when agent completes).
|
|
399
|
+
*/
|
|
400
|
+
#flushStreaming() {
|
|
401
|
+
const remaining = this.#registry.get(this.#streaming);
|
|
402
|
+
if (remaining.length > 0) {
|
|
403
|
+
this.#registry.update(this.#pending, (pending) => [
|
|
404
|
+
...pending,
|
|
405
|
+
...remaining
|
|
406
|
+
]);
|
|
407
|
+
this.#registry.set(this.#streaming, []);
|
|
408
|
+
}
|
|
409
|
+
this.#finalizedIds.clear();
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Schedule a chat name update as a detached (fire-and-forget) operation.
|
|
413
|
+
* Called automatically on the first message; can also be invoked manually via the toolbar.
|
|
414
|
+
*/
|
|
415
|
+
#updateChatName(prompt) {
|
|
416
|
+
const chat = this._options.chat?.target;
|
|
417
|
+
if (!chat) {
|
|
418
|
+
return Effect.void;
|
|
419
|
+
}
|
|
420
|
+
const spaceId = Obj.getDatabase(chat)?.spaceId;
|
|
421
|
+
if (!spaceId) {
|
|
422
|
+
return Effect.void;
|
|
423
|
+
}
|
|
424
|
+
log.info("scheduling chat name update", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 368, S: this });
|
|
425
|
+
return Operation.schedule(AssistantOperation.UpdateChatName, {
|
|
426
|
+
chat,
|
|
427
|
+
prompt
|
|
428
|
+
}, {
|
|
429
|
+
spaceId
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
|
|
434
|
+
// src/components/Chat/context.ts
|
|
435
|
+
import { createContext } from "@radix-ui/react-context";
|
|
436
|
+
var [ChatContextProvider, useChatContext] = createContext("Chat");
|
|
437
|
+
|
|
438
|
+
export {
|
|
439
|
+
AiServicePresets,
|
|
440
|
+
AiUsageQuotaError,
|
|
441
|
+
AiChatProcessor,
|
|
442
|
+
ChatContextProvider,
|
|
443
|
+
useChatContext
|
|
444
|
+
};
|
|
445
|
+
//# sourceMappingURL=chunk-54W7N6M6.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/processor/presets.ts", "../../../src/processor/processor.ts", "../../../src/util/error-cause.ts", "../../../src/components/Chat/context.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { type ModelName } from '@dxos/ai';\n\nconst ModelProviders = ['dxos-local', 'dxos-remote', 'lm-studio', 'ollama'] as const;\n\nconst ModelProvider = Schema.Literal(...ModelProviders);\ntype ModelProvider = Schema.Schema.Type<typeof ModelProvider>;\n\nexport type AiServicePreset = {\n id: string;\n provider: ModelProvider;\n model: ModelName;\n label?: string;\n};\n\nconst createModelLabel = (model: ModelName) => {\n const parts = model.split('.');\n return parts[parts.length - 1];\n};\n\n// TODO(burdon): Users should be able to create and edit presets.\nexport const AiServicePresets: AiServicePreset[] = [\n // Sonnet is first so it is the default selection.\n {\n provider: 'dxos-remote' as const,\n model: 'ai.claude.model.claude-sonnet-4-6' as const,\n label: 'Claude Sonnet',\n },\n {\n provider: 'dxos-remote' as const,\n model: 'ai.claude.model.claude-opus-4-8' as const,\n label: 'Claude Opus',\n },\n {\n provider: 'dxos-remote' as const,\n model: 'ai.claude.model.claude-haiku-4-5' as const,\n label: 'Claude Haiku',\n },\n {\n provider: 'ollama' as const,\n model: 'ai.ollama.model.gpt-oss:20b' as const,\n },\n {\n provider: 'ollama' as const,\n model: 'ai.ollama.model.gemma4:latest' as const,\n },\n {\n provider: 'lm-studio' as const,\n model: 'ai.google.model.gemma-3-27b' as const,\n },\n {\n provider: 'lm-studio' as const,\n model: 'ai.meta.model.llama-3.2-3b-instruct' as const,\n },\n {\n model: 'ai.ollama.model.deepseek-r1:latest' as const,\n provider: 'dxos-local' as const,\n },\n].map(\n ({ model, provider, label }, i) =>\n ({\n id: `preset-${i}`,\n provider,\n model,\n label: label ?? createModelLabel(model),\n }) satisfies AiServicePreset,\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, Registry as AtomRegistry } from '@effect-atom/atom-react';\nimport * as AiError from '@effect/ai/AiError';\nimport * as Cause from 'effect/Cause';\nimport * as Effect from 'effect/Effect';\nimport * as Exit from 'effect/Exit';\nimport * as Fiber from 'effect/Fiber';\nimport * as Layer from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as Stream from 'effect/Stream';\n\nimport { type AiService, DEFAULT_EDGE_MODEL, type ModelName, type ModelRegistry, type OpaqueToolkit } from '@dxos/ai';\nimport { Capabilities } from '@dxos/app-framework';\nimport {\n AiContext,\n AiSession,\n createSystemPrompt,\n formatSystemPrompt,\n McpServerError,\n PartialBlock,\n ToolExecutionServices,\n} from '@dxos/assistant';\nimport { type Chat } from '@dxos/assistant-toolkit';\nimport { type Credential, Operation, type ServiceNotAvailableError, Trace } from '@dxos/compute';\nimport { type Database, Feed, Obj, Ref, type Registry } from '@dxos/echo';\nimport { UsageQuotaExceededError } from '@dxos/edge-client';\nimport { EffectEx } from '@dxos/effect';\nimport { AgentService } from '@dxos/functions-runtime';\nimport { log } from '@dxos/log';\nimport { Message } from '@dxos/types';\n\nimport { AssistantOperation } from '#types';\n\nimport { findInCause } from '../util/error-cause';\n\n/**\n * @deprecated Services type for the old direct-conversation processor path.\n * Retained for backward compatibility with CLI and update-name.\n */\nexport type AiChatServices =\n | Credential.CredentialsService\n | Database.Service\n | AiService.AiService\n | Trace.TraceService;\n\n/**\n * Space-scoped services materialised by the layer passed into\n * {@link AiChatProcessor}. Mirrors the tag list that\n * {@link useChatProcessor} passes to {@link ServiceResolver.provide}.\n */\nexport type SpaceServices =\n | Database.Service\n | Feed.FeedService\n | Credential.CredentialsService\n | AiService.AiService\n | AgentService.AgentService\n | Registry.Service\n | OpaqueToolkit.OpaqueToolkitProvider;\n\nexport type AiChatProcessorOptions = {\n model?: ModelName;\n modelRegistry?: ModelRegistry;\n registry?: Registry.Registry;\n observableRegistry?: AtomRegistry.Registry;\n /**\n * For tracing.\n */\n chat?: Ref.Ref<Chat.Chat>;\n system?: string;\n};\n\nconst defaultOptions: Partial<AiChatProcessorOptions> = {\n model: DEFAULT_EDGE_MODEL,\n};\n\nexport type ProcessorRequestOptions = {};\n\nexport type ProcessorRequest = {\n message: string;\n options?: ProcessorRequestOptions;\n};\n\n/** User-facing message shown when an AI request is rejected for exceeding the account usage quota (HTTP 429). */\nconst QUOTA_EXCEEDED_MESSAGE = 'You have reached your AI usage limit for this period.';\n\n/** An actionable next-step a chat error surfaces in its toast; the label key is resolved by the chat UI. */\nexport type ChatErrorAction = { readonly labelKey: string };\n\n/**\n * Display error for an over-quota (HTTP 429) rejection. Declares an {@link action} so the chat toast can\n * offer a usage-dashboard link declaratively — the UI renders whatever action an error declares rather\n * than branching on the error type.\n */\nexport class AiUsageQuotaError extends Error {\n readonly action: ChatErrorAction = { labelKey: 'view-usage.label' };\n}\n\n/**\n * Matches an over-quota rejection (EDGE responds 429) in error text. The typed\n * {@link UsageQuotaExceededError} is wrapped deep in the cause chain and does not survive the\n * agent-process boundary — the failure is rendered to a string via `Cause.pretty`, which drops\n * nested causes — so detection also relies on the HTTP 429 that `@effect/ai`'s\n * {@link AiError.HttpResponseError} embeds in its message (e.g. \"... (429 POST ...)\").\n */\nconst QUOTA_PATTERN = /\\b429\\b|rate.?limit|too many requests|usage quota|quota exceeded/i;\n\n/** Whether an error denotes an over-quota (HTTP 429) rejection, detected by typed status or message text. */\nconst isQuotaError = (err: unknown): boolean => {\n if (AiError.isAiError(err)) {\n if (err._tag === 'HttpResponseError' && err.response.status === 429) {\n return true;\n }\n return QUOTA_PATTERN.test(err.description ?? err.message);\n }\n return typeof err === 'string' && QUOTA_PATTERN.test(err);\n};\n\n/**\n * Maps a failure from the agent fiber to an error suitable for display.\n * An over-quota (HTTP 429) rejection is surfaced as an actionable usage-limit message; the typed\n * {@link UsageQuotaExceededError} only survives on the direct path, so {@link isQuotaError} also\n * recognizes the stringified 429 the chat receives across the agent-process boundary.\n * Other {@link AiError}s originate from the AI service and are actionable by the user\n * (e.g., \"model 'x' not found\", \"Connection refused\"), so their detail is propagated.\n * Any other failure is treated as an internal/unexpected error and reported generically\n * to avoid leaking implementation detail.\n */\nexport const parseError = (err: unknown): Error => {\n const quotaError = findInCause(err, UsageQuotaExceededError.is);\n if (quotaError || isQuotaError(err)) {\n return new AiUsageQuotaError(quotaError?.message?.trim() || QUOTA_EXCEEDED_MESSAGE, { cause: err });\n }\n\n let message: string | undefined;\n if (AiError.isAiError(err)) {\n message = err.description?.trim() || err.message;\n } else if (typeof err === 'string') {\n // TODO(burdon): This is brittle.\n // UnknownError: ChatCompletionsClient.streamText: model 'gemma3:27b' not found\n const [, model] = err.match(/model\\s+'([^']+)'\\s+not\\s+found/i) || [];\n if (model) {\n message = `The model is not available: ${model}`;\n }\n }\n\n if (!message) {\n message = 'An unexpected error occurred.';\n }\n\n return new Error(message, { cause: err });\n};\n\n/**\n * Handles interactions with the AI service.\n * Uses AgentService to spawn a process-backed agent and subscribes to ephemeral trace events for streaming.\n */\nexport class AiChatProcessor {\n readonly #registry: AtomRegistry.Registry;\n\n /** Pending messages (finalized, non-streaming). */\n readonly #pending = Atom.make<Message.Message[]>([]);\n\n /** Currently streaming messages (from ephemeral trace events). */\n readonly #streaming = Atom.make<Message.Message[]>([]);\n\n /** Set of message IDs that have been finalized (non-pending delivered via ephemeral). */\n readonly #finalizedIds = new Set<string>();\n\n /** Currently active request fiber. */\n #requestFiber: Fiber.RuntimeFiber<void, unknown> | undefined;\n\n /** Last request (for retries). */\n #lastRequest: ProcessorRequest | undefined;\n\n /** Streaming state. */\n public readonly streaming = Atom.make<boolean>((get) => get(this.#streaming).length > 0);\n\n /** Active state. */\n public readonly active = Atom.make(false);\n\n /** Array of Messages (incl. the current message being streamed). */\n public readonly messages = Atom.make<Message.Message[]>((get) => [...get(this.#pending), ...get(this.#streaming)]);\n\n /** Last error. */\n public readonly error = Atom.make<Option.Option<Error>>(Option.none());\n\n /**\n * MCP server connection errors observed during the most recent request.\n * Misconfigured/unreachable servers are dropped from the toolkit so the chat\n * keeps working; the entries here let the UI display which servers failed.\n */\n public readonly mcpErrors = Atom.make<readonly Trace.PayloadType<typeof McpServerError>[]>([]);\n\n constructor(\n private readonly _conversation: AiSession.Session,\n private readonly _runtime: Capabilities.ProcessManagerRuntime,\n private readonly _feed: Feed.Feed,\n /**\n * Pre-built layer that materialises {@link SpaceServices}. Built via\n * {@link ServiceResolver.provide} with the {@link ServiceResolver} already\n * supplied (hence `RIn = never`); the {@link ServiceNotAvailableError}\n * error channel surfaces when a tag is not available for the space.\n * Provided to every effect run by the processor so the underlying\n * {@link ProcessManagerRuntime} has access to space-affinity services.\n */\n private readonly _spaceLayer: Layer.Layer<SpaceServices, ServiceNotAvailableError, never>,\n private readonly _options: AiChatProcessorOptions = defaultOptions,\n ) {\n this.#registry = this._options.observableRegistry ?? AtomRegistry.make();\n if (this._options.model && !this._options.system) {\n const capabilities = this._options.modelRegistry?.getCapabilities(this._options.model) ?? {};\n this._options.system = createSystemPrompt(capabilities);\n }\n }\n\n get context() {\n return this._conversation.context;\n }\n\n get conversation() {\n return this._conversation;\n }\n\n get registry() {\n return this._options.registry;\n }\n\n get system(): string {\n return this._options.system ?? '';\n }\n\n async getTools(): Promise<Record<string, any>> {\n return this._runtime.runPromise(\n Effect.provide(this._conversation.getTools(), ToolExecutionServices).pipe(Effect.provide(this._spaceLayer)),\n );\n }\n\n async getSystemPrompt(): Promise<string> {\n return this._runtime.runPromise(\n Effect.gen(this, function* () {\n const blueprints = this.context.getBlueprints();\n const objects = this.context.getObjects();\n return yield* formatSystemPrompt({ system: this._options.system, blueprints, objects });\n }).pipe(\n Effect.provideService(AiContext.Service, { binder: this.context }),\n Effect.provide(this._spaceLayer),\n Effect.orDie,\n ),\n );\n }\n\n /**\n * Initiates a new request via AgentService.\n */\n async request(requestProp: ProcessorRequest): Promise<void> {\n if (this.#requestFiber) {\n await this.cancel();\n }\n\n try {\n this.#lastRequest = requestProp;\n this.#registry.set(this.error, Option.none());\n this.#registry.set(this.mcpErrors, []);\n this.#registry.set(this.active, true);\n\n const effect = Effect.gen(this, function* () {\n // NOTE: Gets or creates a session for the feed.\n log.info('init agent session', { feed: Obj.getURI(this._feed), model: this._options.model });\n const session = yield* AgentService.getSession(this._feed, { model: this._options.model });\n const ephemeralStream = session.subscribeEphemeral();\n yield* ephemeralStream.pipe(\n Stream.runForEach((message) =>\n Effect.sync(() => {\n for (const event of message.events) {\n if (Trace.isOfType(PartialBlock, event)) {\n this.#handleEphemeralMessage(event.data);\n } else if (Trace.isOfType(McpServerError, event)) {\n this.#handleMcpError(event.data);\n }\n }\n }),\n ),\n Effect.fork,\n );\n\n log('chat processor submitting prompt', { length: requestProp.message.length });\n yield* session.submitPrompt(requestProp.message);\n log('chat processor submitPrompt returned, waiting for agent', {});\n\n // On the first message (no name yet), schedule rename immediately so it\n // runs concurrently with the AI response rather than waiting for completion.\n if (!this._options.chat?.target?.name) {\n yield* this.#updateChatName(requestProp.message);\n }\n\n yield* session.waitForCompletion();\n log.info('session complete');\n\n this.#flushStreaming();\n });\n\n this.#requestFiber = this._runtime.runFork(effect.pipe(Effect.provide(this._spaceLayer)));\n\n // Inspect the fiber's exit so the underlying failure (e.g. \"model 'x' not found\") is\n // preserved as a clean Error rather than an opaque FiberFailure.\n const exit = await this._runtime.runPromise(Fiber.await(this.#requestFiber));\n if (Exit.isFailure(exit)) {\n if (Cause.isInterruptedOnly(exit.cause)) {\n this.#discardStreaming();\n return;\n }\n\n throw EffectEx.causeToError(exit.cause);\n }\n\n this.#registry.set(this.error, Option.none());\n this.#lastRequest = undefined;\n this.#requestFiber = undefined;\n } catch (err) {\n // `EffectEx.causeToError` above unwraps the fiber failure into the underlying error (e.g. an AiError\n // carrying \"model 'x' not found\"); `parseError` decides what to surface to the user.\n log.error('request failed', { error: err });\n this.#registry.set(this.error, Option.some(parseError(err)));\n } finally {\n log.info('setting active to false');\n this.#registry.set(this.active, false);\n this.#requestFiber = undefined;\n }\n }\n\n /**\n * Cancels the current request.\n */\n async cancel(): Promise<void> {\n await EffectEx.runAndForwardErrors(\n Effect.gen(this, function* () {\n log.info('cancelling request', { fiber: this.#requestFiber });\n if (this.#requestFiber) {\n yield* Fiber.interrupt(this.#requestFiber);\n }\n const session = yield* AgentService.getSession(this._feed);\n yield* session.terminate();\n }).pipe(Effect.provide(this._spaceLayer)),\n );\n\n this.#requestFiber = undefined;\n this.#discardStreaming();\n this.#registry.set(this.active, false);\n }\n\n /**\n * Retry last failed request.\n */\n async retry(): Promise<void> {\n if (this.#lastRequest) {\n return this.request(this.#lastRequest);\n }\n }\n\n /**\n * Clears the recorded MCP server errors (e.g. after the user dismisses the warning banner).\n */\n dismissMcpErrors(): void {\n this.#registry.set(this.mcpErrors, []);\n }\n\n /**\n * Update the current chat's name.\n */\n async updateName(chat: Chat.Chat): Promise<void> {\n const spaceId = Obj.getDatabase(chat)?.spaceId;\n if (!spaceId) {\n return;\n }\n EffectEx.unwrapExit(\n await this._runtime.runPromiseExit(\n Operation.invoke(AssistantOperation.UpdateChatName, { chat }, { spaceId }).pipe(\n Effect.provide(this._spaceLayer),\n ),\n ),\n );\n }\n\n /**\n * Handles an ephemeral message from the agent process.\n * Both pending and completed blocks arrive here. Completed blocks are deduped\n * against messages already written to the feed queue to handle the race between\n * ephemeral delivery and feed replication.\n */\n #handleEphemeralMessage(event: Trace.PayloadType<typeof PartialBlock>) {\n const isPending = event.block.pending;\n const message = Obj.make(Message.Message, {\n id: event.messageId,\n created: new Date().toISOString(),\n sender: { role: event.role },\n blocks: [event.block],\n });\n\n if (isPending) {\n if (this.#finalizedIds.has(event.messageId)) {\n return;\n }\n this.#registry.update(this.#streaming, (streaming) => {\n const idx = streaming.findIndex((existing) => existing.id === event.messageId);\n if (idx >= 0) {\n const updated = [...streaming];\n updated[idx] = message;\n return updated;\n }\n return [...streaming, message];\n });\n } else {\n this.#finalizedIds.add(event.messageId);\n this.#registry.update(this.#streaming, (streaming) => streaming.filter((existing) => existing.id !== message.id));\n this.#registry.update(this.#pending, (pending) => {\n if (pending.some((existing) => existing.id === message.id)) {\n return pending;\n }\n return [...pending, message];\n });\n }\n }\n\n /**\n * Records a per-server MCP failure, deduped by url+protocol so repeat misconfigurations\n * across turns do not spam the UI.\n */\n #handleMcpError(event: Trace.PayloadType<typeof McpServerError>) {\n log.warn('MCP server error', event);\n this.#registry.update(this.mcpErrors, (errors) => {\n if (errors.some((existing) => existing.url === event.url && existing.protocol === event.protocol)) {\n return errors;\n }\n return [...errors, event];\n });\n }\n\n /**\n * Drop in-flight streaming messages (cancel/interrupt — partial blocks are discarded).\n */\n #discardStreaming() {\n this.#registry.set(this.#streaming, []);\n this.#finalizedIds.clear();\n }\n\n /**\n * Move remaining streaming messages to pending (called when agent completes).\n */\n #flushStreaming() {\n const remaining = this.#registry.get(this.#streaming);\n if (remaining.length > 0) {\n this.#registry.update(this.#pending, (pending) => [...pending, ...remaining]);\n this.#registry.set(this.#streaming, []);\n }\n this.#finalizedIds.clear();\n }\n\n /**\n * Schedule a chat name update as a detached (fire-and-forget) operation.\n * Called automatically on the first message; can also be invoked manually via the toolbar.\n */\n #updateChatName(prompt?: string): Effect.Effect<void, never, Operation.Service> {\n const chat = this._options.chat?.target;\n if (!chat) {\n return Effect.void;\n }\n\n const spaceId = Obj.getDatabase(chat)?.spaceId;\n if (!spaceId) {\n return Effect.void;\n }\n\n log.info('scheduling chat name update');\n return Operation.schedule(AssistantOperation.UpdateChatName, { chat, prompt }, { spaceId });\n }\n}\n", "//\n// Copyright 2026 DXOS.org\n//\n\n/** Walk an error's `cause` chain and return the first value matching `predicate`. */\nexport const findInCause = <T>(error: unknown, predicate: (value: unknown) => value is T): T | undefined => {\n let current: unknown = error;\n // Guard against self-referential / cyclic `cause` chains so traversal always terminates.\n const visited = new Set<unknown>();\n while (current) {\n if (visited.has(current)) {\n break;\n }\n visited.add(current);\n if (predicate(current)) {\n return current;\n }\n current = current instanceof Error ? current.cause : undefined;\n }\n return undefined;\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\n\nimport { type Chat as ChatModule } from '@dxos/assistant-toolkit';\nimport { type Event } from '@dxos/async';\nimport { type Database } from '@dxos/echo';\nimport { type Message } from '@dxos/types';\n\nimport { type AiChatProcessor } from '../../processor';\nimport { type ChatEvent } from './events';\n\n/**\n * Wall-clock timestamps for the most-recent (or in-flight) request, lifted out of\n * `ChatStreamStatus` so the elapsed value survives across re-mounts triggered when wire's\n * drip queue toggles `wireDrainingEffect` (which removes/restores the footer block widget).\n * `endedAt` is `null` while the request is still active.\n */\nexport type ChatRequestTiming = {\n startedAt: number;\n endedAt: number | null;\n};\n\nexport type ChatContextValue = {\n debug?: boolean;\n event: Event<ChatEvent>;\n db?: Database.Database;\n chat?: ChatModule.Chat;\n messages: Message.Message[];\n processor: AiChatProcessor;\n requestTiming: ChatRequestTiming | null;\n};\n\n// Internal: not re-exported from `Chat/index.ts`. Accessed by sibling components in this\n// package (e.g. `ChatStreamStatus`) without dragging in `Chat.tsx`'s heavy transitive\n// imports (transcription, etc.).\nexport const [ChatContextProvider, useChatContext] = createContext<ChatContextValue>('Chat');\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Schema", "ModelProviders", "ModelProvider", "Literal", "createModelLabel", "model", "parts", "split", "length", "AiServicePresets", "provider", "label", "map", "i", "id", "Atom", "Registry", "AtomRegistry", "AiError", "Cause", "Effect", "Exit", "Fiber", "Option", "Stream", "DEFAULT_EDGE_MODEL", "AiContext", "createSystemPrompt", "formatSystemPrompt", "McpServerError", "PartialBlock", "ToolExecutionServices", "Operation", "Trace", "Obj", "UsageQuotaExceededError", "EffectEx", "AgentService", "log", "Message", "AssistantOperation", "findInCause", "error", "predicate", "current", "visited", "Set", "has", "add", "Error", "cause", "undefined", "defaultOptions", "labelKey", "AiError", "err", "QUOTA_PATTERN", "test", "quotaError", "isQuotaError", "AiUsageQuotaError", "trim", "message", "Error", "Atom", "make", "messages", "error", "_runtime", "_feed", "_spaceLayer", "_options", "capabilities", "getCapabilities", "system", "createSystemPrompt", "context", "conversation", "registry", "getTools", "getSystemPrompt", "blueprints", "objects", "getObjects", "formatSystemPrompt", "Effect", "binder", "provide", "orDie", "set", "active", "gen", "log", "model", "session", "AgentService", "ephemeralStream", "event", "isOfType", "PartialBlock", "McpServerError", "data", "length", "requestProp", "submitPrompt", "waitForCompletion", "Cause", "isInterruptedOnly", "exit", "Option", "undefined", "info", "Fiber", "interrupt", "getSession", "pipe", "EffectEx", "spaceId", "Message", "id", "messageId", "created", "Date", "toISOString", "sender", "role", "blocks", "isPending", "updated", "streaming", "update", "pending", "existing", "errors", "protocol", "remaining", "clear", "void", "Obj", "chat", "prompt", "createContext", "ChatContextProvider", "useChatContext"]
|
|
7
|
+
}
|
|
@@ -100,7 +100,7 @@ import { Routine, Operation } from "@dxos/compute";
|
|
|
100
100
|
import { Database, Feed, Obj, Ref, Type } from "@dxos/echo";
|
|
101
101
|
import { DXN } from "@dxos/keys";
|
|
102
102
|
import { meta } from "#meta";
|
|
103
|
-
var makeKey = (name) => DXN.make(`${meta.
|
|
103
|
+
var makeKey = (name) => DXN.make(`${meta.profile.key}.operation.${name}`);
|
|
104
104
|
var CreateChat = Operation.make({
|
|
105
105
|
meta: {
|
|
106
106
|
key: makeKey("createChat"),
|
|
@@ -280,7 +280,7 @@ __export(AssistantCapabilities_exports, {
|
|
|
280
280
|
import * as Schema3 from "effect/Schema";
|
|
281
281
|
import { Capability as Capability2 } from "@dxos/app-framework";
|
|
282
282
|
import { meta as meta2 } from "#meta";
|
|
283
|
-
var Settings3 = Capability2.make(`${meta2.
|
|
283
|
+
var Settings3 = Capability2.make(`${meta2.profile.key}.capability.settings`);
|
|
284
284
|
var StateSchema = Schema3.mutable(Schema3.Struct({
|
|
285
285
|
/** Map of primary object dxn to current chat dxn. */
|
|
286
286
|
currentChat: Schema3.Record({
|
|
@@ -293,8 +293,8 @@ var StateSchema = Schema3.mutable(Schema3.Struct({
|
|
|
293
293
|
value: Schema3.UndefinedOr(Schema3.String)
|
|
294
294
|
})
|
|
295
295
|
}));
|
|
296
|
-
var State = Capability2.make(`${meta2.
|
|
297
|
-
var CompanionChatCache = Capability2.make(`${meta2.
|
|
296
|
+
var State = Capability2.make(`${meta2.profile.key}.capability.state`);
|
|
297
|
+
var CompanionChatCache = Capability2.make(`${meta2.profile.key}.capability.companion-chat-cache`);
|
|
298
298
|
|
|
299
299
|
// src/types/AssistantEvents.ts
|
|
300
300
|
var AssistantEvents_exports = {};
|
|
@@ -303,7 +303,7 @@ __export(AssistantEvents_exports, {
|
|
|
303
303
|
});
|
|
304
304
|
import { ActivationEvent } from "@dxos/app-framework";
|
|
305
305
|
import { meta as meta3 } from "#meta";
|
|
306
|
-
var SetupAiServiceProviders = ActivationEvent.make(`${meta3.
|
|
306
|
+
var SetupAiServiceProviders = ActivationEvent.make(`${meta3.profile.key}.event.setupAiServiceProviders`);
|
|
307
307
|
|
|
308
308
|
// src/types/service.ts
|
|
309
309
|
import * as Schema4 from "effect/Schema";
|
|
@@ -389,4 +389,4 @@ export {
|
|
|
389
389
|
ServiceType,
|
|
390
390
|
categoryIcons
|
|
391
391
|
};
|
|
392
|
-
//# sourceMappingURL=chunk-
|
|
392
|
+
//# sourceMappingURL=chunk-5KB2WRI2.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/types/Assistant.ts", "../../../src/types/Settings.ts", "../../../src/types/AssistantOperation.ts", "../../../src/types/AssistantCapabilities.ts", "../../../src/types/AssistantEvents.ts", "../../../src/types/service.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\n// @import-as-namespace\n\n// Re-export Chat schema for backward compatibility.\nimport { Chat as ChatModule } from '@dxos/assistant-toolkit';\nexport const Chat = ChatModule.Chat;\nexport type Chat = ChatModule.Chat;\n\n// Re-export Settings as merged const/type (not as namespace).\nimport * as SettingsModule from './Settings';\nexport const Settings = SettingsModule.Settings;\nexport type Settings = SettingsModule.Settings;\n\nexport const ChatViews = SettingsModule.ChatViews;\nexport const ChatView = SettingsModule.ChatView;\nexport type ChatView = SettingsModule.ChatView;\n\nexport const ModelProviders = SettingsModule.ModelProviders;\nexport const ModelProvider = SettingsModule.ModelProvider;\nexport type ModelProvider = SettingsModule.ModelProvider;\n\nexport const ModelDefaults = SettingsModule.ModelDefaults;\nexport type ModelDefaults = SettingsModule.ModelDefaults;\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { SchemaEx } from '@dxos/effect';\n\nexport const ModelProvider = Schema.Union(\n Schema.Literal('edge').annotations({ title: 'DXOS' }),\n Schema.Literal('ollama').annotations({ title: 'Ollama' }),\n Schema.Literal('lmstudio').annotations({ title: 'LM Studio' }),\n);\nexport type ModelProvider = Schema.Schema.Type<typeof ModelProvider>;\nexport const ModelProviders = SchemaEx.getLiteralValues(ModelProvider);\n\nexport const ChatView = Schema.Union(\n Schema.Literal('normal').annotations({ title: 'Normal' }),\n Schema.Literal('summary').annotations({ title: 'Summary' }),\n Schema.Literal('thinking').annotations({ title: 'Thinking' }),\n Schema.Literal('debug').annotations({ title: 'Debug' }),\n);\nexport type ChatView = Schema.Schema.Type<typeof ChatView>;\nexport const ChatViews = SchemaEx.getLiteralValues(ChatView);\n\nexport const ModelDefaults = Schema.mutable(\n Schema.Struct({\n edge: Schema.optional(\n Schema.String.annotations({\n title: 'Remote language model',\n description: 'Choose the remote language model used for AI requests.',\n }),\n ),\n ollama: Schema.optional(\n Schema.String.annotations({\n title: 'Ollama language model',\n description: 'Choose the locally hosted Ollama model for AI requests.',\n }),\n ),\n lmstudio: Schema.optional(\n Schema.String.annotations({\n title: 'LM Studio language model',\n description: 'Choose the locally hosted LM Studio model for AI requests.',\n }),\n ),\n }),\n);\nexport type ModelDefaults = Schema.Schema.Type<typeof ModelDefaults>;\n\nexport const Settings = Schema.mutable(\n Schema.Struct({\n customPrompts: Schema.optional(\n Schema.Boolean.annotations({\n title: 'Use custom prompts',\n description: 'Allow the assistant to use custom prompts defined in your spaces.',\n }),\n ),\n chatView: Schema.optional(\n ChatView.annotations({\n title: 'Chat view',\n description:\n 'Controls which message blocks are shown in the chat: normal hides reasoning, thinking shows reasoning, debug shows raw blocks, summary shows only conversational text.',\n }),\n ),\n modelProvider: Schema.optional(\n ModelProvider.annotations({\n title: 'LLM provider',\n description: 'Select which language model service to use for AI responses.',\n }),\n ),\n modelDefaults: Schema.optional(ModelDefaults),\n tracePanelDebug: Schema.optional(\n Schema.Boolean.annotations({\n title: 'Trace panel debug',\n description: 'Show the raw span tree as JSON in the trace panel instead of the commit graph.',\n }),\n ),\n }),\n);\nexport interface Settings extends Schema.Schema.Type<typeof Settings> {}\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { AiService } from '@dxos/ai';\nimport { Capability } from '@dxos/app-framework';\nimport { Chat } from '@dxos/assistant-toolkit';\nimport { Routine, Operation } from '@dxos/compute';\nimport { Database, Feed, Obj, Ref, Type } from '@dxos/echo';\nimport { DXN } from '@dxos/keys';\n\nimport { meta } from '#meta';\n\nconst makeKey = (name: string) => DXN.make(`${meta.profile.key}.operation.${name}`);\n\nexport const CreateChat = Operation.make({\n meta: { key: makeKey('createChat'), name: 'Create Chat', icon: 'ph--chat-text--regular' },\n services: [Capability.Service],\n input: Schema.Struct({\n db: Database.Database,\n name: Schema.optional(Schema.String),\n /** If false, chat is created in-memory only and not added to space. Defaults to true. */\n addToSpace: Schema.optional(Schema.Boolean),\n }),\n output: Schema.Struct({\n object: Type.getSchema(Chat.Chat),\n }),\n});\n\nexport const UpdateChatName = Operation.make({\n meta: {\n key: makeKey('updateChatName'),\n name: 'Update Chat Name',\n icon: 'ph--pencil--regular',\n },\n services: [Database.Service, Feed.FeedService, AiService.AiService],\n input: Schema.Struct({\n chat: Type.getSchema(Chat.Chat),\n /** Initial user message text; used when the feed has no history yet (e.g. auto-rename on first send). */\n prompt: Schema.optional(Schema.String),\n }),\n output: Schema.Void,\n});\n\nexport const SetCurrentChat = Operation.make({\n meta: {\n key: makeKey('setCurrentChat'),\n name: 'Set Current Chat',\n icon: 'ph--chat-text--regular',\n },\n services: [Capability.Service],\n input: Schema.Struct({\n companionTo: Obj.Unknown,\n chat: Type.getSchema(Chat.Chat).pipe(Schema.optional),\n }),\n output: Schema.Void,\n});\n\nexport const RunPromptInNewChat = Operation.make({\n meta: {\n key: makeKey('runPromptInNewChat'),\n name: 'Run Prompt In New Chat',\n icon: 'ph--chat-text--regular',\n },\n services: [Capability.Service],\n input: Schema.Struct({\n db: Database.Database,\n /** Context objects to bind to the new chat. */\n objects: Schema.optional(Schema.Array(Obj.Unknown)),\n /** Blueprint keys to look up and bind to the new chat. */\n blueprints: Schema.optional(Schema.Array(Schema.String)),\n /** Raw instructions or an existing Routine object reference. */\n prompt: Schema.Union(Schema.String, Ref.Ref(Routine.Routine)),\n /**\n * When true, skips opening the chat: runs the Agent prompt operation against the new chat via the compute runtime (traced).\n */\n background: Schema.optional(Schema.Boolean),\n }),\n output: Schema.Struct({\n object: Type.getSchema(Chat.Chat),\n }),\n});\n\nconst NavigationTargetSchema = Schema.Struct({\n path: Schema.String.annotations({ description: 'Navigation path to use with the Open operation.' }),\n label: Schema.String.annotations({ description: 'Human-readable label.' }),\n type: Schema.String.annotations({ description: 'Object type.' }),\n});\n\nexport const ResolveNavigationTargets = Operation.make({\n meta: {\n key: makeKey('resolveNavigationTargets'),\n name: 'Resolve navigation targets',\n description:\n 'Resolve navigation targets within the application. The returned paths can be used with the Open operation. Without a query, returns pages that can be navigated to.',\n icon: 'ph--compass--regular',\n },\n input: Schema.Struct({\n query: Schema.optional(\n Schema.Struct({\n dxn: Schema.optional(DXN.Schema),\n }),\n ),\n }),\n output: Schema.Struct({\n targets: Schema.Array(NavigationTargetSchema),\n }),\n services: [Capability.Service],\n});\n\nexport const ForkChat = Operation.make({\n meta: { key: makeKey('forkChat'), name: 'Fork Chat', icon: 'ph--git-branch--regular', skipRegistry: true },\n services: [Capability.Service, Database.Service],\n input: Schema.Struct({\n chat: Type.getSchema(Chat.Chat),\n /** When provided, the forked chat is set as the companion for this object rather than opened standalone. */\n companionTo: Schema.optional(Obj.Unknown),\n }),\n output: Schema.Struct({\n object: Type.getSchema(Chat.Chat),\n }),\n});\n\nexport const EnsureCompanionChat = Operation.make({\n meta: {\n key: makeKey('ensureCompanionChat'),\n name: 'Ensure Companion Chat',\n icon: 'ph--chat-text--regular',\n },\n services: [Capability.Service],\n input: Schema.Struct({\n db: Database.Database,\n companionTo: Obj.Unknown,\n }),\n output: Schema.Struct({\n chat: Type.getSchema(Chat.Chat),\n /** Whether the returned chat was already persisted in the space. */\n persisted: Schema.Boolean,\n }),\n});\n\nexport const BlueprintForm = Schema.Struct({\n key: Schema.String,\n name: Schema.String,\n description: Schema.optional(Schema.String),\n});\n\nexport const ToggleTracePanelDebug = Operation.make({\n meta: {\n key: makeKey('toggleTracePanelDebug'),\n name: 'Toggle trace panel debug',\n description: 'Toggle trace panel between commit graph and raw span tree JSON.',\n icon: 'ph--bug--regular',\n },\n services: [Capability.Service],\n input: Schema.Struct({\n state: Schema.optional(Schema.Boolean),\n }),\n output: Schema.Boolean,\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport { type Atom } from '@effect-atom/atom-react';\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { type Obj } from '@dxos/echo';\n\nimport { meta } from '#meta';\n\nimport * as Assistant from './Assistant';\n\nexport const Settings = Capability.make<Atom.Writable<Assistant.Settings>>(`${meta.profile.key}.capability.settings`);\n\nexport const StateSchema = Schema.mutable(\n Schema.Struct({\n /** Map of primary object dxn to current chat dxn. */\n currentChat: Schema.Record({ key: Schema.String, value: Schema.UndefinedOr(Schema.String) }),\n /** Map of chat object path to prompt text to auto-submit when the chat opens. */\n pendingPrompts: Schema.Record({ key: Schema.String, value: Schema.UndefinedOr(Schema.String) }),\n }),\n);\n\nexport type AssistantState = Schema.Schema.Type<typeof StateSchema>;\n\nexport const State = Capability.make<Atom.Writable<AssistantState>>(`${meta.profile.key}.capability.state`);\n\n/** Session-scoped cache of transient (not yet persisted) companion chats keyed by companion DXN string. */\nexport const CompanionChatCache = Capability.make<Atom.Writable<Record<string, Obj.Unknown | undefined>>>(\n `${meta.profile.key}.capability.companion-chat-cache`,\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport { ActivationEvent } from '@dxos/app-framework';\n\nimport { meta } from '#meta';\n\nexport const SetupAiServiceProviders = ActivationEvent.make(`${meta.profile.key}.event.setupAiServiceProviders`);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { Operation } from '@dxos/compute';\nimport { ComputeGraph } from '@dxos/conductor';\nimport { DXN, Ref, Type } from '@dxos/echo';\n\n// TODO(burdon): Factor out and reconcile with https://github.com/dxos/dxos/blob/main/packages/plugins/plugin-token-manager/src/defs/presets.ts#L7\n\nconst ApiAuthorizationKey = Schema.Struct({\n type: Schema.Literal('api-key'),\n key: Schema.String,\n placement: Schema.Union(\n Schema.Struct({\n type: Schema.Literal('authorization-header'),\n }),\n Schema.Struct({\n type: Schema.Literal('query'),\n name: Schema.String,\n }),\n ),\n});\n\nconst ApiAuthorizationOauth = Schema.Struct({\n type: Schema.Literal('oauth'),\n clientId: Schema.String,\n clientSecret: Schema.String,\n tokenUrl: Schema.String,\n grantType: Schema.String,\n});\n\nexport const ApiAuthorization = Schema.Union(ApiAuthorizationKey, ApiAuthorizationOauth);\nexport type ApiAuthorization = Schema.Schema.Type<typeof ApiAuthorization>;\n\nconst ServiceInterfaceFunction = Schema.Struct({\n kind: Schema.Literal('function'),\n fn: Ref.Ref(Operation.PersistentOperation),\n});\n\nconst ServiceInterfaceWorkflow = Schema.Struct({\n kind: Schema.Literal('workflow'),\n workflow: Ref.Ref(ComputeGraph),\n});\n\nconst ServiceInterfaceApi = Schema.Struct({\n kind: Schema.Literal('api'),\n\n /**\n * URL to fetch the openapi schema.\n */\n schemaUrl: Schema.optional(Schema.String),\n\n /**\n * Inlined openapi schema.\n */\n schema: Schema.optional(Schema.Any),\n\n /**\n * Authorization configuration if required.\n */\n authorization: Schema.optional(ApiAuthorization),\n});\n\nconst ServiceInterface = Schema.Union(\n // Service types.\n ServiceInterfaceFunction,\n ServiceInterfaceWorkflow,\n ServiceInterfaceApi,\n) as any;\n\nexport type ServiceInterface = Schema.Schema.Type<typeof ServiceInterface>;\n\nexport const ServiceType = Schema.Struct({\n serviceId: Schema.String,\n name: Schema.optional(Schema.String),\n description: Schema.optional(Schema.String),\n category: Schema.optional(Schema.String),\n enabled: Schema.optional(Schema.Boolean),\n\n /**\n * Entries exposed: functions, workflows, and APIs.\n */\n interfaces: Schema.optional(Schema.Array(ServiceInterface)),\n}).pipe(Type.makeObject(DXN.make('org.dxos.type.service', '0.1.0')));\n\nexport type ServiceType = Type.InstanceType<typeof ServiceType>;\n\n//\n// Service Registry\n//\n\nexport interface BaseServiceRegistry {\n queryServices(query?: ServiceQuery): Promise<ServiceType[]>;\n}\n\nexport type ServiceQuery = {\n name?: string;\n category?: string;\n};\n\nexport const categoryIcons: Record<string, string> = {\n finance: 'ph--bank--regular',\n health: 'ph--heart--regular',\n geolocation: 'ph--globe-simple--regular',\n education: 'ph--books--regular',\n entertainment: 'ph--music-notes--regular',\n shopping: 'ph--shopping-cart--regular',\n travel: 'ph--airplane-takeoff--regular',\n utilities: 'ph--lightning--regular',\n weather: 'ph--cloud-rain--regular',\n} as const;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ChatView", "ChatViews", "ModelDefaults", "ModelProvider", "ModelProviders", "Settings", "Chat", "ChatModule", "Schema", "SchemaEx", "ModelProvider", "Union", "Literal", "annotations", "title", "ModelProviders", "getLiteralValues", "ChatView", "ChatViews", "ModelDefaults", "mutable", "Struct", "edge", "optional", "String", "description", "ollama", "lmstudio", "Settings", "customPrompts", "Boolean", "chatView", "modelProvider", "modelDefaults", "tracePanelDebug", "Chat", "ChatModule", "Settings", "ChatViews", "ChatView", "ModelProviders", "ModelProvider", "ModelDefaults", "Schema", "AiService", "Capability", "Chat", "Routine", "Operation", "Database", "Feed", "Obj", "Ref", "Type", "DXN", "meta", "makeKey", "name", "make", "profile", "key", "CreateChat", "icon", "services", "Service", "input", "Struct", "db", "optional", "String", "addToSpace", "Boolean", "output", "object", "getSchema", "UpdateChatName", "FeedService", "chat", "prompt", "Void", "SetCurrentChat", "companionTo", "Unknown", "pipe", "RunPromptInNewChat", "objects", "Array", "blueprints", "Union", "background", "NavigationTargetSchema", "path", "annotations", "description", "label", "type", "ResolveNavigationTargets", "query", "dxn", "targets", "ForkChat", "skipRegistry", "EnsureCompanionChat", "persisted", "BlueprintForm", "ToggleTracePanelDebug", "state", "Settings", "Schema", "Capability", "meta", "make", "profile", "key", "StateSchema", "mutable", "Struct", "currentChat", "Record", "String", "value", "UndefinedOr", "pendingPrompts", "State", "CompanionChatCache", "ActivationEvent", "meta", "SetupAiServiceProviders", "make", "profile", "key", "Schema", "Operation", "ComputeGraph", "DXN", "Ref", "Type", "ApiAuthorizationKey", "Struct", "type", "Literal", "key", "String", "placement", "Union", "name", "ApiAuthorizationOauth", "clientId", "clientSecret", "tokenUrl", "grantType", "ApiAuthorization", "ServiceInterfaceFunction", "kind", "fn", "PersistentOperation", "ServiceInterfaceWorkflow", "workflow", "ServiceInterfaceApi", "schemaUrl", "optional", "schema", "Any", "authorization", "ServiceInterface", "ServiceType", "serviceId", "description", "category", "enabled", "Boolean", "interfaces", "Array", "pipe", "makeObject", "make", "categoryIcons", "finance", "health", "geolocation", "education", "entertainment", "shopping", "travel", "utilities", "weather"]
|
|
7
|
+
}
|