@dxos/plugin-automation 0.7.4 → 0.7.5-labs.a279d8c
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/browser/{AssistantPanel-N3QSALKY.mjs → AssistantPanel-KO6DZBTU.mjs} +10 -11
- package/dist/lib/browser/AssistantPanel-KO6DZBTU.mjs.map +7 -0
- package/dist/lib/browser/AutomationPanel-BMLM533Z.mjs +131 -0
- package/dist/lib/browser/AutomationPanel-BMLM533Z.mjs.map +7 -0
- package/dist/lib/browser/ChatContainer-SIAJFRFF.mjs +300 -0
- package/dist/lib/browser/ChatContainer-SIAJFRFF.mjs.map +7 -0
- package/dist/lib/browser/ai-client-6CRYUC6D.mjs +22 -0
- package/dist/lib/browser/ai-client-6CRYUC6D.mjs.map +7 -0
- package/dist/lib/browser/app-graph-builder-IJTTULDP.mjs +131 -0
- package/dist/lib/browser/app-graph-builder-IJTTULDP.mjs.map +7 -0
- package/dist/lib/browser/{chunk-7KB4UMXO.mjs → chunk-C3VRGDR6.mjs} +30 -4
- package/dist/lib/browser/chunk-C3VRGDR6.mjs.map +7 -0
- package/dist/lib/browser/chunk-EKJVAFT2.mjs +226 -0
- package/dist/lib/browser/chunk-EKJVAFT2.mjs.map +7 -0
- package/dist/lib/browser/{chunk-X5KMOH3I.mjs → chunk-HKX3D3ZP.mjs} +3 -3
- package/dist/lib/browser/chunk-HKX3D3ZP.mjs.map +7 -0
- package/dist/lib/browser/chunk-HZ4TA7HY.mjs +15 -0
- package/dist/lib/browser/chunk-HZ4TA7HY.mjs.map +7 -0
- package/dist/lib/browser/chunk-JSNPW6JF.mjs +14 -0
- package/dist/lib/browser/chunk-JSNPW6JF.mjs.map +7 -0
- package/dist/lib/browser/chunk-KPSDH6XZ.mjs +118 -0
- package/dist/lib/browser/chunk-KPSDH6XZ.mjs.map +7 -0
- package/dist/lib/browser/chunk-YZF3SDZL.mjs +139 -0
- package/dist/lib/browser/chunk-YZF3SDZL.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +143 -249
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/intent-resolver-AHDQ3KQP.mjs +24 -0
- package/dist/lib/browser/intent-resolver-AHDQ3KQP.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react-surface-IGMBLSV7.mjs +49 -0
- package/dist/lib/browser/react-surface-IGMBLSV7.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +6 -3
- package/dist/lib/node/{AssistantPanel-RIA4TI3B.cjs → AssistantPanel-PPFS2HKK.cjs} +20 -21
- package/dist/lib/node/AssistantPanel-PPFS2HKK.cjs.map +7 -0
- package/dist/lib/node/{AutomationPanel-HZS5WKI5.cjs → AutomationPanel-RXJDVLCF.cjs} +52 -72
- package/dist/lib/node/AutomationPanel-RXJDVLCF.cjs.map +7 -0
- package/dist/lib/node/ChatContainer-GS2SC5OG.cjs +318 -0
- package/dist/lib/node/ChatContainer-GS2SC5OG.cjs.map +7 -0
- package/dist/lib/node/ai-client-A3RRU55B.cjs +38 -0
- package/dist/lib/node/ai-client-A3RRU55B.cjs.map +7 -0
- package/dist/lib/node/app-graph-builder-MF5M4QRS.cjs +147 -0
- package/dist/lib/node/app-graph-builder-MF5M4QRS.cjs.map +7 -0
- package/dist/lib/node/{chunk-DTJ7XVO2.cjs → chunk-5VF5JKUN.cjs} +7 -7
- package/dist/lib/node/chunk-5VF5JKUN.cjs.map +7 -0
- package/dist/lib/node/{chunk-CUCUWUAF.cjs → chunk-BUQOZA4N.cjs} +32 -8
- package/dist/lib/node/chunk-BUQOZA4N.cjs.map +7 -0
- package/dist/lib/node/chunk-DNLBVFR7.cjs +147 -0
- package/dist/lib/node/chunk-DNLBVFR7.cjs.map +7 -0
- package/dist/lib/node/chunk-TWDGP26W.cjs +172 -0
- package/dist/lib/node/chunk-TWDGP26W.cjs.map +7 -0
- package/dist/lib/node/chunk-VEGLN4YN.cjs +250 -0
- package/dist/lib/node/chunk-VEGLN4YN.cjs.map +7 -0
- package/dist/lib/node/chunk-Z2YFE5SJ.cjs +49 -0
- package/dist/lib/node/chunk-Z2YFE5SJ.cjs.map +7 -0
- package/dist/lib/node/{meta.cjs → chunk-ZS5RZ7RM.cjs} +12 -8
- package/dist/lib/node/chunk-ZS5RZ7RM.cjs.map +7 -0
- package/dist/lib/node/index.cjs +159 -279
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/intent-resolver-TBHYXBDI.cjs +39 -0
- package/dist/lib/node/intent-resolver-TBHYXBDI.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/react-surface-BVUZMKYS.cjs +69 -0
- package/dist/lib/node/react-surface-BVUZMKYS.cjs.map +7 -0
- package/dist/lib/node/types/index.cjs +10 -7
- package/dist/lib/node/types/index.cjs.map +2 -2
- package/dist/lib/node-esm/{AssistantPanel-72YH43CH.mjs → AssistantPanel-XSSKKCJY.mjs} +10 -11
- package/dist/lib/node-esm/AssistantPanel-XSSKKCJY.mjs.map +7 -0
- package/dist/lib/node-esm/AutomationPanel-GQZZ4UBI.mjs +132 -0
- package/dist/lib/node-esm/AutomationPanel-GQZZ4UBI.mjs.map +7 -0
- package/dist/lib/node-esm/ChatContainer-57ILGC3R.mjs +301 -0
- package/dist/lib/node-esm/ChatContainer-57ILGC3R.mjs.map +7 -0
- package/dist/lib/node-esm/ai-client-2GBZRHBA.mjs +23 -0
- package/dist/lib/node-esm/ai-client-2GBZRHBA.mjs.map +7 -0
- package/dist/lib/node-esm/app-graph-builder-5N7OK23B.mjs +132 -0
- package/dist/lib/node-esm/app-graph-builder-5N7OK23B.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-5QUXIXNB.mjs +227 -0
- package/dist/lib/node-esm/chunk-5QUXIXNB.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-ICHNUP5M.mjs +119 -0
- package/dist/lib/node-esm/chunk-ICHNUP5M.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-ISYLEDVU.mjs +16 -0
- package/dist/lib/node-esm/chunk-ISYLEDVU.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-23LY7DYS.mjs → chunk-JCYVS5GG.mjs} +29 -4
- package/dist/lib/node-esm/chunk-JCYVS5GG.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-L2B6VGMG.mjs +16 -0
- package/dist/lib/node-esm/chunk-L2B6VGMG.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-U7HXYMPZ.mjs +141 -0
- package/dist/lib/node-esm/chunk-U7HXYMPZ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-HNOBZHWK.mjs → chunk-X3LPRWIL.mjs} +3 -3
- package/dist/lib/node-esm/chunk-X3LPRWIL.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +143 -249
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/intent-resolver-DPJJHFGK.mjs +25 -0
- package/dist/lib/node-esm/intent-resolver-DPJJHFGK.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/react-surface-77S6XJOM.mjs +50 -0
- package/dist/lib/node-esm/react-surface-77S6XJOM.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +6 -3
- package/dist/types/src/AutomationPlugin.d.ts +1 -3
- package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
- package/dist/types/src/artifacts.stories.d.ts +30 -0
- package/dist/types/src/artifacts.stories.d.ts.map +1 -0
- package/dist/types/src/capabilities/ai-client.d.ts +5 -0
- package/dist/types/src/capabilities/ai-client.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts +180 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
- package/dist/types/src/capabilities/capabilities.d.ts +5 -0
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +182 -0
- package/dist/types/src/capabilities/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface.d.ts +4 -0
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
- package/dist/types/src/components/AssistantPanel/AssistantPanel.d.ts.map +1 -1
- package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +1 -1
- package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
- package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts.map +1 -1
- package/dist/types/src/components/ChatContainer.d.ts +8 -0
- package/dist/types/src/components/ChatContainer.d.ts.map +1 -0
- package/dist/types/src/components/Thread/Thread.d.ts +14 -0
- package/dist/types/src/components/Thread/Thread.d.ts.map +1 -0
- package/dist/types/src/components/Thread/Thread.stories.d.ts +12 -0
- package/dist/types/src/components/Thread/Thread.stories.d.ts.map +1 -0
- package/dist/types/src/components/Thread/index.d.ts +2 -0
- package/dist/types/src/components/Thread/index.d.ts.map +1 -0
- package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +1 -2
- package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
- package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +8 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/hooks/email.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +1 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/invocation-handler.d.ts.map +1 -1
- package/dist/types/src/hooks/processor.d.ts +46 -0
- package/dist/types/src/hooks/processor.d.ts.map +1 -0
- package/dist/types/src/hooks/processor.test.d.ts +2 -0
- package/dist/types/src/hooks/processor.test.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +1 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +1 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/testing/testing.d.ts +2 -0
- package/dist/types/src/testing/testing.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +76 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +40 -39
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +16 -5
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/package.json +48 -47
- package/src/AutomationPlugin.tsx +85 -194
- package/src/artifacts.stories.tsx +180 -0
- package/src/capabilities/ai-client.ts +19 -0
- package/src/capabilities/app-graph-builder.ts +127 -0
- package/src/capabilities/capabilities.ts +12 -0
- package/src/capabilities/index.ts +12 -0
- package/src/capabilities/intent-resolver.ts +22 -0
- package/src/capabilities/react-surface.tsx +34 -0
- package/src/components/AssistantPanel/AssistantPanel.tsx +10 -8
- package/src/components/AutomationPanel/AutomationPanel.stories.tsx +1 -2
- package/src/components/AutomationPanel/AutomationPanel.tsx +61 -39
- package/src/components/ChatContainer.tsx +80 -0
- package/src/components/PromptEditor/PromptEditor.stories.tsx +3 -3
- package/src/components/Thread/Thread.stories.tsx +142 -0
- package/src/components/Thread/Thread.tsx +149 -0
- package/src/components/Thread/index.ts +5 -0
- package/src/components/TriggerEditor/TriggerEditor.stories.tsx +1 -2
- package/src/components/TriggerEditor/TriggerEditor.tsx +83 -16
- package/src/components/index.ts +5 -0
- package/src/hooks/email.ts +2 -2
- package/src/hooks/index.ts +1 -0
- package/src/hooks/invocation-handler.ts +2 -2
- package/src/hooks/processor.test.ts +15 -0
- package/src/hooks/processor.ts +161 -0
- package/src/index.ts +1 -4
- package/src/meta.ts +1 -1
- package/src/testing/testing.ts +9 -2
- package/src/translations.ts +13 -0
- package/src/types/schema.ts +9 -2
- package/src/types/types.ts +15 -21
- package/dist/lib/browser/AssistantPanel-N3QSALKY.mjs.map +0 -7
- package/dist/lib/browser/AutomationPanel-AQMN2CQR.mjs +0 -153
- package/dist/lib/browser/AutomationPanel-AQMN2CQR.mjs.map +0 -7
- package/dist/lib/browser/chunk-7KB4UMXO.mjs.map +0 -7
- package/dist/lib/browser/chunk-X5KMOH3I.mjs.map +0 -7
- package/dist/lib/browser/meta.mjs +0 -9
- package/dist/lib/browser/meta.mjs.map +0 -7
- package/dist/lib/node/AssistantPanel-RIA4TI3B.cjs.map +0 -7
- package/dist/lib/node/AutomationPanel-HZS5WKI5.cjs.map +0 -7
- package/dist/lib/node/chunk-CUCUWUAF.cjs.map +0 -7
- package/dist/lib/node/chunk-DTJ7XVO2.cjs.map +0 -7
- package/dist/lib/node/meta.cjs.map +0 -7
- package/dist/lib/node-esm/AssistantPanel-72YH43CH.mjs.map +0 -7
- package/dist/lib/node-esm/AutomationPanel-JUHOWQWW.mjs +0 -154
- package/dist/lib/node-esm/AutomationPanel-JUHOWQWW.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-23LY7DYS.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-HNOBZHWK.mjs.map +0 -7
- package/dist/lib/node-esm/meta.mjs +0 -10
- package/dist/lib/node-esm/meta.mjs.map +0 -7
|
@@ -26,68 +26,28 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
mod
|
|
27
27
|
));
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
var
|
|
30
|
-
__export(
|
|
29
|
+
var AutomationPanel_RXJDVLCF_exports = {};
|
|
30
|
+
__export(AutomationPanel_RXJDVLCF_exports, {
|
|
31
31
|
default: () => AutomationPanel_default
|
|
32
32
|
});
|
|
33
|
-
module.exports = __toCommonJS(
|
|
34
|
-
var
|
|
33
|
+
module.exports = __toCommonJS(AutomationPanel_RXJDVLCF_exports);
|
|
34
|
+
var import_chunk_DNLBVFR7 = require("./chunk-DNLBVFR7.cjs");
|
|
35
|
+
var import_chunk_5VF5JKUN = require("./chunk-5VF5JKUN.cjs");
|
|
35
36
|
var import_react = __toESM(require("react"));
|
|
36
37
|
var import_echo_schema = require("@dxos/echo-schema");
|
|
37
38
|
var import_functions = require("@dxos/functions");
|
|
38
|
-
var import_plugin_script = require("@dxos/plugin-script");
|
|
39
39
|
var import_react_client = require("@dxos/react-client");
|
|
40
40
|
var import_echo = require("@dxos/react-client/echo");
|
|
41
41
|
var import_react_ui = require("@dxos/react-ui");
|
|
42
42
|
var import_react_ui_list = require("@dxos/react-ui-list");
|
|
43
43
|
var import_react_ui_theme = require("@dxos/react-ui-theme");
|
|
44
|
-
var import_react2 = __toESM(require("react"));
|
|
45
|
-
var import_functions2 = require("@dxos/functions");
|
|
46
|
-
var import_types = require("@dxos/plugin-script/types");
|
|
47
|
-
var import_echo2 = require("@dxos/react-client/echo");
|
|
48
|
-
var import_react_ui2 = require("@dxos/react-ui");
|
|
49
|
-
var import_react_ui_form = require("@dxos/react-ui-form");
|
|
50
|
-
var TriggerEditor = ({ space, trigger, onSave, onCancel, storedTrigger }) => {
|
|
51
|
-
const { t } = (0, import_react_ui2.useTranslation)(import_chunk_DTJ7XVO2.AUTOMATION_PLUGIN);
|
|
52
|
-
const functions = (0, import_echo2.useQuery)(space, import_echo2.Filter.schema(import_types.FunctionType));
|
|
53
|
-
const scripts = (0, import_echo2.useQuery)(space, import_echo2.Filter.schema(import_types.ScriptType));
|
|
54
|
-
const handleSave = (values) => {
|
|
55
|
-
onSave?.(values);
|
|
56
|
-
};
|
|
57
|
-
return /* @__PURE__ */ import_react2.default.createElement(import_react_ui_form.Form, {
|
|
58
|
-
schema: import_functions2.FunctionTriggerSchema,
|
|
59
|
-
values: trigger,
|
|
60
|
-
filter: (props) => props.filter((p) => p.name !== "meta"),
|
|
61
|
-
onSave: handleSave,
|
|
62
|
-
onCancel,
|
|
63
|
-
Custom: {
|
|
64
|
-
["function"]: (props) => /* @__PURE__ */ import_react2.default.createElement(import_react_ui_form.SelectInput, {
|
|
65
|
-
...props,
|
|
66
|
-
options: functions.map((fn) => ({
|
|
67
|
-
value: fn.name,
|
|
68
|
-
label: getFunctionName(scripts, fn)
|
|
69
|
-
}))
|
|
70
|
-
}),
|
|
71
|
-
["spec.type"]: (props) => /* @__PURE__ */ import_react2.default.createElement(import_react_ui_form.SelectInput, {
|
|
72
|
-
...props,
|
|
73
|
-
options: Object.values(import_functions2.TriggerKind).map((kind) => ({
|
|
74
|
-
value: kind,
|
|
75
|
-
label: t(`trigger type ${kind}`)
|
|
76
|
-
}))
|
|
77
|
-
})
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
};
|
|
81
|
-
var getFunctionName = (scripts, fn) => {
|
|
82
|
-
return scripts.find((s) => fn.source?.id === s.id)?.name ?? fn.name;
|
|
83
|
-
};
|
|
84
44
|
var grid = "grid grid-cols-[40px_1fr_32px] min-bs-[2.5rem]";
|
|
85
|
-
var AutomationPanel = ({ space }) => {
|
|
86
|
-
const { t } = (0, import_react_ui.useTranslation)(
|
|
45
|
+
var AutomationPanel = ({ space, object }) => {
|
|
46
|
+
const { t } = (0, import_react_ui.useTranslation)(import_chunk_5VF5JKUN.AUTOMATION_PLUGIN);
|
|
87
47
|
const client = (0, import_react_client.useClient)();
|
|
88
48
|
const triggers = (0, import_echo.useQuery)(space, import_echo.Filter.schema(import_functions.FunctionTrigger));
|
|
89
|
-
const functions = (0, import_echo.useQuery)(space, import_echo.Filter.schema(
|
|
90
|
-
const scripts = (0, import_echo.useQuery)(space, import_echo.Filter.schema(
|
|
49
|
+
const functions = (0, import_echo.useQuery)(space, import_echo.Filter.schema(import_functions.FunctionType));
|
|
50
|
+
const scripts = (0, import_echo.useQuery)(space, import_echo.Filter.schema(import_functions.ScriptType));
|
|
91
51
|
const [trigger, setTrigger] = (0, import_react.useState)();
|
|
92
52
|
const [selected, setSelected] = (0, import_react.useState)();
|
|
93
53
|
const handleSelect = (trigger2) => {
|
|
@@ -96,7 +56,9 @@ var AutomationPanel = ({ space }) => {
|
|
|
96
56
|
setSelected(trigger2);
|
|
97
57
|
};
|
|
98
58
|
const handleAdd = () => {
|
|
99
|
-
setTrigger((0, import_echo.create)(import_functions.FunctionTriggerSchema, {
|
|
59
|
+
setTrigger((0, import_echo.create)(import_functions.FunctionTriggerSchema, {
|
|
60
|
+
meta: {}
|
|
61
|
+
}));
|
|
100
62
|
setSelected(void 0);
|
|
101
63
|
};
|
|
102
64
|
const handleDelete = (trigger2) => {
|
|
@@ -125,25 +87,27 @@ var AutomationPanel = ({ space }) => {
|
|
|
125
87
|
}, ({ items: triggers2 }) => /* @__PURE__ */ import_react.default.createElement("div", {
|
|
126
88
|
role: "list",
|
|
127
89
|
className: "flex flex-col w-full"
|
|
128
|
-
}, triggers2?.map((trigger2) =>
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
90
|
+
}, triggers2?.map((trigger2) => {
|
|
91
|
+
const copyAction = getCopyAction(client, trigger2);
|
|
92
|
+
return /* @__PURE__ */ import_react.default.createElement(import_react_ui_list.List.Item, {
|
|
93
|
+
key: trigger2.id,
|
|
94
|
+
item: trigger2,
|
|
95
|
+
classNames: (0, import_react_ui_theme.mx)(grid, import_react_ui_theme.ghostHover, "items-center", "px-2")
|
|
96
|
+
}, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Input.Root, null, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Input.Switch, {
|
|
97
|
+
checked: trigger2.enabled,
|
|
98
|
+
onCheckedChange: (checked) => trigger2.enabled = checked
|
|
99
|
+
})), /* @__PURE__ */ import_react.default.createElement("div", {
|
|
100
|
+
className: "flex"
|
|
101
|
+
}, /* @__PURE__ */ import_react.default.createElement(import_react_ui_list.List.ItemTitle, {
|
|
102
|
+
classNames: "px-1 cursor-pointer w-0 shrink truncate",
|
|
103
|
+
onClick: () => handleSelect(trigger2)
|
|
104
|
+
}, getFunctionName(scripts, functions, trigger2) ?? "\u2205"), copyAction && /* @__PURE__ */ import_react.default.createElement(import_react_ui.Button, {
|
|
105
|
+
onClick: () => navigator.clipboard.writeText(copyAction.contentProvider())
|
|
106
|
+
}, t(copyAction.translationKey))), /* @__PURE__ */ import_react.default.createElement(import_react_ui_list.List.ItemDeleteButton, {
|
|
107
|
+
onClick: () => handleDelete(trigger2)
|
|
108
|
+
}));
|
|
109
|
+
}))), trigger && /* @__PURE__ */ import_react.default.createElement(import_chunk_DNLBVFR7.TriggerEditor, {
|
|
145
110
|
space,
|
|
146
|
-
storedTrigger: selected,
|
|
147
111
|
trigger,
|
|
148
112
|
onSave: handleSave,
|
|
149
113
|
onCancel: handleCancel
|
|
@@ -155,6 +119,21 @@ var AutomationPanel = ({ space }) => {
|
|
|
155
119
|
onClick: handleAdd
|
|
156
120
|
})));
|
|
157
121
|
};
|
|
122
|
+
var getCopyAction = (client, trigger) => {
|
|
123
|
+
if (trigger?.spec?.type === import_functions.TriggerKind.Email) {
|
|
124
|
+
return {
|
|
125
|
+
translationKey: "trigger copy email",
|
|
126
|
+
contentProvider: () => `${(0, import_echo.getSpace)(trigger).id}@dxos.network`
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
if (trigger?.spec?.type === import_functions.TriggerKind.Webhook) {
|
|
130
|
+
return {
|
|
131
|
+
translationKey: "trigger copy url",
|
|
132
|
+
contentProvider: () => getWebhookUrl(client, trigger)
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return void 0;
|
|
136
|
+
};
|
|
158
137
|
var getWebhookUrl = (client, trigger) => {
|
|
159
138
|
const spaceId = (0, import_echo.getSpace)(trigger).id;
|
|
160
139
|
const edgeUrl = new URL(client.config.values.runtime.services.edge.url);
|
|
@@ -162,12 +141,13 @@ var getWebhookUrl = (client, trigger) => {
|
|
|
162
141
|
edgeUrl.protocol = isSecure ? "https" : "http";
|
|
163
142
|
return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();
|
|
164
143
|
};
|
|
165
|
-
var
|
|
144
|
+
var getFunctionName = (scripts, functions, trigger) => {
|
|
145
|
+
const shortId = trigger.function && `${trigger.function?.slice(0, 16)}\u2026`;
|
|
166
146
|
const functionObject = functions.find((fn) => fn.name === trigger.function);
|
|
167
147
|
if (!functionObject) {
|
|
168
|
-
return
|
|
148
|
+
return shortId;
|
|
169
149
|
}
|
|
170
|
-
return scripts.find((s) => functionObject.source?.id === s.id)?.name ??
|
|
150
|
+
return scripts.find((s) => functionObject.source?.target?.id === s.id)?.name ?? shortId;
|
|
171
151
|
};
|
|
172
152
|
var AutomationPanel_default = AutomationPanel;
|
|
173
|
-
//# sourceMappingURL=AutomationPanel-
|
|
153
|
+
//# sourceMappingURL=AutomationPanel-RXJDVLCF.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/AutomationPanel/AutomationPanel.tsx", "../../../src/components/AutomationPanel/index.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport { S } from '@dxos/echo-schema';\nimport {\n FunctionType,\n FunctionTrigger,\n FunctionTriggerSchema,\n TriggerKind,\n type FunctionTriggerType,\n ScriptType,\n} from '@dxos/functions';\nimport { type Client, useClient } from '@dxos/react-client';\nimport { create, Filter, useQuery, type Space, type ReactiveObject, getSpace } from '@dxos/react-client/echo';\nimport { IconButton, Input, useTranslation, Button } from '@dxos/react-ui';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover, mx } from '@dxos/react-ui-theme';\n\nimport { AUTOMATION_PLUGIN } from '../../meta';\nimport { TriggerEditor, type TriggerEditorProps } from '../TriggerEditor';\n\nconst grid = 'grid grid-cols-[40px_1fr_32px] min-bs-[2.5rem]';\n\nexport type AutomationPanelProps = {\n space: Space;\n object?: ReactiveObject<any>;\n};\n\n// TODO(burdon): Factor out common layout with ViewEditor.\nexport const AutomationPanel = ({ space, object }: AutomationPanelProps) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n const client = useClient();\n const triggers = useQuery(space, Filter.schema(FunctionTrigger));\n const functions = useQuery(space, Filter.schema(FunctionType));\n const scripts = useQuery(space, Filter.schema(ScriptType));\n\n const [trigger, setTrigger] = useState<FunctionTriggerType>();\n const [selected, setSelected] = useState<FunctionTrigger>();\n\n const handleSelect = (trigger: FunctionTrigger) => {\n const { id: _, ...values } = trigger;\n setTrigger(values);\n setSelected(trigger);\n };\n\n const handleAdd = () => {\n setTrigger(create(FunctionTriggerSchema, { meta: {} }));\n setSelected(undefined);\n };\n\n const handleDelete = (trigger: FunctionTrigger) => {\n space.db.remove(trigger);\n setTrigger(undefined);\n setSelected(undefined);\n };\n\n const handleSave: TriggerEditorProps['onSave'] = (trigger) => {\n if (selected) {\n Object.assign(selected, trigger);\n } else {\n space.db.add(create(FunctionTrigger, trigger));\n }\n\n setTrigger(undefined);\n setSelected(undefined);\n };\n\n const handleCancel: TriggerEditorProps['onCancel'] = () => {\n setTrigger(undefined);\n };\n\n return (\n <div className='flex flex-col w-full divide-y divide-separator overflow-y-auto'>\n <List.Root<FunctionTrigger> items={triggers} isItem={S.is(FunctionTrigger)} getId={(field) => field.id}>\n {({ items: triggers }) => (\n <div role='list' className='flex flex-col w-full'>\n {triggers?.map((trigger) => {\n const copyAction = getCopyAction(client, trigger);\n return (\n <List.Item<FunctionTrigger>\n key={trigger.id}\n item={trigger}\n classNames={mx(grid, ghostHover, 'items-center', 'px-2')}\n >\n <Input.Root>\n <Input.Switch\n checked={trigger.enabled}\n onCheckedChange={(checked) => (trigger.enabled = checked)}\n />\n </Input.Root>\n\n <div className={'flex'}>\n <List.ItemTitle\n classNames='px-1 cursor-pointer w-0 shrink truncate'\n onClick={() => handleSelect(trigger)}\n >\n {getFunctionName(scripts, functions, trigger) ?? '∅'}\n </List.ItemTitle>\n\n {/* TODO: a better way to expose copy action */}\n {copyAction && (\n <Button onClick={() => navigator.clipboard.writeText(copyAction.contentProvider())}>\n {t(copyAction.translationKey)}\n </Button>\n )}\n </div>\n\n <List.ItemDeleteButton onClick={() => handleDelete(trigger)} />\n </List.Item>\n );\n })}\n </div>\n )}\n </List.Root>\n\n {trigger && <TriggerEditor space={space} trigger={trigger} onSave={handleSave} onCancel={handleCancel} />}\n\n {!trigger && (\n <div className='flex p-2 justify-center'>\n <IconButton icon='ph--plus--regular' label={t('new trigger')} onClick={handleAdd} />\n </div>\n )}\n </div>\n );\n};\n\nconst getCopyAction = (client: Client, trigger: FunctionTrigger | undefined) => {\n if (trigger?.spec?.type === TriggerKind.Email) {\n return { translationKey: 'trigger copy email', contentProvider: () => `${getSpace(trigger)!.id}@dxos.network` };\n }\n\n if (trigger?.spec?.type === TriggerKind.Webhook) {\n return { translationKey: 'trigger copy url', contentProvider: () => getWebhookUrl(client, trigger) };\n }\n\n return undefined;\n};\n\nconst getWebhookUrl = (client: Client, trigger: FunctionTrigger) => {\n const spaceId = getSpace(trigger)!.id;\n const edgeUrl = new URL(client.config.values.runtime!.services!.edge!.url!);\n const isSecure = edgeUrl.protocol.startsWith('https') || edgeUrl.protocol.startsWith('wss');\n edgeUrl.protocol = isSecure ? 'https' : 'http';\n return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();\n};\n\nconst getFunctionName = (scripts: ScriptType[], functions: FunctionType[], trigger: FunctionTriggerType) => {\n const shortId = trigger.function && `${trigger.function?.slice(0, 16)}…`;\n const functionObject = functions.find((fn) => fn.name === trigger.function);\n if (!functionObject) {\n return shortId;\n }\n return scripts.find((s) => functionObject.source?.target?.id === s.id)?.name ?? shortId;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AutomationPanel } from './AutomationPanel';\n\nexport default AutomationPanel;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["grid", "AutomationPanel", "space", "object", "t", "useTranslation", "AUTOMATION_PLUGIN", "client", "useClient", "triggers", "useQuery", "Filter", "schema", "FunctionTrigger", "functions", "FunctionType", "scripts", "ScriptType", "trigger", "setTrigger", "useState", "selected", "setSelected", "handleSelect", "id", "_", "values", "handleAdd", "create", "FunctionTriggerSchema", "meta", "undefined", "handleDelete", "db", "remove", "handleSave", "Object", "assign", "add", "handleCancel", "React", "div", "className", "List", "Root", "items", "isItem", "S", "is", "getId", "field", "role", "map", "copyAction", "getCopyAction", "Item", "key", "item", "classNames", "mx", "ghostHover", "Input", "Switch", "checked", "enabled", "onCheckedChange", "ItemTitle", "onClick", "getFunctionName", "Button", "navigator", "clipboard", "writeText", "contentProvider", "translationKey", "ItemDeleteButton", "TriggerEditor", "onSave", "onCancel", "IconButton", "icon", "label", "spec", "type", "TriggerKind", "Email", "getSpace", "Webhook", "getWebhookUrl", "spaceId", "edgeUrl", "URL", "config", "runtime", "services", "edge", "url", "isSecure", "protocol", "startsWith", "toString", "shortId", "function", "slice", "functionObject", "find", "fn", "name", "s", "source", "target"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var ChatContainer_GS2SC5OG_exports = {};
|
|
30
|
+
__export(ChatContainer_GS2SC5OG_exports, {
|
|
31
|
+
ChatContainer: () => ChatContainer,
|
|
32
|
+
default: () => ChatContainer_default
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(ChatContainer_GS2SC5OG_exports);
|
|
35
|
+
var import_chunk_Z2YFE5SJ = require("./chunk-Z2YFE5SJ.cjs");
|
|
36
|
+
var import_chunk_TWDGP26W = require("./chunk-TWDGP26W.cjs");
|
|
37
|
+
var import_chunk_ZS5RZ7RM = require("./chunk-ZS5RZ7RM.cjs");
|
|
38
|
+
var import_chunk_5VF5JKUN = require("./chunk-5VF5JKUN.cjs");
|
|
39
|
+
var import_react = __toESM(require("react"));
|
|
40
|
+
var import_app_framework = require("@dxos/app-framework");
|
|
41
|
+
var import_artifact = require("@dxos/artifact");
|
|
42
|
+
var import_keys = require("@dxos/keys");
|
|
43
|
+
var import_echo = require("@dxos/react-client/echo");
|
|
44
|
+
var import_react_edge_client = require("@dxos/react-edge-client");
|
|
45
|
+
var import_react_ui_stack = require("@dxos/react-ui-stack");
|
|
46
|
+
var import_signals_core = require("@preact/signals-core");
|
|
47
|
+
var import_artifact2 = require("@dxos/artifact");
|
|
48
|
+
var import_assistant = require("@dxos/assistant");
|
|
49
|
+
var import_echo_schema = require("@dxos/echo-schema");
|
|
50
|
+
var import_invariant = require("@dxos/invariant");
|
|
51
|
+
var import_log = require("@dxos/log");
|
|
52
|
+
var import_react2 = require("react");
|
|
53
|
+
var import_async = require("@dxos/async");
|
|
54
|
+
var import_context = require("@dxos/context");
|
|
55
|
+
var import_functions = require("@dxos/functions");
|
|
56
|
+
var import_functions2 = require("@dxos/functions");
|
|
57
|
+
var import_invariant2 = require("@dxos/invariant");
|
|
58
|
+
var import_log2 = require("@dxos/log");
|
|
59
|
+
var import_react_client = require("@dxos/react-client");
|
|
60
|
+
var import_echo2 = require("@dxos/react-client/echo");
|
|
61
|
+
var import_async2 = require("@dxos/async");
|
|
62
|
+
var import_echo_db = require("@dxos/echo-db");
|
|
63
|
+
var import_functions3 = require("@dxos/functions");
|
|
64
|
+
var import_invariant3 = require("@dxos/invariant");
|
|
65
|
+
var import_keys2 = require("@dxos/keys");
|
|
66
|
+
var import_log3 = require("@dxos/log");
|
|
67
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-automation/src/hooks/processor.ts";
|
|
68
|
+
var defaultOptions = {
|
|
69
|
+
model: "@anthropic/claude-3-5-sonnet-20241022",
|
|
70
|
+
systemPrompt: ""
|
|
71
|
+
};
|
|
72
|
+
var ChatProcessor = class {
|
|
73
|
+
constructor(_client, _tools, _extensions, _options = defaultOptions) {
|
|
74
|
+
this._client = _client;
|
|
75
|
+
this._tools = _tools;
|
|
76
|
+
this._extensions = _extensions;
|
|
77
|
+
this._options = _options;
|
|
78
|
+
this._history = [];
|
|
79
|
+
this._pending = (0, import_signals_core.signal)([]);
|
|
80
|
+
this._streaming = (0, import_signals_core.signal)([]);
|
|
81
|
+
}
|
|
82
|
+
get isStreaming() {
|
|
83
|
+
return (0, import_signals_core.computed)(() => this._pending.value.length > 0);
|
|
84
|
+
}
|
|
85
|
+
get messages() {
|
|
86
|
+
return (0, import_signals_core.computed)(() => [
|
|
87
|
+
...this._pending.value,
|
|
88
|
+
...this._streaming.value
|
|
89
|
+
]);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Make GPT request.
|
|
93
|
+
*/
|
|
94
|
+
async request(message, history = []) {
|
|
95
|
+
import_log.log.info("requesting...", {
|
|
96
|
+
message,
|
|
97
|
+
history: history.length
|
|
98
|
+
}, {
|
|
99
|
+
F: __dxlog_file,
|
|
100
|
+
L: 73,
|
|
101
|
+
S: this,
|
|
102
|
+
C: (f, a) => f(...a)
|
|
103
|
+
});
|
|
104
|
+
this._history = history;
|
|
105
|
+
this._pending.value = [
|
|
106
|
+
(0, import_echo_schema.createStatic)(import_artifact2.Message, {
|
|
107
|
+
role: "user",
|
|
108
|
+
content: [
|
|
109
|
+
{
|
|
110
|
+
type: "text",
|
|
111
|
+
text: message
|
|
112
|
+
}
|
|
113
|
+
]
|
|
114
|
+
})
|
|
115
|
+
];
|
|
116
|
+
this._streaming.value = [];
|
|
117
|
+
await this.generate();
|
|
118
|
+
return this._reset();
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Cancel pending requests.
|
|
122
|
+
* @returns Pending requests (incl. the request message).
|
|
123
|
+
*/
|
|
124
|
+
async cancel() {
|
|
125
|
+
import_log.log.info("cancelling...", void 0, {
|
|
126
|
+
F: __dxlog_file,
|
|
127
|
+
L: 92,
|
|
128
|
+
S: this,
|
|
129
|
+
C: (f, a) => f(...a)
|
|
130
|
+
});
|
|
131
|
+
this._response?.abort();
|
|
132
|
+
return this._reset();
|
|
133
|
+
}
|
|
134
|
+
async _reset() {
|
|
135
|
+
const pending = this._pending.value;
|
|
136
|
+
this._history = [];
|
|
137
|
+
this._pending.value = [];
|
|
138
|
+
this._streaming.value = [];
|
|
139
|
+
return pending;
|
|
140
|
+
}
|
|
141
|
+
async generate() {
|
|
142
|
+
try {
|
|
143
|
+
let more = false;
|
|
144
|
+
do {
|
|
145
|
+
import_log.log.info("requesting...", {
|
|
146
|
+
history: this._history.length,
|
|
147
|
+
pending: this._pending.value.length
|
|
148
|
+
}, {
|
|
149
|
+
F: __dxlog_file,
|
|
150
|
+
L: 109,
|
|
151
|
+
S: this,
|
|
152
|
+
C: (f, a) => f(...a)
|
|
153
|
+
});
|
|
154
|
+
this._response = await this._client.generate({
|
|
155
|
+
...this._options,
|
|
156
|
+
// TODO(burdon): Rename messages or separate history/message.
|
|
157
|
+
history: [
|
|
158
|
+
...this._history,
|
|
159
|
+
...this._pending.value
|
|
160
|
+
],
|
|
161
|
+
tools: this._tools
|
|
162
|
+
});
|
|
163
|
+
queueMicrotask(async () => {
|
|
164
|
+
(0, import_invariant.invariant)(this._response, void 0, {
|
|
165
|
+
F: __dxlog_file,
|
|
166
|
+
L: 119,
|
|
167
|
+
S: this,
|
|
168
|
+
A: [
|
|
169
|
+
"this._response",
|
|
170
|
+
""
|
|
171
|
+
]
|
|
172
|
+
});
|
|
173
|
+
for await (const event of this._response) {
|
|
174
|
+
import_log.log.info("event", {
|
|
175
|
+
event: event.type
|
|
176
|
+
}, {
|
|
177
|
+
F: __dxlog_file,
|
|
178
|
+
L: 121,
|
|
179
|
+
S: this,
|
|
180
|
+
C: (f, a) => f(...a)
|
|
181
|
+
});
|
|
182
|
+
this._streaming.value = this._response.accumulatedMessages.map((message) => (0, import_echo_schema.createStatic)(import_artifact2.Message, message));
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
const messages = await this._response.complete();
|
|
186
|
+
import_log.log.info("response", {
|
|
187
|
+
messages: messages.length
|
|
188
|
+
}, {
|
|
189
|
+
F: __dxlog_file,
|
|
190
|
+
L: 128,
|
|
191
|
+
S: this,
|
|
192
|
+
C: (f, a) => f(...a)
|
|
193
|
+
});
|
|
194
|
+
this._pending.value.push(...messages.map((message) => (0, import_echo_schema.createStatic)(import_artifact2.Message, message)));
|
|
195
|
+
this._streaming.value = [];
|
|
196
|
+
more = false;
|
|
197
|
+
if (messages.length > 0 && (0, import_assistant.isToolUse)(messages.at(-1))) {
|
|
198
|
+
import_log.log.info("tool request...", void 0, {
|
|
199
|
+
F: __dxlog_file,
|
|
200
|
+
L: 135,
|
|
201
|
+
S: this,
|
|
202
|
+
C: (f, a) => f(...a)
|
|
203
|
+
});
|
|
204
|
+
const response = await (0, import_assistant.runTools)({
|
|
205
|
+
message: messages.at(-1),
|
|
206
|
+
tools: this._tools ?? [],
|
|
207
|
+
extensions: this._extensions
|
|
208
|
+
});
|
|
209
|
+
import_log.log.info("tool response", {
|
|
210
|
+
response
|
|
211
|
+
}, {
|
|
212
|
+
F: __dxlog_file,
|
|
213
|
+
L: 142,
|
|
214
|
+
S: this,
|
|
215
|
+
C: (f, a) => f(...a)
|
|
216
|
+
});
|
|
217
|
+
switch (response.type) {
|
|
218
|
+
case "continue": {
|
|
219
|
+
this._pending.value.push(response.message);
|
|
220
|
+
more = true;
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
} while (more);
|
|
226
|
+
} catch (err) {
|
|
227
|
+
import_log.log.catch("request failed", {
|
|
228
|
+
err
|
|
229
|
+
}, {
|
|
230
|
+
F: __dxlog_file,
|
|
231
|
+
L: 154,
|
|
232
|
+
S: this,
|
|
233
|
+
C: (f, a) => f(...a)
|
|
234
|
+
});
|
|
235
|
+
} finally {
|
|
236
|
+
import_log.log.info("done", void 0, {
|
|
237
|
+
F: __dxlog_file,
|
|
238
|
+
L: 156,
|
|
239
|
+
S: this,
|
|
240
|
+
C: (f, a) => f(...a)
|
|
241
|
+
});
|
|
242
|
+
this._response = void 0;
|
|
243
|
+
this._streaming.value = [];
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
var registerTriggersMutex = new import_async.Mutex();
|
|
248
|
+
var ChatContainer = ({ chat, role }) => {
|
|
249
|
+
const edgeClient = (0, import_react_edge_client.useEdgeClient)();
|
|
250
|
+
const { dispatchPromise: dispatch } = (0, import_app_framework.useIntentDispatcher)();
|
|
251
|
+
const space = (0, import_echo.getSpace)(chat);
|
|
252
|
+
const aiClient = (0, import_app_framework.useCapability)(import_chunk_ZS5RZ7RM.AutomationCapabilities.AiClient);
|
|
253
|
+
const artifactDefinitions = (0, import_app_framework.useCapabilities)(import_app_framework.Capabilities.ArtifactDefinition);
|
|
254
|
+
const globalTools = (0, import_app_framework.useCapabilities)(import_app_framework.Capabilities.Tools);
|
|
255
|
+
const tools = (0, import_react.useMemo)(() => [
|
|
256
|
+
...globalTools.flat(),
|
|
257
|
+
...artifactDefinitions.flatMap((definition) => definition.tools)
|
|
258
|
+
], [
|
|
259
|
+
globalTools,
|
|
260
|
+
artifactDefinitions
|
|
261
|
+
]);
|
|
262
|
+
const systemPrompt = (0, import_react.useMemo)(() => (0, import_artifact.createSystemPrompt)({
|
|
263
|
+
artifacts: artifactDefinitions.map((definition) => definition.instructions)
|
|
264
|
+
}), [
|
|
265
|
+
artifactDefinitions
|
|
266
|
+
]);
|
|
267
|
+
const processor = (0, import_react.useMemo)(() => new ChatProcessor(aiClient, tools, {
|
|
268
|
+
space,
|
|
269
|
+
dispatch
|
|
270
|
+
}, {
|
|
271
|
+
model: "@anthropic/claude-3-5-sonnet-20241022",
|
|
272
|
+
systemPrompt
|
|
273
|
+
}), [
|
|
274
|
+
aiClient,
|
|
275
|
+
tools,
|
|
276
|
+
space,
|
|
277
|
+
systemPrompt
|
|
278
|
+
]);
|
|
279
|
+
const queueDxn = (0, import_react.useMemo)(() => new import_keys.DXN(import_keys.DXN.kind.QUEUE, [
|
|
280
|
+
import_keys.QueueSubspaceTags.DATA,
|
|
281
|
+
space.id,
|
|
282
|
+
chat.queue.dxn.parts.at(-1)
|
|
283
|
+
]), [
|
|
284
|
+
chat.queue.dxn
|
|
285
|
+
]);
|
|
286
|
+
const queue = (0, import_react_edge_client.useQueue)(edgeClient, queueDxn);
|
|
287
|
+
const messages = (0, import_react.useMemo)(() => [
|
|
288
|
+
...queue.items,
|
|
289
|
+
...processor.messages.value
|
|
290
|
+
], [
|
|
291
|
+
queue.items,
|
|
292
|
+
processor.messages.value
|
|
293
|
+
]);
|
|
294
|
+
const handleSubmit = (0, import_react.useCallback)(async (message) => {
|
|
295
|
+
if (processor.isStreaming) {
|
|
296
|
+
await processor.cancel();
|
|
297
|
+
}
|
|
298
|
+
const messages2 = await processor.request(message, queue.items);
|
|
299
|
+
await queue.append(messages2);
|
|
300
|
+
}, [
|
|
301
|
+
processor,
|
|
302
|
+
queue
|
|
303
|
+
]);
|
|
304
|
+
return /* @__PURE__ */ import_react.default.createElement(import_react_ui_stack.StackItem.Content, {
|
|
305
|
+
toolbar: false,
|
|
306
|
+
role
|
|
307
|
+
}, /* @__PURE__ */ import_react.default.createElement(import_chunk_TWDGP26W.Thread, {
|
|
308
|
+
messages,
|
|
309
|
+
streaming: processor.isStreaming.value,
|
|
310
|
+
onSubmit: handleSubmit
|
|
311
|
+
}));
|
|
312
|
+
};
|
|
313
|
+
var ChatContainer_default = ChatContainer;
|
|
314
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
315
|
+
0 && (module.exports = {
|
|
316
|
+
ChatContainer
|
|
317
|
+
});
|
|
318
|
+
//# sourceMappingURL=ChatContainer-GS2SC5OG.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/ChatContainer.tsx", "../../../src/hooks/processor.ts", "../../../src/hooks/useLocalTriggerManager.ts", "../../../src/hooks/invocation-handler.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Capabilities, useCapabilities, useCapability, useIntentDispatcher } from '@dxos/app-framework';\nimport { createSystemPrompt, type Message } from '@dxos/artifact';\nimport { DXN, QueueSubspaceTags } from '@dxos/keys';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { useEdgeClient, useQueue } from '@dxos/react-edge-client';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { Thread } from './Thread';\nimport { AutomationCapabilities } from '../capabilities';\nimport { ChatProcessor } from '../hooks';\nimport { type GptChatType } from '../types';\n\nexport const ChatContainer = ({ chat, role }: { chat: GptChatType; role: string }) => {\n const edgeClient = useEdgeClient();\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const space = getSpace(chat);\n const aiClient = useCapability(AutomationCapabilities.AiClient);\n const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);\n const globalTools = useCapabilities(Capabilities.Tools);\n const tools = useMemo(\n () => [...globalTools.flat(), ...artifactDefinitions.flatMap((definition) => definition.tools)],\n [globalTools, artifactDefinitions],\n );\n const systemPrompt = useMemo(\n () => createSystemPrompt({ artifacts: artifactDefinitions.map((definition) => definition.instructions) }),\n [artifactDefinitions],\n );\n\n // TODO(burdon): Create hook.\n // TODO(wittjosiah): Should these be created in the component?\n // TODO(zan): Combine with ai service client?\n const processor = useMemo(\n () =>\n new ChatProcessor(\n aiClient,\n tools,\n { space, dispatch },\n { model: '@anthropic/claude-3-5-sonnet-20241022', systemPrompt },\n ),\n [aiClient, tools, space, systemPrompt],\n );\n // TODO(wittjosiah): Remove transformation.\n const queueDxn = useMemo(\n () => new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, space!.id, chat.queue.dxn.parts.at(-1)!]),\n [chat.queue.dxn],\n );\n const queue = useQueue<Message>(edgeClient, queueDxn);\n const messages = useMemo(\n () => [...queue.items, ...processor.messages.value],\n [queue.items, processor.messages.value],\n );\n\n const handleSubmit = useCallback(\n async (message: string) => {\n // TODO(burdon): Button to cancel. Otherwise queue request.\n if (processor.isStreaming) {\n await processor.cancel();\n }\n\n const messages = await processor.request(message, queue.items);\n // TODO(burdon): Append on success only? If approved by user? Clinet/server.\n await queue.append(messages);\n },\n [processor, queue],\n );\n\n return (\n <StackItem.Content toolbar={false} role={role}>\n <Thread messages={messages} streaming={processor.isStreaming.value} onSubmit={handleSubmit} />\n </StackItem.Content>\n );\n};\n\nexport default ChatContainer;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ReadonlySignal, type Signal, computed, signal } from '@preact/signals-core';\n\nimport { type PromiseIntentDispatcher } from '@dxos/app-framework';\nimport { type Tool, Message } from '@dxos/artifact';\nimport {\n type AIServiceClientImpl,\n type GenerateRequest,\n type GenerationStream,\n isToolUse,\n runTools,\n} from '@dxos/assistant';\nimport { createStatic } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { type Space } from '@dxos/react-client/echo';\n\nconst defaultOptions: Pick<GenerateRequest, 'model' | 'systemPrompt'> = {\n model: '@anthropic/claude-3-5-sonnet-20241022',\n systemPrompt: '',\n};\n\n// TODO(burdon): Factor out.\ndeclare global {\n interface ToolContextExtensions {\n space?: Space;\n dispatch?: PromiseIntentDispatcher;\n }\n}\n\n/**\n * Handles interactions with an AI service.\n * Manages message history, and executes tools based on AI responses.\n * Maintains a queue of messages and handles streaming responses from the AI service.\n * Supports cancellation of in-progress requests.\n */\n// TODO(burdon): Tests.\nexport class ChatProcessor {\n /** Prior history from queue. */\n private _history: Message[] = [];\n\n /** Pending messages (incl. the initial user message). */\n private _pending: Signal<Message[]> = signal([]);\n\n /** Streaming messages (from the AI service). */\n private _streaming: Signal<Message[]> = signal([]);\n\n /** Current streaming response. */\n private _response: GenerationStream | undefined;\n\n constructor(\n private readonly _client: AIServiceClientImpl,\n private readonly _tools?: Tool[],\n private readonly _extensions?: ToolContextExtensions,\n private readonly _options: Pick<GenerateRequest, 'model' | 'systemPrompt'> = defaultOptions,\n ) {}\n\n get isStreaming(): ReadonlySignal<boolean> {\n return computed(() => this._pending.value.length > 0);\n }\n\n get messages(): ReadonlySignal<Message[]> {\n return computed(() => [...this._pending.value, ...this._streaming.value]);\n }\n\n /**\n * Make GPT request.\n */\n async request(message: string, history: Message[] = []): Promise<Message[]> {\n log.info('requesting...', { message, history: history.length });\n this._history = history;\n this._pending.value = [\n createStatic(Message, {\n role: 'user',\n content: [{ type: 'text', text: message }],\n }),\n ];\n this._streaming.value = [];\n\n await this.generate();\n return this._reset();\n }\n\n /**\n * Cancel pending requests.\n * @returns Pending requests (incl. the request message).\n */\n async cancel(): Promise<Message[]> {\n log.info('cancelling...');\n this._response?.abort();\n return this._reset();\n }\n\n private async _reset(): Promise<Message[]> {\n const pending = this._pending.value;\n this._history = [];\n this._pending.value = [];\n this._streaming.value = [];\n return pending;\n }\n\n private async generate() {\n try {\n let more = false;\n do {\n log.info('requesting...', { history: this._history.length, pending: this._pending.value.length });\n this._response = await this._client.generate({\n ...this._options,\n // TODO(burdon): Rename messages or separate history/message.\n history: [...this._history, ...this._pending.value],\n tools: this._tools,\n });\n\n // Process the stream.\n queueMicrotask(async () => {\n invariant(this._response);\n for await (const event of this._response) {\n log.info('event', { event: event.type });\n this._streaming.value = this._response.accumulatedMessages.map((message) => createStatic(Message, message));\n }\n });\n\n // Update pending messages.\n const messages = await this._response.complete();\n log.info('response', { messages: messages.length });\n this._pending.value.push(...messages.map((message) => createStatic(Message, message)));\n this._streaming.value = [];\n\n // Resolve tool use locally.\n more = false;\n if (messages.length > 0 && isToolUse(messages.at(-1)!)) {\n log.info('tool request...');\n const response = await runTools({\n message: messages.at(-1)!,\n tools: this._tools ?? [],\n extensions: this._extensions,\n });\n\n log.info('tool response', { response });\n switch (response.type) {\n case 'continue': {\n this._pending.value.push(response.message);\n more = true;\n break;\n }\n }\n }\n } while (more);\n } catch (err) {\n // TODO(burdon): Handle error.\n log.catch('request failed', { err });\n } finally {\n log.info('done');\n this._response = undefined;\n this._streaming.value = [];\n }\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { Mutex } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { createSubscriptionTrigger, type TriggerFactory } from '@dxos/functions';\nimport { FunctionTrigger } from '@dxos/functions';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { Filter, type Space, useQuery } from '@dxos/react-client/echo';\n\nimport { invokeFunction } from './invocation-handler';\n\nconst registerTriggersMutex = new Mutex();\n\nexport const useLocalTriggerManager = (space: Space) => {\n const client = useClient();\n\n // TODO(burdon): Factor out, creating context for plugin (runs outside of component).\n const [registry] = useState(new Map<string, Context>());\n const triggers = useQuery(space, Filter.schema(FunctionTrigger));\n useEffect(() => {\n setTimeout(async () => {\n // Mark-and-sweep removing disabled triggers.\n await registerTriggersMutex.executeSynchronized(async () => {\n const deprecated = new Set(Array.from(registry.keys()));\n log('triggers', {\n deprecated,\n all: triggers.map((t) => t.id),\n enabled: triggers.filter((t) => t.enabled).map((t) => t.id),\n });\n\n for (const trigger of triggers) {\n if (trigger.enabled) {\n if (registry.has(trigger.id)) {\n deprecated.delete(trigger.id);\n continue;\n }\n log.info('activating trigger', trigger.id);\n\n const ctx = new Context();\n registry.set(trigger.id, ctx);\n const triggerSpec = trigger.spec;\n invariant(triggerSpec);\n\n let triggerFactory: TriggerFactory<any>;\n if (triggerSpec.type === 'subscription') {\n triggerFactory = createSubscriptionTrigger;\n } else {\n log.info('unsupported trigger', { type: triggerSpec.type });\n continue;\n }\n\n await triggerFactory(ctx, space, trigger.spec, (data: any) => {\n return invokeFunction(client, space, trigger, data);\n });\n }\n }\n\n for (const id of deprecated) {\n const ctx = registry.get(id);\n if (ctx) {\n await ctx.dispose();\n registry.delete(id);\n }\n }\n });\n });\n }, [JSON.stringify(triggers)]);\n\n useEffect(() => {\n return () => {\n for (const ctx of registry.values()) {\n void ctx.dispose();\n }\n };\n }, []);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { sleep } from '@dxos/async';\nimport { getObjectCore, ResultFormat } from '@dxos/echo-db';\nimport { type AnyObjectData } from '@dxos/echo-schema';\nimport { FunctionType } from '@dxos/functions';\nimport { type FunctionTrigger } from '@dxos/functions';\nimport { invariant } from '@dxos/invariant';\nimport { DXN, LOCAL_SPACE_TAG } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { type Client, type Config } from '@dxos/react-client';\nimport { type Space } from '@dxos/react-client/echo';\n\nconst MAX_RETRIES = 3;\nconst RETRY_DELAY = 1_000;\n\nconst callFunction = async (funcUrl: string, trigger: any, data: any) => {\n const body = { event: 'trigger', trigger, data };\n\n let retryCount = 0;\n while (retryCount < MAX_RETRIES) {\n log.info('exec', { funcUrl, body, retryCount });\n const response = await fetch(funcUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n const data = await response.text();\n log.info('response', { status: response.status, body: data });\n if (response.status === 409) {\n retryCount++;\n await sleep(RETRY_DELAY * Math.min(retryCount, 2));\n continue;\n }\n\n return { status: response.status, data };\n }\n return { status: 500 };\n};\n\nexport const invokeFunction = async (client: Client, space: Space, trigger: FunctionTrigger, data: any) => {\n try {\n invariant(trigger.spec);\n invariant(trigger.function);\n\n const script = await space.db.query({ id: trigger.function }, { format: ResultFormat.Plain }).first();\n const { objects: functions } = await space.db\n .query({ __typename: FunctionType.typename }, { format: ResultFormat.Plain })\n .run();\n const func = functions.find((fn) => referenceEquals(fn.source, trigger.function!)) as AnyObjectData | undefined;\n const funcSlug = func?.__meta.keys.find((key) => key.source === USERFUNCTIONS_META_KEY)?.id;\n if (!funcSlug) {\n log.warn('function not deployed', { scriptId: script.id, name: script.name });\n return 404;\n }\n\n const funcUrl = getFunctionUrl(client.config, funcSlug, space.id);\n const triggerData: AnyObjectData = {\n ...getObjectCore(trigger).toPlainObject(),\n // TODO: Remove when functions can query by DXN.\n promptId: trigger.meta?.prompt?.id,\n };\n // TODO: Remove when functions can add objects and easily modify collections (push, splice).\n return (await callFunction(funcUrl, triggerData, data)).status;\n } catch (err) {\n return 400;\n }\n};\n\nconst USERFUNCTIONS_META_KEY = 'dxos.org/service/function';\n\nconst getFunctionUrl = (config: Config, slug: string, spaceId?: string) => {\n const baseUrl = new URL('functions/', config.values.runtime?.services?.edge?.url);\n\n // Leading slashes cause the URL to be treated as an absolute path.\n const relativeUrl = slug.replace(/^\\//, '');\n const url = new URL(`./${relativeUrl}`, baseUrl.toString());\n spaceId && url.searchParams.set('spaceId', spaceId);\n url.protocol = 'https';\n return url.toString();\n};\n\n// TODO(dmaretskyi): Factor out.\n\ntype ReferenceLike = { '/': string } | string;\n\nconst referenceEquals = (a: ReferenceLike, b: ReferenceLike): boolean => {\n const aDXN = toDXN(a);\n const bDXN = toDXN(b);\n return aDXN.toString() === bDXN.toString();\n};\n\nconst toDXN = (ref: ReferenceLike): DXN => {\n if (typeof ref === 'string') {\n if (ref.startsWith('dxn:')) {\n return DXN.parse(ref);\n } else {\n return new DXN(DXN.kind.ECHO, [LOCAL_SPACE_TAG, ref]);\n }\n }\n\n invariant(typeof ref['/'] === 'string');\n return DXN.parse(ref['/']);\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_artifact", "import_react", "import_functions", "import_invariant", "import_log", "import_echo", "import_async", "import_keys", "defaultOptions", "model", "systemPrompt", "ChatProcessor", "constructor", "_client", "_tools", "_extensions", "_options", "_history", "_pending", "signal", "_streaming", "isStreaming", "computed", "value", "length", "messages", "request", "message", "history", "log", "info", "createStatic", "Message", "role", "content", "type", "text", "generate", "_reset", "cancel", "_response", "abort", "pending", "more", "tools", "queueMicrotask", "invariant", "event", "accumulatedMessages", "map", "complete", "push", "isToolUse", "at", "response", "runTools", "extensions", "err", "catch", "undefined", "registerTriggersMutex", "Mutex", "ChatContainer", "chat", "edgeClient", "useEdgeClient", "dispatchPromise", "dispatch", "useIntentDispatcher", "space", "getSpace", "aiClient", "useCapability", "AutomationCapabilities", "AiClient", "artifactDefinitions", "useCapabilities", "Capabilities", "ArtifactDefinition", "globalTools", "Tools", "useMemo", "flat", "flatMap", "definition", "createSystemPrompt", "artifacts", "instructions", "processor", "queueDxn", "DXN", "kind", "QUEUE", "QueueSubspaceTags", "DATA", "id", "queue", "dxn", "parts", "useQueue", "items", "handleSubmit", "useCallback", "append", "React", "StackItem", "Content", "toolbar", "Thread", "streaming", "onSubmit"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var ai_client_A3RRU55B_exports = {};
|
|
20
|
+
__export(ai_client_A3RRU55B_exports, {
|
|
21
|
+
default: () => ai_client_default
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(ai_client_A3RRU55B_exports);
|
|
24
|
+
var import_chunk_ZS5RZ7RM = require("./chunk-ZS5RZ7RM.cjs");
|
|
25
|
+
var import_chunk_5VF5JKUN = require("./chunk-5VF5JKUN.cjs");
|
|
26
|
+
var import_app_framework = require("@dxos/app-framework");
|
|
27
|
+
var import_assistant = require("@dxos/assistant");
|
|
28
|
+
var import_plugin_client = require("@dxos/plugin-client");
|
|
29
|
+
var DEFAULT_AI_SERVICE_URL = "http://localhost:8788";
|
|
30
|
+
var ai_client_default = (context) => {
|
|
31
|
+
const client = context.requestCapability(import_plugin_client.ClientCapabilities.Client);
|
|
32
|
+
const endpoint = client.config.values.runtime?.app?.env?.DX_AI_SERVICE_URL ?? DEFAULT_AI_SERVICE_URL;
|
|
33
|
+
const aiClient = new import_assistant.AIServiceClientImpl({
|
|
34
|
+
endpoint
|
|
35
|
+
});
|
|
36
|
+
return (0, import_app_framework.contributes)(import_chunk_ZS5RZ7RM.AutomationCapabilities.AiClient, aiClient);
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=ai-client-A3RRU55B.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/ai-client.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { contributes, type PluginsContext } from '@dxos/app-framework';\nimport { AIServiceClientImpl } from '@dxos/assistant';\nimport { ClientCapabilities } from '@dxos/plugin-client';\n\nimport { AutomationCapabilities } from './capabilities';\n\n// TODO(wittjosiah): Factor out.\nconst DEFAULT_AI_SERVICE_URL = 'http://localhost:8788';\n\nexport default (context: PluginsContext) => {\n const client = context.requestCapability(ClientCapabilities.Client);\n const endpoint = client.config.values.runtime?.app?.env?.DX_AI_SERVICE_URL ?? DEFAULT_AI_SERVICE_URL;\n const aiClient = new AIServiceClientImpl({ endpoint });\n return contributes(AutomationCapabilities.AiClient, aiClient);\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,2BAAiD;AACjD,uBAAoC;AACpC,2BAAmC;AAKnC,IAAMA,yBAAyB;AAE/B,IAAA,oBAAe,CAACC,YAAAA;AACd,QAAMC,SAASD,QAAQE,kBAAkBC,wCAAmBC,MAAM;AAClE,QAAMC,WAAWJ,OAAOK,OAAOC,OAAOC,SAASC,KAAKC,KAAKC,qBAAqBZ;AAC9E,QAAMa,WAAW,IAAIC,qCAAoB;IAAER;EAAS,CAAA;AACpD,aAAOS,kCAAYC,6CAAuBC,UAAUJ,QAAAA;AACtD;",
|
|
6
|
+
"names": ["DEFAULT_AI_SERVICE_URL", "context", "client", "requestCapability", "ClientCapabilities", "Client", "endpoint", "config", "values", "runtime", "app", "env", "DX_AI_SERVICE_URL", "aiClient", "AIServiceClientImpl", "contributes", "AutomationCapabilities", "AiClient"]
|
|
7
|
+
}
|