workerclaw 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +129 -0
- package/dist/active-behavior/behavior-scheduler.d.ts +119 -0
- package/dist/active-behavior/behavior-scheduler.d.ts.map +1 -0
- package/dist/active-behavior/behavior-scheduler.js +297 -0
- package/dist/active-behavior/behavior-scheduler.js.map +1 -0
- package/dist/active-behavior/frequency-control.d.ts +72 -0
- package/dist/active-behavior/frequency-control.d.ts.map +1 -0
- package/dist/active-behavior/frequency-control.js +206 -0
- package/dist/active-behavior/frequency-control.js.map +1 -0
- package/dist/active-behavior/index.d.ts +8 -0
- package/dist/active-behavior/index.d.ts.map +1 -0
- package/dist/active-behavior/index.js +6 -0
- package/dist/active-behavior/index.js.map +1 -0
- package/dist/agent/agent-engine.d.ts +122 -0
- package/dist/agent/agent-engine.d.ts.map +1 -0
- package/dist/agent/agent-engine.js +380 -0
- package/dist/agent/agent-engine.js.map +1 -0
- package/dist/agent/context-window.d.ts +69 -0
- package/dist/agent/context-window.d.ts.map +1 -0
- package/dist/agent/context-window.js +210 -0
- package/dist/agent/context-window.js.map +1 -0
- package/dist/agent/llm-client.d.ts +37 -0
- package/dist/agent/llm-client.d.ts.map +1 -0
- package/dist/agent/llm-client.js +155 -0
- package/dist/agent/llm-client.js.map +1 -0
- package/dist/agent/personality.d.ts +71 -0
- package/dist/agent/personality.d.ts.map +1 -0
- package/dist/agent/personality.js +147 -0
- package/dist/agent/personality.js.map +1 -0
- package/dist/agent/session-manager.d.ts +111 -0
- package/dist/agent/session-manager.d.ts.map +1 -0
- package/dist/agent/session-manager.js +205 -0
- package/dist/agent/session-manager.js.map +1 -0
- package/dist/agent/tool-executor.d.ts +34 -0
- package/dist/agent/tool-executor.d.ts.map +1 -0
- package/dist/agent/tool-executor.js +145 -0
- package/dist/agent/tool-executor.js.map +1 -0
- package/dist/agent/tool-registry.d.ts +67 -0
- package/dist/agent/tool-registry.d.ts.map +1 -0
- package/dist/agent/tool-registry.js +272 -0
- package/dist/agent/tool-registry.js.map +1 -0
- package/dist/cli/configure.d.ts +16 -0
- package/dist/cli/configure.d.ts.map +1 -0
- package/dist/cli/configure.js +212 -0
- package/dist/cli/configure.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +256 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompter.d.ts +59 -0
- package/dist/cli/prompter.d.ts.map +1 -0
- package/dist/cli/prompter.js +120 -0
- package/dist/cli/prompter.js.map +1 -0
- package/dist/cli/sections/index.d.ts +9 -0
- package/dist/cli/sections/index.d.ts.map +1 -0
- package/dist/cli/sections/index.js +9 -0
- package/dist/cli/sections/index.js.map +1 -0
- package/dist/cli/sections/llm.d.ts +14 -0
- package/dist/cli/sections/llm.d.ts.map +1 -0
- package/dist/cli/sections/llm.js +155 -0
- package/dist/cli/sections/llm.js.map +1 -0
- package/dist/cli/sections/personality.d.ts +14 -0
- package/dist/cli/sections/personality.d.ts.map +1 -0
- package/dist/cli/sections/personality.js +90 -0
- package/dist/cli/sections/personality.js.map +1 -0
- package/dist/cli/sections/platform.d.ts +14 -0
- package/dist/cli/sections/platform.d.ts.map +1 -0
- package/dist/cli/sections/platform.js +179 -0
- package/dist/cli/sections/platform.js.map +1 -0
- package/dist/cli/sections/security.d.ts +14 -0
- package/dist/cli/sections/security.d.ts.map +1 -0
- package/dist/cli/sections/security.js +106 -0
- package/dist/cli/sections/security.js.map +1 -0
- package/dist/cli/sections/skills.d.ts +10 -0
- package/dist/cli/sections/skills.d.ts.map +1 -0
- package/dist/cli/sections/skills.js +149 -0
- package/dist/cli/sections/skills.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +116 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/config.d.ts +175 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +109 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/events.d.ts +211 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +152 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/logger.d.ts +23 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +53 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/workerclaw.d.ts +83 -0
- package/dist/core/workerclaw.d.ts.map +1 -0
- package/dist/core/workerclaw.js +161 -0
- package/dist/core/workerclaw.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/ingress/message-parser.d.ts +36 -0
- package/dist/ingress/message-parser.d.ts.map +1 -0
- package/dist/ingress/message-parser.js +107 -0
- package/dist/ingress/message-parser.js.map +1 -0
- package/dist/ingress/miniabc-client.d.ts +109 -0
- package/dist/ingress/miniabc-client.d.ts.map +1 -0
- package/dist/ingress/miniabc-client.js +345 -0
- package/dist/ingress/miniabc-client.js.map +1 -0
- package/dist/ingress/platform-api.d.ts +82 -0
- package/dist/ingress/platform-api.d.ts.map +1 -0
- package/dist/ingress/platform-api.js +209 -0
- package/dist/ingress/platform-api.js.map +1 -0
- package/dist/sandbox/command-sandbox.d.ts +46 -0
- package/dist/sandbox/command-sandbox.d.ts.map +1 -0
- package/dist/sandbox/command-sandbox.js +144 -0
- package/dist/sandbox/command-sandbox.js.map +1 -0
- package/dist/sandbox/fs-sandbox.d.ts +56 -0
- package/dist/sandbox/fs-sandbox.d.ts.map +1 -0
- package/dist/sandbox/fs-sandbox.js +119 -0
- package/dist/sandbox/fs-sandbox.js.map +1 -0
- package/dist/sandbox/network-sandbox.d.ts +41 -0
- package/dist/sandbox/network-sandbox.d.ts.map +1 -0
- package/dist/sandbox/network-sandbox.js +114 -0
- package/dist/sandbox/network-sandbox.js.map +1 -0
- package/dist/security/content-scanner.d.ts +59 -0
- package/dist/security/content-scanner.d.ts.map +1 -0
- package/dist/security/content-scanner.js +289 -0
- package/dist/security/content-scanner.js.map +1 -0
- package/dist/security/gate.d.ts +78 -0
- package/dist/security/gate.d.ts.map +1 -0
- package/dist/security/gate.js +150 -0
- package/dist/security/gate.js.map +1 -0
- package/dist/security/permission-level.d.ts +68 -0
- package/dist/security/permission-level.d.ts.map +1 -0
- package/dist/security/permission-level.js +191 -0
- package/dist/security/permission-level.js.map +1 -0
- package/dist/security/rate-limiter.d.ts +52 -0
- package/dist/security/rate-limiter.d.ts.map +1 -0
- package/dist/security/rate-limiter.js +133 -0
- package/dist/security/rate-limiter.js.map +1 -0
- package/dist/security/source-verifier.d.ts +33 -0
- package/dist/security/source-verifier.d.ts.map +1 -0
- package/dist/security/source-verifier.js +106 -0
- package/dist/security/source-verifier.js.map +1 -0
- package/dist/skills/builtin/code.d.ts +27 -0
- package/dist/skills/builtin/code.d.ts.map +1 -0
- package/dist/skills/builtin/code.js +132 -0
- package/dist/skills/builtin/code.js.map +1 -0
- package/dist/skills/builtin/index.d.ts +12 -0
- package/dist/skills/builtin/index.d.ts.map +1 -0
- package/dist/skills/builtin/index.js +16 -0
- package/dist/skills/builtin/index.js.map +1 -0
- package/dist/skills/builtin/search.d.ts +27 -0
- package/dist/skills/builtin/search.d.ts.map +1 -0
- package/dist/skills/builtin/search.js +105 -0
- package/dist/skills/builtin/search.js.map +1 -0
- package/dist/skills/builtin/writing.d.ts +22 -0
- package/dist/skills/builtin/writing.d.ts.map +1 -0
- package/dist/skills/builtin/writing.js +93 -0
- package/dist/skills/builtin/writing.js.map +1 -0
- package/dist/skills/index.d.ts +11 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +10 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/pack-loader.d.ts +31 -0
- package/dist/skills/pack-loader.d.ts.map +1 -0
- package/dist/skills/pack-loader.js +167 -0
- package/dist/skills/pack-loader.js.map +1 -0
- package/dist/skills/pack-registry.d.ts +40 -0
- package/dist/skills/pack-registry.d.ts.map +1 -0
- package/dist/skills/pack-registry.js +80 -0
- package/dist/skills/pack-registry.js.map +1 -0
- package/dist/skills/pack-types.d.ts +64 -0
- package/dist/skills/pack-types.d.ts.map +1 -0
- package/dist/skills/pack-types.js +7 -0
- package/dist/skills/pack-types.js.map +1 -0
- package/dist/skills/skill-registry.d.ts +83 -0
- package/dist/skills/skill-registry.d.ts.map +1 -0
- package/dist/skills/skill-registry.js +206 -0
- package/dist/skills/skill-registry.js.map +1 -0
- package/dist/skills/skill-runner.d.ts +49 -0
- package/dist/skills/skill-runner.d.ts.map +1 -0
- package/dist/skills/skill-runner.js +128 -0
- package/dist/skills/skill-runner.js.map +1 -0
- package/dist/skills/types.d.ts +94 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +7 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/task/concurrency.d.ts +87 -0
- package/dist/task/concurrency.d.ts.map +1 -0
- package/dist/task/concurrency.js +269 -0
- package/dist/task/concurrency.js.map +1 -0
- package/dist/task/task-evaluator.d.ts +52 -0
- package/dist/task/task-evaluator.d.ts.map +1 -0
- package/dist/task/task-evaluator.js +141 -0
- package/dist/task/task-evaluator.js.map +1 -0
- package/dist/task/task-manager.d.ts +112 -0
- package/dist/task/task-manager.d.ts.map +1 -0
- package/dist/task/task-manager.js +382 -0
- package/dist/task/task-manager.js.map +1 -0
- package/dist/task/task-state-machine.d.ts +63 -0
- package/dist/task/task-state-machine.d.ts.map +1 -0
- package/dist/task/task-state-machine.js +149 -0
- package/dist/task/task-state-machine.js.map +1 -0
- package/dist/types/agent.d.ts +79 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +7 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/message.d.ts +87 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/message.js +30 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/task.d.ts +176 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +5 -0
- package/dist/types/task.js.map +1 -0
- package/package.json +57 -0
- package/workerclaw.config.example.json +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-registry.js","sourceRoot":"","sources":["../../src/skills/skill-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 技能执行器
|
|
3
|
+
*
|
|
4
|
+
* 负责匹配和执行技能
|
|
5
|
+
* 将任务路由到合适的技能执行
|
|
6
|
+
*/
|
|
7
|
+
import { EventBus } from '../core/events.js';
|
|
8
|
+
import { SkillRegistry } from './skill-registry.js';
|
|
9
|
+
import type { PermissionLevel } from '../types/agent.js';
|
|
10
|
+
import type { Task } from '../types/task.js';
|
|
11
|
+
import type { SkillContext, SkillResult, Skill } from './types.js';
|
|
12
|
+
export interface SkillRunnerConfig {
|
|
13
|
+
/** 技能执行超时 (ms) */
|
|
14
|
+
skillTimeoutMs: number;
|
|
15
|
+
/** 最大重试次数 */
|
|
16
|
+
maxRetries: number;
|
|
17
|
+
/** 重试延迟 (ms) */
|
|
18
|
+
retryDelayMs: number;
|
|
19
|
+
}
|
|
20
|
+
export declare const DEFAULT_SKILL_RUNNER_CONFIG: SkillRunnerConfig;
|
|
21
|
+
export declare class SkillRunner {
|
|
22
|
+
private logger;
|
|
23
|
+
private config;
|
|
24
|
+
private registry;
|
|
25
|
+
private eventBus;
|
|
26
|
+
constructor(registry: SkillRegistry, config?: Partial<SkillRunnerConfig>, eventBus?: EventBus);
|
|
27
|
+
/**
|
|
28
|
+
* 为任务查找最匹配的技能
|
|
29
|
+
* 返回第一个适用的技能(按注册顺序)
|
|
30
|
+
*/
|
|
31
|
+
findBestSkill(task: Task, permissionLevel: PermissionLevel): Skill | null;
|
|
32
|
+
/**
|
|
33
|
+
* 执行技能
|
|
34
|
+
*/
|
|
35
|
+
execute(skill: Skill, context: SkillContext): Promise<SkillResult>;
|
|
36
|
+
/**
|
|
37
|
+
* 带超时和重试的技能执行
|
|
38
|
+
*/
|
|
39
|
+
private executeWithTimeout;
|
|
40
|
+
/**
|
|
41
|
+
* 检查任务是否需要技能
|
|
42
|
+
*/
|
|
43
|
+
needsSkill(task: Task, permissionLevel: PermissionLevel): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* 获取技能注册表引用
|
|
46
|
+
*/
|
|
47
|
+
getRegistry(): SkillRegistry;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=skill-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-runner.d.ts","sourceRoot":"","sources":["../../src/skills/skill-runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,QAAQ,EAAmB,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC,kBAAkB;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,2BAA2B,EAAE,iBAIzC,CAAC;AAEF,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAW;gBAGzB,QAAQ,EAAE,aAAa,EACvB,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,QAAQ,CAAC,EAAE,QAAQ;IAQrB;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,GAAG,KAAK,GAAG,IAAI;IAQzE;;OAEG;IACG,OAAO,CACX,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,WAAW,CAAC;IAqDvB;;OAEG;YACW,kBAAkB;IAsChC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,GAAG,OAAO;IAIjE;;OAEG;IACH,WAAW,IAAI,aAAa;CAG7B"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 技能执行器
|
|
3
|
+
*
|
|
4
|
+
* 负责匹配和执行技能
|
|
5
|
+
* 将任务路由到合适的技能执行
|
|
6
|
+
*/
|
|
7
|
+
import { createLogger } from '../core/logger.js';
|
|
8
|
+
import { EventBus } from '../core/events.js';
|
|
9
|
+
export const DEFAULT_SKILL_RUNNER_CONFIG = {
|
|
10
|
+
skillTimeoutMs: 60000,
|
|
11
|
+
maxRetries: 1,
|
|
12
|
+
retryDelayMs: 2000,
|
|
13
|
+
};
|
|
14
|
+
export class SkillRunner {
|
|
15
|
+
logger;
|
|
16
|
+
config;
|
|
17
|
+
registry;
|
|
18
|
+
eventBus;
|
|
19
|
+
constructor(registry, config, eventBus) {
|
|
20
|
+
this.registry = registry;
|
|
21
|
+
this.config = { ...DEFAULT_SKILL_RUNNER_CONFIG, ...config };
|
|
22
|
+
this.eventBus = eventBus || new EventBus();
|
|
23
|
+
this.logger = createLogger('SkillRunner');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 为任务查找最匹配的技能
|
|
27
|
+
* 返回第一个适用的技能(按注册顺序)
|
|
28
|
+
*/
|
|
29
|
+
findBestSkill(task, permissionLevel) {
|
|
30
|
+
const skills = this.registry.getApplicableSkills(task, permissionLevel);
|
|
31
|
+
if (skills.length === 0)
|
|
32
|
+
return null;
|
|
33
|
+
// TODO: Phase 5 可以根据评分选最佳技能
|
|
34
|
+
return skills[0];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 执行技能
|
|
38
|
+
*/
|
|
39
|
+
async execute(skill, context) {
|
|
40
|
+
const startTime = Date.now();
|
|
41
|
+
this.logger.info(`执行技能: ${skill.metadata.name}`, {
|
|
42
|
+
taskType: context.task.taskType,
|
|
43
|
+
taskId: context.task.taskId,
|
|
44
|
+
});
|
|
45
|
+
this.eventBus.emit('skill:started', {
|
|
46
|
+
skillName: skill.metadata.name,
|
|
47
|
+
taskId: context.task.taskId,
|
|
48
|
+
});
|
|
49
|
+
try {
|
|
50
|
+
// 带超时的执行
|
|
51
|
+
const result = await this.executeWithTimeout(skill, context);
|
|
52
|
+
const durationMs = Date.now() - startTime;
|
|
53
|
+
this.logger.info(`技能完成: ${skill.metadata.name}`, {
|
|
54
|
+
success: result.success,
|
|
55
|
+
durationMs,
|
|
56
|
+
});
|
|
57
|
+
this.eventBus.emit('skill:completed', {
|
|
58
|
+
skillName: skill.metadata.name,
|
|
59
|
+
taskId: context.task.taskId,
|
|
60
|
+
success: result.success,
|
|
61
|
+
durationMs,
|
|
62
|
+
});
|
|
63
|
+
return { ...result, durationMs };
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
const durationMs = Date.now() - startTime;
|
|
67
|
+
const error = err;
|
|
68
|
+
this.logger.error(`技能执行失败: ${skill.metadata.name}`, error.message);
|
|
69
|
+
this.eventBus.emit('skill:failed', {
|
|
70
|
+
skillName: skill.metadata.name,
|
|
71
|
+
taskId: context.task.taskId,
|
|
72
|
+
error: error.message,
|
|
73
|
+
durationMs,
|
|
74
|
+
});
|
|
75
|
+
return {
|
|
76
|
+
success: false,
|
|
77
|
+
content: '',
|
|
78
|
+
outputs: [],
|
|
79
|
+
durationMs,
|
|
80
|
+
error: error.message,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 带超时和重试的技能执行
|
|
86
|
+
*/
|
|
87
|
+
async executeWithTimeout(skill, context, attempt = 1) {
|
|
88
|
+
const timeout = Math.min(this.config.skillTimeoutMs, context.remainingMs - 5000);
|
|
89
|
+
return new Promise((resolve, reject) => {
|
|
90
|
+
const timer = setTimeout(() => {
|
|
91
|
+
reject(new Error(`技能执行超时 (${timeout}ms)`));
|
|
92
|
+
}, Math.max(timeout, 1000));
|
|
93
|
+
skill.execute(context)
|
|
94
|
+
.then(result => {
|
|
95
|
+
clearTimeout(timer);
|
|
96
|
+
resolve(result);
|
|
97
|
+
})
|
|
98
|
+
.catch(err => {
|
|
99
|
+
clearTimeout(timer);
|
|
100
|
+
// 重试
|
|
101
|
+
if (attempt < this.config.maxRetries) {
|
|
102
|
+
this.logger.warn(`技能重试 (${attempt}/${this.config.maxRetries}): ${skill.metadata.name}`);
|
|
103
|
+
setTimeout(() => {
|
|
104
|
+
this.executeWithTimeout(skill, context, attempt + 1)
|
|
105
|
+
.then(resolve)
|
|
106
|
+
.catch(reject);
|
|
107
|
+
}, this.config.retryDelayMs);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
reject(err);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 检查任务是否需要技能
|
|
117
|
+
*/
|
|
118
|
+
needsSkill(task, permissionLevel) {
|
|
119
|
+
return this.registry.getApplicableSkills(task, permissionLevel).length > 0;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 获取技能注册表引用
|
|
123
|
+
*/
|
|
124
|
+
getRegistry() {
|
|
125
|
+
return this.registry;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=skill-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-runner.js","sourceRoot":"","sources":["../../src/skills/skill-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 技能类型定义
|
|
3
|
+
*
|
|
4
|
+
* 定义技能系统的接口和类型
|
|
5
|
+
*/
|
|
6
|
+
import type { ToolDefinition, PermissionLevel, ToolExecutorFn } from '../types/agent.js';
|
|
7
|
+
import type { Task } from '../types/task.js';
|
|
8
|
+
/** 技能元数据 */
|
|
9
|
+
export interface SkillMetadata {
|
|
10
|
+
/** 技能名称(唯一标识) */
|
|
11
|
+
name: string;
|
|
12
|
+
/** 技能显示名称 */
|
|
13
|
+
displayName: string;
|
|
14
|
+
/** 技能描述 */
|
|
15
|
+
description: string;
|
|
16
|
+
/** 技能版本 */
|
|
17
|
+
version: string;
|
|
18
|
+
/** 技能作者 */
|
|
19
|
+
author?: string;
|
|
20
|
+
/** 标签 */
|
|
21
|
+
tags: string[];
|
|
22
|
+
/** 最低权限级别 */
|
|
23
|
+
requiredLevel: PermissionLevel;
|
|
24
|
+
/** 适用任务类型(空数组表示适用所有类型) */
|
|
25
|
+
applicableTaskTypes: string[];
|
|
26
|
+
/** 所需工具名称列表 */
|
|
27
|
+
requiredTools: string[];
|
|
28
|
+
}
|
|
29
|
+
/** 技能执行上下文 */
|
|
30
|
+
export interface SkillContext {
|
|
31
|
+
/** 当前任务 */
|
|
32
|
+
task: Task;
|
|
33
|
+
/** 权限级别 */
|
|
34
|
+
permissionLevel: PermissionLevel;
|
|
35
|
+
/** 技能参数 */
|
|
36
|
+
params: Record<string, any>;
|
|
37
|
+
/** 工作目录 */
|
|
38
|
+
workDir: string;
|
|
39
|
+
/** 任务超时剩余 (ms) */
|
|
40
|
+
remainingMs: number;
|
|
41
|
+
}
|
|
42
|
+
/** 技能执行结果 */
|
|
43
|
+
export interface SkillResult {
|
|
44
|
+
/** 是否成功 */
|
|
45
|
+
success: boolean;
|
|
46
|
+
/** 输出内容 */
|
|
47
|
+
content: string;
|
|
48
|
+
/** 输出类型 */
|
|
49
|
+
outputs: Array<{
|
|
50
|
+
type: 'text' | 'image' | 'file';
|
|
51
|
+
content: string;
|
|
52
|
+
name?: string;
|
|
53
|
+
}>;
|
|
54
|
+
/** 使用 token 数 */
|
|
55
|
+
tokensUsed?: {
|
|
56
|
+
prompt: number;
|
|
57
|
+
completion: number;
|
|
58
|
+
};
|
|
59
|
+
/** 执行耗时 */
|
|
60
|
+
durationMs: number;
|
|
61
|
+
/** 错误信息 */
|
|
62
|
+
error?: string;
|
|
63
|
+
}
|
|
64
|
+
/** 技能接口 */
|
|
65
|
+
export interface Skill {
|
|
66
|
+
/** 技能元数据 */
|
|
67
|
+
metadata: SkillMetadata;
|
|
68
|
+
/** 提供的工具列表 */
|
|
69
|
+
tools?: ToolDefinition[];
|
|
70
|
+
/** 提供工具的执行器 */
|
|
71
|
+
toolExecutors?: Record<string, ToolExecutorFn>;
|
|
72
|
+
/** 执行技能 */
|
|
73
|
+
execute(context: SkillContext): Promise<SkillResult>;
|
|
74
|
+
/** 生成技能专属提示(附加到系统提示中) */
|
|
75
|
+
getSystemPromptAddon?(): string;
|
|
76
|
+
/** 初始化/预热 */
|
|
77
|
+
init?(): Promise<void>;
|
|
78
|
+
/** 清理 */
|
|
79
|
+
dispose?(): Promise<void>;
|
|
80
|
+
}
|
|
81
|
+
/** 技能状态 */
|
|
82
|
+
export type SkillState = 'loaded' | 'initialized' | 'ready' | 'error';
|
|
83
|
+
/** 技能注册项 */
|
|
84
|
+
export interface SkillRegistration {
|
|
85
|
+
/** 技能实例 */
|
|
86
|
+
skill: Skill;
|
|
87
|
+
/** 注册时间 */
|
|
88
|
+
registeredAt: number;
|
|
89
|
+
/** 状态 */
|
|
90
|
+
state: SkillState;
|
|
91
|
+
/** 初始化错误 */
|
|
92
|
+
error?: string;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/skills/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAI7C,YAAY;AACZ,MAAM,WAAW,aAAa;IAC5B,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS;IACT,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,aAAa;IACb,aAAa,EAAE,eAAe,CAAC;IAC/B,0BAA0B;IAC1B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,eAAe;IACf,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,cAAc;AACd,MAAM,WAAW,YAAY;IAC3B,WAAW;IACX,IAAI,EAAE,IAAI,CAAC;IACX,WAAW;IACX,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW;IACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,aAAa;AACb,MAAM,WAAW,WAAW;IAC1B,WAAW;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;QAChC,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,iBAAiB;IACjB,UAAU,CAAC,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,WAAW;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,WAAW;AACX,MAAM,WAAW,KAAK;IACpB,YAAY;IACZ,QAAQ,EAAE,aAAa,CAAC;IACxB,cAAc;IACd,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,eAAe;IACf,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC/C,WAAW;IACX,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACrD,yBAAyB;IACzB,oBAAoB,CAAC,IAAI,MAAM,CAAC;IAChC,aAAa;IACb,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,SAAS;IACT,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,WAAW;AACX,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC;AAEtE,YAAY;AACZ,MAAM,WAAW,iBAAiB;IAChC,WAAW;IACX,KAAK,EAAE,KAAK,CAAC;IACb,WAAW;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS;IACT,KAAK,EAAE,UAAU,CAAC;IAClB,YAAY;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/skills/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 并发控制器
|
|
3
|
+
*
|
|
4
|
+
* 管理任务并发执行,包括:
|
|
5
|
+
* - 最大并发数限制
|
|
6
|
+
* - 按任务类型的并发限制
|
|
7
|
+
* - 等待队列 + 优先级调度
|
|
8
|
+
* - 任务完成后自动从队列取下一个
|
|
9
|
+
*/
|
|
10
|
+
import { EventBus } from '../core/events.js';
|
|
11
|
+
import type { Task, ConcurrencyConfig, TaskType } from '../types/task.js';
|
|
12
|
+
export declare class ConcurrencyController {
|
|
13
|
+
private logger;
|
|
14
|
+
private eventBus;
|
|
15
|
+
private config;
|
|
16
|
+
/** 运行中的任务 */
|
|
17
|
+
private running;
|
|
18
|
+
/** 按类型统计运行中任务数 */
|
|
19
|
+
private runningByType;
|
|
20
|
+
/** 等待队列(按优先级排序) */
|
|
21
|
+
private queue;
|
|
22
|
+
/** 队列超时回调 */
|
|
23
|
+
private onQueueTimeout?;
|
|
24
|
+
/** 处理队列回调 */
|
|
25
|
+
private onProcessQueue?;
|
|
26
|
+
constructor(config: ConcurrencyConfig, eventBus: EventBus);
|
|
27
|
+
/**
|
|
28
|
+
* 设置队列超时回调
|
|
29
|
+
*/
|
|
30
|
+
setQueueTimeoutHandler(handler: (task: Task) => void): void;
|
|
31
|
+
/**
|
|
32
|
+
* 设置处理队列回调(当有空位时触发)
|
|
33
|
+
*/
|
|
34
|
+
setProcessQueueHandler(handler: () => void): void;
|
|
35
|
+
/**
|
|
36
|
+
* 尝试启动任务(有容量立即启动,否则入队列)
|
|
37
|
+
* @returns 'started' | 'queued' | 'rejected'
|
|
38
|
+
*/
|
|
39
|
+
tryStart(task: Task): 'started' | 'queued' | 'rejected';
|
|
40
|
+
/**
|
|
41
|
+
* 任务入队
|
|
42
|
+
* @returns 'queued' | 'rejected'
|
|
43
|
+
*/
|
|
44
|
+
private enqueue;
|
|
45
|
+
/**
|
|
46
|
+
* 排序队列(优先级调度)
|
|
47
|
+
*/
|
|
48
|
+
private sortQueue;
|
|
49
|
+
/**
|
|
50
|
+
* 任务完成,释放槽位
|
|
51
|
+
*/
|
|
52
|
+
taskFinished(taskId: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* 从队列取出下一个任务执行
|
|
55
|
+
*/
|
|
56
|
+
processQueue(): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* 取消队列中的任务
|
|
59
|
+
*/
|
|
60
|
+
removeFromQueue(taskId: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* 检查是否有可用容量
|
|
63
|
+
*/
|
|
64
|
+
hasCapacity(taskType?: TaskType): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* 设置队列项超时
|
|
67
|
+
*/
|
|
68
|
+
setQueueTimeout(taskId: string, timeoutMs: number): void;
|
|
69
|
+
/**
|
|
70
|
+
* 获取统计信息
|
|
71
|
+
*/
|
|
72
|
+
getStats(): {
|
|
73
|
+
running: number;
|
|
74
|
+
queue: number;
|
|
75
|
+
maxConcurrent: number;
|
|
76
|
+
byType: Record<string, number>;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* 取消指定任务
|
|
80
|
+
*/
|
|
81
|
+
cancelTask(taskId: string): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* 清理所有资源
|
|
84
|
+
*/
|
|
85
|
+
dispose(): void;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=concurrency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/task/concurrency.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,QAAQ,EAAmB,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAU1E,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,MAAM,CAAoB;IAElC,aAAa;IACb,OAAO,CAAC,OAAO,CAA2B;IAE1C,kBAAkB;IAClB,OAAO,CAAC,aAAa,CAA+B;IAEpD,mBAAmB;IACnB,OAAO,CAAC,KAAK,CAAoB;IAEjC,aAAa;IACb,OAAO,CAAC,cAAc,CAAC,CAAuB;IAE9C,aAAa;IACb,OAAO,CAAC,cAAc,CAAC,CAAa;gBAExB,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ;IAMzD;;OAEG;IACH,sBAAsB,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI;IAI3D;;OAEG;IACH,sBAAsB,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAIjD;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU;IA4BvD;;;OAGG;IACH,OAAO,CAAC,OAAO;IAwBf;;OAEG;IACH,OAAO,CAAC,SAAS;IA6BjB;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAqBlC;;OAEG;IACH,YAAY,IAAI,OAAO;IAuCvB;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAQxC;;OAEG;IACH,WAAW,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO;IAYzC;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAgBxD;;OAEG;IACH,QAAQ,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAarG;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAanC;;OAEG;IACH,OAAO,IAAI,IAAI;CAQhB"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 并发控制器
|
|
3
|
+
*
|
|
4
|
+
* 管理任务并发执行,包括:
|
|
5
|
+
* - 最大并发数限制
|
|
6
|
+
* - 按任务类型的并发限制
|
|
7
|
+
* - 等待队列 + 优先级调度
|
|
8
|
+
* - 任务完成后自动从队列取下一个
|
|
9
|
+
*/
|
|
10
|
+
import { createLogger } from '../core/logger.js';
|
|
11
|
+
import { WorkerClawEvent } from '../core/events.js';
|
|
12
|
+
export class ConcurrencyController {
|
|
13
|
+
logger;
|
|
14
|
+
eventBus;
|
|
15
|
+
config;
|
|
16
|
+
/** 运行中的任务 */
|
|
17
|
+
running = new Map();
|
|
18
|
+
/** 按类型统计运行中任务数 */
|
|
19
|
+
runningByType = new Map();
|
|
20
|
+
/** 等待队列(按优先级排序) */
|
|
21
|
+
queue = [];
|
|
22
|
+
/** 队列超时回调 */
|
|
23
|
+
onQueueTimeout;
|
|
24
|
+
/** 处理队列回调 */
|
|
25
|
+
onProcessQueue;
|
|
26
|
+
constructor(config, eventBus) {
|
|
27
|
+
this.config = config;
|
|
28
|
+
this.eventBus = eventBus;
|
|
29
|
+
this.logger = createLogger('Concurrency');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 设置队列超时回调
|
|
33
|
+
*/
|
|
34
|
+
setQueueTimeoutHandler(handler) {
|
|
35
|
+
this.onQueueTimeout = handler;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 设置处理队列回调(当有空位时触发)
|
|
39
|
+
*/
|
|
40
|
+
setProcessQueueHandler(handler) {
|
|
41
|
+
this.onProcessQueue = handler;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 尝试启动任务(有容量立即启动,否则入队列)
|
|
45
|
+
* @returns 'started' | 'queued' | 'rejected'
|
|
46
|
+
*/
|
|
47
|
+
tryStart(task) {
|
|
48
|
+
// 检查全局并发
|
|
49
|
+
if (this.running.size >= this.config.maxConcurrent) {
|
|
50
|
+
return this.enqueue(task);
|
|
51
|
+
}
|
|
52
|
+
// 检查按类型并发
|
|
53
|
+
const typeLimit = this.config.maxPerType[task.taskType];
|
|
54
|
+
if (typeLimit !== undefined) {
|
|
55
|
+
const typeCount = this.runningByType.get(task.taskType) || 0;
|
|
56
|
+
if (typeCount >= typeLimit) {
|
|
57
|
+
return this.enqueue(task);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// 启动
|
|
61
|
+
this.running.set(task.taskId, task);
|
|
62
|
+
this.runningByType.set(task.taskType, (this.runningByType.get(task.taskType) || 0) + 1);
|
|
63
|
+
this.logger.info(`任务开始执行 [${task.taskId}]`, {
|
|
64
|
+
type: task.taskType,
|
|
65
|
+
running: this.running.size,
|
|
66
|
+
max: this.config.maxConcurrent,
|
|
67
|
+
});
|
|
68
|
+
return 'started';
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 任务入队
|
|
72
|
+
* @returns 'queued' | 'rejected'
|
|
73
|
+
*/
|
|
74
|
+
enqueue(task) {
|
|
75
|
+
if (this.queue.length >= this.config.queueSize) {
|
|
76
|
+
this.eventBus.emit(WorkerClawEvent.QUEUE_FULL, {
|
|
77
|
+
queueSize: this.queue.length,
|
|
78
|
+
maxQueueSize: this.config.queueSize,
|
|
79
|
+
});
|
|
80
|
+
return 'rejected';
|
|
81
|
+
}
|
|
82
|
+
const item = {
|
|
83
|
+
task,
|
|
84
|
+
enqueuedAt: Date.now(),
|
|
85
|
+
};
|
|
86
|
+
this.queue.push(item);
|
|
87
|
+
this.sortQueue();
|
|
88
|
+
const position = this.queue.findIndex(i => i.task.taskId === task.taskId) + 1;
|
|
89
|
+
this.logger.info(`任务入队 [${task.taskId}]`, { position, queueSize: this.queue.length });
|
|
90
|
+
this.eventBus.emit(WorkerClawEvent.TASK_QUEUED, { taskId: task.taskId, queuePosition: position });
|
|
91
|
+
return 'queued';
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 排序队列(优先级调度)
|
|
95
|
+
*/
|
|
96
|
+
sortQueue() {
|
|
97
|
+
this.queue.sort((a, b) => {
|
|
98
|
+
let scoreA = 0;
|
|
99
|
+
let scoreB = 0;
|
|
100
|
+
// 高金额优先
|
|
101
|
+
if (this.config.priority.highValueFirst) {
|
|
102
|
+
scoreA += (a.task.reward || 0) * 10;
|
|
103
|
+
scoreB += (b.task.reward || 0) * 10;
|
|
104
|
+
}
|
|
105
|
+
// 紧急任务优先(截止时间近的优先)
|
|
106
|
+
if (this.config.priority.urgentFirst) {
|
|
107
|
+
if (a.task.deadline) {
|
|
108
|
+
const remaining = new Date(a.task.deadline).getTime() - Date.now();
|
|
109
|
+
if (remaining > 0 && remaining < 60 * 60 * 1000)
|
|
110
|
+
scoreA += 50; // 1小时内
|
|
111
|
+
}
|
|
112
|
+
if (b.task.deadline) {
|
|
113
|
+
const remaining = new Date(b.task.deadline).getTime() - Date.now();
|
|
114
|
+
if (remaining > 0 && remaining < 60 * 60 * 1000)
|
|
115
|
+
scoreB += 50;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// 先入先出(同等优先级)
|
|
119
|
+
if (scoreA === scoreB)
|
|
120
|
+
return a.enqueuedAt - b.enqueuedAt;
|
|
121
|
+
return scoreB - scoreA;
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 任务完成,释放槽位
|
|
126
|
+
*/
|
|
127
|
+
taskFinished(taskId) {
|
|
128
|
+
const task = this.running.get(taskId);
|
|
129
|
+
if (!task)
|
|
130
|
+
return;
|
|
131
|
+
this.running.delete(taskId);
|
|
132
|
+
const typeCount = (this.runningByType.get(task.taskType) || 1) - 1;
|
|
133
|
+
if (typeCount <= 0) {
|
|
134
|
+
this.runningByType.delete(task.taskType);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
this.runningByType.set(task.taskType, typeCount);
|
|
138
|
+
}
|
|
139
|
+
this.logger.debug(`任务完成释放槽位 [${taskId}]`, {
|
|
140
|
+
running: this.running.size,
|
|
141
|
+
max: this.config.maxConcurrent,
|
|
142
|
+
});
|
|
143
|
+
// 处理队列
|
|
144
|
+
this.processQueue();
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* 从队列取出下一个任务执行
|
|
148
|
+
*/
|
|
149
|
+
processQueue() {
|
|
150
|
+
if (this.queue.length === 0)
|
|
151
|
+
return false;
|
|
152
|
+
const next = this.queue[0];
|
|
153
|
+
const typeLimit = this.config.maxPerType[next.task.taskType];
|
|
154
|
+
// 检查容量
|
|
155
|
+
if (this.running.size >= this.config.maxConcurrent)
|
|
156
|
+
return false;
|
|
157
|
+
if (typeLimit !== undefined) {
|
|
158
|
+
const typeCount = this.runningByType.get(next.task.taskType) || 0;
|
|
159
|
+
if (typeCount >= typeLimit)
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
// 取出并启动
|
|
163
|
+
this.queue.shift();
|
|
164
|
+
if (next.timeoutTimer) {
|
|
165
|
+
clearTimeout(next.timeoutTimer);
|
|
166
|
+
}
|
|
167
|
+
this.running.set(next.task.taskId, next.task);
|
|
168
|
+
this.runningByType.set(next.task.taskType, (this.runningByType.get(next.task.taskType) || 0) + 1);
|
|
169
|
+
this.logger.info(`从队列取出任务 [${next.task.taskId}]`, {
|
|
170
|
+
type: next.task.taskType,
|
|
171
|
+
running: this.running.size,
|
|
172
|
+
});
|
|
173
|
+
this.eventBus.emit(WorkerClawEvent.TASK_DEQUEUED, { taskId: next.task.taskId });
|
|
174
|
+
// 通知外部处理
|
|
175
|
+
if (this.onProcessQueue) {
|
|
176
|
+
this.onProcessQueue();
|
|
177
|
+
}
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* 取消队列中的任务
|
|
182
|
+
*/
|
|
183
|
+
removeFromQueue(taskId) {
|
|
184
|
+
const idx = this.queue.findIndex(i => i.task.taskId === taskId);
|
|
185
|
+
if (idx === -1)
|
|
186
|
+
return false;
|
|
187
|
+
const item = this.queue.splice(idx, 1)[0];
|
|
188
|
+
if (item.timeoutTimer)
|
|
189
|
+
clearTimeout(item.timeoutTimer);
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* 检查是否有可用容量
|
|
194
|
+
*/
|
|
195
|
+
hasCapacity(taskType) {
|
|
196
|
+
if (this.running.size >= this.config.maxConcurrent)
|
|
197
|
+
return false;
|
|
198
|
+
if (taskType) {
|
|
199
|
+
const typeLimit = this.config.maxPerType[taskType];
|
|
200
|
+
if (typeLimit !== undefined) {
|
|
201
|
+
const typeCount = this.runningByType.get(taskType) || 0;
|
|
202
|
+
if (typeCount >= typeLimit)
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* 设置队列项超时
|
|
210
|
+
*/
|
|
211
|
+
setQueueTimeout(taskId, timeoutMs) {
|
|
212
|
+
const item = this.queue.find(i => i.task.taskId === taskId);
|
|
213
|
+
if (!item)
|
|
214
|
+
return;
|
|
215
|
+
item.timeoutTimer = setTimeout(() => {
|
|
216
|
+
const idx = this.queue.findIndex(i => i.task.taskId === taskId);
|
|
217
|
+
if (idx !== -1) {
|
|
218
|
+
this.queue.splice(idx, 1);
|
|
219
|
+
this.logger.warn(`队列任务超时 [${taskId}]`, { timeoutMs });
|
|
220
|
+
if (this.onQueueTimeout) {
|
|
221
|
+
this.onQueueTimeout(item.task);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}, timeoutMs);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* 获取统计信息
|
|
228
|
+
*/
|
|
229
|
+
getStats() {
|
|
230
|
+
const byType = {};
|
|
231
|
+
for (const [type, count] of this.runningByType) {
|
|
232
|
+
byType[type] = count;
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
running: this.running.size,
|
|
236
|
+
queue: this.queue.length,
|
|
237
|
+
maxConcurrent: this.config.maxConcurrent,
|
|
238
|
+
byType,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* 取消指定任务
|
|
243
|
+
*/
|
|
244
|
+
cancelTask(taskId) {
|
|
245
|
+
// 如果在运行中,从运行中移除
|
|
246
|
+
if (this.running.delete(taskId)) {
|
|
247
|
+
const taskType = this.queue.find(i => i.task.taskId === taskId)?.task.taskType;
|
|
248
|
+
// 无法精确知道 taskType,但可以通过遍历
|
|
249
|
+
this.logger.info(`取消运行中任务 [${taskId}]`);
|
|
250
|
+
this.processQueue();
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
// 如果在队列中
|
|
254
|
+
return this.removeFromQueue(taskId);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* 清理所有资源
|
|
258
|
+
*/
|
|
259
|
+
dispose() {
|
|
260
|
+
for (const item of this.queue) {
|
|
261
|
+
if (item.timeoutTimer)
|
|
262
|
+
clearTimeout(item.timeoutTimer);
|
|
263
|
+
}
|
|
264
|
+
this.queue = [];
|
|
265
|
+
this.running.clear();
|
|
266
|
+
this.runningByType.clear();
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=concurrency.js.map
|