dsh-agent-toolkit 0.2.3 → 0.2.5
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/lib/client.js +67 -67
- package/lib/index.js +74 -17
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -67,15 +67,15 @@ window.__ModuleLoader__.load({
|
|
|
67
67
|
document.head.appendChild(tag);
|
|
68
68
|
}
|
|
69
69
|
var delegate_card_module_css_default = {
|
|
70
|
-
"result": "_8wQUq_result",
|
|
71
|
-
"chip": "_8wQUq_chip",
|
|
72
70
|
"summary": "_8wQUq_summary",
|
|
71
|
+
"root": "_8wQUq_root",
|
|
72
|
+
"body": "_8wQUq_body",
|
|
73
|
+
"visuallyHidden": "_8wQUq_visuallyHidden",
|
|
74
|
+
"row": "_8wQUq_row",
|
|
73
75
|
"childLink": "_8wQUq_childLink",
|
|
74
76
|
"prompt": "_8wQUq_prompt",
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"root": "_8wQUq_root",
|
|
78
|
-
"visuallyHidden": "_8wQUq_visuallyHidden"
|
|
77
|
+
"chip": "_8wQUq_chip",
|
|
78
|
+
"result": "_8wQUq_result"
|
|
79
79
|
};
|
|
80
80
|
//#endregion
|
|
81
81
|
//#region src/client/delegate/delegate-card.tsx
|
|
@@ -411,32 +411,32 @@ window.__ModuleLoader__.load({
|
|
|
411
411
|
document.head.appendChild(tag);
|
|
412
412
|
}
|
|
413
413
|
var agents_module_css_default = {
|
|
414
|
-
"
|
|
415
|
-
"builtinBadge": "KsfSLW_builtinBadge",
|
|
414
|
+
"toolGroupTitle": "KsfSLW_toolGroupTitle",
|
|
416
415
|
"actions": "KsfSLW_actions",
|
|
417
|
-
"
|
|
418
|
-
"listPane": "KsfSLW_listPane",
|
|
416
|
+
"createButton": "KsfSLW_createButton",
|
|
419
417
|
"toolMode": "KsfSLW_toolMode",
|
|
420
|
-
"
|
|
421
|
-
"
|
|
422
|
-
"
|
|
423
|
-
"block": "KsfSLW_block",
|
|
424
|
-
"toolGroupTitle": "KsfSLW_toolGroupTitle",
|
|
425
|
-
"agentDesc": "KsfSLW_agentDesc",
|
|
426
|
-
"readonlyId": "KsfSLW_readonlyId",
|
|
418
|
+
"hint": "KsfSLW_hint",
|
|
419
|
+
"editorPane": "KsfSLW_editorPane",
|
|
420
|
+
"error": "KsfSLW_error",
|
|
427
421
|
"dangerButton": "KsfSLW_dangerButton",
|
|
428
|
-
"
|
|
422
|
+
"listPane": "KsfSLW_listPane",
|
|
429
423
|
"toolGroupSet": "KsfSLW_toolGroupSet",
|
|
424
|
+
"select": "KsfSLW_select",
|
|
425
|
+
"textarea": "KsfSLW_textarea",
|
|
426
|
+
"agentRow": "KsfSLW_agentRow",
|
|
427
|
+
"builtinBadge": "KsfSLW_builtinBadge",
|
|
428
|
+
"field": "KsfSLW_field",
|
|
429
|
+
"agentName": "KsfSLW_agentName",
|
|
430
|
+
"agentDesc": "KsfSLW_agentDesc",
|
|
430
431
|
"editor": "KsfSLW_editor",
|
|
432
|
+
"block": "KsfSLW_block",
|
|
431
433
|
"input": "KsfSLW_input",
|
|
434
|
+
"readonlyId": "KsfSLW_readonlyId",
|
|
435
|
+
"toolGrid": "KsfSLW_toolGrid",
|
|
432
436
|
"blockTitle": "KsfSLW_blockTitle",
|
|
433
|
-
"
|
|
434
|
-
"agentName": "KsfSLW_agentName",
|
|
437
|
+
"split": "KsfSLW_split",
|
|
435
438
|
"toolCheck": "KsfSLW_toolCheck",
|
|
436
|
-
"hint": "KsfSLW_hint",
|
|
437
|
-
"createButton": "KsfSLW_createButton",
|
|
438
439
|
"agentRowActive": "KsfSLW_agentRowActive",
|
|
439
|
-
"editorPane": "KsfSLW_editorPane",
|
|
440
440
|
"dialog": "KsfSLW_dialog"
|
|
441
441
|
};
|
|
442
442
|
//#endregion
|
|
@@ -951,24 +951,24 @@ window.__ModuleLoader__.load({
|
|
|
951
951
|
document.head.appendChild(tag);
|
|
952
952
|
}
|
|
953
953
|
var prompt_module_css_default = {
|
|
954
|
-
"
|
|
955
|
-
"
|
|
956
|
-
"
|
|
954
|
+
"tabActive": "VZk1fa_tabActive",
|
|
955
|
+
"listPane": "VZk1fa_listPane",
|
|
956
|
+
"editorPane": "VZk1fa_editorPane",
|
|
957
|
+
"layerName": "VZk1fa_layerName",
|
|
958
|
+
"actions": "VZk1fa_actions",
|
|
957
959
|
"hint": "VZk1fa_hint",
|
|
958
960
|
"layerOrder": "VZk1fa_layerOrder",
|
|
961
|
+
"readonlyTag": "VZk1fa_readonlyTag",
|
|
962
|
+
"tab": "VZk1fa_tab",
|
|
963
|
+
"split": "VZk1fa_split",
|
|
959
964
|
"layerRow": "VZk1fa_layerRow",
|
|
960
|
-
"
|
|
961
|
-
"
|
|
962
|
-
"tabActive": "VZk1fa_tabActive",
|
|
963
|
-
"listPane": "VZk1fa_listPane",
|
|
964
|
-
"layerRowActive": "VZk1fa_layerRowActive",
|
|
965
|
+
"textarea": "VZk1fa_textarea",
|
|
966
|
+
"editor": "VZk1fa_editor",
|
|
965
967
|
"dialog": "VZk1fa_dialog",
|
|
966
|
-
"
|
|
967
|
-
"readonlyTag": "VZk1fa_readonlyTag",
|
|
968
|
-
"editorPane": "VZk1fa_editorPane",
|
|
968
|
+
"tabs": "VZk1fa_tabs",
|
|
969
969
|
"error": "VZk1fa_error",
|
|
970
|
-
"
|
|
971
|
-
"
|
|
970
|
+
"layerRowActive": "VZk1fa_layerRowActive",
|
|
971
|
+
"field": "VZk1fa_field"
|
|
972
972
|
};
|
|
973
973
|
//#endregion
|
|
974
974
|
//#region src/client/prompt/PromptLayersModal.tsx
|
|
@@ -1454,11 +1454,11 @@ window.__ModuleLoader__.load({
|
|
|
1454
1454
|
var chart_module_css_default = {
|
|
1455
1455
|
"chartTheme": "_8LXSJW_chartTheme",
|
|
1456
1456
|
"swatchCached": "_8LXSJW_swatchCached",
|
|
1457
|
-
"swatchFresh": "_8LXSJW_swatchFresh",
|
|
1458
1457
|
"tooltipTitle": "_8LXSJW_tooltipTitle",
|
|
1459
|
-
"
|
|
1458
|
+
"swatchFresh": "_8LXSJW_swatchFresh",
|
|
1460
1459
|
"tooltip": "_8LXSJW_tooltip",
|
|
1461
|
-
"tooltipTotal": "_8LXSJW_tooltipTotal"
|
|
1460
|
+
"tooltipTotal": "_8LXSJW_tooltipTotal",
|
|
1461
|
+
"legend": "_8LXSJW_legend"
|
|
1462
1462
|
};
|
|
1463
1463
|
//#endregion
|
|
1464
1464
|
//#region \0dsh-css:D:\work\github\dsh\dsh-agent-toolkit\packages\usage\src\client\usage\ActivityHeatmap.module.css.mjs
|
|
@@ -1472,14 +1472,14 @@ window.__ModuleLoader__.load({
|
|
|
1472
1472
|
document.head.appendChild(tag);
|
|
1473
1473
|
}
|
|
1474
1474
|
var ActivityHeatmap_module_css_default = {
|
|
1475
|
-
"
|
|
1476
|
-
"months": "hjrYrq_months",
|
|
1475
|
+
"grid": "hjrYrq_grid",
|
|
1477
1476
|
"level3": "hjrYrq_level3",
|
|
1478
|
-
"level2": "hjrYrq_level2",
|
|
1479
1477
|
"level4": "hjrYrq_level4",
|
|
1480
|
-
"
|
|
1481
|
-
"
|
|
1482
|
-
"week": "hjrYrq_week"
|
|
1478
|
+
"months": "hjrYrq_months",
|
|
1479
|
+
"level0": "hjrYrq_level0",
|
|
1480
|
+
"week": "hjrYrq_week",
|
|
1481
|
+
"level2": "hjrYrq_level2",
|
|
1482
|
+
"level1": "hjrYrq_level1"
|
|
1483
1483
|
};
|
|
1484
1484
|
//#endregion
|
|
1485
1485
|
//#region ../usage/src/client/usage/ActivityHeatmap.tsx
|
|
@@ -52517,18 +52517,18 @@ ${te.current.stack}
|
|
|
52517
52517
|
}
|
|
52518
52518
|
var UsageModal_module_css_default = {
|
|
52519
52519
|
"row": "MODeXa_row",
|
|
52520
|
-
"dateLabel": "MODeXa_dateLabel",
|
|
52521
|
-
"pager": "MODeXa_pager",
|
|
52522
|
-
"tab": "MODeXa_tab",
|
|
52523
52520
|
"rowName": "MODeXa_rowName",
|
|
52524
|
-
"compaction": "MODeXa_compaction",
|
|
52525
|
-
"tabActive": "MODeXa_tabActive",
|
|
52526
|
-
"sectionTitle": "MODeXa_sectionTitle",
|
|
52527
52521
|
"rowCalls": "MODeXa_rowCalls",
|
|
52528
52522
|
"dialog": "MODeXa_dialog",
|
|
52523
|
+
"sectionTitle": "MODeXa_sectionTitle",
|
|
52524
|
+
"dateLabel": "MODeXa_dateLabel",
|
|
52525
|
+
"pager": "MODeXa_pager",
|
|
52526
|
+
"compaction": "MODeXa_compaction",
|
|
52529
52527
|
"pagerButton": "MODeXa_pagerButton",
|
|
52530
52528
|
"tabs": "MODeXa_tabs",
|
|
52531
|
-
"total": "MODeXa_total"
|
|
52529
|
+
"total": "MODeXa_total",
|
|
52530
|
+
"tab": "MODeXa_tab",
|
|
52531
|
+
"tabActive": "MODeXa_tabActive"
|
|
52532
52532
|
};
|
|
52533
52533
|
//#endregion
|
|
52534
52534
|
//#region ../usage/src/client/usage/UsageModal.tsx
|
|
@@ -55153,29 +55153,29 @@ ${te.current.stack}
|
|
|
55153
55153
|
document.head.appendChild(tag);
|
|
55154
55154
|
}
|
|
55155
55155
|
var bots_module_css_default = {
|
|
55156
|
-
"tabActive": "vTbXga_tabActive",
|
|
55157
55156
|
"botRow": "vTbXga_botRow",
|
|
55158
|
-
"step": "vTbXga_step",
|
|
55159
|
-
"tabs": "vTbXga_tabs",
|
|
55160
|
-
"select": "vTbXga_select",
|
|
55161
|
-
"hint": "vTbXga_hint",
|
|
55162
55157
|
"channelBadge": "vTbXga_channelBadge",
|
|
55163
|
-
"groupTitle": "vTbXga_groupTitle",
|
|
55164
55158
|
"field": "vTbXga_field",
|
|
55165
|
-
"
|
|
55166
|
-
"createButton": "vTbXga_createButton",
|
|
55167
|
-
"tab": "vTbXga_tab",
|
|
55159
|
+
"select": "vTbXga_select",
|
|
55168
55160
|
"status": "vTbXga_status",
|
|
55169
|
-
"stepActive": "vTbXga_stepActive",
|
|
55170
55161
|
"group": "vTbXga_group",
|
|
55162
|
+
"botName": "vTbXga_botName",
|
|
55163
|
+
"textarea": "vTbXga_textarea",
|
|
55164
|
+
"dialog": "vTbXga_dialog",
|
|
55171
55165
|
"input": "vTbXga_input",
|
|
55166
|
+
"steps": "vTbXga_steps",
|
|
55167
|
+
"createButton": "vTbXga_createButton",
|
|
55168
|
+
"tab": "vTbXga_tab",
|
|
55169
|
+
"tabActive": "vTbXga_tabActive",
|
|
55170
|
+
"hint": "vTbXga_hint",
|
|
55171
|
+
"step": "vTbXga_step",
|
|
55172
|
+
"stepSeparator": "vTbXga_stepSeparator",
|
|
55173
|
+
"tabs": "vTbXga_tabs",
|
|
55172
55174
|
"scanSection": "vTbXga_scanSection",
|
|
55173
55175
|
"error": "vTbXga_error",
|
|
55174
|
-
"
|
|
55175
|
-
"
|
|
55176
|
-
"
|
|
55177
|
-
"botName": "vTbXga_botName",
|
|
55178
|
-
"textarea": "vTbXga_textarea"
|
|
55176
|
+
"stepActive": "vTbXga_stepActive",
|
|
55177
|
+
"formActions": "vTbXga_formActions",
|
|
55178
|
+
"groupTitle": "vTbXga_groupTitle"
|
|
55179
55179
|
};
|
|
55180
55180
|
//#endregion
|
|
55181
55181
|
//#region src/client/bots/BotForm.tsx
|
package/lib/index.js
CHANGED
|
@@ -12,6 +12,7 @@ import { SessionId } from "@deepseek-ai/dsh-session";
|
|
|
12
12
|
import { credentialRef } from "@deepseek-ai/dsh-credentials";
|
|
13
13
|
import * as lark from "@larksuiteoapi/node-sdk";
|
|
14
14
|
import { randomBytes, randomUUID } from "node:crypto";
|
|
15
|
+
import { bindScopeParent, createScope, scopeOf } from "@deepseek-ai/dsh-scope";
|
|
15
16
|
import { setupUsage } from "@dsh-agent-toolkit/token-usage";
|
|
16
17
|
//#region src/agents/store.ts
|
|
17
18
|
/** agents 注册表存储域声明:记录 schema + domain 布局的单一来源。 */
|
|
@@ -1353,6 +1354,15 @@ function createDelegateTool(toolName, deps) {
|
|
|
1353
1354
|
/** 团队名册段在 prompt 中的位置:紧随内置 subagent 段(116.5)之后。 */
|
|
1354
1355
|
const TEAM_SECTION_ORDER = 116.6;
|
|
1355
1356
|
/**
|
|
1357
|
+
* 团队名册段文本:仅当该 agent scope 的可见工具里确有委派工具时渲染,否则空
|
|
1358
|
+
* (空段渲染时被丢弃)。工具白名单 restrict 只作用于 tools 视图,名册段必须
|
|
1359
|
+
* 自行按 `tools.get(name, scope)` 联动,否则没勾委派的 bot 提示词仍会出现委派段落。
|
|
1360
|
+
*/
|
|
1361
|
+
function teamSectionText(toolName, roles, toolVisible) {
|
|
1362
|
+
if (!toolVisible) return "";
|
|
1363
|
+
return `你有一组可委派的成员:用 ${toolName} 把自包含的子任务委派给合适的成员,成员结果会作为工具返回值回到本对话。\n可用成员:\n${roles.filter((r) => r.id !== "main").map((r) => `${r.id}: ${r.description ?? r.name}`).join("\n")}`;
|
|
1364
|
+
}
|
|
1365
|
+
/**
|
|
1356
1366
|
* 挂载 team_delegate 工具与函数式团队提示段。
|
|
1357
1367
|
* provider 能力守卫与生命周期镜像同归档 tool-subagent:persona/depthLimit 缺失响亮报错,
|
|
1358
1368
|
* 工具随 provider 在场与否挂载/摘除。名册来自注册表(main 排除),工具与提示段都经
|
|
@@ -1399,10 +1409,7 @@ function setupDelegate(ctx, config, registry, channels) {
|
|
|
1399
1409
|
ctx.systemPrompt.section({
|
|
1400
1410
|
name: "plugin:dsh-agent-toolkit:team",
|
|
1401
1411
|
order: TEAM_SECTION_ORDER,
|
|
1402
|
-
text: () =>
|
|
1403
|
-
const rosterText = registry.list().filter((r) => r.id !== "main").map((r) => `${r.id}: ${r.description ?? r.name}`).join("\n");
|
|
1404
|
-
return `你有一组可委派的成员:用 ${config.toolName} 把自包含的子任务委派给合适的成员,成员结果会作为工具返回值回到本对话。\n可用成员:\n${rosterText}`;
|
|
1405
|
-
}
|
|
1412
|
+
text: (context) => teamSectionText(config.toolName, registry.list(), ctx.tools.get(config.toolName, context.scope) !== void 0)
|
|
1406
1413
|
});
|
|
1407
1414
|
}
|
|
1408
1415
|
//#endregion
|
|
@@ -1668,18 +1675,15 @@ function setupCreateAgentCommand(ctx, deps) {
|
|
|
1668
1675
|
//#region src/channels/agent-setup.ts
|
|
1669
1676
|
/** bot 会话角色 persona 的 scoped 段名:与全局 persona 层同名,scoped 注册即 shadow 覆盖主 Agent persona。 */
|
|
1670
1677
|
const TOOLKIT_PERSONA_SECTION = "prompt-stack:persona";
|
|
1671
|
-
/** 默认加载器:复刻 preset mount 的模块解析——loader 的 unwrapExports 取 `default ?? 命名导出模块`。 */
|
|
1672
|
-
async function loadToolModule(specifier) {
|
|
1673
|
-
const mod = await import(specifier);
|
|
1674
|
-
return mod.default ?? mod;
|
|
1675
|
-
}
|
|
1676
1678
|
/**
|
|
1677
|
-
* 组合 agent
|
|
1678
|
-
*
|
|
1679
|
-
* 顺序敏感:restrict
|
|
1679
|
+
* 组合 agent 作用域:先把 agent scope 父链挂到基础工具行 standing scope(工具成为
|
|
1680
|
+
* 继承面),再叠 bot 的 persona 与 tools 白名单。
|
|
1681
|
+
* 顺序敏感:restrict 必须在 join 之后——宿主 tools.restrict() 只校验并过滤继承面
|
|
1682
|
+
* (global + 祖先 scope 层),own 层(agentCtx 直接挂载)的名字既不可 restrict 也
|
|
1683
|
+
* 不受 restrict 影响,直接挂进 agentCtx 的白名单会抛 unknown global tools。
|
|
1680
1684
|
*/
|
|
1681
|
-
async function setupAgentScope(agentCtx, hooks,
|
|
1682
|
-
|
|
1685
|
+
async function setupAgentScope(agentCtx, hooks, toolsScope) {
|
|
1686
|
+
await toolsScope.join(agentCtx);
|
|
1683
1687
|
if (hooks.persona !== void 0) agentCtx.systemPrompt.section({
|
|
1684
1688
|
name: TOOLKIT_PERSONA_SECTION,
|
|
1685
1689
|
order: 10,
|
|
@@ -2747,6 +2751,55 @@ var BotRuntime = class {
|
|
|
2747
2751
|
}
|
|
2748
2752
|
};
|
|
2749
2753
|
//#endregion
|
|
2754
|
+
//#region src/channels/tool-scope.ts
|
|
2755
|
+
/** 默认加载器:复刻 preset mount 的模块解析——loader 的 unwrapExports 取 `default ?? 命名导出模块`。 */
|
|
2756
|
+
async function loadToolModule(specifier) {
|
|
2757
|
+
const mod = await import(specifier);
|
|
2758
|
+
return mod.default ?? mod;
|
|
2759
|
+
}
|
|
2760
|
+
/** 建一个 bot 会话共用的工具行 standing scope(所有 bot 会话挂同一套 BASIC_TOOLS)。 */
|
|
2761
|
+
function createToolsScope(ctx, loadTool = loadToolModule) {
|
|
2762
|
+
let scope;
|
|
2763
|
+
let mount;
|
|
2764
|
+
let generation = 0;
|
|
2765
|
+
function ensure() {
|
|
2766
|
+
mount ??= (async () => {
|
|
2767
|
+
const key = {
|
|
2768
|
+
origin: "dsh-agent-toolkit",
|
|
2769
|
+
kind: "bots-tools",
|
|
2770
|
+
gen: ++generation
|
|
2771
|
+
};
|
|
2772
|
+
const created = createScope(ctx, key);
|
|
2773
|
+
scope = created;
|
|
2774
|
+
try {
|
|
2775
|
+
for (const tool of BASIC_TOOLS) await created.ctx.plugin(await loadTool(tool.id), tool.config);
|
|
2776
|
+
} catch (error) {
|
|
2777
|
+
if (scope === created) scope = void 0;
|
|
2778
|
+
mount = void 0;
|
|
2779
|
+
await created.dispose().catch(() => void 0);
|
|
2780
|
+
throw error;
|
|
2781
|
+
}
|
|
2782
|
+
return key;
|
|
2783
|
+
})();
|
|
2784
|
+
return mount;
|
|
2785
|
+
}
|
|
2786
|
+
return {
|
|
2787
|
+
async join(agentCtx) {
|
|
2788
|
+
const agentKey = scopeOf(agentCtx);
|
|
2789
|
+
if (agentKey === void 0) throw new Error("tools-scope: refusing to join an unscoped agent context; per-agent composition requires a scope key");
|
|
2790
|
+
const standing = await ensure();
|
|
2791
|
+
bindScopeParent(agentKey, standing);
|
|
2792
|
+
return standing;
|
|
2793
|
+
},
|
|
2794
|
+
async dispose() {
|
|
2795
|
+
mount = void 0;
|
|
2796
|
+
const current = scope;
|
|
2797
|
+
scope = void 0;
|
|
2798
|
+
await current?.dispose();
|
|
2799
|
+
}
|
|
2800
|
+
};
|
|
2801
|
+
}
|
|
2802
|
+
//#endregion
|
|
2750
2803
|
//#region src/bots/api.ts
|
|
2751
2804
|
/** 浏览器半 RPC:单前缀路由 /dsh-agent-toolkit/api/bots + 内部路径分发。 */
|
|
2752
2805
|
const MAX_BODY_BYTES = 65536;
|
|
@@ -3089,21 +3142,22 @@ function setupBots(ctx, config, deps) {
|
|
|
3089
3142
|
await ctx.credentials.set(credentialRef(ref), secret);
|
|
3090
3143
|
return ref;
|
|
3091
3144
|
};
|
|
3092
|
-
/** 创作期注入已迁至 agent-setup.ts
|
|
3145
|
+
/** 创作期注入已迁至 agent-setup.ts + tool-scope.ts(基础工具行 standing scope 挂载 + persona/tools),preset 机制整体移除。 */
|
|
3146
|
+
const toolsScope = createToolsScope(ctx);
|
|
3093
3147
|
const agentsPort = {
|
|
3094
3148
|
async create(input) {
|
|
3095
3149
|
return adaptAgent(await ctx.agents.create({
|
|
3096
3150
|
sessionId: SessionId(input.sessionId),
|
|
3097
3151
|
meta: { cwd: input.cwd },
|
|
3098
3152
|
...input.agentOptions !== void 0 ? { agentOptions: input.agentOptions } : {},
|
|
3099
|
-
setup: (agentCtx) => setupAgentScope(agentCtx, input.hooks)
|
|
3153
|
+
setup: (agentCtx) => setupAgentScope(agentCtx, input.hooks, toolsScope)
|
|
3100
3154
|
}));
|
|
3101
3155
|
},
|
|
3102
3156
|
async resume(input) {
|
|
3103
3157
|
return adaptAgent(await ctx.agents.resume({
|
|
3104
3158
|
resumeSessionId: SessionId(input.sessionId),
|
|
3105
3159
|
...input.agentOptions !== void 0 ? { agentOptions: input.agentOptions } : {},
|
|
3106
|
-
setup: (agentCtx) => setupAgentScope(agentCtx, input.hooks)
|
|
3160
|
+
setup: (agentCtx) => setupAgentScope(agentCtx, input.hooks, toolsScope)
|
|
3107
3161
|
}));
|
|
3108
3162
|
}
|
|
3109
3163
|
};
|
|
@@ -3207,6 +3261,9 @@ function setupBots(ctx, config, deps) {
|
|
|
3207
3261
|
});
|
|
3208
3262
|
return () => dispose();
|
|
3209
3263
|
});
|
|
3264
|
+
ctx.effect(() => async () => {
|
|
3265
|
+
await toolsScope.dispose();
|
|
3266
|
+
});
|
|
3210
3267
|
ctx.effect(() => async () => {
|
|
3211
3268
|
registerAppService.dispose();
|
|
3212
3269
|
});
|