network-ai 5.10.2 → 5.12.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/INTEGRATION_GUIDE.md +2 -2
- package/QUICKSTART.md +10 -0
- package/README.md +32 -3
- package/SKILL.md +3 -3
- package/dist/esm/adapters/a2a-adapter.js +235 -0
- package/dist/esm/adapters/a2a-adapter.js.map +1 -0
- package/dist/esm/adapters/adapter-registry.js +613 -0
- package/dist/esm/adapters/adapter-registry.js.map +1 -0
- package/dist/esm/adapters/agno-adapter.js +140 -0
- package/dist/esm/adapters/agno-adapter.js.map +1 -0
- package/dist/esm/adapters/anthropic-computer-use-adapter.js +180 -0
- package/dist/esm/adapters/anthropic-computer-use-adapter.js.map +1 -0
- package/dist/esm/adapters/aps-adapter.js +289 -0
- package/dist/esm/adapters/aps-adapter.js.map +1 -0
- package/dist/esm/adapters/autogen-adapter.js +141 -0
- package/dist/esm/adapters/autogen-adapter.js.map +1 -0
- package/dist/esm/adapters/base-adapter.js +104 -0
- package/dist/esm/adapters/base-adapter.js.map +1 -0
- package/dist/esm/adapters/browser-agent-adapter.js +219 -0
- package/dist/esm/adapters/browser-agent-adapter.js.map +1 -0
- package/dist/esm/adapters/codex-adapter.js +318 -0
- package/dist/esm/adapters/codex-adapter.js.map +1 -0
- package/dist/esm/adapters/copilot-adapter.js +132 -0
- package/dist/esm/adapters/copilot-adapter.js.map +1 -0
- package/dist/esm/adapters/crewai-adapter.js +148 -0
- package/dist/esm/adapters/crewai-adapter.js.map +1 -0
- package/dist/esm/adapters/custom-adapter.js +142 -0
- package/dist/esm/adapters/custom-adapter.js.map +1 -0
- package/dist/esm/adapters/custom-streaming-adapter.js +181 -0
- package/dist/esm/adapters/custom-streaming-adapter.js.map +1 -0
- package/dist/esm/adapters/dspy-adapter.js +127 -0
- package/dist/esm/adapters/dspy-adapter.js.map +1 -0
- package/dist/esm/adapters/haystack-adapter.js +149 -0
- package/dist/esm/adapters/haystack-adapter.js.map +1 -0
- package/dist/esm/adapters/hermes-adapter.js +217 -0
- package/dist/esm/adapters/hermes-adapter.js.map +1 -0
- package/dist/esm/adapters/index.js +109 -0
- package/dist/esm/adapters/index.js.map +1 -0
- package/dist/esm/adapters/langchain-adapter.js +134 -0
- package/dist/esm/adapters/langchain-adapter.js.map +1 -0
- package/dist/esm/adapters/langchain-streaming-adapter.js +161 -0
- package/dist/esm/adapters/langchain-streaming-adapter.js.map +1 -0
- package/dist/esm/adapters/langgraph-adapter.js +119 -0
- package/dist/esm/adapters/langgraph-adapter.js.map +1 -0
- package/dist/esm/adapters/llamaindex-adapter.js +135 -0
- package/dist/esm/adapters/llamaindex-adapter.js.map +1 -0
- package/dist/esm/adapters/mcp-adapter.js +200 -0
- package/dist/esm/adapters/mcp-adapter.js.map +1 -0
- package/dist/esm/adapters/minimax-adapter.js +233 -0
- package/dist/esm/adapters/minimax-adapter.js.map +1 -0
- package/dist/esm/adapters/nemoclaw-adapter.js +465 -0
- package/dist/esm/adapters/nemoclaw-adapter.js.map +1 -0
- package/dist/esm/adapters/openai-agents-adapter.js +118 -0
- package/dist/esm/adapters/openai-agents-adapter.js.map +1 -0
- package/dist/esm/adapters/openai-assistants-adapter.js +130 -0
- package/dist/esm/adapters/openai-assistants-adapter.js.map +1 -0
- package/dist/esm/adapters/openclaw-adapter.js +107 -0
- package/dist/esm/adapters/openclaw-adapter.js.map +1 -0
- package/dist/esm/adapters/orchestrator-adapter.js +218 -0
- package/dist/esm/adapters/orchestrator-adapter.js.map +1 -0
- package/dist/esm/adapters/pydantic-ai-adapter.js +163 -0
- package/dist/esm/adapters/pydantic-ai-adapter.js.map +1 -0
- package/dist/esm/adapters/rlm-adapter.js +167 -0
- package/dist/esm/adapters/rlm-adapter.js.map +1 -0
- package/dist/esm/adapters/semantic-kernel-adapter.js +123 -0
- package/dist/esm/adapters/semantic-kernel-adapter.js.map +1 -0
- package/dist/esm/adapters/streaming-base-adapter.js +74 -0
- package/dist/esm/adapters/streaming-base-adapter.js.map +1 -0
- package/dist/esm/adapters/vertex-ai-adapter.js +166 -0
- package/dist/esm/adapters/vertex-ai-adapter.js.map +1 -0
- package/dist/esm/demo-control-plane.js +147 -0
- package/dist/esm/demo-control-plane.js.map +1 -0
- package/dist/esm/demo-worktree-dashboard.js +131 -0
- package/dist/esm/demo-worktree-dashboard.js.map +1 -0
- package/dist/esm/examples/01-hello-swarm.js +165 -0
- package/dist/esm/examples/01-hello-swarm.js.map +1 -0
- package/dist/esm/examples/02-fsm-pipeline.js +189 -0
- package/dist/esm/examples/02-fsm-pipeline.js.map +1 -0
- package/dist/esm/examples/03-parallel-agents.js +192 -0
- package/dist/esm/examples/03-parallel-agents.js.map +1 -0
- package/dist/esm/examples/05-code-review-swarm.js +1177 -0
- package/dist/esm/examples/05-code-review-swarm.js.map +1 -0
- package/dist/esm/examples/06-ai-pipeline-demo.js +263 -0
- package/dist/esm/examples/06-ai-pipeline-demo.js.map +1 -0
- package/dist/esm/examples/07-full-showcase.js +946 -0
- package/dist/esm/examples/07-full-showcase.js.map +1 -0
- package/dist/esm/examples/08-control-plane-stress-demo.js +186 -0
- package/dist/esm/examples/08-control-plane-stress-demo.js.map +1 -0
- package/dist/esm/examples/09-real-langchain.js +231 -0
- package/dist/esm/examples/09-real-langchain.js.map +1 -0
- package/dist/esm/examples/10-nemoclaw-sandbox-swarm.js +270 -0
- package/dist/esm/examples/10-nemoclaw-sandbox-swarm.js.map +1 -0
- package/dist/esm/examples/demo-runner.js +119 -0
- package/dist/esm/examples/demo-runner.js.map +1 -0
- package/dist/esm/index.js +1352 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/adapter-hooks.js +216 -0
- package/dist/esm/lib/adapter-hooks.js.map +1 -0
- package/dist/esm/lib/adapter-test-harness.js +118 -0
- package/dist/esm/lib/adapter-test-harness.js.map +1 -0
- package/dist/esm/lib/agent-conversation.js +155 -0
- package/dist/esm/lib/agent-conversation.js.map +1 -0
- package/dist/esm/lib/agent-debate.js +146 -0
- package/dist/esm/lib/agent-debate.js.map +1 -0
- package/dist/esm/lib/agent-memory.js +336 -0
- package/dist/esm/lib/agent-memory.js.map +1 -0
- package/dist/esm/lib/agent-runtime.js +818 -0
- package/dist/esm/lib/agent-runtime.js.map +1 -0
- package/dist/esm/lib/agent-vcr.js +218 -0
- package/dist/esm/lib/agent-vcr.js.map +1 -0
- package/dist/esm/lib/anomaly-detector.js +178 -0
- package/dist/esm/lib/anomaly-detector.js.map +1 -0
- package/dist/esm/lib/approval-inbox.js +385 -0
- package/dist/esm/lib/approval-inbox.js.map +1 -0
- package/dist/esm/lib/auth-guardian.js +692 -0
- package/dist/esm/lib/auth-guardian.js.map +1 -0
- package/dist/esm/lib/auth-validator.js +32 -0
- package/dist/esm/lib/auth-validator.js.map +1 -0
- package/dist/esm/lib/blackboard-backend-crdt.js +251 -0
- package/dist/esm/lib/blackboard-backend-crdt.js.map +1 -0
- package/dist/esm/lib/blackboard-backend-redis.js +244 -0
- package/dist/esm/lib/blackboard-backend-redis.js.map +1 -0
- package/dist/esm/lib/blackboard-backend.js +141 -0
- package/dist/esm/lib/blackboard-backend.js.map +1 -0
- package/dist/esm/lib/blackboard-validator.js +985 -0
- package/dist/esm/lib/blackboard-validator.js.map +1 -0
- package/dist/esm/lib/circuit-breaker.js +164 -0
- package/dist/esm/lib/circuit-breaker.js.map +1 -0
- package/dist/esm/lib/claim-verifier.js +173 -0
- package/dist/esm/lib/claim-verifier.js.map +1 -0
- package/dist/esm/lib/comparison-runner.js +138 -0
- package/dist/esm/lib/comparison-runner.js.map +1 -0
- package/dist/esm/lib/compliance-monitor.js +261 -0
- package/dist/esm/lib/compliance-monitor.js.map +1 -0
- package/dist/esm/lib/confidence-filter.js +210 -0
- package/dist/esm/lib/confidence-filter.js.map +1 -0
- package/dist/esm/lib/config-watcher.js +215 -0
- package/dist/esm/lib/config-watcher.js.map +1 -0
- package/dist/esm/lib/consistency.js +274 -0
- package/dist/esm/lib/consistency.js.map +1 -0
- package/dist/esm/lib/console-ui.js +276 -0
- package/dist/esm/lib/console-ui.js.map +1 -0
- package/dist/esm/lib/context-throttler.js +171 -0
- package/dist/esm/lib/context-throttler.js.map +1 -0
- package/dist/esm/lib/control-plane.js +527 -0
- package/dist/esm/lib/control-plane.js.map +1 -0
- package/dist/esm/lib/cost-governor.js +128 -0
- package/dist/esm/lib/cost-governor.js.map +1 -0
- package/dist/esm/lib/cost-heatmap.js +161 -0
- package/dist/esm/lib/cost-heatmap.js.map +1 -0
- package/dist/esm/lib/coverage-gate.js +213 -0
- package/dist/esm/lib/coverage-gate.js.map +1 -0
- package/dist/esm/lib/coverage-reporter.js +177 -0
- package/dist/esm/lib/coverage-reporter.js.map +1 -0
- package/dist/esm/lib/crdt.js +141 -0
- package/dist/esm/lib/crdt.js.map +1 -0
- package/dist/esm/lib/dashboard-server.js +403 -0
- package/dist/esm/lib/dashboard-server.js.map +1 -0
- package/dist/esm/lib/dry-run.js +130 -0
- package/dist/esm/lib/dry-run.js.map +1 -0
- package/dist/esm/lib/env-manager.js +518 -0
- package/dist/esm/lib/env-manager.js.map +1 -0
- package/dist/esm/lib/errors.js +201 -0
- package/dist/esm/lib/errors.js.map +1 -0
- package/dist/esm/lib/event-bus.js +229 -0
- package/dist/esm/lib/event-bus.js.map +1 -0
- package/dist/esm/lib/explainability.js +102 -0
- package/dist/esm/lib/explainability.js.map +1 -0
- package/dist/esm/lib/fan-out.js +237 -0
- package/dist/esm/lib/fan-out.js.map +1 -0
- package/dist/esm/lib/federated-budget.js +322 -0
- package/dist/esm/lib/federated-budget.js.map +1 -0
- package/dist/esm/lib/fsm-journey.js +478 -0
- package/dist/esm/lib/fsm-journey.js.map +1 -0
- package/dist/esm/lib/goal-decomposer.js +698 -0
- package/dist/esm/lib/goal-decomposer.js.map +1 -0
- package/dist/esm/lib/goal-dsl.js +391 -0
- package/dist/esm/lib/goal-dsl.js.map +1 -0
- package/dist/esm/lib/job-queue.js +310 -0
- package/dist/esm/lib/job-queue.js.map +1 -0
- package/dist/esm/lib/landscape-agent.js +134 -0
- package/dist/esm/lib/landscape-agent.js.map +1 -0
- package/dist/esm/lib/learning-loop.js +181 -0
- package/dist/esm/lib/learning-loop.js.map +1 -0
- package/dist/esm/lib/lifecycle-hooks.js +148 -0
- package/dist/esm/lib/lifecycle-hooks.js.map +1 -0
- package/dist/esm/lib/locked-blackboard.js +1295 -0
- package/dist/esm/lib/locked-blackboard.js.map +1 -0
- package/dist/esm/lib/logger.js +150 -0
- package/dist/esm/lib/logger.js.map +1 -0
- package/dist/esm/lib/mcp-blackboard-tools.js +298 -0
- package/dist/esm/lib/mcp-blackboard-tools.js.map +1 -0
- package/dist/esm/lib/mcp-bridge.js +357 -0
- package/dist/esm/lib/mcp-bridge.js.map +1 -0
- package/dist/esm/lib/mcp-tool-consumer.js +287 -0
- package/dist/esm/lib/mcp-tool-consumer.js.map +1 -0
- package/dist/esm/lib/mcp-tools-control.js +392 -0
- package/dist/esm/lib/mcp-tools-control.js.map +1 -0
- package/dist/esm/lib/mcp-tools-extended.js +371 -0
- package/dist/esm/lib/mcp-tools-extended.js.map +1 -0
- package/dist/esm/lib/mcp-transport-http.js +528 -0
- package/dist/esm/lib/mcp-transport-http.js.map +1 -0
- package/dist/esm/lib/mcp-transport-sse.js +503 -0
- package/dist/esm/lib/mcp-transport-sse.js.map +1 -0
- package/dist/esm/lib/metrics.js +284 -0
- package/dist/esm/lib/metrics.js.map +1 -0
- package/dist/esm/lib/orchestrator-types.js +66 -0
- package/dist/esm/lib/orchestrator-types.js.map +1 -0
- package/dist/esm/lib/otel-bridge.js +167 -0
- package/dist/esm/lib/otel-bridge.js.map +1 -0
- package/dist/esm/lib/partition-planner.js +246 -0
- package/dist/esm/lib/partition-planner.js.map +1 -0
- package/dist/esm/lib/phase-pipeline.js +367 -0
- package/dist/esm/lib/phase-pipeline.js.map +1 -0
- package/dist/esm/lib/playground.js +224 -0
- package/dist/esm/lib/playground.js.map +1 -0
- package/dist/esm/lib/qa-orchestrator.js +296 -0
- package/dist/esm/lib/qa-orchestrator.js.map +1 -0
- package/dist/esm/lib/quadtree.js +259 -0
- package/dist/esm/lib/quadtree.js.map +1 -0
- package/dist/esm/lib/route-classifier.js +217 -0
- package/dist/esm/lib/route-classifier.js.map +1 -0
- package/dist/esm/lib/semantic-search.js +235 -0
- package/dist/esm/lib/semantic-search.js.map +1 -0
- package/dist/esm/lib/shared-blackboard.js +249 -0
- package/dist/esm/lib/shared-blackboard.js.map +1 -0
- package/dist/esm/lib/skill-composer.js +190 -0
- package/dist/esm/lib/skill-composer.js.map +1 -0
- package/dist/esm/lib/speculative-executor.js +107 -0
- package/dist/esm/lib/speculative-executor.js.map +1 -0
- package/dist/esm/lib/strategy-agent.js +626 -0
- package/dist/esm/lib/strategy-agent.js.map +1 -0
- package/dist/esm/lib/swarm-transport.js +307 -0
- package/dist/esm/lib/swarm-transport.js.map +1 -0
- package/dist/esm/lib/swarm-utils.js +510 -0
- package/dist/esm/lib/swarm-utils.js.map +1 -0
- package/dist/esm/lib/task-decomposer.js +272 -0
- package/dist/esm/lib/task-decomposer.js.map +1 -0
- package/dist/esm/lib/telemetry-provider.js +207 -0
- package/dist/esm/lib/telemetry-provider.js.map +1 -0
- package/dist/esm/lib/timeline-scrubber.js +173 -0
- package/dist/esm/lib/timeline-scrubber.js.map +1 -0
- package/dist/esm/lib/topology.js +591 -0
- package/dist/esm/lib/topology.js.map +1 -0
- package/dist/esm/lib/transport-agent.js +366 -0
- package/dist/esm/lib/transport-agent.js.map +1 -0
- package/dist/esm/lib/work-tree-dashboard.js +583 -0
- package/dist/esm/lib/work-tree-dashboard.js.map +1 -0
- package/dist/esm/lib/work-tree-ui.js +333 -0
- package/dist/esm/lib/work-tree-ui.js.map +1 -0
- package/dist/esm/lib/work-tree.js +480 -0
- package/dist/esm/lib/work-tree.js.map +1 -0
- package/dist/esm/run.js +144 -0
- package/dist/esm/run.js.map +1 -0
- package/dist/esm/security.js +1122 -0
- package/dist/esm/security.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/mcp-transport-http.d.ts +203 -0
- package/dist/lib/mcp-transport-http.d.ts.map +1 -0
- package/dist/lib/mcp-transport-http.js +528 -0
- package/dist/lib/mcp-transport-http.js.map +1 -0
- package/dist/lib/phase-pipeline.d.ts +31 -0
- package/dist/lib/phase-pipeline.d.ts.map +1 -1
- package/dist/lib/phase-pipeline.js +93 -1
- package/dist/lib/phase-pipeline.js.map +1 -1
- package/dist/lib/semantic-search.d.ts +42 -6
- package/dist/lib/semantic-search.d.ts.map +1 -1
- package/dist/lib/semantic-search.js +87 -6
- package/dist/lib/semantic-search.js.map +1 -1
- package/package.json +24 -4
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenAI Assistants Adapter
|
|
4
|
+
*
|
|
5
|
+
* Integrates OpenAI's Assistants API (v2) with the SwarmOrchestrator.
|
|
6
|
+
* Supports function calling, code interpreter, file search, and
|
|
7
|
+
* custom assistant configurations.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const adapter = new OpenAIAssistantsAdapter();
|
|
11
|
+
* adapter.registerAssistant("analyst", { assistantId: "asst_abc123", apiKey });
|
|
12
|
+
* adapter.registerLocalFunction("calculator", async (params) => calculate(params));
|
|
13
|
+
* await registry.addAdapter(adapter);
|
|
14
|
+
*
|
|
15
|
+
* Then in the orchestrator:
|
|
16
|
+
* delegateTask({ targetAgent: "openai-assistants:analyst", ... })
|
|
17
|
+
*
|
|
18
|
+
* @module OpenAIAssistantsAdapter
|
|
19
|
+
* @version 1.0.0
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.OpenAIAssistantsAdapter = void 0;
|
|
23
|
+
const base_adapter_1 = require("./base-adapter");
|
|
24
|
+
class OpenAIAssistantsAdapter extends base_adapter_1.BaseAdapter {
|
|
25
|
+
name = 'openai-assistants';
|
|
26
|
+
version = '1.0.0';
|
|
27
|
+
assistants = new Map();
|
|
28
|
+
defaultClient;
|
|
29
|
+
get capabilities() {
|
|
30
|
+
return {
|
|
31
|
+
streaming: true,
|
|
32
|
+
parallel: true,
|
|
33
|
+
bidirectional: true,
|
|
34
|
+
discovery: true,
|
|
35
|
+
authentication: true,
|
|
36
|
+
statefulSessions: true,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async initialize(config) {
|
|
40
|
+
await super.initialize(config);
|
|
41
|
+
if (config.options?.client) {
|
|
42
|
+
this.defaultClient = config.options.client;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// --- Registration ---
|
|
46
|
+
registerAssistant(agentId, assistantConfig, client, metadata) {
|
|
47
|
+
this.assistants.set(agentId, {
|
|
48
|
+
config: assistantConfig,
|
|
49
|
+
client,
|
|
50
|
+
});
|
|
51
|
+
this.registerLocalAgent({
|
|
52
|
+
id: agentId,
|
|
53
|
+
name: agentId,
|
|
54
|
+
description: metadata?.description ?? `OpenAI Assistant: ${agentId}`,
|
|
55
|
+
capabilities: metadata?.capabilities ?? ['chat', 'function-calling', 'code-interpreter'],
|
|
56
|
+
status: 'available',
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// --- Execution ---
|
|
60
|
+
async executeAgent(agentId, payload, context) {
|
|
61
|
+
this.ensureReady();
|
|
62
|
+
const entry = this.assistants.get(agentId);
|
|
63
|
+
if (!entry) {
|
|
64
|
+
return this.errorResult('AGENT_NOT_FOUND', `OpenAI Assistant "${agentId}" is not registered`, false);
|
|
65
|
+
}
|
|
66
|
+
const client = entry.client || this.defaultClient;
|
|
67
|
+
if (!client) {
|
|
68
|
+
return this.errorResult('NO_CLIENT', 'No OpenAI client provided. Pass a client via registerAssistant() or initialize({ options: { client } })', false);
|
|
69
|
+
}
|
|
70
|
+
const message = this.buildMessage(payload);
|
|
71
|
+
const startTime = Date.now();
|
|
72
|
+
try {
|
|
73
|
+
// Strategy 1: Simple chat helper
|
|
74
|
+
if (client.chat) {
|
|
75
|
+
const result = await client.chat(entry.config.assistantId, message, {
|
|
76
|
+
model: entry.config.model,
|
|
77
|
+
maxTokens: entry.config.maxTokens,
|
|
78
|
+
});
|
|
79
|
+
return this.successResult({
|
|
80
|
+
response: result.response,
|
|
81
|
+
usage: result.usage,
|
|
82
|
+
}, Date.now() - startTime);
|
|
83
|
+
}
|
|
84
|
+
// Strategy 2: Thread-based flow
|
|
85
|
+
if (client.createThread && client.addMessage && client.createAndPollRun) {
|
|
86
|
+
// Reuse thread for session statefulness
|
|
87
|
+
if (!entry.threadId) {
|
|
88
|
+
const thread = await client.createThread();
|
|
89
|
+
entry.threadId = thread.id;
|
|
90
|
+
}
|
|
91
|
+
await client.addMessage(entry.threadId, { role: 'user', content: message });
|
|
92
|
+
const run = await client.createAndPollRun(entry.threadId, entry.config.assistantId, { model: entry.config.model, maxTokens: entry.config.maxTokens });
|
|
93
|
+
if (run.status !== 'completed') {
|
|
94
|
+
return this.errorResult('RUN_FAILED', `Run finished with status: ${run.status}. ${run.error || ''}`, run.status === 'expired');
|
|
95
|
+
}
|
|
96
|
+
const assistantMessages = run.messages.filter((m) => m.role === 'assistant');
|
|
97
|
+
const lastMessage = assistantMessages[assistantMessages.length - 1];
|
|
98
|
+
return this.successResult({
|
|
99
|
+
response: lastMessage?.content ?? '',
|
|
100
|
+
messages: assistantMessages,
|
|
101
|
+
usage: run.usage,
|
|
102
|
+
threadId: entry.threadId,
|
|
103
|
+
}, Date.now() - startTime);
|
|
104
|
+
}
|
|
105
|
+
return this.errorResult('NO_METHOD', 'Client has no callable method (chat or createThread+addMessage+createAndPollRun)', false);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
return this.errorResult('OPENAI_ERROR', error instanceof Error ? error.message : 'OpenAI Assistants execution failed', true, error);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// --- Helpers ---
|
|
112
|
+
buildMessage(payload) {
|
|
113
|
+
if (payload.handoff?.instruction) {
|
|
114
|
+
let msg = payload.handoff.instruction;
|
|
115
|
+
if (payload.handoff.constraints?.length) {
|
|
116
|
+
msg += `\n\nConstraints: ${payload.handoff.constraints.join(', ')}`;
|
|
117
|
+
}
|
|
118
|
+
if (payload.handoff.expectedOutput) {
|
|
119
|
+
msg += `\n\nExpected output format: ${payload.handoff.expectedOutput}`;
|
|
120
|
+
}
|
|
121
|
+
if (payload.blackboardSnapshot) {
|
|
122
|
+
msg += `\n\nContext: ${JSON.stringify(payload.blackboardSnapshot)}`;
|
|
123
|
+
}
|
|
124
|
+
return msg;
|
|
125
|
+
}
|
|
126
|
+
return JSON.stringify(payload.params);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.OpenAIAssistantsAdapter = OpenAIAssistantsAdapter;
|
|
130
|
+
//# sourceMappingURL=openai-assistants-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-assistants-adapter.js","sourceRoot":"","sources":["../../../adapters/openai-assistants-adapter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;AAEH,iDAA6C;AA6E7C,MAAa,uBAAwB,SAAQ,0BAAW;IAC7C,IAAI,GAAG,mBAAmB,CAAC;IAC3B,OAAO,GAAG,OAAO,CAAC;IACnB,UAAU,GAAgC,IAAI,GAAG,EAAE,CAAC;IACpD,aAAa,CAA0B;IAE/C,IAAI,YAAY;QACd,OAAO;YACL,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;YACd,aAAa,EAAE,IAAI;YACnB,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;SACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAqB;QACpC,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAgC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,uBAAuB;IAEvB,iBAAiB,CACf,OAAe,EACf,eAAgC,EAChC,MAA+B,EAC/B,QAA4D;QAE5D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE;YAC3B,MAAM,EAAE,eAAe;YACvB,MAAM;SACP,CAAC,CAAC;QACH,IAAI,CAAC,kBAAkB,CAAC;YACtB,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,QAAQ,EAAE,WAAW,IAAI,qBAAqB,OAAO,EAAE;YACpE,YAAY,EAAE,QAAQ,EAAE,YAAY,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,kBAAkB,CAAC;YACxF,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;IAEpB,KAAK,CAAC,YAAY,CAChB,OAAe,EACf,OAAqB,EACrB,OAAqB;QAErB,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,WAAW,CACrB,iBAAiB,EACjB,qBAAqB,OAAO,qBAAqB,EACjD,KAAK,CACN,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,WAAW,CACrB,WAAW,EACX,yGAAyG,EACzG,KAAK,CACN,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,iCAAiC;YACjC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE;oBAClE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;oBACzB,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS;iBAClC,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC,aAAa,CAAC;oBACxB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YAC7B,CAAC;YAED,gCAAgC;YAChC,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBACxE,wCAAwC;gBACxC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACpB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;oBAC3C,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;gBAC7B,CAAC;gBAED,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;gBAE5E,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,gBAAgB,CACvC,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,MAAM,CAAC,WAAW,EACxB,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CACjE,CAAC;gBAEF,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBAC/B,OAAO,IAAI,CAAC,WAAW,CACrB,YAAY,EACZ,6BAA6B,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,EAC7D,GAAG,CAAC,MAAM,KAAK,SAAS,CACzB,CAAC;gBACJ,CAAC;gBAED,MAAM,iBAAiB,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;gBAC7E,MAAM,WAAW,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAEpE,OAAO,IAAI,CAAC,aAAa,CAAC;oBACxB,QAAQ,EAAE,WAAW,EAAE,OAAO,IAAI,EAAE;oBACpC,QAAQ,EAAE,iBAAiB;oBAC3B,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBACzB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YAC7B,CAAC;YAED,OAAO,IAAI,CAAC,WAAW,CACrB,WAAW,EACX,kFAAkF,EAClF,KAAK,CACN,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CACrB,cAAc,EACd,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC,EAC7E,IAAI,EACJ,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kBAAkB;IAEV,YAAY,CAAC,OAAqB;QACxC,IAAI,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;YACjC,IAAI,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACtC,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;gBACxC,GAAG,IAAI,oBAAoB,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtE,CAAC;YACD,IAAI,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;gBACnC,GAAG,IAAI,+BAA+B,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YACzE,CAAC;YACD,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;gBAC/B,GAAG,IAAI,gBAAgB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACtE,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;CACF;AA5JD,0DA4JC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenClaw Adapter — Preserves all existing OpenClaw functionality
|
|
4
|
+
*
|
|
5
|
+
* This adapter wraps the original `callSkill()` / `OpenClawSkill` interface
|
|
6
|
+
* so the SwarmOrchestrator continues to work exactly as before for OpenClaw users.
|
|
7
|
+
*
|
|
8
|
+
* @module OpenClawAdapter
|
|
9
|
+
* @version 1.0.0
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.OpenClawAdapter = void 0;
|
|
13
|
+
const base_adapter_1 = require("./base-adapter");
|
|
14
|
+
class OpenClawAdapter extends base_adapter_1.BaseAdapter {
|
|
15
|
+
name = 'openclaw';
|
|
16
|
+
version = '1.0.0';
|
|
17
|
+
callSkill = null;
|
|
18
|
+
get capabilities() {
|
|
19
|
+
return {
|
|
20
|
+
streaming: false,
|
|
21
|
+
parallel: true,
|
|
22
|
+
bidirectional: true,
|
|
23
|
+
discovery: false,
|
|
24
|
+
authentication: true,
|
|
25
|
+
statefulSessions: true,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async initialize(config) {
|
|
29
|
+
await super.initialize(config);
|
|
30
|
+
// Try to import callSkill from openclaw-core
|
|
31
|
+
try {
|
|
32
|
+
const openclawCore = await import('openclaw-core');
|
|
33
|
+
this.callSkill = openclawCore.callSkill;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// If openclaw-core is provided via config, use that
|
|
37
|
+
if (config.options?.callSkill && typeof config.options.callSkill === 'function') {
|
|
38
|
+
this.callSkill = config.options.callSkill;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
console.warn('[OpenClawAdapter] openclaw-core not available. Provide callSkill via config.options.callSkill');
|
|
42
|
+
this.ready = false;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
this.ready = true;
|
|
47
|
+
}
|
|
48
|
+
async executeAgent(agentId, payload, context) {
|
|
49
|
+
this.ensureReady();
|
|
50
|
+
if (!this.callSkill) {
|
|
51
|
+
return this.errorResult('NO_CALLSKILL', 'callSkill function is not available', false);
|
|
52
|
+
}
|
|
53
|
+
const startTime = Date.now();
|
|
54
|
+
try {
|
|
55
|
+
// Translate universal payload → OpenClaw callSkill format
|
|
56
|
+
const openclawParams = {
|
|
57
|
+
action: payload.action,
|
|
58
|
+
...payload.params,
|
|
59
|
+
};
|
|
60
|
+
// Include handoff context if present (preserves existing handoff protocol)
|
|
61
|
+
if (payload.handoff) {
|
|
62
|
+
openclawParams.handoff = {
|
|
63
|
+
handoffId: payload.handoff.handoffId,
|
|
64
|
+
sourceAgent: payload.handoff.sourceAgent,
|
|
65
|
+
targetAgent: payload.handoff.targetAgent,
|
|
66
|
+
taskType: payload.handoff.taskType,
|
|
67
|
+
payload: {
|
|
68
|
+
instruction: payload.handoff.instruction,
|
|
69
|
+
context: payload.handoff.context,
|
|
70
|
+
constraints: payload.handoff.constraints,
|
|
71
|
+
expectedOutput: payload.handoff.expectedOutput,
|
|
72
|
+
},
|
|
73
|
+
metadata: payload.handoff.metadata,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// Include blackboard snapshot if present
|
|
77
|
+
if (payload.blackboardSnapshot) {
|
|
78
|
+
openclawParams.context = {
|
|
79
|
+
...(openclawParams.context || {}),
|
|
80
|
+
blackboardSnapshot: payload.blackboardSnapshot,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// Call the OpenClaw skill
|
|
84
|
+
const result = await this.callSkill(agentId, openclawParams);
|
|
85
|
+
// Translate OpenClaw result → universal AgentResult
|
|
86
|
+
return {
|
|
87
|
+
success: result.success,
|
|
88
|
+
data: result.data,
|
|
89
|
+
error: result.error ? {
|
|
90
|
+
code: result.error.code,
|
|
91
|
+
message: result.error.message,
|
|
92
|
+
recoverable: result.error.recoverable,
|
|
93
|
+
suggestedAction: result.error.suggestedAction,
|
|
94
|
+
} : undefined,
|
|
95
|
+
metadata: {
|
|
96
|
+
adapter: this.name,
|
|
97
|
+
executionTimeMs: Date.now() - startTime,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return this.errorResult('OPENCLAW_ERROR', error instanceof Error ? error.message : 'OpenClaw skill execution failed', true, error);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.OpenClawAdapter = OpenClawAdapter;
|
|
107
|
+
//# sourceMappingURL=openclaw-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-adapter.js","sourceRoot":"","sources":["../../../adapters/openclaw-adapter.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,iDAA6C;AAoB7C,MAAa,eAAgB,SAAQ,0BAAW;IACrC,IAAI,GAAG,UAAU,CAAC;IAClB,OAAO,GAAG,OAAO,CAAC;IACnB,SAAS,GAAuB,IAAI,CAAC;IAE7C,IAAI,YAAY;QACd,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,IAAI;YACd,aAAa,EAAE,IAAI;YACnB,SAAS,EAAE,KAAK;YAChB,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;SACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAqB;QACpC,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE/B,6CAA6C;QAC7C,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YACnD,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;YACpD,IAAI,MAAM,CAAC,OAAO,EAAE,SAAS,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;gBAChF,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAwB,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,+FAA+F,CAAC,CAAC;gBAC9G,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;gBACnB,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,OAAe,EACf,OAAqB,EACrB,OAAqB;QAErB,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,qCAAqC,EAAE,KAAK,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,0DAA0D;YAC1D,MAAM,cAAc,GAA4B;gBAC9C,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,GAAG,OAAO,CAAC,MAAM;aAClB,CAAC;YAEF,2EAA2E;YAC3E,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,cAAc,CAAC,OAAO,GAAG;oBACvB,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS;oBACpC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW;oBACxC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW;oBACxC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ;oBAClC,OAAO,EAAE;wBACP,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW;wBACxC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO;wBAChC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW;wBACxC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,cAAc;qBAC/C;oBACD,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ;iBACnC,CAAC;YACJ,CAAC;YAED,yCAAyC;YACzC,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;gBAC/B,cAAc,CAAC,OAAO,GAAG;oBACvB,GAAG,CAAC,cAAc,CAAC,OAAkC,IAAI,EAAE,CAAC;oBAC5D,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;iBAC/C,CAAC;YACJ,CAAC;YAED,0BAA0B;YAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YAE7D,oDAAoD;YACpD,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBACpB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;oBACvB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;oBAC7B,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;oBACrC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,eAAe;iBAC9C,CAAC,CAAC,CAAC,SAAS;gBACb,QAAQ,EAAE;oBACR,OAAO,EAAE,IAAI,CAAC,IAAI;oBAClB,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACxC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CACrB,gBAAgB,EAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC,EAC1E,IAAI,EACJ,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AA7GD,0CA6GC"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Orchestrator Adapter — Wrap a child SwarmOrchestrator as an agent
|
|
4
|
+
*
|
|
5
|
+
* This adapter enables hierarchical multi-orchestrator coordination.
|
|
6
|
+
* A parent SwarmOrchestrator treats a child SwarmOrchestrator as just
|
|
7
|
+
* another agent via the adapter system. Each child has its own
|
|
8
|
+
* LockedBlackboard with its own filesystem mutex, so the propose →
|
|
9
|
+
* validate → commit pattern prevents overwrites at every level.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* const child = new SwarmOrchestrator('./boards/child-project', childRegistry);
|
|
13
|
+
* const adapter = new OrchestratorAdapter();
|
|
14
|
+
* adapter.registerOrchestrator('child-team', child, {
|
|
15
|
+
* description: 'Backend team orchestrator',
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* // Parent orchestrator delegates to the child as a normal agent
|
|
19
|
+
* await parentOrchestrator.addAdapter(adapter);
|
|
20
|
+
* await parentOrchestrator.execute('delegate_task', {
|
|
21
|
+
* targetAgent: 'orchestrator:child-team',
|
|
22
|
+
* taskPayload: { instruction: 'Refactor the auth module' },
|
|
23
|
+
* }, { agentId: 'root' });
|
|
24
|
+
*
|
|
25
|
+
* The child orchestrator receives the task, decomposes it across its own
|
|
26
|
+
* agents, and returns the aggregated result. The parent sees it as one
|
|
27
|
+
* atomic response — the hierarchy is transparent.
|
|
28
|
+
*
|
|
29
|
+
* @module OrchestratorAdapter
|
|
30
|
+
* @version 1.0.0
|
|
31
|
+
*/
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.OrchestratorAdapter = void 0;
|
|
34
|
+
const base_adapter_1 = require("./base-adapter");
|
|
35
|
+
class OrchestratorAdapter extends base_adapter_1.BaseAdapter {
|
|
36
|
+
name = 'orchestrator';
|
|
37
|
+
version = '1.0.0';
|
|
38
|
+
children = new Map();
|
|
39
|
+
get capabilities() {
|
|
40
|
+
return {
|
|
41
|
+
streaming: false,
|
|
42
|
+
parallel: true,
|
|
43
|
+
bidirectional: false,
|
|
44
|
+
discovery: true,
|
|
45
|
+
authentication: false,
|
|
46
|
+
statefulSessions: true,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Register a child SwarmOrchestrator as an agent.
|
|
51
|
+
* The child keeps its own blackboard, adapters, and lock — full isolation.
|
|
52
|
+
*/
|
|
53
|
+
registerOrchestrator(orchestratorId, orchestrator, config) {
|
|
54
|
+
if (!orchestratorId || typeof orchestratorId !== 'string') {
|
|
55
|
+
throw new Error('orchestratorId must be a non-empty string');
|
|
56
|
+
}
|
|
57
|
+
if (!orchestrator || typeof orchestrator.execute !== 'function') {
|
|
58
|
+
throw new Error('orchestrator must implement execute()');
|
|
59
|
+
}
|
|
60
|
+
const childConfig = {
|
|
61
|
+
description: config?.description ?? `Child orchestrator: ${orchestratorId}`,
|
|
62
|
+
capabilities: config?.capabilities ?? ['orchestration', 'delegation', 'parallel'],
|
|
63
|
+
defaultTargetAgent: config?.defaultTargetAgent,
|
|
64
|
+
timeout: config?.timeout ?? 120_000,
|
|
65
|
+
};
|
|
66
|
+
this.children.set(orchestratorId, {
|
|
67
|
+
orchestrator,
|
|
68
|
+
config: childConfig,
|
|
69
|
+
busy: false,
|
|
70
|
+
});
|
|
71
|
+
this.registerLocalAgent({
|
|
72
|
+
id: orchestratorId,
|
|
73
|
+
name: orchestrator.name ?? orchestratorId,
|
|
74
|
+
description: childConfig.description,
|
|
75
|
+
capabilities: childConfig.capabilities,
|
|
76
|
+
status: 'available',
|
|
77
|
+
metadata: {
|
|
78
|
+
type: 'orchestrator',
|
|
79
|
+
timeout: childConfig.timeout,
|
|
80
|
+
defaultTargetAgent: childConfig.defaultTargetAgent,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Remove a child orchestrator from this adapter.
|
|
86
|
+
*/
|
|
87
|
+
removeOrchestrator(orchestratorId) {
|
|
88
|
+
const removed = this.children.delete(orchestratorId);
|
|
89
|
+
if (removed) {
|
|
90
|
+
this.unregisterAgent(orchestratorId);
|
|
91
|
+
}
|
|
92
|
+
return removed;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Execute a task on a child orchestrator.
|
|
96
|
+
*
|
|
97
|
+
* The payload is translated into a `delegate_task` call on the child.
|
|
98
|
+
* If `handoff.targetAgent` is set, it becomes the target within the child
|
|
99
|
+
* swarm. Otherwise, the child's `defaultTargetAgent` is used, or the
|
|
100
|
+
* child decides its own routing.
|
|
101
|
+
*/
|
|
102
|
+
async executeAgent(agentId, payload, context) {
|
|
103
|
+
this.ensureReady();
|
|
104
|
+
const child = this.children.get(agentId);
|
|
105
|
+
if (!child) {
|
|
106
|
+
return this.errorResult('ORCHESTRATOR_NOT_FOUND', `Child orchestrator "${agentId}" is not registered. Use registerOrchestrator().`, false);
|
|
107
|
+
}
|
|
108
|
+
const startTime = Date.now();
|
|
109
|
+
child.busy = true;
|
|
110
|
+
// Update agent status
|
|
111
|
+
const agentInfo = this.registeredAgents.get(agentId);
|
|
112
|
+
if (agentInfo)
|
|
113
|
+
agentInfo.status = 'busy';
|
|
114
|
+
try {
|
|
115
|
+
const instruction = payload.handoff?.instruction
|
|
116
|
+
?? payload.params?.instruction
|
|
117
|
+
?? JSON.stringify(payload.params);
|
|
118
|
+
// Determine the target agent within the child swarm
|
|
119
|
+
const innerTarget = payload.handoff?.targetAgent
|
|
120
|
+
?? child.config.defaultTargetAgent
|
|
121
|
+
?? 'orchestrator';
|
|
122
|
+
const childParams = {
|
|
123
|
+
targetAgent: innerTarget,
|
|
124
|
+
taskPayload: {
|
|
125
|
+
instruction,
|
|
126
|
+
context: payload.handoff?.context ?? payload.params?.context,
|
|
127
|
+
constraints: payload.handoff?.constraints ?? payload.params?.constraints,
|
|
128
|
+
expectedOutput: payload.handoff?.expectedOutput ?? payload.params?.expectedOutput,
|
|
129
|
+
},
|
|
130
|
+
timeout: child.config.timeout,
|
|
131
|
+
};
|
|
132
|
+
// Forward blackboard snapshot if provided (cross-level context sharing)
|
|
133
|
+
if (payload.blackboardSnapshot) {
|
|
134
|
+
childParams.parentBlackboardSnapshot = payload.blackboardSnapshot;
|
|
135
|
+
}
|
|
136
|
+
const childContext = {
|
|
137
|
+
agentId: context.agentId,
|
|
138
|
+
taskId: context.taskId,
|
|
139
|
+
sessionId: context.sessionId,
|
|
140
|
+
};
|
|
141
|
+
// Execute on the child orchestrator with timeout
|
|
142
|
+
const result = await Promise.race([
|
|
143
|
+
child.orchestrator.execute('delegate_task', childParams, childContext),
|
|
144
|
+
this.timeoutAfter(child.config.timeout ?? 120_000),
|
|
145
|
+
]);
|
|
146
|
+
const elapsed = Date.now() - startTime;
|
|
147
|
+
if (!result.success) {
|
|
148
|
+
return this.errorResult(result.error?.code ?? 'CHILD_EXECUTION_FAILED', result.error?.message ?? 'Child orchestrator returned failure', result.error?.recoverable ?? true, result.error);
|
|
149
|
+
}
|
|
150
|
+
return this.successResult({
|
|
151
|
+
orchestratorId: agentId,
|
|
152
|
+
childResult: result.data,
|
|
153
|
+
hierarchy: true,
|
|
154
|
+
}, elapsed);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
if (error instanceof Error && error.message === 'ORCHESTRATOR_TIMEOUT') {
|
|
158
|
+
return this.errorResult('CHILD_TIMEOUT', `Child orchestrator "${agentId}" timed out after ${child.config.timeout}ms`, true);
|
|
159
|
+
}
|
|
160
|
+
return this.errorResult('CHILD_EXECUTION_ERROR', error instanceof Error ? error.message : 'Child orchestrator execution failed', true, error);
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
child.busy = false;
|
|
164
|
+
const agentInfo2 = this.registeredAgents.get(agentId);
|
|
165
|
+
if (agentInfo2)
|
|
166
|
+
agentInfo2.status = 'available';
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Query the internal state of a child orchestrator.
|
|
171
|
+
* Returns agents, blackboard snapshot, and tasks from the child swarm.
|
|
172
|
+
* The parent can use this for unified visibility across the hierarchy.
|
|
173
|
+
*/
|
|
174
|
+
async queryChildState(orchestratorId, scope = 'all') {
|
|
175
|
+
const child = this.children.get(orchestratorId);
|
|
176
|
+
if (!child)
|
|
177
|
+
return null;
|
|
178
|
+
const result = await child.orchestrator.execute('query_swarm_state', { scope }, { agentId: 'parent-orchestrator' });
|
|
179
|
+
return {
|
|
180
|
+
orchestratorId,
|
|
181
|
+
busy: child.busy,
|
|
182
|
+
swarmState: result.success ? result.data : null,
|
|
183
|
+
queriedAt: new Date().toISOString(),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Query state of all registered child orchestrators.
|
|
188
|
+
* This is the foundation for the unified ControlPlane view.
|
|
189
|
+
*/
|
|
190
|
+
async queryAllChildStates(scope = 'all') {
|
|
191
|
+
const entries = Array.from(this.children.keys());
|
|
192
|
+
const results = await Promise.all(entries.map(id => this.queryChildState(id, scope)));
|
|
193
|
+
return results.filter((s) => s !== null);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get the list of registered child orchestrator IDs.
|
|
197
|
+
*/
|
|
198
|
+
listOrchestrators() {
|
|
199
|
+
return Array.from(this.children.keys());
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Check if a specific child orchestrator is currently busy.
|
|
203
|
+
*/
|
|
204
|
+
isChildBusy(orchestratorId) {
|
|
205
|
+
return this.children.get(orchestratorId)?.busy ?? false;
|
|
206
|
+
}
|
|
207
|
+
async shutdown() {
|
|
208
|
+
this.children.clear();
|
|
209
|
+
await super.shutdown();
|
|
210
|
+
}
|
|
211
|
+
timeoutAfter(ms) {
|
|
212
|
+
return new Promise((_, reject) => {
|
|
213
|
+
setTimeout(() => reject(new Error('ORCHESTRATOR_TIMEOUT')), ms);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
exports.OrchestratorAdapter = OrchestratorAdapter;
|
|
218
|
+
//# sourceMappingURL=orchestrator-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-adapter.js","sourceRoot":"","sources":["../../../adapters/orchestrator-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pydantic AI Adapter
|
|
4
|
+
*
|
|
5
|
+
* Integrates Pydantic AI (type-safe Python agent framework) with the
|
|
6
|
+
* SwarmOrchestrator via user-supplied runner functions.
|
|
7
|
+
*
|
|
8
|
+
* Pydantic AI provides structured, validated agent responses with
|
|
9
|
+
* dependency injection, streaming, and multi-step tool use. Since
|
|
10
|
+
* it's Python-native, this adapter wraps either:
|
|
11
|
+
* - A JS-compatible runner interface (for interop bridges)
|
|
12
|
+
* - An HTTP endpoint that fronts a Pydantic AI agent
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* const adapter = new PydanticAIAdapter();
|
|
16
|
+
* adapter.registerAgent('data-analyst', {
|
|
17
|
+
* runner: myPydanticRunner,
|
|
18
|
+
* resultSchema: { type: 'object', properties: { answer: { type: 'string' } } },
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* @module PydanticAIAdapter
|
|
22
|
+
* @version 1.0.0
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.PydanticAIAdapter = void 0;
|
|
26
|
+
const base_adapter_1 = require("./base-adapter");
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Adapter
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
/**
|
|
31
|
+
* Adapter for Pydantic AI structured agent framework.
|
|
32
|
+
*
|
|
33
|
+
* Supports both direct runners (for JS/Python bridges) and
|
|
34
|
+
* HTTP endpoints (for remote Pydantic AI servers).
|
|
35
|
+
*/
|
|
36
|
+
class PydanticAIAdapter extends base_adapter_1.BaseAdapter {
|
|
37
|
+
name = 'pydantic-ai';
|
|
38
|
+
version = '1.0.0';
|
|
39
|
+
agents = new Map();
|
|
40
|
+
get capabilities() {
|
|
41
|
+
return {
|
|
42
|
+
streaming: false,
|
|
43
|
+
parallel: true,
|
|
44
|
+
bidirectional: false,
|
|
45
|
+
discovery: true,
|
|
46
|
+
authentication: true,
|
|
47
|
+
statefulSessions: false,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// -----------------------------------------------------------------------
|
|
51
|
+
// Registration
|
|
52
|
+
// -----------------------------------------------------------------------
|
|
53
|
+
/**
|
|
54
|
+
* Register a Pydantic AI agent (runner or HTTP-backed).
|
|
55
|
+
*/
|
|
56
|
+
registerPydanticAgent(agentId, config) {
|
|
57
|
+
if (!config.runner && !config.http) {
|
|
58
|
+
throw new Error('PydanticAIAgentConfig requires either runner or http');
|
|
59
|
+
}
|
|
60
|
+
this.agents.set(agentId, config);
|
|
61
|
+
this.registerLocalAgent({
|
|
62
|
+
id: agentId,
|
|
63
|
+
name: agentId,
|
|
64
|
+
status: 'available',
|
|
65
|
+
capabilities: ['structured-output', 'validation', 'tool-use'],
|
|
66
|
+
metadata: {
|
|
67
|
+
adapter: 'pydantic-ai',
|
|
68
|
+
model: config.model,
|
|
69
|
+
mode: config.runner ? 'direct' : 'http',
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// -----------------------------------------------------------------------
|
|
74
|
+
// Execution
|
|
75
|
+
// -----------------------------------------------------------------------
|
|
76
|
+
async executeAgent(agentId, payload, _context) {
|
|
77
|
+
this.ensureReady();
|
|
78
|
+
const config = this.agents.get(agentId);
|
|
79
|
+
if (!config) {
|
|
80
|
+
return this.errorResult('PYDANTIC_AGENT_NOT_FOUND', `No agent registered as '${agentId}'`);
|
|
81
|
+
}
|
|
82
|
+
const prompt = payload.handoff?.instruction
|
|
83
|
+
?? payload.params?.instruction
|
|
84
|
+
?? payload.params?.prompt
|
|
85
|
+
?? payload.action;
|
|
86
|
+
const deps = {
|
|
87
|
+
...config.defaultDeps,
|
|
88
|
+
...payload.params,
|
|
89
|
+
...payload.handoff?.context,
|
|
90
|
+
};
|
|
91
|
+
const timeoutMs = config.timeoutMs ?? 60_000;
|
|
92
|
+
const start = Date.now();
|
|
93
|
+
try {
|
|
94
|
+
let result;
|
|
95
|
+
if (config.runner) {
|
|
96
|
+
result = await Promise.race([
|
|
97
|
+
config.runner.run(prompt, deps),
|
|
98
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Pydantic AI execution timed out')), timeoutMs)),
|
|
99
|
+
]);
|
|
100
|
+
}
|
|
101
|
+
else if (config.http) {
|
|
102
|
+
result = await this.executeHttp(config.http, prompt, deps, timeoutMs);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
return this.errorResult('PYDANTIC_NO_RUNNER', 'No runner or HTTP config available');
|
|
106
|
+
}
|
|
107
|
+
const durationMs = Date.now() - start;
|
|
108
|
+
return this.successResult({
|
|
109
|
+
data: result.data,
|
|
110
|
+
text: result.text,
|
|
111
|
+
validated: result.validated,
|
|
112
|
+
toolCalls: result.toolCalls,
|
|
113
|
+
usage: result.usage,
|
|
114
|
+
}, durationMs);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
return this.errorResult('PYDANTIC_EXECUTION_FAILED', err instanceof Error ? err.message : String(err));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// -----------------------------------------------------------------------
|
|
121
|
+
// HTTP runner
|
|
122
|
+
// -----------------------------------------------------------------------
|
|
123
|
+
async executeHttp(httpConfig, prompt, deps, timeoutMs) {
|
|
124
|
+
const url = `${httpConfig.baseUrl.replace(/\/$/, '')}/run`;
|
|
125
|
+
const headers = {
|
|
126
|
+
'Content-Type': 'application/json',
|
|
127
|
+
...httpConfig.headers,
|
|
128
|
+
};
|
|
129
|
+
if (httpConfig.authorization) {
|
|
130
|
+
headers['Authorization'] = httpConfig.authorization;
|
|
131
|
+
}
|
|
132
|
+
const body = JSON.stringify({ prompt, deps });
|
|
133
|
+
// Use dynamic import for fetch (Node 18+) or global
|
|
134
|
+
const controller = new AbortController();
|
|
135
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
136
|
+
try {
|
|
137
|
+
const response = await fetch(url, {
|
|
138
|
+
method: 'POST',
|
|
139
|
+
headers,
|
|
140
|
+
body,
|
|
141
|
+
signal: controller.signal,
|
|
142
|
+
});
|
|
143
|
+
if (!response.ok) {
|
|
144
|
+
const text = await response.text();
|
|
145
|
+
throw new Error(`HTTP ${response.status}: ${text}`);
|
|
146
|
+
}
|
|
147
|
+
const data = await response.json();
|
|
148
|
+
return data;
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
clearTimeout(timer);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// -----------------------------------------------------------------------
|
|
155
|
+
// Lifecycle
|
|
156
|
+
// -----------------------------------------------------------------------
|
|
157
|
+
async shutdown() {
|
|
158
|
+
this.agents.clear();
|
|
159
|
+
await super.shutdown();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.PydanticAIAdapter = PydanticAIAdapter;
|
|
163
|
+
//# sourceMappingURL=pydantic-ai-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pydantic-ai-adapter.js","sourceRoot":"","sources":["../../../adapters/pydantic-ai-adapter.ts"],"names":[],"mappings":"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"}
|