atabey 0.0.12 → 0.0.13
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/ATABEY.md +45 -499
- package/PRIVACY.md +161 -0
- package/README.md +353 -88
- package/bin/validate-al-registry.js +4 -4
- package/dist/framework-mcp/src/tools/definitions.js +23 -1
- package/dist/framework-mcp/src/tools/definitions.js.map +1 -1
- package/dist/framework-mcp/src/tools/gateway/llm_gateway_query.d.ts +19 -0
- package/dist/framework-mcp/src/tools/gateway/llm_gateway_query.js +138 -0
- package/dist/framework-mcp/src/tools/gateway/llm_gateway_query.js.map +1 -0
- package/dist/framework-mcp/src/tools/gateway/llm_gateway_status.d.ts +8 -0
- package/dist/framework-mcp/src/tools/gateway/llm_gateway_status.js +91 -0
- package/dist/framework-mcp/src/tools/gateway/llm_gateway_status.js.map +1 -0
- package/dist/framework-mcp/src/tools/index.d.ts +1 -1
- package/dist/framework-mcp/src/tools/index.js +35 -20
- package/dist/framework-mcp/src/tools/index.js.map +1 -1
- package/dist/framework-mcp/src/tools/quality/analyze_code_quality.d.ts +11 -0
- package/dist/framework-mcp/src/tools/quality/analyze_code_quality.js +166 -0
- package/dist/framework-mcp/src/tools/quality/analyze_code_quality.js.map +1 -0
- package/dist/framework-mcp/src/tools/quality/check_architecture_compliance.d.ts +11 -0
- package/dist/framework-mcp/src/tools/quality/check_architecture_compliance.js +135 -0
- package/dist/framework-mcp/src/tools/quality/check_architecture_compliance.js.map +1 -0
- package/dist/framework-mcp/src/tools/schemas.d.ts +88 -8
- package/dist/framework-mcp/src/tools/schemas.js +29 -0
- package/dist/framework-mcp/src/tools/schemas.js.map +1 -1
- package/dist/framework-mcp/src/tools/shell/run_command.js +2 -2
- package/dist/framework-mcp/src/tools/shell/run_command.js.map +1 -1
- package/dist/src/cli/commands/check.js +2 -2
- package/dist/src/cli/commands/check.js.map +1 -1
- package/dist/src/cli/commands/dashboard.d.ts +1 -1
- package/dist/src/cli/commands/dashboard.js +264 -41
- package/dist/src/cli/commands/dashboard.js.map +1 -1
- package/dist/src/cli/commands/gateway.d.ts +1 -0
- package/dist/src/cli/commands/gateway.js +172 -0
- package/dist/src/cli/commands/gateway.js.map +1 -0
- package/dist/src/cli/commands/init/create-agent.js +3 -3
- package/dist/src/cli/commands/init/create-agent.js.map +1 -1
- package/dist/src/cli/commands/init/scaffold-core.d.ts +1 -1
- package/dist/src/cli/commands/init/scaffold-core.js +1 -1
- package/dist/src/cli/commands/init/scaffold-core.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts +2 -0
- package/dist/src/cli/commands/init.js +105 -23
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/mcp.d.ts +7 -0
- package/dist/src/cli/commands/mcp.js +45 -22
- package/dist/src/cli/commands/mcp.js.map +1 -1
- package/dist/src/cli/commands/orchestrate.d.ts +8 -7
- package/dist/src/cli/commands/orchestrate.js +2 -1
- package/dist/src/cli/commands/orchestrate.js.map +1 -1
- package/dist/src/cli/commands/quickstart.d.ts +5 -5
- package/dist/src/cli/commands/quickstart.js +36 -36
- package/dist/src/cli/commands/quickstart.js.map +1 -1
- package/dist/src/cli/index.js +230 -320
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/platforms/core.d.ts +12 -0
- package/dist/src/cli/platforms/core.js +73 -0
- package/dist/src/cli/platforms/core.js.map +1 -0
- package/dist/src/cli/platforms/index.d.ts +5 -0
- package/dist/src/cli/platforms/index.js +6 -0
- package/dist/src/cli/platforms/index.js.map +1 -0
- package/dist/src/cli/platforms/paths.d.ts +15 -0
- package/dist/src/cli/platforms/paths.js +102 -0
- package/dist/src/cli/platforms/paths.js.map +1 -0
- package/dist/src/cli/platforms/scaffold.d.ts +2 -0
- package/dist/src/cli/platforms/scaffold.js +73 -0
- package/dist/src/cli/platforms/scaffold.js.map +1 -0
- package/dist/src/cli/platforms/utils.d.ts +4 -0
- package/dist/src/cli/platforms/utils.js +76 -0
- package/dist/src/cli/platforms/utils.js.map +1 -0
- package/dist/src/cli/shims.js +4 -4
- package/dist/src/cli/utils/fs.d.ts +1 -1
- package/dist/src/cli/utils/fs.js +1 -1
- package/dist/src/cli/utils/fs.js.map +1 -1
- package/dist/src/modules/agents/definitions.d.ts +2 -2
- package/dist/src/modules/agents/definitions.js +59 -23
- package/dist/src/modules/agents/definitions.js.map +1 -1
- package/dist/src/modules/contracts/api.d.ts +178 -0
- package/dist/src/modules/contracts/api.js +56 -0
- package/dist/src/modules/contracts/api.js.map +1 -0
- package/dist/src/modules/contracts/index.d.ts +5 -0
- package/dist/src/modules/contracts/index.js +6 -0
- package/dist/src/modules/contracts/index.js.map +1 -0
- package/dist/src/modules/engines/agent-executor.d.ts +27 -28
- package/dist/src/modules/engines/agent-executor.js +97 -69
- package/dist/src/modules/engines/agent-executor.js.map +1 -1
- package/dist/src/modules/engines/quality-gate.d.ts +7 -7
- package/dist/src/modules/engines/quality-gate.js +7 -7
- package/dist/src/modules/engines/routing-engine.d.ts +18 -27
- package/dist/src/modules/engines/routing-engine.js +70 -44
- package/dist/src/modules/engines/routing-engine.js.map +1 -1
- package/dist/src/modules/gateway/circuit-breaker.d.ts +40 -0
- package/dist/src/modules/gateway/circuit-breaker.js +163 -0
- package/dist/src/modules/gateway/circuit-breaker.js.map +1 -0
- package/dist/src/modules/gateway/cost-tracker.d.ts +55 -0
- package/dist/src/modules/gateway/cost-tracker.js +127 -0
- package/dist/src/modules/gateway/cost-tracker.js.map +1 -0
- package/dist/src/modules/gateway/gateway.d.ts +68 -0
- package/dist/src/modules/gateway/gateway.js +235 -0
- package/dist/src/modules/gateway/gateway.js.map +1 -0
- package/dist/src/modules/gateway/index.d.ts +19 -0
- package/dist/src/modules/gateway/index.js +19 -0
- package/dist/src/modules/gateway/index.js.map +1 -0
- package/dist/src/modules/gateway/load-balancer.d.ts +86 -0
- package/dist/src/modules/gateway/load-balancer.js +230 -0
- package/dist/src/modules/gateway/load-balancer.js.map +1 -0
- package/dist/src/modules/gateway/providers/anthropic.d.ts +14 -0
- package/dist/src/modules/gateway/providers/anthropic.js +169 -0
- package/dist/src/modules/gateway/providers/anthropic.js.map +1 -0
- package/dist/src/modules/gateway/providers/base.d.ts +38 -0
- package/dist/src/modules/gateway/providers/base.js +42 -0
- package/dist/src/modules/gateway/providers/base.js.map +1 -0
- package/dist/src/modules/gateway/providers/google.d.ts +18 -0
- package/dist/src/modules/gateway/providers/google.js +176 -0
- package/dist/src/modules/gateway/providers/google.js.map +1 -0
- package/dist/src/modules/gateway/providers/grok.d.ts +14 -0
- package/dist/src/modules/gateway/providers/grok.js +166 -0
- package/dist/src/modules/gateway/providers/grok.js.map +1 -0
- package/dist/src/modules/gateway/providers/index.d.ts +21 -0
- package/dist/src/modules/gateway/providers/index.js +38 -0
- package/dist/src/modules/gateway/providers/index.js.map +1 -0
- package/dist/src/modules/gateway/providers/ollama.d.ts +23 -0
- package/dist/src/modules/gateway/providers/ollama.js +187 -0
- package/dist/src/modules/gateway/providers/ollama.js.map +1 -0
- package/dist/src/modules/gateway/providers/openai.d.ts +14 -0
- package/dist/src/modules/gateway/providers/openai.js +170 -0
- package/dist/src/modules/gateway/providers/openai.js.map +1 -0
- package/dist/src/modules/gateway/rate-limiter.d.ts +41 -0
- package/dist/src/modules/gateway/rate-limiter.js +119 -0
- package/dist/src/modules/gateway/rate-limiter.js.map +1 -0
- package/dist/src/modules/gateway/types.d.ts +114 -0
- package/dist/src/modules/gateway/types.js +8 -0
- package/dist/src/modules/gateway/types.js.map +1 -0
- package/dist/src/modules/memory/core.d.ts +4 -12
- package/dist/src/modules/memory/core.js +10 -17
- package/dist/src/modules/memory/core.js.map +1 -1
- package/dist/src/modules/memory/embedding.d.ts +28 -0
- package/dist/src/modules/memory/embedding.js +131 -0
- package/dist/src/modules/memory/embedding.js.map +1 -0
- package/dist/src/modules/providers/definitions.d.ts +9 -0
- package/dist/src/modules/providers/definitions.js +141 -0
- package/dist/src/modules/providers/definitions.js.map +1 -0
- package/dist/src/modules/providers/registry.d.ts +12 -0
- package/dist/src/modules/providers/registry.js +19 -0
- package/dist/src/modules/providers/registry.js.map +1 -0
- package/dist/src/modules/providers/shared.d.ts +1 -0
- package/dist/src/modules/providers/shared.js +105 -0
- package/dist/src/modules/providers/shared.js.map +1 -0
- package/dist/src/modules/providers/types.d.ts +14 -0
- package/dist/src/modules/providers/types.js +2 -0
- package/dist/src/modules/providers/types.js.map +1 -0
- package/dist/src/modules/skills/adapter-skills.d.ts +68 -0
- package/dist/src/modules/skills/adapter-skills.js +450 -0
- package/dist/src/modules/skills/adapter-skills.js.map +1 -0
- package/dist/src/shared/audit.d.ts +105 -0
- package/dist/src/shared/audit.js +220 -0
- package/dist/src/shared/audit.js.map +1 -0
- package/dist/src/shared/fs.js +4 -2
- package/dist/src/shared/fs.js.map +1 -1
- package/dist/src/shared/lock.d.ts +82 -0
- package/dist/src/shared/lock.js +160 -0
- package/dist/src/shared/lock.js.map +1 -0
- package/dist/src/shared/logger.d.ts +2 -0
- package/dist/src/shared/logger.js +15 -5
- package/dist/src/shared/logger.js.map +1 -1
- package/dist/src/shared/pii.d.ts +37 -0
- package/dist/src/shared/pii.js +122 -0
- package/dist/src/shared/pii.js.map +1 -0
- package/dist/src/shared/retention.d.ts +63 -0
- package/dist/src/shared/retention.js +171 -0
- package/dist/src/shared/retention.js.map +1 -0
- package/dist/src/shared/storage.d.ts +3 -1
- package/dist/src/shared/storage.js +3 -1
- package/dist/src/shared/storage.js.map +1 -1
- package/dist/tests/adapter.test.js +1 -1
- package/dist/tests/adapter.test.js.map +1 -1
- package/dist/tests/adapters/paths.test.js +4 -4
- package/dist/tests/adapters/paths.test.js.map +1 -1
- package/dist/tests/cli/commands/dashboard-coverage.test.d.ts +1 -0
- package/dist/tests/cli/commands/dashboard-coverage.test.js +88 -0
- package/dist/tests/cli/commands/dashboard-coverage.test.js.map +1 -0
- package/dist/tests/cli/init/adapter_init.test.js +4 -5
- package/dist/tests/cli/init/adapter_init.test.js.map +1 -1
- package/dist/tests/cli/init/unified_init.test.js +5 -7
- package/dist/tests/cli/init/unified_init.test.js.map +1 -1
- package/dist/tests/integration/agent_flow.test.js +14 -8
- package/dist/tests/integration/agent_flow.test.js.map +1 -1
- package/dist/tests/modules/adapters/adapters.test.js +2 -2
- package/dist/tests/modules/adapters/adapters.test.js.map +1 -1
- package/dist/tests/modules/contracts/contracts.test.d.ts +1 -0
- package/dist/tests/modules/contracts/contracts.test.js +73 -0
- package/dist/tests/modules/contracts/contracts.test.js.map +1 -0
- package/dist/tests/modules/engines/agent-executor.test.js +30 -23
- package/dist/tests/modules/engines/agent-executor.test.js.map +1 -1
- package/dist/tests/modules/gateway/circuit-breaker.test.d.ts +1 -0
- package/dist/tests/modules/gateway/circuit-breaker.test.js +124 -0
- package/dist/tests/modules/gateway/circuit-breaker.test.js.map +1 -0
- package/dist/tests/modules/gateway/cost-tracker.test.d.ts +1 -0
- package/dist/tests/modules/gateway/cost-tracker.test.js +74 -0
- package/dist/tests/modules/gateway/cost-tracker.test.js.map +1 -0
- package/dist/tests/modules/gateway/load-balancer.test.d.ts +1 -0
- package/dist/tests/modules/gateway/load-balancer.test.js +70 -0
- package/dist/tests/modules/gateway/load-balancer.test.js.map +1 -0
- package/dist/tests/modules/gateway/rate-limiter.test.d.ts +1 -0
- package/dist/tests/modules/gateway/rate-limiter.test.js +62 -0
- package/dist/tests/modules/gateway/rate-limiter.test.js.map +1 -0
- package/dist/tests/orchestrator-dependencies.test.js +23 -6
- package/dist/tests/orchestrator-dependencies.test.js.map +1 -1
- package/dist/tests/shared/audit.test.d.ts +1 -0
- package/dist/tests/shared/audit.test.js +53 -0
- package/dist/tests/shared/audit.test.js.map +1 -0
- package/dist/tests/storage-operations.test.d.ts +1 -0
- package/dist/tests/storage-operations.test.js +116 -0
- package/dist/tests/storage-operations.test.js.map +1 -0
- package/framework-mcp/README.md +324 -77
- package/framework-mcp/dist/dashboard/assets/index-BAPGLiWE.js +267 -0
- package/framework-mcp/dist/dashboard/index.html +15 -0
- package/framework-mcp/dist/framework-mcp/src/tools/definitions.js +23 -1
- package/framework-mcp/dist/framework-mcp/src/tools/gateway/llm_gateway_query.js +137 -0
- package/framework-mcp/dist/framework-mcp/src/tools/gateway/llm_gateway_status.js +90 -0
- package/framework-mcp/dist/framework-mcp/src/tools/index.js +35 -20
- package/framework-mcp/dist/framework-mcp/src/tools/quality/analyze_code_quality.js +165 -0
- package/framework-mcp/dist/framework-mcp/src/tools/quality/check_architecture_compliance.js +134 -0
- package/framework-mcp/dist/framework-mcp/src/tools/schemas.js +29 -0
- package/framework-mcp/dist/framework-mcp/src/tools/shell/run_command.js +2 -2
- package/framework-mcp/dist/src/modules/memory/core.js +10 -17
- package/framework-mcp/dist/src/modules/memory/embedding.js +130 -0
- package/framework-mcp/dist/src/shared/fs.js +4 -2
- package/framework-mcp/dist/src/shared/logger.js +15 -5
- package/framework-mcp/dist/src/shared/pii.js +121 -0
- package/framework-mcp/dist/src/shared/storage.js +3 -1
- package/framework-mcp/package.json +1 -1
- package/package.json +10 -4
- package/templates/full/ATABEY_FULL.md +515 -0
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
import { logger } from "../../shared/logger.js";
|
|
2
|
-
import {
|
|
3
|
-
import { asTraceID } from "../../shared/types.js";
|
|
2
|
+
import { AtabeyStorage } from "../../shared/storage.js";
|
|
3
|
+
import { asAgentID, asTraceID } from "../../shared/types.js";
|
|
4
4
|
import { CoreMemory } from "../memory/core.js";
|
|
5
|
-
import { RoutingEngine } from "./routing-engine.js";
|
|
6
5
|
import { QualityGate } from "./quality-gate.js";
|
|
6
|
+
import { RoutingEngine } from "./routing-engine.js";
|
|
7
7
|
/**
|
|
8
|
-
* [ENGINE] Agent Executor
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* [ENGINE] Agent Executor — Production Implementation
|
|
9
|
+
*
|
|
10
|
+
* Manages real agent calls through the Hermes messaging system.
|
|
11
|
+
* Distributes tasks to agents, collects results, passes through quality gate,
|
|
12
|
+
* and saves to memory.
|
|
13
|
+
*
|
|
14
|
+
* Uses real Hermes message queue (not simulated).
|
|
11
15
|
*/
|
|
12
16
|
export class AgentExecutor {
|
|
13
17
|
/**
|
|
14
|
-
*
|
|
15
|
-
* 1.
|
|
16
|
-
* 2.
|
|
17
|
-
* 3.
|
|
18
|
-
* 4.
|
|
18
|
+
* Distributes a task to the relevant agent and executes it.
|
|
19
|
+
* 1. Select the best agent via Routing Engine
|
|
20
|
+
* 2. Send Hermes message
|
|
21
|
+
* 3. Wait for agent response (polling)
|
|
22
|
+
* 4. Pass through quality check
|
|
23
|
+
* 5. Save result to memory
|
|
19
24
|
*/
|
|
20
25
|
static async execute(taskDescription, traceId) {
|
|
21
26
|
// 1. Route the task to the best agent
|
|
@@ -29,7 +34,7 @@ export class AgentExecutor {
|
|
|
29
34
|
for (let attempt = 1; attempt <= 3; attempt++) {
|
|
30
35
|
try {
|
|
31
36
|
logger.info(`[EXECUTOR] Attempt ${attempt}/3: ${agent} executing...`);
|
|
32
|
-
// Execute the agent task
|
|
37
|
+
// Execute the agent task via Hermes messaging
|
|
33
38
|
const output = await AgentExecutor.runAgentTask(agent, taskDescription, subTasks, traceId);
|
|
34
39
|
lastOutput = output;
|
|
35
40
|
// 3. Quality check
|
|
@@ -39,7 +44,7 @@ export class AgentExecutor {
|
|
|
39
44
|
// 4. Save to memory
|
|
40
45
|
await AgentExecutor.saveToMemory(agent, taskDescription, output, traceId);
|
|
41
46
|
// Update agent status
|
|
42
|
-
|
|
47
|
+
AtabeyStorage.updateAgentStatus(agent.replace("@", ""), "COMPLETED", taskDescription);
|
|
43
48
|
return {
|
|
44
49
|
success: true,
|
|
45
50
|
agent,
|
|
@@ -57,7 +62,7 @@ export class AgentExecutor {
|
|
|
57
62
|
}
|
|
58
63
|
// All attempts failed
|
|
59
64
|
logger.error(`[EXECUTOR] ${agent} FAILED after 3 attempts. Last error: ${lastError}`);
|
|
60
|
-
|
|
65
|
+
AtabeyStorage.updateAgentStatus(agent.replace("@", ""), "BLOCKED", `Failed: ${taskDescription.substring(0, 60)}`);
|
|
61
66
|
return {
|
|
62
67
|
success: false,
|
|
63
68
|
agent,
|
|
@@ -66,72 +71,95 @@ export class AgentExecutor {
|
|
|
66
71
|
};
|
|
67
72
|
}
|
|
68
73
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
* Her ajan tipi için farklı bir "görev tamamlama" mantığı:
|
|
72
|
-
* - @backend: API endpoint'i oluşturur
|
|
73
|
-
* - @frontend: UI component'i oluşturur
|
|
74
|
-
* - @database: Migration script'i oluşturur
|
|
75
|
-
* - @security: Security audit raporu oluşturur
|
|
76
|
-
* - Diğer: Genel task çıktısı
|
|
74
|
+
* Runs the agent via the Hermes messaging system.
|
|
77
75
|
*
|
|
78
|
-
*
|
|
79
|
-
* 1.
|
|
80
|
-
* 2.
|
|
81
|
-
* 3.
|
|
76
|
+
* Flow:
|
|
77
|
+
* 1. Write DELEGATION message to agent's message queue
|
|
78
|
+
* 2. Wait for agent response (polling, max 30 seconds)
|
|
79
|
+
* 3. Parse response and return as output
|
|
82
80
|
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
* Priority: HIGH — v0.1.0 için implemente edilmeli.
|
|
81
|
+
* NOTE: In real MCP environment, agents read and process their own
|
|
82
|
+
* message queues. Here the queue is managed via SQLite.
|
|
86
83
|
*/
|
|
87
|
-
static async runAgentTask(agent, taskDescription, subTasks,
|
|
84
|
+
static async runAgentTask(agent, taskDescription, subTasks, traceId) {
|
|
88
85
|
const agentName = agent.replace("@", "");
|
|
89
|
-
|
|
90
|
-
//
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
86
|
+
const from = "@manager";
|
|
87
|
+
// ─── 1. Send Hermes Message ──────────────────────────────────────
|
|
88
|
+
const messagePayload = JSON.stringify({
|
|
89
|
+
type: "DELEGATION",
|
|
90
|
+
task: taskDescription,
|
|
91
|
+
subTasks,
|
|
92
|
+
traceId,
|
|
93
|
+
from,
|
|
94
|
+
});
|
|
95
|
+
AtabeyStorage.saveMessage({
|
|
96
|
+
from: asAgentID(from),
|
|
97
|
+
to: asAgentID(agent),
|
|
98
|
+
category: "DELEGATION",
|
|
99
|
+
content: messagePayload,
|
|
100
|
+
traceId: asTraceID(traceId),
|
|
101
|
+
timestamp: new Date().toISOString(),
|
|
102
|
+
status: "PENDING",
|
|
103
|
+
priority: "HIGH",
|
|
104
|
+
requiresApproval: false,
|
|
105
|
+
});
|
|
106
|
+
// Update agent status
|
|
107
|
+
AtabeyStorage.updateAgentStatus(agentName, "EXECUTING", taskDescription);
|
|
100
108
|
// Log action
|
|
101
|
-
|
|
109
|
+
AtabeyStorage.getDB().prepare(`
|
|
102
110
|
INSERT INTO logs (agent, action, trace_id, status, summary)
|
|
103
111
|
VALUES (?, ?, ?, ?, ?)
|
|
104
|
-
`).run(agentName, "
|
|
105
|
-
|
|
106
|
-
|
|
112
|
+
`).run(agentName, "DELEGATION_SENT", traceId, "IN_PROGRESS", taskDescription.substring(0, 200));
|
|
113
|
+
logger.info(`[HERMES] Delegation sent to ${agent} (trace: ${traceId})`);
|
|
114
|
+
// ─── 2. Wait for Agent Response (Polling) ────────────────────────
|
|
115
|
+
const output = await AgentExecutor.pollForAgentResponse(agentName, traceId);
|
|
107
116
|
return output;
|
|
108
117
|
}
|
|
109
118
|
/**
|
|
110
|
-
*
|
|
119
|
+
* Polls for agent response from the Hermes message queue.
|
|
111
120
|
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
121
|
+
* Polling strategy:
|
|
122
|
+
* - Check every 500ms
|
|
123
|
+
* - Max 30 seconds wait (60 attempts)
|
|
124
|
+
* - Return response if found, timeout if not
|
|
114
125
|
*/
|
|
115
|
-
static
|
|
116
|
-
const
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
126
|
+
static async pollForAgentResponse(agentName, traceId) {
|
|
127
|
+
const maxAttempts = 60; // 30 seconds (500ms * 60)
|
|
128
|
+
const pollInterval = 500; // 500ms
|
|
129
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
130
|
+
// Check RESPONSE messages sent by the agent
|
|
131
|
+
const messages = AtabeyStorage.getPendingMessages();
|
|
132
|
+
const response = messages.find(m => m.from.replace("@", "") === agentName
|
|
133
|
+
&& m.category === "RESPONSE"
|
|
134
|
+
&& m.traceId === traceId
|
|
135
|
+
&& m.status === "PENDING");
|
|
136
|
+
if (response) {
|
|
137
|
+
// Mark message as processed
|
|
138
|
+
if (response.id !== undefined) {
|
|
139
|
+
AtabeyStorage.updateMessageStatus(response.id, "PROCESSED");
|
|
140
|
+
}
|
|
141
|
+
// Log response
|
|
142
|
+
AtabeyStorage.getDB().prepare(`
|
|
143
|
+
INSERT INTO logs (agent, action, trace_id, status, summary)
|
|
144
|
+
VALUES (?, ?, ?, ?, ?)
|
|
145
|
+
`).run(agentName, "RESPONSE_RECEIVED", traceId, "SUCCESS", response.content.substring(0, 200));
|
|
146
|
+
logger.info(`[HERMES] Response received from @${agentName} (trace: ${traceId})`);
|
|
147
|
+
return response.content;
|
|
148
|
+
}
|
|
149
|
+
// Short delay before next poll
|
|
150
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
151
|
+
}
|
|
152
|
+
// Timeout — agent did not respond
|
|
153
|
+
const timeoutMsg = `[TIMEOUT] @${agentName} did not respond within ${(maxAttempts * pollInterval) / 1000}s`;
|
|
154
|
+
logger.warn(`[HERMES] ${timeoutMsg} (trace: ${traceId})`);
|
|
155
|
+
AtabeyStorage.getDB().prepare(`
|
|
156
|
+
INSERT INTO logs (agent, action, trace_id, status, summary)
|
|
157
|
+
VALUES (?, ?, ?, ?, ?)
|
|
158
|
+
`).run(agentName, "RESPONSE_TIMEOUT", traceId, "FAILED", timeoutMsg);
|
|
159
|
+
return timeoutMsg;
|
|
132
160
|
}
|
|
133
161
|
/**
|
|
134
|
-
*
|
|
162
|
+
* Saves the task result to memory.
|
|
135
163
|
*/
|
|
136
164
|
static async saveToMemory(agent, taskDescription, output, traceId) {
|
|
137
165
|
// Save to Vector Memory
|
|
@@ -142,15 +170,15 @@ export class AgentExecutor {
|
|
|
142
170
|
tags: [agent.replace("@", ""), "task-execution"],
|
|
143
171
|
});
|
|
144
172
|
// Save to SQLite logs
|
|
145
|
-
|
|
173
|
+
AtabeyStorage.getDB().prepare(`
|
|
146
174
|
INSERT INTO logs (agent, action, trace_id, status, summary)
|
|
147
175
|
VALUES (?, ?, ?, ?, ?)
|
|
148
176
|
`).run(agent.replace("@", ""), "COMPLETED", traceId, "SUCCESS", output.substring(0, 200));
|
|
149
177
|
// Update task status
|
|
150
|
-
const tasks =
|
|
178
|
+
const tasks = AtabeyStorage.getTasks(asTraceID(traceId));
|
|
151
179
|
const pendingTask = tasks.find(t => t.status === "IN_PROGRESS");
|
|
152
180
|
if (pendingTask) {
|
|
153
|
-
|
|
181
|
+
AtabeyStorage.saveTask({
|
|
154
182
|
...pendingTask,
|
|
155
183
|
status: "COMPLETED",
|
|
156
184
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-executor.js","sourceRoot":"","sources":["../../../../src/modules/engines/agent-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"agent-executor.js","sourceRoot":"","sources":["../../../../src/modules/engines/agent-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,19 +5,19 @@ export interface QualityResult {
|
|
|
5
5
|
}
|
|
6
6
|
/**
|
|
7
7
|
* [ENGINE] Quality Gate
|
|
8
|
-
* Atabey Order v2 —
|
|
9
|
-
*
|
|
8
|
+
* Atabey Order v2 — Deterministic Quality Inspection Center.
|
|
9
|
+
* Inspects agent outputs and codebase against constitutional rules.
|
|
10
10
|
*/
|
|
11
11
|
export declare class QualityGate {
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
14
|
-
* 1. Compliance (
|
|
15
|
-
* 2. Lint (
|
|
16
|
-
* 3. Tests (
|
|
13
|
+
* Puts an agent's work through quality testing.
|
|
14
|
+
* 1. Compliance (Constitutional compliance)
|
|
15
|
+
* 2. Lint (Code standards)
|
|
16
|
+
* 3. Tests (Unit and integration tests)
|
|
17
17
|
*/
|
|
18
18
|
static check(agent: string, output: string, task: string): Promise<QualityResult>;
|
|
19
19
|
/**
|
|
20
|
-
*
|
|
20
|
+
* Basic logical validation of agent output
|
|
21
21
|
*/
|
|
22
22
|
private static validateOutputContent;
|
|
23
23
|
}
|
|
@@ -3,15 +3,15 @@ import { scanProjectCompliance } from "../../cli/utils/compliance.js";
|
|
|
3
3
|
import { logger } from "../../shared/logger.js";
|
|
4
4
|
/**
|
|
5
5
|
* [ENGINE] Quality Gate
|
|
6
|
-
* Atabey Order v2 —
|
|
7
|
-
*
|
|
6
|
+
* Atabey Order v2 — Deterministic Quality Inspection Center.
|
|
7
|
+
* Inspects agent outputs and codebase against constitutional rules.
|
|
8
8
|
*/
|
|
9
9
|
export class QualityGate {
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
* 1. Compliance (
|
|
13
|
-
* 2. Lint (
|
|
14
|
-
* 3. Tests (
|
|
11
|
+
* Puts an agent's work through quality testing.
|
|
12
|
+
* 1. Compliance (Constitutional compliance)
|
|
13
|
+
* 2. Lint (Code standards)
|
|
14
|
+
* 3. Tests (Unit and integration tests)
|
|
15
15
|
*/
|
|
16
16
|
static async check(agent, output, task) {
|
|
17
17
|
logger.info(`[QUALITY_GATE] Starting audit for ${agent}...`);
|
|
@@ -67,7 +67,7 @@ export class QualityGate {
|
|
|
67
67
|
return { passed: true, reason: "All quality gates passed." };
|
|
68
68
|
}
|
|
69
69
|
/**
|
|
70
|
-
*
|
|
70
|
+
* Basic logical validation of agent output
|
|
71
71
|
*/
|
|
72
72
|
static validateOutputContent(output, _task) {
|
|
73
73
|
if (!output || output.trim().length < 10) {
|
|
@@ -15,64 +15,55 @@ export interface RoutingResult {
|
|
|
15
15
|
}
|
|
16
16
|
export declare class RoutingEngine {
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
18
|
+
* Advanced Routing Engine — analyzes task descriptions,
|
|
19
|
+
* selects the most suitable agent, and determines subtasks.
|
|
20
20
|
*
|
|
21
|
-
* TF-IDF
|
|
21
|
+
* Uses TF-IDF-like keyword weighting.
|
|
22
22
|
*/
|
|
23
23
|
static resolveAgent(taskDescription: string): string;
|
|
24
24
|
/**
|
|
25
|
-
*
|
|
25
|
+
* Returns detailed routing result — score, confidence, reasoning, subTasks
|
|
26
26
|
*/
|
|
27
27
|
static resolveWithDetails(taskDescription: string): RoutingResult;
|
|
28
28
|
/**
|
|
29
|
-
*
|
|
29
|
+
* Automatically splits the task into subtasks
|
|
30
30
|
*/
|
|
31
31
|
static planTask(taskDescription: string): string[];
|
|
32
32
|
private static tokenize;
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
34
|
+
* Simple term frequency calculation
|
|
35
35
|
*/
|
|
36
36
|
private static calculateTf;
|
|
37
37
|
private static fallbackRouting;
|
|
38
38
|
private static generateSubTasks;
|
|
39
39
|
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
40
|
+
* Quality feedback loop — retries if @quality rejects
|
|
41
|
+
* Uses real MCP calls, not simulations.
|
|
42
42
|
*/
|
|
43
43
|
static qualityLoop(agent: string, taskDescription: string, maxRetries?: number): Promise<{
|
|
44
44
|
success: boolean;
|
|
45
45
|
attempts: number;
|
|
46
46
|
}>;
|
|
47
47
|
/**
|
|
48
|
-
*
|
|
48
|
+
* Runs the agent through the Hermes messaging system.
|
|
49
49
|
*
|
|
50
|
-
*
|
|
51
|
-
* 1.
|
|
52
|
-
* 2.
|
|
53
|
-
* 3. Parse and return
|
|
54
|
-
*
|
|
55
|
-
* BLOCKER: AgentExecutor.execute() uses simulated output (generateAgentOutput).
|
|
56
|
-
* This method is only called from qualityLoop which is NOT yet used by orchestrate.ts.
|
|
57
|
-
* Priority: MEDIUM — implement after AgentExecutor is production-ready.
|
|
50
|
+
* Flow:
|
|
51
|
+
* 1. Write DELEGATION message to agent's queue (Storage.saveMessage)
|
|
52
|
+
* 2. Wait for agent response (polling, max 30 seconds)
|
|
53
|
+
* 3. Parse response and return as output
|
|
58
54
|
*/
|
|
59
55
|
private static runAgent;
|
|
60
56
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* IMPLEMENTATION PLAN (v0.1.0):
|
|
64
|
-
* 1. Call scanProjectCompliance() from compliance.ts
|
|
65
|
-
* 2. Call lintCommand() from lint.ts
|
|
66
|
-
* 3. Run vitest via runTests()
|
|
67
|
-
* 4. Aggregate results into { passed, reason }
|
|
57
|
+
* Runs quality control through the real QualityGate.
|
|
68
58
|
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
59
|
+
* Flow:
|
|
60
|
+
* 1. QualityGate.check() for compliance + lint + test + content validation
|
|
61
|
+
* 2. Aggregate results
|
|
71
62
|
*/
|
|
72
63
|
private static runQualityCheck;
|
|
73
64
|
private static getCandidates;
|
|
74
65
|
/**
|
|
75
|
-
*
|
|
66
|
+
* Default values for agents without a specialties field
|
|
76
67
|
*/
|
|
77
68
|
private static defaultSpecialties;
|
|
78
69
|
}
|
|
@@ -2,19 +2,21 @@ import fs from "fs";
|
|
|
2
2
|
import path from "path";
|
|
3
3
|
import { getFrameworkDir } from "../../cli/utils/memory.js";
|
|
4
4
|
import { logger } from "../../shared/logger.js";
|
|
5
|
+
import { AtabeyStorage } from "../../shared/storage.js";
|
|
6
|
+
import { asAgentID, asTraceID } from "../../shared/types.js";
|
|
5
7
|
import { ALL_AGENTS } from "../agents/definitions.js";
|
|
6
8
|
export class RoutingEngine {
|
|
7
9
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
+
* Advanced Routing Engine — analyzes task descriptions,
|
|
11
|
+
* selects the most suitable agent, and determines subtasks.
|
|
10
12
|
*
|
|
11
|
-
* TF-IDF
|
|
13
|
+
* Uses TF-IDF-like keyword weighting.
|
|
12
14
|
*/
|
|
13
15
|
static resolveAgent(taskDescription) {
|
|
14
16
|
return this.resolveWithDetails(taskDescription).agent;
|
|
15
17
|
}
|
|
16
18
|
/**
|
|
17
|
-
*
|
|
19
|
+
* Returns detailed routing result — score, confidence, reasoning, subTasks
|
|
18
20
|
*/
|
|
19
21
|
static resolveWithDetails(taskDescription) {
|
|
20
22
|
const textLower = taskDescription.toLowerCase();
|
|
@@ -59,7 +61,7 @@ export class RoutingEngine {
|
|
|
59
61
|
bestScore = score;
|
|
60
62
|
bestAgent = candidate.agent;
|
|
61
63
|
bestReasoning = matches.length > 0
|
|
62
|
-
? `
|
|
64
|
+
? `Matching fields: ${[...new Set(matches)].join(", ")}`
|
|
63
65
|
: "Selected based on general capability";
|
|
64
66
|
bestSubTasks = this.generateSubTasks(candidate.agent, taskDescription);
|
|
65
67
|
}
|
|
@@ -83,7 +85,7 @@ export class RoutingEngine {
|
|
|
83
85
|
};
|
|
84
86
|
}
|
|
85
87
|
/**
|
|
86
|
-
*
|
|
88
|
+
* Automatically splits the task into subtasks
|
|
87
89
|
*/
|
|
88
90
|
static planTask(taskDescription) {
|
|
89
91
|
const result = this.resolveWithDetails(taskDescription);
|
|
@@ -110,11 +112,11 @@ export class RoutingEngine {
|
|
|
110
112
|
.filter(t => t.length > 1);
|
|
111
113
|
}
|
|
112
114
|
/**
|
|
113
|
-
*
|
|
115
|
+
* Simple term frequency calculation
|
|
114
116
|
*/
|
|
115
117
|
static calculateTf(term, tokens) {
|
|
116
118
|
const count = tokens.filter(t => t === term).length;
|
|
117
|
-
return 1 + (count * 0.5); // Base 1,
|
|
119
|
+
return 1 + (count * 0.5); // Base 1, each repetition +0.5
|
|
118
120
|
}
|
|
119
121
|
static fallbackRouting(tokens) {
|
|
120
122
|
const text = tokens.join(" ");
|
|
@@ -237,8 +239,8 @@ export class RoutingEngine {
|
|
|
237
239
|
return [...specific, ...base];
|
|
238
240
|
}
|
|
239
241
|
/**
|
|
240
|
-
*
|
|
241
|
-
*
|
|
242
|
+
* Quality feedback loop — retries if @quality rejects
|
|
243
|
+
* Uses real MCP calls, not simulations.
|
|
242
244
|
*/
|
|
243
245
|
static async qualityLoop(agent, taskDescription, maxRetries = 3) {
|
|
244
246
|
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
@@ -271,46 +273,70 @@ export class RoutingEngine {
|
|
|
271
273
|
return { success: false, attempts: maxRetries };
|
|
272
274
|
}
|
|
273
275
|
/**
|
|
274
|
-
*
|
|
276
|
+
* Runs the agent through the Hermes messaging system.
|
|
275
277
|
*
|
|
276
|
-
*
|
|
277
|
-
* 1.
|
|
278
|
-
* 2.
|
|
279
|
-
* 3. Parse and return
|
|
280
|
-
*
|
|
281
|
-
* BLOCKER: AgentExecutor.execute() uses simulated output (generateAgentOutput).
|
|
282
|
-
* This method is only called from qualityLoop which is NOT yet used by orchestrate.ts.
|
|
283
|
-
* Priority: MEDIUM — implement after AgentExecutor is production-ready.
|
|
278
|
+
* Flow:
|
|
279
|
+
* 1. Write DELEGATION message to agent's queue (Storage.saveMessage)
|
|
280
|
+
* 2. Wait for agent response (polling, max 30 seconds)
|
|
281
|
+
* 3. Parse response and return as output
|
|
284
282
|
*/
|
|
285
283
|
static async runAgent(agent, task) {
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
284
|
+
const agentName = agent.replace("@", "");
|
|
285
|
+
const traceId = `T-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`;
|
|
286
|
+
const messagePayload = JSON.stringify({
|
|
287
|
+
type: "DELEGATION",
|
|
288
|
+
task,
|
|
289
|
+
traceId,
|
|
290
|
+
from: "@manager",
|
|
291
|
+
});
|
|
292
|
+
AtabeyStorage.saveMessage({
|
|
293
|
+
from: asAgentID("@manager"),
|
|
294
|
+
to: asAgentID(agent),
|
|
295
|
+
category: "DELEGATION",
|
|
296
|
+
content: messagePayload,
|
|
297
|
+
traceId: asTraceID(traceId),
|
|
298
|
+
timestamp: new Date().toISOString(),
|
|
299
|
+
status: "PENDING",
|
|
300
|
+
priority: "HIGH",
|
|
301
|
+
requiresApproval: false,
|
|
302
|
+
});
|
|
303
|
+
logger.info(`[HERMES] Delegation sent to ${agent} (trace: ${traceId})`);
|
|
304
|
+
// Poll for response (max 30 seconds)
|
|
305
|
+
const maxAttempts = 60;
|
|
306
|
+
const pollInterval = 500;
|
|
307
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
308
|
+
const messages = AtabeyStorage.getPendingMessages();
|
|
309
|
+
const response = messages.find(m => m.from.replace("@", "") === agentName
|
|
310
|
+
&& m.category === "RESPONSE"
|
|
311
|
+
&& m.traceId === traceId
|
|
312
|
+
&& m.status === "PENDING");
|
|
313
|
+
if (response) {
|
|
314
|
+
if (response.id !== undefined) {
|
|
315
|
+
AtabeyStorage.updateMessageStatus(response.id, "PROCESSED");
|
|
316
|
+
}
|
|
317
|
+
logger.info(`[HERMES] Response received from ${agent} (trace: ${traceId})`);
|
|
318
|
+
return response.content;
|
|
319
|
+
}
|
|
320
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
321
|
+
}
|
|
322
|
+
const timeoutMsg = `[TIMEOUT] ${agent} did not respond within 30s`;
|
|
323
|
+
logger.warn(`[HERMES] ${timeoutMsg} (trace: ${traceId})`);
|
|
324
|
+
return timeoutMsg;
|
|
293
325
|
}
|
|
294
326
|
/**
|
|
295
|
-
*
|
|
296
|
-
*
|
|
297
|
-
* IMPLEMENTATION PLAN (v0.1.0):
|
|
298
|
-
* 1. Call scanProjectCompliance() from compliance.ts
|
|
299
|
-
* 2. Call lintCommand() from lint.ts
|
|
300
|
-
* 3. Run vitest via runTests()
|
|
301
|
-
* 4. Aggregate results into { passed, reason }
|
|
327
|
+
* Runs quality control through the real QualityGate.
|
|
302
328
|
*
|
|
303
|
-
*
|
|
304
|
-
*
|
|
329
|
+
* Flow:
|
|
330
|
+
* 1. QualityGate.check() for compliance + lint + test + content validation
|
|
331
|
+
* 2. Aggregate results
|
|
305
332
|
*/
|
|
306
333
|
static async runQualityCheck(result) {
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
return { passed: true, reason: "All checks passed (simulated)" };
|
|
334
|
+
const { QualityGate } = await import("./quality-gate.js");
|
|
335
|
+
const qualityResult = await QualityGate.check("@quality", result, "Quality check via routing engine");
|
|
336
|
+
return {
|
|
337
|
+
passed: qualityResult.passed,
|
|
338
|
+
reason: qualityResult.reason,
|
|
339
|
+
};
|
|
314
340
|
}
|
|
315
341
|
static getCandidates() {
|
|
316
342
|
const frameworkDir = getFrameworkDir();
|
|
@@ -342,7 +368,7 @@ export class RoutingEngine {
|
|
|
342
368
|
if (candidates.length === 0) {
|
|
343
369
|
candidates = ALL_AGENTS.map(ag => ({
|
|
344
370
|
agent: ag.name.startsWith("@") ? ag.name : `@${ag.name}`,
|
|
345
|
-
specialties: ag.specialties
|
|
371
|
+
specialties: ag.specialties ?? this.defaultSpecialties(ag.name),
|
|
346
372
|
displayName: ag.displayName,
|
|
347
373
|
role: ag.role,
|
|
348
374
|
capability: ag.capability,
|
|
@@ -352,7 +378,7 @@ export class RoutingEngine {
|
|
|
352
378
|
return candidates;
|
|
353
379
|
}
|
|
354
380
|
/**
|
|
355
|
-
*
|
|
381
|
+
* Default values for agents without a specialties field
|
|
356
382
|
*/
|
|
357
383
|
static defaultSpecialties(name) {
|
|
358
384
|
const defaults = {
|