plugin-agent-orchestrator 1.0.17 → 1.0.19
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/client/AIEmployeeSelect.d.ts +11 -0
- package/dist/client/AIEmployeesContext.d.ts +30 -0
- package/dist/client/AgentRunsTab.d.ts +2 -0
- package/dist/client/HarnessProfilesTab.d.ts +2 -0
- package/dist/client/OrchestratorSettings.d.ts +3 -0
- package/dist/client/RulesTab.d.ts +2 -0
- package/dist/client/TracingTab.d.ts +2 -0
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +1 -1
- package/dist/client/plugin.d.ts +6 -0
- package/dist/client/skill-hub/components/ExecutionHistory.d.ts +2 -0
- package/dist/client/skill-hub/components/ExecutionProgress.d.ts +20 -0
- package/dist/client/skill-hub/components/GitSkillImport.d.ts +7 -0
- package/dist/client/skill-hub/components/LoopSettings.d.ts +2 -0
- package/dist/client/skill-hub/components/SkillEditor.d.ts +7 -0
- package/dist/client/skill-hub/components/SkillManager.d.ts +2 -0
- package/dist/client/skill-hub/components/SkillMetrics.d.ts +2 -0
- package/dist/client/skill-hub/components/SkillTestPanel.d.ts +7 -0
- package/dist/client/skill-hub/index.d.ts +11 -0
- package/dist/client/skill-hub/locale.d.ts +3 -0
- package/dist/client/skill-hub/tools/InteractionSchemasProvider.d.ts +6 -0
- package/dist/client/skill-hub/tools/SkillHubCard.d.ts +3 -0
- package/dist/client/skill-hub/tools/loopTemplates.d.ts +22 -0
- package/dist/client/skill-hub/tools/registerSkillLoopCards.d.ts +1 -0
- package/dist/client/skill-hub/utils/jsonFields.d.ts +3 -0
- package/dist/client/tools/PlanApprovalCard.d.ts +3 -0
- package/dist/client/tools/registerOrchestratorCards.d.ts +1 -0
- package/dist/externalVersion.js +6 -6
- package/dist/index.d.ts +2 -0
- package/dist/server/collections/agent-execution-spans.d.ts +9 -0
- package/dist/server/collections/agent-harness-profiles.d.ts +2 -0
- package/dist/server/collections/agent-harness-profiles.js +89 -0
- package/dist/server/collections/agent-loop-events.d.ts +2 -0
- package/dist/server/collections/agent-loop-events.js +101 -0
- package/dist/server/collections/agent-loop-runs.d.ts +2 -0
- package/dist/server/collections/agent-loop-runs.js +188 -0
- package/dist/server/collections/agent-loop-steps.d.ts +2 -0
- package/dist/server/collections/agent-loop-steps.js +174 -0
- package/dist/server/collections/orchestrator-config.d.ts +2 -0
- package/dist/server/collections/orchestrator-config.js +7 -0
- package/dist/server/collections/orchestrator-logs.d.ts +8 -0
- package/dist/server/collections/skill-definitions.d.ts +3 -0
- package/dist/server/collections/skill-executions.d.ts +3 -0
- package/dist/server/collections/skill-executions.js +12 -0
- package/dist/server/collections/skill-loop-configs.d.ts +3 -0
- package/dist/server/collections/skill-loop-configs.js +94 -0
- package/dist/server/collections/skill-worker-configs.d.ts +3 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/migrations/20260423000000-add-progress-fields.d.ts +4 -0
- package/dist/server/migrations/20260425000000-add-interaction-schema.d.ts +4 -0
- package/dist/server/migrations/20260427000000-add-tracing-detail-fields.d.ts +7 -0
- package/dist/server/migrations/20260427000000-change-packages-to-text.d.ts +4 -0
- package/dist/server/migrations/20260427000001-change-other-json-to-text.d.ts +4 -0
- package/dist/server/migrations/20260429000000-add-llm-fields.d.ts +7 -0
- package/dist/server/migrations/20260429000000-fix-inputargs-json-to-text.d.ts +16 -0
- package/dist/server/migrations/20260503000000-add-orchestrator-trace-fields.d.ts +7 -0
- package/dist/server/migrations/20260524000000-add-agent-loop-fields-to-skill-executions.d.ts +7 -0
- package/dist/server/migrations/20260524000000-add-agent-loop-fields-to-skill-executions.js +55 -0
- package/dist/server/migrations/20260524001000-add-plan-approval-and-harness-profiles.d.ts +12 -0
- package/dist/server/migrations/20260524001000-add-plan-approval-and-harness-profiles.js +162 -0
- package/dist/server/plugin.d.ts +16 -0
- package/dist/server/plugin.js +13 -0
- package/dist/server/resources/agent-loop.d.ts +3 -0
- package/dist/server/resources/agent-loop.js +205 -0
- package/dist/server/resources/tracing.d.ts +7 -0
- package/dist/server/services/AgentHarness.d.ts +42 -0
- package/dist/server/services/AgentHarness.js +565 -0
- package/dist/server/services/AgentLoopController.d.ts +205 -0
- package/dist/server/services/AgentLoopController.js +940 -0
- package/dist/server/services/AgentLoopRepository.d.ts +20 -0
- package/dist/server/services/AgentLoopRepository.js +210 -0
- package/dist/server/services/AgentLoopService.d.ts +149 -0
- package/dist/server/services/AgentLoopService.js +133 -0
- package/dist/server/services/AgentPlanValidator.d.ts +4 -0
- package/dist/server/services/AgentPlanValidator.js +99 -0
- package/dist/server/services/AgentPlannerService.d.ts +8 -0
- package/dist/server/services/AgentPlannerService.js +119 -0
- package/dist/server/services/AgentRegistryService.d.ts +13 -0
- package/dist/server/services/AgentRegistryService.js +178 -0
- package/dist/server/services/CodeValidator.d.ts +32 -0
- package/dist/server/services/ExecutionSpanService.d.ts +46 -0
- package/dist/server/services/FileManager.d.ts +28 -0
- package/dist/server/services/SandboxRunner.d.ts +41 -0
- package/dist/server/services/SkillManager.d.ts +6 -0
- package/dist/server/services/SkillRepositoryService.d.ts +22 -0
- package/dist/server/services/WorkerEnvManager.d.ts +26 -0
- package/dist/server/skill-hub/actions/git-import.d.ts +21 -0
- package/dist/server/skill-hub/mcp/McpController.d.ts +15 -0
- package/dist/server/skill-hub/plugin.d.ts +61 -0
- package/dist/server/skill-hub/plugin.js +152 -54
- package/dist/server/skill-hub/tasks/SkillExecutionTask.d.ts +16 -0
- package/dist/server/skill-hub/tasks/SkillExecutionTask.js +15 -0
- package/dist/server/skill-hub/utils/json-fields.d.ts +7 -0
- package/dist/server/tools/agent-loop.d.ts +235 -0
- package/dist/server/tools/agent-loop.js +406 -0
- package/dist/server/tools/delegate-task.d.ts +19 -0
- package/dist/server/tools/delegate-task.js +19 -368
- package/dist/server/tools/external-rag-search.d.ts +42 -0
- package/dist/server/tools/orchestrator-plan.d.ts +205 -0
- package/dist/server/tools/orchestrator-plan.js +291 -0
- package/dist/server/tools/skill-execute.d.ts +36 -0
- package/dist/server/tools/skill-execute.js +2 -0
- package/package.json +1 -1
- package/src/client/AgentRunsTab.tsx +764 -0
- package/src/client/HarnessProfilesTab.tsx +247 -0
- package/src/client/OrchestratorSettings.tsx +40 -2
- package/src/client/RulesTab.tsx +103 -6
- package/src/client/plugin.tsx +27 -54
- package/src/client/skill-hub/components/LoopSettings.tsx +331 -0
- package/src/client/skill-hub/index.tsx +51 -75
- package/src/client/skill-hub/tools/InteractionSchemasProvider.tsx +56 -16
- package/src/client/skill-hub/tools/SkillHubCard.tsx +35 -4
- package/src/client/skill-hub/tools/loopTemplates.ts +52 -0
- package/src/client/skill-hub/tools/registerSkillLoopCards.ts +58 -0
- package/src/client/tools/PlanApprovalCard.tsx +175 -0
- package/src/client/tools/registerOrchestratorCards.ts +7 -0
- package/src/server/collections/agent-harness-profiles.ts +59 -0
- package/src/server/collections/agent-loop-events.ts +71 -0
- package/src/server/collections/agent-loop-runs.ts +158 -0
- package/src/server/collections/agent-loop-steps.ts +144 -0
- package/src/server/collections/orchestrator-config.ts +7 -0
- package/src/server/collections/skill-executions.ts +63 -51
- package/src/server/collections/skill-loop-configs.ts +65 -0
- package/src/server/migrations/20260524000000-add-agent-loop-fields-to-skill-executions.ts +30 -0
- package/src/server/migrations/20260524001000-add-plan-approval-and-harness-profiles.ts +142 -0
- package/src/server/plugin.ts +15 -0
- package/src/server/resources/agent-loop.ts +183 -0
- package/src/server/services/AgentHarness.ts +663 -0
- package/src/server/services/AgentLoopController.ts +1128 -0
- package/src/server/services/AgentLoopRepository.ts +194 -0
- package/src/server/services/AgentLoopService.ts +161 -0
- package/src/server/services/AgentPlanValidator.ts +73 -0
- package/src/server/services/AgentPlannerService.ts +93 -0
- package/src/server/services/AgentRegistryService.ts +169 -0
- package/src/server/services/ExecutionSpanService.ts +2 -0
- package/src/server/skill-hub/plugin.ts +897 -771
- package/src/server/skill-hub/tasks/SkillExecutionTask.ts +15 -0
- package/src/server/tools/agent-loop.ts +399 -0
- package/src/server/tools/delegate-task.ts +23 -485
- package/src/server/tools/orchestrator-plan.ts +279 -0
- package/src/server/tools/skill-execute.ts +68 -64
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var AgentPlannerService_exports = {};
|
|
28
|
+
__export(AgentPlannerService_exports, {
|
|
29
|
+
AgentPlannerService: () => AgentPlannerService
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(AgentPlannerService_exports);
|
|
32
|
+
function normalizeStepType(value) {
|
|
33
|
+
return ["reasoning", "skill", "tool", "sub_agent", "verification"].includes(value) ? value : "tool";
|
|
34
|
+
}
|
|
35
|
+
function normalizePlanKey(step, index) {
|
|
36
|
+
return String(step.planKey || step.key || step.id || `step_${index + 1}`);
|
|
37
|
+
}
|
|
38
|
+
function asArray(value) {
|
|
39
|
+
return Array.isArray(value) ? value : [];
|
|
40
|
+
}
|
|
41
|
+
function asObject(value) {
|
|
42
|
+
if (value && typeof value === "object" && !Array.isArray(value)) return value;
|
|
43
|
+
if (typeof value === "string" && value.trim()) {
|
|
44
|
+
try {
|
|
45
|
+
const parsed = JSON.parse(value);
|
|
46
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
47
|
+
} catch {
|
|
48
|
+
return {};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return {};
|
|
52
|
+
}
|
|
53
|
+
class AgentPlannerService {
|
|
54
|
+
buildPlan(goal, plan, options) {
|
|
55
|
+
var _a;
|
|
56
|
+
if (Array.isArray(plan) && plan.length > 0) {
|
|
57
|
+
return plan.map((step, index) => {
|
|
58
|
+
var _a2;
|
|
59
|
+
return {
|
|
60
|
+
...step,
|
|
61
|
+
planKey: normalizePlanKey(step, index),
|
|
62
|
+
type: normalizeStepType(step.type),
|
|
63
|
+
dependsOn: asArray(step.dependsOn).map(String),
|
|
64
|
+
metadata: {
|
|
65
|
+
...asObject(step.metadata),
|
|
66
|
+
harnessTag: options.harnessTag || ((_a2 = options.metadata) == null ? void 0 : _a2.harnessTag) || "default"
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
const harnessTag = options.harnessTag || ((_a = options.metadata) == null ? void 0 : _a.harnessTag) || "default";
|
|
72
|
+
const steps = [
|
|
73
|
+
{
|
|
74
|
+
planKey: "prepare_context",
|
|
75
|
+
title: "Prepare execution context",
|
|
76
|
+
description: "Review the user goal, available context, and constraints before execution.",
|
|
77
|
+
type: "reasoning",
|
|
78
|
+
input: { goal },
|
|
79
|
+
metadata: { harnessTag }
|
|
80
|
+
}
|
|
81
|
+
];
|
|
82
|
+
if (options.targetAgent) {
|
|
83
|
+
steps.push({
|
|
84
|
+
planKey: "delegate_execution",
|
|
85
|
+
title: `Delegate execution to ${options.targetAgent}`,
|
|
86
|
+
description: goal,
|
|
87
|
+
type: "sub_agent",
|
|
88
|
+
target: options.targetAgent,
|
|
89
|
+
input: { goal },
|
|
90
|
+
dependsOn: ["prepare_context"],
|
|
91
|
+
metadata: { harnessTag }
|
|
92
|
+
});
|
|
93
|
+
} else {
|
|
94
|
+
steps.push({
|
|
95
|
+
planKey: "execute_goal",
|
|
96
|
+
title: "Execute approved goal",
|
|
97
|
+
description: "Execute the user goal in the leader harness using the available approved tools.",
|
|
98
|
+
type: "reasoning",
|
|
99
|
+
input: { goal },
|
|
100
|
+
dependsOn: ["prepare_context"],
|
|
101
|
+
metadata: { harnessTag, controllerOnly: true }
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
steps.push({
|
|
105
|
+
planKey: "verify_result",
|
|
106
|
+
title: "Verify result",
|
|
107
|
+
description: "Check that the completed work matches the approved goal and report evidence.",
|
|
108
|
+
type: "verification",
|
|
109
|
+
input: { goal },
|
|
110
|
+
dependsOn: [steps[steps.length - 1].planKey || "execute_goal"],
|
|
111
|
+
metadata: { harnessTag }
|
|
112
|
+
});
|
|
113
|
+
return steps;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
117
|
+
0 && (module.exports = {
|
|
118
|
+
AgentPlannerService
|
|
119
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class AgentRegistryService {
|
|
2
|
+
private readonly plugin;
|
|
3
|
+
constructor(plugin: any);
|
|
4
|
+
get db(): any;
|
|
5
|
+
getHarnessProfile(tag: string): Promise<any>;
|
|
6
|
+
getOrchestratorConfig(leaderUsername: string, subAgentUsername: string): Promise<any>;
|
|
7
|
+
getAIEmployee(username: string): Promise<any>;
|
|
8
|
+
resolveModelSettings(subAgentUsername: string, leaderUsername?: string, dynamicValues?: any): Promise<{
|
|
9
|
+
llmService: string;
|
|
10
|
+
model: string;
|
|
11
|
+
}>;
|
|
12
|
+
isRegisteredDelegationTool(toolName: string): Promise<boolean>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var AgentRegistryService_exports = {};
|
|
28
|
+
__export(AgentRegistryService_exports, {
|
|
29
|
+
AgentRegistryService: () => AgentRegistryService
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(AgentRegistryService_exports);
|
|
32
|
+
function toPlain(record) {
|
|
33
|
+
var _a;
|
|
34
|
+
return ((_a = record == null ? void 0 : record.toJSON) == null ? void 0 : _a.call(record)) || record;
|
|
35
|
+
}
|
|
36
|
+
function asObject(value) {
|
|
37
|
+
if (value && typeof value === "object" && !Array.isArray(value)) return value;
|
|
38
|
+
if (typeof value === "string" && value.trim()) {
|
|
39
|
+
try {
|
|
40
|
+
const parsed = JSON.parse(value);
|
|
41
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
42
|
+
} catch {
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
function normalizeEmployeeUsername(raw) {
|
|
49
|
+
if (!raw) return null;
|
|
50
|
+
if (typeof raw === "string") return raw;
|
|
51
|
+
return raw.username || raw.aiEmployeeUsername || raw.name || null;
|
|
52
|
+
}
|
|
53
|
+
class AgentRegistryService {
|
|
54
|
+
constructor(plugin) {
|
|
55
|
+
this.plugin = plugin;
|
|
56
|
+
}
|
|
57
|
+
get db() {
|
|
58
|
+
return this.plugin.db;
|
|
59
|
+
}
|
|
60
|
+
async getHarnessProfile(tag) {
|
|
61
|
+
try {
|
|
62
|
+
const repo = this.db.getRepository("agentHarnessProfiles");
|
|
63
|
+
if (!repo) return null;
|
|
64
|
+
const profile = await repo.findOne({
|
|
65
|
+
filter: {
|
|
66
|
+
tag: tag || "default",
|
|
67
|
+
enabled: true
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
return profile ? toPlain(profile) : null;
|
|
71
|
+
} catch {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async getOrchestratorConfig(leaderUsername, subAgentUsername) {
|
|
76
|
+
try {
|
|
77
|
+
const repo = this.db.getRepository("orchestratorConfig");
|
|
78
|
+
if (!repo) return null;
|
|
79
|
+
const config = await repo.findOne({
|
|
80
|
+
filter: {
|
|
81
|
+
leaderUsername,
|
|
82
|
+
subAgentUsername,
|
|
83
|
+
enabled: true
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
return config ? toPlain(config) : null;
|
|
87
|
+
} catch {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async getAIEmployee(username) {
|
|
92
|
+
try {
|
|
93
|
+
const repo = this.db.getRepository("aiEmployees");
|
|
94
|
+
if (!repo) return null;
|
|
95
|
+
const employee = await repo.findOne({
|
|
96
|
+
filter: { username }
|
|
97
|
+
});
|
|
98
|
+
return employee ? toPlain(employee) : null;
|
|
99
|
+
} catch {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async resolveModelSettings(subAgentUsername, leaderUsername, dynamicValues) {
|
|
104
|
+
const subAgent = await this.getAIEmployee(subAgentUsername);
|
|
105
|
+
if (!subAgent) {
|
|
106
|
+
throw new Error(`Sub-agent "${subAgentUsername}" was not found.`);
|
|
107
|
+
}
|
|
108
|
+
const hasModelSettings = (val) => {
|
|
109
|
+
return Boolean((val == null ? void 0 : val.llmService) && (val == null ? void 0 : val.model));
|
|
110
|
+
};
|
|
111
|
+
let modelSettings = hasModelSettings(dynamicValues) ? dynamicValues : void 0;
|
|
112
|
+
if (!modelSettings) {
|
|
113
|
+
if (hasModelSettings(subAgent.modelSettings)) {
|
|
114
|
+
modelSettings = subAgent.modelSettings;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (!modelSettings && leaderUsername) {
|
|
118
|
+
const leader = await this.getAIEmployee(leaderUsername);
|
|
119
|
+
if (leader && hasModelSettings(leader.modelSettings)) {
|
|
120
|
+
modelSettings = leader.modelSettings;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return modelSettings;
|
|
124
|
+
}
|
|
125
|
+
async isRegisteredDelegationTool(toolName) {
|
|
126
|
+
if (!toolName || typeof toolName !== "string") return false;
|
|
127
|
+
if (!toolName.startsWith("delegate_") && !toolName.startsWith("dispatch_subagents_")) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
const configRepo = this.db.getRepository("orchestratorConfig");
|
|
132
|
+
if (!configRepo) return false;
|
|
133
|
+
if (toolName.startsWith("dispatch_subagents_")) {
|
|
134
|
+
const leader = toolName.substring("dispatch_subagents_".length);
|
|
135
|
+
const count = await configRepo.count({
|
|
136
|
+
filter: {
|
|
137
|
+
leaderUsername: leader,
|
|
138
|
+
enabled: true
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
return count > 0;
|
|
142
|
+
}
|
|
143
|
+
if (toolName.startsWith("delegate_") && toolName.includes("_to_")) {
|
|
144
|
+
const parts = toolName.substring("delegate_".length).split("_to_");
|
|
145
|
+
if (parts.length === 2) {
|
|
146
|
+
const [leader, subAgent] = parts;
|
|
147
|
+
const count = await configRepo.count({
|
|
148
|
+
filter: {
|
|
149
|
+
leaderUsername: leader,
|
|
150
|
+
subAgentUsername: subAgent,
|
|
151
|
+
enabled: true
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
if (count > 0) return true;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (toolName.startsWith("delegate_to_")) {
|
|
158
|
+
const subAgent = toolName.substring("delegate_to_".length);
|
|
159
|
+
const configs = await configRepo.find({
|
|
160
|
+
filter: {
|
|
161
|
+
subAgentUsername: subAgent,
|
|
162
|
+
enabled: true
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
if ((configs == null ? void 0 : configs.length) === 1) {
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return false;
|
|
170
|
+
} catch {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
176
|
+
0 && (module.exports = {
|
|
177
|
+
AgentRegistryService
|
|
178
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare class CodeValidator {
|
|
2
|
+
/**
|
|
3
|
+
* Check code against forbidden patterns (dangerous modules/functions).
|
|
4
|
+
* @throws CodeValidationError if a forbidden pattern is found.
|
|
5
|
+
*/
|
|
6
|
+
validate(code: string, language: 'node' | 'python'): void;
|
|
7
|
+
/**
|
|
8
|
+
* Validate that code only imports packages in the whitelist.
|
|
9
|
+
* Called after the basic forbidden pattern check.
|
|
10
|
+
* Skips validation if whitelist is empty (env not initialized yet).
|
|
11
|
+
*
|
|
12
|
+
* @param code - The code to validate
|
|
13
|
+
* @param language - 'node' or 'python'
|
|
14
|
+
* @param whitelist - Array of allowed package names (from skillWorkerConfigs.packageWhitelist)
|
|
15
|
+
*/
|
|
16
|
+
validateImports(code: string, language: 'node' | 'python', whitelist: string[]): void;
|
|
17
|
+
/**
|
|
18
|
+
* Check Node.js require() calls against the whitelist.
|
|
19
|
+
* Built-in modules (fs, path, etc.) are always allowed.
|
|
20
|
+
*/
|
|
21
|
+
private validateNodeImports;
|
|
22
|
+
/**
|
|
23
|
+
* Check Python import/from statements against the whitelist.
|
|
24
|
+
* Built-in modules (os, sys, json, etc.) are always allowed.
|
|
25
|
+
* Handles PyPI→import name mapping (e.g., python-docx → docx, Pillow → PIL).
|
|
26
|
+
*/
|
|
27
|
+
private validatePythonImports;
|
|
28
|
+
}
|
|
29
|
+
export declare class CodeValidationError extends Error {
|
|
30
|
+
matchedPattern: string;
|
|
31
|
+
constructor(message: string, matchedPattern: string);
|
|
32
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export declare const ORCHESTRATOR_TRACE_CONTEXT_KEY = "__orchestratorTraceContext";
|
|
2
|
+
export type OrchestratorTraceContext = {
|
|
3
|
+
rootRunId: string;
|
|
4
|
+
spanId?: string;
|
|
5
|
+
parentSpanId?: string;
|
|
6
|
+
toolCallId?: string;
|
|
7
|
+
leaderUsername?: string;
|
|
8
|
+
employeeUsername?: string;
|
|
9
|
+
toolName?: string;
|
|
10
|
+
agentLoopRunId?: string;
|
|
11
|
+
agentLoopStepId?: string;
|
|
12
|
+
};
|
|
13
|
+
type SpanValues = {
|
|
14
|
+
rootRunId: string;
|
|
15
|
+
parentSpanId?: string;
|
|
16
|
+
type: string;
|
|
17
|
+
status: string;
|
|
18
|
+
leaderUsername?: string;
|
|
19
|
+
employeeUsername?: string;
|
|
20
|
+
toolName?: string;
|
|
21
|
+
title?: string;
|
|
22
|
+
input?: any;
|
|
23
|
+
output?: string;
|
|
24
|
+
error?: string;
|
|
25
|
+
durationMs?: number;
|
|
26
|
+
startedAt?: Date;
|
|
27
|
+
endedAt?: Date;
|
|
28
|
+
orchestratorLogId?: string | number;
|
|
29
|
+
skillExecutionId?: string | number;
|
|
30
|
+
metadata?: any;
|
|
31
|
+
userId?: string | number;
|
|
32
|
+
};
|
|
33
|
+
export declare class ExecutionSpanService {
|
|
34
|
+
private readonly plugin;
|
|
35
|
+
constructor(plugin: any);
|
|
36
|
+
create(values: SpanValues): Promise<any>;
|
|
37
|
+
update(spanId: string | number | undefined, values: Record<string, any>): Promise<{
|
|
38
|
+
id: string | number;
|
|
39
|
+
}>;
|
|
40
|
+
finish(spanId: string | number | undefined, status: 'success' | 'error' | 'canceled' | 'timeout', startedAt: number, values?: Record<string, any>): Promise<{
|
|
41
|
+
id: string | number;
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
export declare function getOrchestratorTraceContext(ctx: any): OrchestratorTraceContext | null;
|
|
45
|
+
export declare function setOrchestratorTraceContext(ctx: any, traceContext: OrchestratorTraceContext): any;
|
|
46
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface OutputFileInfo {
|
|
2
|
+
name: string;
|
|
3
|
+
size: number;
|
|
4
|
+
mimeType: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class FileManager {
|
|
7
|
+
private storagePath;
|
|
8
|
+
private executionsDir;
|
|
9
|
+
constructor(storagePath: string);
|
|
10
|
+
createExecDir(execId: string): string;
|
|
11
|
+
getExecDir(execId: string): string;
|
|
12
|
+
getOutputDir(execId: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Returns absolute path to an output file, or null if invalid/not found.
|
|
15
|
+
* Includes path traversal protection.
|
|
16
|
+
*/
|
|
17
|
+
getOutputFilePath(execId: string, filename: string): string | null;
|
|
18
|
+
listOutputFiles(execId: string): OutputFileInfo[];
|
|
19
|
+
getTotalOutputSize(execId: string): number;
|
|
20
|
+
/**
|
|
21
|
+
* Remove a specific execution directory by execId.
|
|
22
|
+
*/
|
|
23
|
+
removeExecDir(execId: string): void;
|
|
24
|
+
/**
|
|
25
|
+
* Remove execution directories older than maxAgeMs.
|
|
26
|
+
*/
|
|
27
|
+
cleanupOlderThan(maxAgeMs: number): number;
|
|
28
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { FileManager, OutputFileInfo } from './FileManager';
|
|
2
|
+
export interface ExecuteOptions {
|
|
3
|
+
language: 'node' | 'python';
|
|
4
|
+
code: string;
|
|
5
|
+
execId: string;
|
|
6
|
+
timeoutSeconds?: number;
|
|
7
|
+
maxOutputSizeMb?: number;
|
|
8
|
+
onProgress?: (progress: ProgressUpdate) => void;
|
|
9
|
+
/** AbortSignal — when aborted, the child process is killed */
|
|
10
|
+
signal?: {
|
|
11
|
+
addEventListener(event: string, listener: () => void): void;
|
|
12
|
+
};
|
|
13
|
+
/** Package whitelist for import validation (from skillWorkerConfigs) */
|
|
14
|
+
packageWhitelist?: string[];
|
|
15
|
+
/** Optional installed/copied skill package root exposed to the runtime as SKILL_DIR. */
|
|
16
|
+
skillDir?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ProgressUpdate {
|
|
19
|
+
percent: number;
|
|
20
|
+
log: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ExecutionResult {
|
|
23
|
+
success: boolean;
|
|
24
|
+
stdout: string;
|
|
25
|
+
stderr: string;
|
|
26
|
+
files: OutputFileInfo[];
|
|
27
|
+
durationMs: number;
|
|
28
|
+
/** true if execution was canceled by user */
|
|
29
|
+
canceled?: boolean;
|
|
30
|
+
/** true if execution timed out */
|
|
31
|
+
timedOut?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export declare class SandboxRunner {
|
|
34
|
+
private fileManager;
|
|
35
|
+
private logger;
|
|
36
|
+
private storagePath;
|
|
37
|
+
private validator;
|
|
38
|
+
private sandboxWorkspace;
|
|
39
|
+
constructor(fileManager: FileManager, logger: any, storagePath: string);
|
|
40
|
+
execute(options: ExecuteOptions): Promise<ExecutionResult>;
|
|
41
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface SkillPackageMetadata {
|
|
2
|
+
path: string;
|
|
3
|
+
metadata: Record<string, any>;
|
|
4
|
+
instructions: string;
|
|
5
|
+
code: string | null;
|
|
6
|
+
}
|
|
7
|
+
export declare class SkillRepositoryService {
|
|
8
|
+
private baseDir;
|
|
9
|
+
constructor(storagePath: string);
|
|
10
|
+
/**
|
|
11
|
+
* Extract a zip file to the repository.
|
|
12
|
+
* Returns parsed metadata from SKILL.md / skill.yaml
|
|
13
|
+
*/
|
|
14
|
+
extractSkillPackage(skillName: string, zipFilePath: string): Promise<SkillPackageMetadata>;
|
|
15
|
+
getSkillPath(skillName: string): string;
|
|
16
|
+
getSkillCode(skillName: string): string | null;
|
|
17
|
+
copySkillPackageTo(skillName: string, destDir: string): void;
|
|
18
|
+
readSkillPackage(packageDir: string): SkillPackageMetadata;
|
|
19
|
+
copyDirectoryTo(srcDir: string, destDir: string): void;
|
|
20
|
+
private getSkillCodeFromDir;
|
|
21
|
+
private aggregateOtherMarkdownFiles;
|
|
22
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import Application from '@nocobase/server';
|
|
2
|
+
import { Database } from '@nocobase/database';
|
|
3
|
+
type WorkerEnvConfig = {
|
|
4
|
+
npmRegistryUrl?: string;
|
|
5
|
+
npmAuthToken?: string;
|
|
6
|
+
pypiIndexUrl?: string;
|
|
7
|
+
pypiTrustedHost?: string;
|
|
8
|
+
aptMirrorUrl?: string;
|
|
9
|
+
aptGpgKeyUrl?: string;
|
|
10
|
+
customPackages?: {
|
|
11
|
+
python?: string[];
|
|
12
|
+
node?: string[];
|
|
13
|
+
apt?: string[];
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export declare class WorkerEnvManager {
|
|
17
|
+
private readonly app;
|
|
18
|
+
private readonly db;
|
|
19
|
+
private readonly storagePath;
|
|
20
|
+
constructor(app: Application, db: Database, storagePath: string);
|
|
21
|
+
getOrCreateConfig(): Promise<any>;
|
|
22
|
+
initEnvironment(config: WorkerEnvConfig): Promise<string>;
|
|
23
|
+
executeInit(payload: WorkerEnvConfig): Promise<void>;
|
|
24
|
+
parsePackageWhitelist(config: any): Record<"node" | "python" | "apt", string[]>;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Context } from '@nocobase/actions';
|
|
2
|
+
/**
|
|
3
|
+
* Git integration actions for skill-hub.
|
|
4
|
+
*
|
|
5
|
+
* Supported manifest shape:
|
|
6
|
+
* {
|
|
7
|
+
* "skills": [
|
|
8
|
+
* { "folder": "my-skill", "name": "my-skill", "language": "python" },
|
|
9
|
+
* { "name": "pptx-advanced-export", "storageType": "plugin", "pluginSource": "pptx-advanced-export" }
|
|
10
|
+
* ]
|
|
11
|
+
* }
|
|
12
|
+
*/
|
|
13
|
+
export declare function gitListSkills(ctx: Context, next: () => Promise<void>): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Sync selected skills from git into skillDefinitions.
|
|
16
|
+
*
|
|
17
|
+
* Code is optional. Regular git skills may provide code via codeTemplate,
|
|
18
|
+
* codeFile, or conventional files under skills/<folder>. Plugin skills only
|
|
19
|
+
* need storageType=plugin and pluginSource.
|
|
20
|
+
*/
|
|
21
|
+
export declare function gitSyncSkills(ctx: Context, next: () => Promise<void>): Promise<void>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type PluginSkillHubServer from '../plugin';
|
|
2
|
+
export declare class McpController {
|
|
3
|
+
private plugin;
|
|
4
|
+
constructor(plugin: PluginSkillHubServer);
|
|
5
|
+
/**
|
|
6
|
+
* List all enabled skills in standard MCP format.
|
|
7
|
+
* Route: GET /api/skillHub:mcpListTools
|
|
8
|
+
*/
|
|
9
|
+
listTools(ctx: any, next: any): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Execute a skill in standard MCP format.
|
|
12
|
+
* Route: POST /api/skillHub:mcpCallTool
|
|
13
|
+
*/
|
|
14
|
+
callTool(ctx: any, next: any): Promise<void>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { SandboxRunner } from '../services/SandboxRunner';
|
|
2
|
+
import { FileManager } from '../services/FileManager';
|
|
3
|
+
import { SkillManager } from '../services/SkillManager';
|
|
4
|
+
import { WorkerEnvManager } from '../services/WorkerEnvManager';
|
|
5
|
+
export declare class SkillHubSubFeature {
|
|
6
|
+
private plugin;
|
|
7
|
+
sandboxRunner: SandboxRunner;
|
|
8
|
+
fileManager: FileManager;
|
|
9
|
+
skillManager: SkillManager;
|
|
10
|
+
workerEnvManager: WorkerEnvManager;
|
|
11
|
+
private cleanupInterval;
|
|
12
|
+
private initEnvDoneCallback;
|
|
13
|
+
private initEnvProgressCallback;
|
|
14
|
+
private mcpController;
|
|
15
|
+
private skillRepoService;
|
|
16
|
+
private rateLimiter;
|
|
17
|
+
private skillTemplates;
|
|
18
|
+
constructor(plugin: any);
|
|
19
|
+
get app(): any;
|
|
20
|
+
get db(): any;
|
|
21
|
+
get name(): any;
|
|
22
|
+
load(): Promise<void>;
|
|
23
|
+
private onQueueTask;
|
|
24
|
+
/**
|
|
25
|
+
* Execute skill — called by both AI tool and REST test endpoint.
|
|
26
|
+
* Dispatches to worker via EventQueue, waits for result via PubSub.
|
|
27
|
+
* Pushes progress to SSE via runtime.writer (if within AI tool context).
|
|
28
|
+
* Includes rate limiting and graceful abort propagation.
|
|
29
|
+
*/
|
|
30
|
+
executeSkill(skill: any, inputArgs: Record<string, any>, ctx?: any): Promise<any>;
|
|
31
|
+
private handleDownload;
|
|
32
|
+
private handleTest;
|
|
33
|
+
/**
|
|
34
|
+
* Handle Init Environment request from admin UI.
|
|
35
|
+
* Dispatches init task to all workers via EventQueue.
|
|
36
|
+
*/
|
|
37
|
+
private handleInitEnv;
|
|
38
|
+
/**
|
|
39
|
+
* Subscribe to init-env done AND progress PubSub channels.
|
|
40
|
+
* When a worker finishes init, auto-update the DB with status.
|
|
41
|
+
*/
|
|
42
|
+
private subscribeInitEnvDone;
|
|
43
|
+
private getSkillRecordId;
|
|
44
|
+
private resolveLoopInteractionSchema;
|
|
45
|
+
private getLoopConfigsBySkillId;
|
|
46
|
+
private registerAITools;
|
|
47
|
+
private startCleanupInterval;
|
|
48
|
+
beforeStop(): Promise<void>;
|
|
49
|
+
private handleClearStorage;
|
|
50
|
+
private handleListTemplates;
|
|
51
|
+
/**
|
|
52
|
+
* Register a skill template into memory for UI importing.
|
|
53
|
+
*/
|
|
54
|
+
registerSkillTemplate(pluginName: string, skillDef: any): void;
|
|
55
|
+
resolveSkillTemplate(templateName: string): any;
|
|
56
|
+
getSkillDescriptionForAI(skill: any): Promise<string>;
|
|
57
|
+
getSkillInstructions(skill: any): Promise<any>;
|
|
58
|
+
private hydrateSkillTemplate;
|
|
59
|
+
install(): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
export default SkillHubSubFeature;
|