@downcity/plugins 1.0.52 → 1.0.56
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/bin/BuiltinPlugins.d.ts +2 -3
- package/bin/BuiltinPlugins.d.ts.map +1 -1
- package/bin/BuiltinPlugins.js +2 -2
- package/bin/BuiltinPlugins.js.map +1 -1
- package/bin/asr/Plugin.d.ts +1 -2
- package/bin/asr/Plugin.d.ts.map +1 -1
- package/bin/asr/Plugin.js +2 -2
- package/bin/asr/Plugin.js.map +1 -1
- package/bin/auth/Plugin.d.ts +1 -2
- package/bin/auth/Plugin.d.ts.map +1 -1
- package/bin/auth/Plugin.js +2 -2
- package/bin/auth/Plugin.js.map +1 -1
- package/bin/chat/ChatPlugin.d.ts +1 -2
- package/bin/chat/ChatPlugin.d.ts.map +1 -1
- package/bin/chat/ChatPlugin.js +3 -12
- package/bin/chat/ChatPlugin.js.map +1 -1
- package/bin/chat/PROMPT.direct.d.ts +1 -1
- package/bin/chat/PROMPT.direct.d.ts.map +1 -1
- package/bin/chat/PROMPT.direct.js +1 -1
- package/bin/chat/PROMPT.direct.js.map +1 -1
- package/bin/chat/channels/qq/PROMPT.direct.d.ts +1 -1
- package/bin/chat/channels/qq/PROMPT.direct.d.ts.map +1 -1
- package/bin/chat/channels/qq/PROMPT.direct.js +1 -1
- package/bin/chat/channels/qq/PROMPT.direct.js.map +1 -1
- package/bin/chat/channels/telegram/Bot.d.ts +6 -0
- package/bin/chat/channels/telegram/Bot.d.ts.map +1 -1
- package/bin/chat/channels/telegram/Bot.js +24 -0
- package/bin/chat/channels/telegram/Bot.js.map +1 -1
- package/bin/chat/channels/telegram/TelegramPlatformClient.d.ts +14 -0
- package/bin/chat/channels/telegram/TelegramPlatformClient.d.ts.map +1 -1
- package/bin/chat/channels/telegram/TelegramPlatformClient.js +39 -5
- package/bin/chat/channels/telegram/TelegramPlatformClient.js.map +1 -1
- package/bin/contact/ContactPlugin.d.ts +1 -2
- package/bin/contact/ContactPlugin.d.ts.map +1 -1
- package/bin/contact/ContactPlugin.js +2 -2
- package/bin/contact/ContactPlugin.js.map +1 -1
- package/bin/contact/PROMPT.d.ts +1 -1
- package/bin/contact/PROMPT.d.ts.map +1 -1
- package/bin/contact/PROMPT.js +1 -1
- package/bin/contact/PROMPT.js.map +1 -1
- package/bin/image/ImagePlugin.d.ts +61 -0
- package/bin/image/ImagePlugin.d.ts.map +1 -0
- package/bin/image/ImagePlugin.js +189 -0
- package/bin/image/ImagePlugin.js.map +1 -0
- package/bin/image/types/ImagePlugin.d.ts +136 -0
- package/bin/image/types/ImagePlugin.d.ts.map +1 -0
- package/bin/image/types/ImagePlugin.js +10 -0
- package/bin/image/types/ImagePlugin.js.map +1 -0
- package/bin/index.d.ts +2 -0
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +1 -0
- package/bin/index.js.map +1 -1
- package/bin/shell/ShellPlugin.d.ts +1 -2
- package/bin/shell/ShellPlugin.d.ts.map +1 -1
- package/bin/shell/ShellPlugin.js +2 -2
- package/bin/shell/ShellPlugin.js.map +1 -1
- package/bin/skill/Action.d.ts +8 -3
- package/bin/skill/Action.d.ts.map +1 -1
- package/bin/skill/Action.js +9 -11
- package/bin/skill/Action.js.map +1 -1
- package/bin/skill/Command.d.ts +1 -1
- package/bin/skill/Command.d.ts.map +1 -1
- package/bin/skill/Command.js +3 -10
- package/bin/skill/Command.js.map +1 -1
- package/bin/skill/Config.d.ts +9 -9
- package/bin/skill/Config.d.ts.map +1 -1
- package/bin/skill/Config.js +36 -24
- package/bin/skill/Config.js.map +1 -1
- package/bin/skill/PROMPT.d.ts +1 -1
- package/bin/skill/PROMPT.d.ts.map +1 -1
- package/bin/skill/PROMPT.js +1 -1
- package/bin/skill/PROMPT.js.map +1 -1
- package/bin/skill/Plugin.d.ts +2 -2
- package/bin/skill/Plugin.d.ts.map +1 -1
- package/bin/skill/Plugin.js +20 -37
- package/bin/skill/Plugin.js.map +1 -1
- package/bin/skill/runtime/Discovery.d.ts +3 -3
- package/bin/skill/runtime/Discovery.d.ts.map +1 -1
- package/bin/skill/runtime/Discovery.js +37 -14
- package/bin/skill/runtime/Discovery.js.map +1 -1
- package/bin/skill/runtime/Paths.d.ts +5 -5
- package/bin/skill/runtime/Paths.d.ts.map +1 -1
- package/bin/skill/runtime/Paths.js +23 -33
- package/bin/skill/runtime/Paths.js.map +1 -1
- package/bin/skill/runtime/Prompt.d.ts +2 -2
- package/bin/skill/runtime/Prompt.d.ts.map +1 -1
- package/bin/skill/runtime/Prompt.js +3 -8
- package/bin/skill/runtime/Prompt.js.map +1 -1
- package/bin/skill/runtime/SystemProvider.d.ts +2 -2
- package/bin/skill/runtime/SystemProvider.d.ts.map +1 -1
- package/bin/skill/runtime/SystemProvider.js +2 -2
- package/bin/skill/runtime/SystemProvider.js.map +1 -1
- package/bin/skill/types/SkillPlugin.d.ts +34 -12
- package/bin/skill/types/SkillPlugin.d.ts.map +1 -1
- package/bin/skill/types/SkillPlugin.js +2 -1
- package/bin/skill/types/SkillPlugin.js.map +1 -1
- package/bin/skill/types/SkillRoot.d.ts +1 -1
- package/bin/task/Action.js +2 -2
- package/bin/task/Action.js.map +1 -1
- package/bin/task/PROMPT.d.ts +1 -1
- package/bin/task/PROMPT.d.ts.map +1 -1
- package/bin/task/PROMPT.js +1 -1
- package/bin/task/PROMPT.js.map +1 -1
- package/bin/task/TaskPlugin.d.ts +1 -2
- package/bin/task/TaskPlugin.d.ts.map +1 -1
- package/bin/task/TaskPlugin.js +2 -2
- package/bin/task/TaskPlugin.js.map +1 -1
- package/bin/tts/Plugin.d.ts +1 -2
- package/bin/tts/Plugin.d.ts.map +1 -1
- package/bin/tts/Plugin.js +6 -6
- package/bin/tts/Plugin.js.map +1 -1
- package/bin/web/PROMPT.agent-browser.d.ts +1 -1
- package/bin/web/PROMPT.agent-browser.d.ts.map +1 -1
- package/bin/web/PROMPT.agent-browser.js +1 -1
- package/bin/web/PROMPT.agent-browser.js.map +1 -1
- package/bin/web/Plugin.d.ts +1 -2
- package/bin/web/Plugin.d.ts.map +1 -1
- package/bin/web/Plugin.js +10 -3
- package/bin/web/Plugin.js.map +1 -1
- package/bin/workboard/Plugin.d.ts +1 -2
- package/bin/workboard/Plugin.d.ts.map +1 -1
- package/bin/workboard/Plugin.js +2 -2
- package/bin/workboard/Plugin.js.map +1 -1
- package/package.json +2 -2
- package/src/BuiltinPlugins.ts +3 -6
- package/src/asr/Plugin.ts +2 -3
- package/src/auth/Plugin.ts +2 -3
- package/src/chat/ChatPlugin.ts +3 -14
- package/src/chat/PROMPT.direct.ts +1 -1
- package/src/chat/PROMPT.direct.ts.txt +5 -7
- package/src/chat/channels/qq/PROMPT.direct.ts +1 -1
- package/src/chat/channels/qq/PROMPT.direct.ts.txt +1 -1
- package/src/chat/channels/telegram/Bot.ts +22 -0
- package/src/chat/channels/telegram/TelegramPlatformClient.ts +42 -6
- package/src/contact/ContactPlugin.ts +2 -3
- package/src/contact/PROMPT.ts +1 -1
- package/src/contact/PROMPT.ts.txt +12 -12
- package/src/image/ImagePlugin.ts +250 -0
- package/src/image/types/ImagePlugin.ts +157 -0
- package/src/index.ts +13 -0
- package/src/shell/ShellPlugin.ts +2 -3
- package/src/skill/Action.ts +20 -9
- package/src/skill/Command.ts +3 -13
- package/src/skill/Config.ts +41 -34
- package/src/skill/PROMPT.ts +1 -1
- package/src/skill/PROMPT.ts.txt +14 -2
- package/src/skill/Plugin.ts +205 -214
- package/src/skill/runtime/Discovery.ts +43 -17
- package/src/skill/runtime/Paths.ts +24 -35
- package/src/skill/runtime/Prompt.ts +4 -10
- package/src/skill/runtime/SystemProvider.ts +4 -4
- package/src/skill/types/SkillPlugin.ts +39 -12
- package/src/skill/types/SkillRoot.ts +1 -1
- package/src/task/Action.ts +2 -2
- package/src/task/PROMPT.ts +1 -1
- package/src/task/PROMPT.ts.txt +10 -10
- package/src/task/TaskPlugin.ts +2 -3
- package/src/tts/Plugin.ts +6 -7
- package/src/web/PROMPT.agent-browser.ts +1 -1
- package/src/web/PROMPT.agent-browser.ts.txt +1 -1
- package/src/web/Plugin.ts +3 -4
- package/src/workboard/Plugin.ts +2 -3
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
* Skills roots resolution.
|
|
3
3
|
*
|
|
4
4
|
* 关键点(中文)
|
|
5
|
-
* - roots 分三类:项目内(project)、用户目录(home
|
|
6
|
-
* -
|
|
5
|
+
* - roots 分三类:项目内(project)、用户目录(home),以及构造参数路径(custom)
|
|
6
|
+
* - SkillPlugin constructor 是唯一配置入口,不再读取 downcity.json 的 skill 私有配置
|
|
7
7
|
* - 兼容 `<any>/skills` 这种布局:如果 root basename 不是 `skills` 且其子目录 `skills/` 存在,则优先扫描 `<root>/skills`
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import fs from "fs-extra";
|
|
11
11
|
import path from "node:path";
|
|
12
|
-
import
|
|
13
|
-
import { readSkillPluginConfig } from "../Config.js";
|
|
12
|
+
import { resolveSkillPluginOptions } from "../Config.js";
|
|
14
13
|
import type { SkillRoot } from "@/skill/types/SkillRoot.js";
|
|
14
|
+
import type { SkillPluginOptions } from "@/skill/types/SkillPlugin.js";
|
|
15
15
|
import { expandHome, uniqStrings } from "./Utils.js";
|
|
16
16
|
|
|
17
17
|
function normalizeSkillRootCandidate(candidate: string): string {
|
|
@@ -38,13 +38,17 @@ function resolveSkillRootPath(projectRoot: string, raw: string): string {
|
|
|
38
38
|
|
|
39
39
|
export function getClaudeSkillSearchRoots(
|
|
40
40
|
projectRoot: string,
|
|
41
|
-
|
|
41
|
+
options?: SkillPluginOptions | null,
|
|
42
42
|
): SkillRoot[] {
|
|
43
|
-
const
|
|
44
|
-
const configured =
|
|
43
|
+
const skillPluginOptions = resolveSkillPluginOptions(options);
|
|
44
|
+
const configured = skillPluginOptions.paths.map((x) => String(x));
|
|
45
45
|
|
|
46
|
-
const defaultsProject
|
|
47
|
-
|
|
46
|
+
const defaultsProject = skillPluginOptions.use.includes("project")
|
|
47
|
+
? [".agents/skills"]
|
|
48
|
+
: [];
|
|
49
|
+
const defaultsHome = skillPluginOptions.use.includes("home")
|
|
50
|
+
? ["~/.agents/skills"]
|
|
51
|
+
: [];
|
|
48
52
|
|
|
49
53
|
const rawConfigured = uniqStrings(configured);
|
|
50
54
|
const rawProject = uniqStrings(defaultsProject);
|
|
@@ -65,32 +69,17 @@ export function getClaudeSkillSearchRoots(
|
|
|
65
69
|
});
|
|
66
70
|
}
|
|
67
71
|
|
|
68
|
-
// 2)
|
|
72
|
+
// 2) constructor paths:用户显式传入的路径,统一视为 custom 来源
|
|
69
73
|
for (const raw of rawConfigured) {
|
|
70
74
|
const resolved = normalizeSkillRootCandidate(resolveSkillRootPath(projectRoot, raw));
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
resolved,
|
|
80
|
-
display: raw,
|
|
81
|
-
priority: 12,
|
|
82
|
-
trustedWhenExternalDisabled: true,
|
|
83
|
-
});
|
|
84
|
-
} else {
|
|
85
|
-
roots.push({
|
|
86
|
-
source: "config",
|
|
87
|
-
raw,
|
|
88
|
-
resolved,
|
|
89
|
-
display: raw,
|
|
90
|
-
priority: 40,
|
|
91
|
-
trustedWhenExternalDisabled: false,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
75
|
+
roots.push({
|
|
76
|
+
source: "custom",
|
|
77
|
+
raw,
|
|
78
|
+
resolved,
|
|
79
|
+
display: raw,
|
|
80
|
+
priority: 12,
|
|
81
|
+
trustedWhenExternalDisabled: true,
|
|
82
|
+
});
|
|
94
83
|
}
|
|
95
84
|
|
|
96
85
|
// 3) home root(用户目录)
|
|
@@ -120,9 +109,9 @@ export function getClaudeSkillSearchRoots(
|
|
|
120
109
|
// Back-compat(内部仅用于 prompt 展示):保留旧 API 形状,避免外部 import 立刻断裂。
|
|
121
110
|
export function getClaudeSkillSearchPaths(
|
|
122
111
|
projectRoot: string,
|
|
123
|
-
|
|
112
|
+
options?: SkillPluginOptions | null,
|
|
124
113
|
): { raw: string[]; resolved: string[] } {
|
|
125
|
-
const roots = getClaudeSkillSearchRoots(projectRoot,
|
|
114
|
+
const roots = getClaudeSkillSearchRoots(projectRoot, options);
|
|
126
115
|
return {
|
|
127
116
|
raw: roots.map((r) => r.display),
|
|
128
117
|
resolved: roots.map((r) => r.resolved),
|
|
@@ -7,10 +7,9 @@
|
|
|
7
7
|
* - 仅做字符串渲染,不做文件 IO。
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import type { DowncityConfig } from "@downcity/agent/internal/config/Config.js";
|
|
11
|
-
import { readSkillPluginConfig } from "../Config.js";
|
|
12
10
|
import { getClaudeSkillSearchRoots } from "./Paths.js";
|
|
13
11
|
import type { ClaudeSkill } from "@/skill/types/ClaudeSkill.js";
|
|
12
|
+
import type { SkillPluginOptions } from "@/skill/types/SkillPlugin.js";
|
|
14
13
|
|
|
15
14
|
/**
|
|
16
15
|
* 渲染 skills 系统提示片段。
|
|
@@ -21,11 +20,10 @@ import type { ClaudeSkill } from "@/skill/types/ClaudeSkill.js";
|
|
|
21
20
|
*/
|
|
22
21
|
export function renderClaudeSkillsPromptSection(
|
|
23
22
|
projectRoot: string,
|
|
24
|
-
|
|
23
|
+
options: SkillPluginOptions | null | undefined,
|
|
25
24
|
skills: ClaudeSkill[],
|
|
26
25
|
): string {
|
|
27
|
-
const roots = getClaudeSkillSearchRoots(projectRoot,
|
|
28
|
-
const allowExternal = readSkillPluginConfig(config).allowExternalPaths;
|
|
26
|
+
const roots = getClaudeSkillSearchRoots(projectRoot, options);
|
|
29
27
|
|
|
30
28
|
const skillsSection =
|
|
31
29
|
skills.length > 0
|
|
@@ -41,11 +39,7 @@ export function renderClaudeSkillsPromptSection(
|
|
|
41
39
|
roots.length > 0
|
|
42
40
|
? roots
|
|
43
41
|
.map((root) => {
|
|
44
|
-
|
|
45
|
-
root.source === "config" && !allowExternal
|
|
46
|
-
? " (disabled: allowExternalPaths=false)"
|
|
47
|
-
: "";
|
|
48
|
-
return `- [${root.source}] ${root.display}${externalNote}`;
|
|
42
|
+
return `- [${root.source}] ${root.display}`;
|
|
49
43
|
})
|
|
50
44
|
.join("\n")
|
|
51
45
|
: "- (none)";
|
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { getSessionRunContext } from "@downcity/agent/internal/executor/SessionRunScope.js";
|
|
11
|
-
import type { DowncityConfig } from "@downcity/agent/internal/types/config/DowncityConfig.js";
|
|
12
11
|
import { discoverClaudeSkillsSync } from "./Discovery.js";
|
|
13
12
|
import { renderClaudeSkillsPromptSection } from "./Prompt.js";
|
|
14
13
|
import { setSessionAvailableSkills } from "./Store.js";
|
|
14
|
+
import type { SkillPluginOptions } from "@/skill/types/SkillPlugin.js";
|
|
15
15
|
|
|
16
16
|
type SkillSystemRuntime = {
|
|
17
17
|
rootPath: string;
|
|
18
|
-
|
|
18
|
+
options?: SkillPluginOptions | null;
|
|
19
19
|
};
|
|
20
20
|
|
|
21
21
|
function getCurrentSessionId(): string {
|
|
@@ -37,7 +37,7 @@ export async function buildSkillsSystemText(
|
|
|
37
37
|
const sessionId = getCurrentSessionId();
|
|
38
38
|
const discoveredSkills = discoverClaudeSkillsSync(
|
|
39
39
|
runtime.rootPath,
|
|
40
|
-
runtime.
|
|
40
|
+
runtime.options,
|
|
41
41
|
);
|
|
42
42
|
|
|
43
43
|
if (sessionId) {
|
|
@@ -46,7 +46,7 @@ export async function buildSkillsSystemText(
|
|
|
46
46
|
|
|
47
47
|
return renderClaudeSkillsPromptSection(
|
|
48
48
|
runtime.rootPath,
|
|
49
|
-
runtime.
|
|
49
|
+
runtime.options,
|
|
50
50
|
discoveredSkills,
|
|
51
51
|
).trim();
|
|
52
52
|
}
|
|
@@ -3,9 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 关键点(中文)
|
|
5
5
|
* - skill 已迁到 plugin 体系,因此把对外 action 名称与 payload 类型统一放到 `types/`。
|
|
6
|
-
* -
|
|
6
|
+
* - constructor options 是 skill plugin 的唯一行为配置入口。
|
|
7
|
+
* - 该文件只描述插件协议,不承载发现、安装或 system 组装逻辑。
|
|
7
8
|
*/
|
|
8
9
|
|
|
10
|
+
import type { ClaudeSkill } from "@/skill/types/ClaudeSkill.js";
|
|
11
|
+
import type { SkillRootSource } from "@/skill/types/SkillRoot.js";
|
|
12
|
+
|
|
9
13
|
/**
|
|
10
14
|
* skill plugin action 名称常量。
|
|
11
15
|
*/
|
|
@@ -71,37 +75,60 @@ export type SkillPluginLookupPayload = {
|
|
|
71
75
|
};
|
|
72
76
|
|
|
73
77
|
/**
|
|
74
|
-
* skill
|
|
78
|
+
* skill 忽略规则。
|
|
75
79
|
*/
|
|
76
|
-
export
|
|
80
|
+
export type SkillPluginIgnoreRule =
|
|
81
|
+
| string
|
|
82
|
+
| RegExp
|
|
83
|
+
| ((skill: ClaudeSkill) => boolean);
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* SkillPlugin 构造参数。
|
|
87
|
+
*/
|
|
88
|
+
export interface SkillPluginOptions {
|
|
89
|
+
/**
|
|
90
|
+
* 启用的内置 skill 来源。
|
|
91
|
+
*
|
|
92
|
+
* 说明(中文)
|
|
93
|
+
* - `project` 表示扫描当前项目的 `.agents/skills`。
|
|
94
|
+
* - `home` 表示扫描用户目录的 `~/.agents/skills`。
|
|
95
|
+
* - 默认只启用 `project`,避免 agent 隐式读取全局 skill。
|
|
96
|
+
*/
|
|
97
|
+
use?: Array<Extract<SkillRootSource, "project" | "home">>;
|
|
77
98
|
/**
|
|
78
99
|
* 额外的 skill 扫描根目录。
|
|
79
100
|
*
|
|
80
101
|
* 说明(中文)
|
|
81
102
|
* - 相对路径基于项目根目录解析。
|
|
82
|
-
* -
|
|
103
|
+
* - 绝对路径与 `~` 路径会按原样解析为自定义来源。
|
|
104
|
+
* - 典型值:`.agents/shared-skills`、`~/team/skills`。
|
|
83
105
|
*/
|
|
84
106
|
paths?: string[];
|
|
85
107
|
/**
|
|
86
|
-
*
|
|
108
|
+
* 忽略指定 skills。
|
|
87
109
|
*
|
|
88
110
|
* 说明(中文)
|
|
89
|
-
* -
|
|
90
|
-
* -
|
|
111
|
+
* - 字符串会同时匹配 skill `id` 与 `name`。
|
|
112
|
+
* - `RegExp` 可用于批量过滤。
|
|
113
|
+
* - 函数返回 `true` 表示忽略该 skill。
|
|
91
114
|
*/
|
|
92
|
-
|
|
115
|
+
ignore?: SkillPluginIgnoreRule[];
|
|
93
116
|
}
|
|
94
117
|
|
|
95
118
|
/**
|
|
96
|
-
* 归一化后的
|
|
119
|
+
* 归一化后的 SkillPlugin 构造参数。
|
|
97
120
|
*/
|
|
98
|
-
export interface
|
|
121
|
+
export interface ResolvedSkillPluginOptions {
|
|
122
|
+
/**
|
|
123
|
+
* 最终启用的内置 skill 来源。
|
|
124
|
+
*/
|
|
125
|
+
use: Array<Extract<SkillRootSource, "project" | "home">>;
|
|
99
126
|
/**
|
|
100
127
|
* 最终生效的额外 skill 扫描根目录。
|
|
101
128
|
*/
|
|
102
129
|
paths: string[];
|
|
103
130
|
/**
|
|
104
|
-
*
|
|
131
|
+
* 最终生效的 skill 忽略规则。
|
|
105
132
|
*/
|
|
106
|
-
|
|
133
|
+
ignore: SkillPluginIgnoreRule[];
|
|
107
134
|
}
|
package/src/task/Action.ts
CHANGED
|
@@ -75,7 +75,7 @@ function buildDefaultTaskBody(): string {
|
|
|
75
75
|
"",
|
|
76
76
|
"- 最终输出直接写结果本身,不要包多余寒暄,不要粘贴冗长日志。",
|
|
77
77
|
"- 需要结构时,优先使用短标题、要点列表、表格或 JSON 等稳定格式。",
|
|
78
|
-
"- 默认不要在正文里重复调用
|
|
78
|
+
"- 默认不要在正文里重复调用 chat plugin 的发送 action;系统会自动发送最终结果。",
|
|
79
79
|
"",
|
|
80
80
|
"# 触发与状态建议",
|
|
81
81
|
"",
|
|
@@ -87,7 +87,7 @@ function buildDefaultTaskBody(): string {
|
|
|
87
87
|
"",
|
|
88
88
|
"- 当前是独立 task 上下文,不要假设仍处在原始聊天回合里。",
|
|
89
89
|
"- 尽量使用可审计的方式:关键中间产物写入 `./.downcity/task/<title>/<timestamp>/` 下的 markdown 文件。",
|
|
90
|
-
"- 如果任务明确要求跨会话、跨平台或发送额外通知,再显式调用
|
|
90
|
+
"- 如果任务明确要求跨会话、跨平台或发送额外通知,再显式调用 chat plugin 的发送 action。",
|
|
91
91
|
"",
|
|
92
92
|
].join("\n");
|
|
93
93
|
}
|
package/src/task/PROMPT.ts
CHANGED
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
// Source: src/task/PROMPT.ts.txt
|
|
7
|
-
const TEXT_MODULE_CONTENT = "# Task Plugin\n\n你可以通过 `task` plugin 管理任务定义、执行、调度与状态控制。\n\n## 任务模型\n\n每个任务定义在 `./.downcity/task/<title>/task.md`,包含:\n- frontmatter(结构化字段)\n- body(任务正文)\n\nfrontmatter 核心字段:\n- `title`:任务唯一标识(唯一)\n- `description`:任务描述\n- `when`:触发条件,支持:`@manual` / cron / `time:<ISO8601-with-timezone>`\n- `sessionId`:任务执行会话\n- `status`:`enabled|paused|disabled`\n- `kind`:`agent|script`(默认 `agent`)\n\n执行时会产生 run 目录:\n- `./.downcity/task/<title>/<timestamp>/`\n\n常见产物:\n- `input.md`\n- `output.md`(本次任务的最终输出正文)\n- `result.md`(执行摘要)\n- `run.json`\n- `run-progress.json`\n- `dialogue.md` / `dialogue.json`(agent 多轮)\n- `error.md`(失败时)\n\n## 执行类型(kind)\n\n1. `kind=agent`\n- 将正文交给 agent 执行\n- 默认单轮完成;仅当 frontmatter 显式设置 `review: true` 时启用模拟用户多轮复核\n- 适合研究、分析、报告生成\n\n2. `kind=script`\n- 将正文当作 shell 脚本执行\n- 正文不能为空,必须是可执行脚本\n\n## 可用 action\n\n- `list`\n- `create`\n- `run`\n- `delete`\n- `update`\n- `status`\n- `enable`\n- `disable`\n\n##
|
|
7
|
+
const TEXT_MODULE_CONTENT = "# Task Plugin\n\n你可以通过 `task` plugin 管理任务定义、执行、调度与状态控制。\n\n## 任务模型\n\n每个任务定义在 `./.downcity/task/<title>/task.md`,包含:\n- frontmatter(结构化字段)\n- body(任务正文)\n\nfrontmatter 核心字段:\n- `title`:任务唯一标识(唯一)\n- `description`:任务描述\n- `when`:触发条件,支持:`@manual` / cron / `time:<ISO8601-with-timezone>`\n- `sessionId`:任务执行会话\n- `status`:`enabled|paused|disabled`\n- `kind`:`agent|script`(默认 `agent`)\n\n执行时会产生 run 目录:\n- `./.downcity/task/<title>/<timestamp>/`\n\n常见产物:\n- `input.md`\n- `output.md`(本次任务的最终输出正文)\n- `result.md`(执行摘要)\n- `run.json`\n- `run-progress.json`\n- `dialogue.md` / `dialogue.json`(agent 多轮)\n- `error.md`(失败时)\n\n## 执行类型(kind)\n\n1. `kind=agent`\n- 将正文交给 agent 执行\n- 默认单轮完成;仅当 frontmatter 显式设置 `review: true` 时启用模拟用户多轮复核\n- 适合研究、分析、报告生成\n\n2. `kind=script`\n- 将正文当作 shell 脚本执行\n- 正文不能为空,必须是可执行脚本\n\n## 可用 action\n\n- `list`\n- `create`\n- `run`\n- `delete`\n- `update`\n- `status`\n- `enable`\n- `disable`\n\n## Action 调用示例\n\n- `plugin_call({ plugin: \"task\", action: \"list\", payload: { status } })`\n- `plugin_call({ plugin: \"task\", action: \"create\", payload: { title, description, sessionId, when, kind, status } })`\n- `plugin_call({ plugin: \"task\", action: \"run\", payload: { title, reason } })`\n- `plugin_call({ plugin: \"task\", action: \"update\", payload: { title, description, when, status, sessionId } })`\n- `plugin_call({ plugin: \"task\", action: \"delete\", payload: { title } })`\n\n## 关键约束\n\n- `title` 唯一;create 去重仅按 `title` 精确匹配。\n- `when=time:...` 触发后会自动置为 `paused`,并回退为 `when=@manual`。\n- `run` 为异步受理:立即返回 `accepted=true`、`message`、`executionId`;调用方应把它视为“任务已进入后台执行,结果会自动通过 chat plugin runtime 发送,当前流程无需阻塞等待”。\n- 如果 `run` 返回 `accepted=true`:\n - 不要手动把 task 产出再转发给用户。\n - 不要主动读取 run 目录、`run-progress.json`、`output.md` 做轮询。\n - 只有当用户明确要求排查、查看产物或确认执行细节时,才进入 run 目录检查。\n- agent 任务默认只要求产生有效输出;仅当任务正文明确要求外发时,才应发送到外部 channel。\n\n## 如何设计 task 正文\n\n### agent task 推荐结构\n\n建议正文至少包含这些标题:\n\n```md\n# 任务目标\n\n- 这次任务要交付什么最终结果\n\n# 背景与输入\n\n- 数据来源、范围、约束、参考材料\n\n# 执行步骤\n\n1. 先做什么\n2. 再做什么\n3. 关键中间产物落在哪里\n\n# 输出要求\n\n- 最终结果用什么格式返回\n- 是否需要表格 / JSON / Markdown\n- 不要包含什么内容\n\n# 触发与状态建议\n\n- 这个任务为什么适合 `@manual` / cron / `time:...`\n- 当前应该是 `paused` 还是 `enabled`\n\n# 注意事项\n\n- 风险、边界、不要做什么\n```\n\n### agent task 正文编写约束\n\n- task 正文必须像一份“交付合同”,让另一个执行器拿到后可以直接执行,不依赖当前聊天语境补全含义。\n- `# 任务目标` 必须写清楚最终要交付什么,不要只写“看一下”“研究一下”“处理一下”这类模糊目标。\n- `# 背景与输入` 必须写清来源、范围、对象、时间、限制条件;不要假设执行器还能看到原始聊天上下文。\n- `# 执行步骤` 应描述任务流程,不应描述 task 管理动作;不要写“先检查有没有同名任务”“再创建任务”“然后触发任务”。\n- `# 输出要求` 必须清楚声明最终成品的格式、结构、语气、长度,以及“不要输出什么”。\n- 要明确写出:**最后一条 assistant 返回会被直接写入 `output.md` 并发送给用户**;因此最终回答必须直接等于成品内容。\n- 内容生成类任务(如日报、提醒、晨读、摘要、报告)必须明确要求“最终输出直接是成品正文”,不要让执行器输出过程说明。\n- 如果任务要把结果发给用户,正文应要求“输出可直接发送的正文内容”,而不是要求执行器解释自己已经发送了什么。\n- 除非确有需要,不要在正文中要求执行器复述 task title、sessionId、执行时间、状态等元信息。\n- 正文中的约束要可执行、可判断,尽量避免“适当”“尽量”“看情况”这类弱约束词。\n- 不要把创建 task、更新 task、查看 task 状态、确认 task 是否存在等管理动作写进正文;这些属于 task plugin 的职责,不属于 task 正文交付物。\n\n### agent task 正文禁止写法\n\n- 不要把正文写成聊天回复口吻,例如:\n - “我来为你……”\n - “首先让我……”\n - “我先检查一下……”\n - “我看到已经有一个同名任务……”\n- 不要把正文写成任务管理说明,例如:\n - “如果任务已存在则更新,否则创建”\n - “先 list 再 run”\n - “完成后告诉用户任务已启动”\n- 不要把正文写成状态汇报模板,例如:\n - “任务状态总结”\n - “已发送 / 已完成 / 已更新”\n - “当前任务配置如下”\n- 不要只描述动作,不描述成品,例如:\n - “去搜集一些资料”\n - “生成一个内容看看”\n - “做完后反馈结果”\n- 不要把正文写成依赖当前上下文的指代,例如:\n - “按上面说的做”\n - “继续刚才那个”\n - “把这个发出去”\n\n### 如何判断正文写得对不对\n\n- 如果把 task 正文单独复制出来给另一个 agent,它仍然能理解任务目标、输入、步骤和交付物,说明正文合格。\n- 如果最终输出章节删掉后,正文只剩“去做一下”式描述,说明正文不合格。\n- 如果正文更像“创建/更新任务的操作说明”,而不是“任务执行说明”,说明分层错了,必须重写。\n- 如果正文天然会诱导执行器输出过程汇报,而不是最终成品,说明 `# 输出要求` 写得不够强,必须补充禁止项。\n\n### script task 推荐结构\n\n- 正文必须是纯 shell 脚本,不要混入解释性自然语言。\n- 开头尽量写注释说明脚本目的、输入依赖、失败条件。\n- 输出保持稳定,便于直接作为最终结果发送给用户。\n- 如需生成文件,写到 run 目录或明确的项目路径。\n\n### 输出设计原则\n\n- task 完成后,系统会自动把**最终结果正文**通过 chat plugin runtime 的 `send` 发回 `sessionId` 绑定的 chat。\n- 当前实现采用最简规则:**最后一条 assistant 返回**会被直接视为最终结果正文,并写入 `output.md`。\n- 因此正文里的“输出要求”要面向最终用户阅读,不要只写给开发者看。\n- 对于面向用户的 agent task,正文应要求“最后一条 assistant 返回直接输出最终交付物本身”,不要让执行器在最后回答里输出自己如何创建、检查、更新、触发或发送任务。\n- 如果任务是内容生成类(例如日报、提醒、晨读、摘要),最后输出应直接是那段内容本身,不要附带“我来为你处理”“任务已发送”“任务状态总结”等过程汇报。\n- 默认不要在正文里再次要求执行器发送 chat 消息;系统会处理最终结果回传。\n- 只有在“跨会话发送”“额外抄送”“多渠道通知”这类场景下,才显式要求执行器调用 chat plugin action。\n\n### `when` / `status` 怎么选\n\n- task 创建默认就是 `status=enabled`;如果还在试任务、容易失败、需要人工确认,再显式切到 `paused`。\n- 已经验证稳定、需要自动运行:直接使用 cron + `status=enabled`。\n- 明确只执行一次:使用 `time:<带时区 ISO 时间>`;执行后系统会自动回退到 `@manual` + `paused`。\n- 如果用户只是“先存起来以后再跑”,不要直接启用调度。\n\n## 正文模板\n\n### agent 模板\n\n```md\n# 任务目标\n\n- 产出一份可直接发给用户的最终结果。\n\n# 背景与输入\n\n- 在这里补充上下文、文件、链接、范围和假设。\n\n# 执行步骤\n\n1. 理解任务目标与完成标准。\n2. 收集必要信息并执行任务。\n3. 把关键中间产物写入 run 目录。\n4. 输出最终结果正文。\n\n# 输出要求\n\n- 最后一条 assistant 返回直接作为最终结果,不要附带冗长日志。\n- 最后一条 assistant 返回直接输出交付物本身,不要输出任务管理过程、发送过程或状态汇报。\n- 不要使用“我来为你…… / 首先让我…… / 已发送……”这类元话术。\n- 默认不要再次调用 chat plugin 的发送 action。\n\n# 触发与状态建议\n\n- 默认创建后立即启用;如果只是先保存草稿或等待人工确认,再改成 `paused`。\n\n# 注意事项\n\n- 仅在明确需要跨会话或额外通知时,才调用 chat plugin 的发送 action。\n```\n\n### script 模板\n\n```bash\n# 任务目标:一句话说明脚本要做什么\n# 输入依赖:列出环境变量、文件、命令依赖\n# 失败条件:列出应该 exit 1 的情况\n\nset -euo pipefail\n\n# 1. 准备输入\n\n# 2. 执行主逻辑\n\n# 3. 输出最终结果(这段输出会被直接发送给用户)\n```\n\n## 建议\n\n- 先 `list`,再 `create`/`update`。\n- 简单内容生成任务优先保持默认单轮;只有确实需要“先生成、再复核、再修订”时再设置 `review: true`。\n- script 任务正文保持纯脚本,不要混入冗余自然语言。\n- 如果用户只是先存起来以后再跑,创建后显式设成 `paused`;否则保持默认启用。\n- task 正文要写“最终结果长什么样”,不要只写“去做一下看看”。\n- 对内容生成任务,要明确写“最后一条 assistant 返回只能是成品正文”,避免执行器把过程说明误当成最终结果。\n";
|
|
8
8
|
|
|
9
9
|
export default TEXT_MODULE_CONTENT;
|
package/src/task/PROMPT.ts.txt
CHANGED
|
@@ -50,13 +50,13 @@ frontmatter 核心字段:
|
|
|
50
50
|
- `enable`
|
|
51
51
|
- `disable`
|
|
52
52
|
|
|
53
|
-
##
|
|
53
|
+
## Action 调用示例
|
|
54
54
|
|
|
55
|
-
- `
|
|
56
|
-
- `
|
|
57
|
-
- `
|
|
58
|
-
- `
|
|
59
|
-
- `
|
|
55
|
+
- `plugin_call({ plugin: "task", action: "list", payload: { status } })`
|
|
56
|
+
- `plugin_call({ plugin: "task", action: "create", payload: { title, description, sessionId, when, kind, status } })`
|
|
57
|
+
- `plugin_call({ plugin: "task", action: "run", payload: { title, reason } })`
|
|
58
|
+
- `plugin_call({ plugin: "task", action: "update", payload: { title, description, when, status, sessionId } })`
|
|
59
|
+
- `plugin_call({ plugin: "task", action: "delete", payload: { title } })`
|
|
60
60
|
|
|
61
61
|
## 关键约束
|
|
62
62
|
|
|
@@ -165,8 +165,8 @@ frontmatter 核心字段:
|
|
|
165
165
|
- 因此正文里的“输出要求”要面向最终用户阅读,不要只写给开发者看。
|
|
166
166
|
- 对于面向用户的 agent task,正文应要求“最后一条 assistant 返回直接输出最终交付物本身”,不要让执行器在最后回答里输出自己如何创建、检查、更新、触发或发送任务。
|
|
167
167
|
- 如果任务是内容生成类(例如日报、提醒、晨读、摘要),最后输出应直接是那段内容本身,不要附带“我来为你处理”“任务已发送”“任务状态总结”等过程汇报。
|
|
168
|
-
-
|
|
169
|
-
-
|
|
168
|
+
- 默认不要在正文里再次要求执行器发送 chat 消息;系统会处理最终结果回传。
|
|
169
|
+
- 只有在“跨会话发送”“额外抄送”“多渠道通知”这类场景下,才显式要求执行器调用 chat plugin action。
|
|
170
170
|
|
|
171
171
|
### `when` / `status` 怎么选
|
|
172
172
|
|
|
@@ -200,7 +200,7 @@ frontmatter 核心字段:
|
|
|
200
200
|
- 最后一条 assistant 返回直接作为最终结果,不要附带冗长日志。
|
|
201
201
|
- 最后一条 assistant 返回直接输出交付物本身,不要输出任务管理过程、发送过程或状态汇报。
|
|
202
202
|
- 不要使用“我来为你…… / 首先让我…… / 已发送……”这类元话术。
|
|
203
|
-
- 默认不要再次调用
|
|
203
|
+
- 默认不要再次调用 chat plugin 的发送 action。
|
|
204
204
|
|
|
205
205
|
# 触发与状态建议
|
|
206
206
|
|
|
@@ -208,7 +208,7 @@ frontmatter 核心字段:
|
|
|
208
208
|
|
|
209
209
|
# 注意事项
|
|
210
210
|
|
|
211
|
-
- 仅在明确需要跨会话或额外通知时,才调用
|
|
211
|
+
- 仅在明确需要跨会话或额外通知时,才调用 chat plugin 的发送 action。
|
|
212
212
|
```
|
|
213
213
|
|
|
214
214
|
### script 模板
|
package/src/task/TaskPlugin.ts
CHANGED
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
* - 当前文件只保留实例骨架与 lifecycle,不再依赖旧的模块级单例。
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import type { AgentRuntime } from "@downcity/agent/internal/types/runtime/agent/AgentRuntime.js";
|
|
11
10
|
import { BasePlugin } from "@downcity/agent/internal/plugin/core/BasePlugin.js";
|
|
12
11
|
import type { PluginActions } from "@downcity/agent/internal/plugin/types/Plugin.js";
|
|
13
12
|
import type { AgentContext } from "@downcity/agent/internal/types/runtime/agent/AgentContext.js";
|
|
@@ -59,8 +58,8 @@ export class TaskPlugin extends BasePlugin {
|
|
|
59
58
|
*/
|
|
60
59
|
public cronEngine: TaskCronTriggerEngine | null = null;
|
|
61
60
|
|
|
62
|
-
constructor(
|
|
63
|
-
super(
|
|
61
|
+
constructor() {
|
|
62
|
+
super();
|
|
64
63
|
|
|
65
64
|
this.actions = createTaskPluginActions({
|
|
66
65
|
reloadSchedulerAfterMutation: async (params) =>
|
package/src/tts/Plugin.ts
CHANGED
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
* - Console 只通过 setup / action 与插件交互,保持极简统一。
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import type { AgentRuntime } from "@downcity/agent/internal/types/runtime/agent/AgentRuntime.js";
|
|
10
9
|
import { BasePlugin } from "@downcity/agent/internal/plugin/core/BasePlugin.js";
|
|
11
10
|
import type { Plugin } from "@downcity/agent/internal/plugin/types/Plugin.js";
|
|
12
11
|
import type {
|
|
@@ -493,13 +492,13 @@ function createTtsPluginDefinition(plugin: Plugin): Plugin {
|
|
|
493
492
|
"# TTS Plugin",
|
|
494
493
|
"The agent can call the tts plugin to synthesize speech audio from plain text.",
|
|
495
494
|
"Typical usage flow:",
|
|
496
|
-
"1. Check availability with `
|
|
497
|
-
"2. Generate audio with `
|
|
498
|
-
"3. Optionally override synthesis parameters
|
|
495
|
+
"1. Check availability with the `status` action when you need to confirm whether the plugin and model are ready.",
|
|
496
|
+
"2. Generate audio with the `synthesize` action.",
|
|
497
|
+
"3. Optionally override synthesis parameters in the action payload: `voice`, `language`, `format`, `speed`, and `output`.",
|
|
499
498
|
"Use the `tts.synthesize` action when the user asks to generate spoken audio or a reusable audio file tag.",
|
|
500
499
|
"A successful synthesis returns a local output path and a reusable `<file type=\"audio\">...</file>` tag for downstream sending.",
|
|
501
500
|
"If the Python runner prints non-fatal stderr, the command still succeeds and returns that stderr summary as extra context.",
|
|
502
|
-
"Example: `
|
|
501
|
+
"Example: `plugin_call({ plugin: \"tts\", action: \"synthesize\", payload: { text: \"你好,欢迎来到 Downcity\", format: \"wav\" } })`",
|
|
503
502
|
].join("\n");
|
|
504
503
|
},
|
|
505
504
|
};
|
|
@@ -511,8 +510,8 @@ function createTtsPluginDefinition(plugin: Plugin): Plugin {
|
|
|
511
510
|
export class TtsPlugin extends BasePlugin {
|
|
512
511
|
readonly name = "tts";
|
|
513
512
|
|
|
514
|
-
constructor(
|
|
515
|
-
super(
|
|
513
|
+
constructor() {
|
|
514
|
+
super();
|
|
516
515
|
Object.assign(this, createTtsPluginDefinition(this));
|
|
517
516
|
}
|
|
518
517
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
// Source: src/web/PROMPT.agent-browser.ts.txt
|
|
7
|
-
const TEXT_MODULE_CONTENT = "# Web Plugin / agent-browser\n\n当前 provider 是 `agent-browser`。\n\n你应直接使用 `agent-browser` 项目的浏览器自动化方法,而不是在本项目里自己实现浏览器交互。\n\n工作原则:\n\n- 浏览器交互、打开页面、点击、填写、截图、滚动等操作优先交给 `agent-browser`\n- 严格遵循 `agent-browser` 的基本工作流:\n 1. `open`\n 2. `snapshot -i`\n 3. 使用元素引用交互\n 4. 页面变化后重新 snapshot\n- 如果 `agent-browser`
|
|
7
|
+
const TEXT_MODULE_CONTENT = "# Web Plugin / agent-browser\n\n当前 provider 是 `agent-browser`。\n\n你应直接使用 `agent-browser` 项目的浏览器自动化方法,而不是在本项目里自己实现浏览器交互。\n\n工作原则:\n\n- 浏览器交互、打开页面、点击、填写、截图、滚动等操作优先交给 `agent-browser`\n- 严格遵循 `agent-browser` 的基本工作流:\n 1. `open`\n 2. `snapshot -i`\n 3. 使用元素引用交互\n 4. 页面变化后重新 snapshot\n- 如果 `agent-browser` provider 不可用,应先报告依赖缺失\n\n你在处理需要浏览器操作的任务时,应以外部 `agent-browser` 项目为准。\n";
|
|
8
8
|
|
|
9
9
|
export default TEXT_MODULE_CONTENT;
|
package/src/web/Plugin.ts
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
* - `web` plugin 不再自实现联网与浏览器能力,只负责 provider 选择、状态检查与提示词注入。
|
|
6
6
|
* - 真正的联网逻辑直接交给外部实现:`web-access` 或 `agent-browser`。
|
|
7
7
|
*/
|
|
8
|
-
import type { AgentRuntime } from "@downcity/agent/internal/types/runtime/agent/AgentRuntime.js";
|
|
9
8
|
import { BasePlugin } from "@downcity/agent/internal/plugin/core/BasePlugin.js";
|
|
10
9
|
import type { Plugin } from "@downcity/agent/internal/plugin/types/Plugin.js";
|
|
11
10
|
import type { JsonObject, JsonValue } from "@downcity/agent/internal/types/common/Json.js";
|
|
@@ -499,7 +498,7 @@ function createWebPluginDefinition(plugin: Plugin): Plugin {
|
|
|
499
498
|
return [
|
|
500
499
|
`Current web provider: ${config.provider}`,
|
|
501
500
|
config.provider === "agent-browser"
|
|
502
|
-
? `Use
|
|
501
|
+
? `Use the configured agent-browser provider: ${config.browserCommand}`
|
|
503
502
|
: "Use the installed external web-access skill/project.",
|
|
504
503
|
"",
|
|
505
504
|
WEB_PLUGIN_PROMPT,
|
|
@@ -516,8 +515,8 @@ function createWebPluginDefinition(plugin: Plugin): Plugin {
|
|
|
516
515
|
export class WebPlugin extends BasePlugin {
|
|
517
516
|
readonly name = "web";
|
|
518
517
|
|
|
519
|
-
constructor(
|
|
520
|
-
super(
|
|
518
|
+
constructor() {
|
|
519
|
+
super();
|
|
521
520
|
Object.assign(this, createWebPluginDefinition(this));
|
|
522
521
|
}
|
|
523
522
|
}
|
package/src/workboard/Plugin.ts
CHANGED
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
* - 当前同时通过 plugin action 与 HTTP 注入提供快照,供 Town RPC 与 Town HTTP gateway 复用。
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import type { AgentRuntime } from "@downcity/agent/internal/types/runtime/agent/AgentRuntime.js";
|
|
10
9
|
import { BasePlugin } from "@downcity/agent/internal/plugin/core/BasePlugin.js";
|
|
11
10
|
import type { Plugin } from "@downcity/agent/internal/plugin/types/Plugin.js";
|
|
12
11
|
import type { JsonValue } from "@downcity/agent/internal/types/common/Json.js";
|
|
@@ -111,8 +110,8 @@ function createWorkboardPluginDefinition(plugin: Plugin): Plugin {
|
|
|
111
110
|
export class WorkboardPlugin extends BasePlugin {
|
|
112
111
|
readonly name = "workboard";
|
|
113
112
|
|
|
114
|
-
constructor(
|
|
115
|
-
super(
|
|
113
|
+
constructor() {
|
|
114
|
+
super();
|
|
116
115
|
Object.assign(this, createWorkboardPluginDefinition(this));
|
|
117
116
|
}
|
|
118
117
|
}
|