atabey 0.0.13 → 0.0.15
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 +1 -1
- package/PRIVACY.md +8 -14
- package/README.md +405 -56
- package/bin/cli.js +72 -5
- package/dist/framework-mcp/src/index.js +988 -63
- package/dist/framework-mcp/src/index.js.map +1 -1
- package/dist/framework-mcp/src/tools/compliance/mask_pii.d.ts +17 -0
- package/dist/framework-mcp/src/tools/compliance/mask_pii.js +56 -0
- package/dist/framework-mcp/src/tools/compliance/mask_pii.js.map +1 -0
- package/dist/framework-mcp/src/tools/definitions.js +10 -9
- package/dist/framework-mcp/src/tools/definitions.js.map +1 -1
- package/dist/framework-mcp/src/tools/framework/run_tests.js +25 -0
- package/dist/framework-mcp/src/tools/framework/run_tests.js.map +1 -1
- package/dist/framework-mcp/src/tools/index.js +7 -8
- package/dist/framework-mcp/src/tools/index.js.map +1 -1
- package/dist/framework-mcp/src/tools/messaging/approve_operation.d.ts +22 -0
- package/dist/framework-mcp/src/tools/messaging/approve_operation.js +81 -0
- package/dist/framework-mcp/src/tools/messaging/approve_operation.js.map +1 -0
- package/dist/framework-mcp/src/tools/messaging/ask_human.d.ts +15 -0
- package/dist/framework-mcp/src/tools/messaging/ask_human.js +89 -20
- package/dist/framework-mcp/src/tools/messaging/ask_human.js.map +1 -1
- package/dist/framework-mcp/src/tools/observability/check_ports.d.ts +1 -0
- package/dist/framework-mcp/src/tools/observability/check_ports.js +24 -8
- package/dist/framework-mcp/src/tools/observability/check_ports.js.map +1 -1
- package/dist/framework-mcp/src/tools/quality/analyze_code_quality.js +13 -64
- package/dist/framework-mcp/src/tools/quality/analyze_code_quality.js.map +1 -1
- package/dist/framework-mcp/src/tools/schemas.d.ts +48 -53
- package/dist/framework-mcp/src/tools/schemas.js +18 -22
- package/dist/framework-mcp/src/tools/schemas.js.map +1 -1
- package/dist/framework-mcp/src/tools/shell/run_command.js +146 -90
- package/dist/framework-mcp/src/tools/shell/run_command.js.map +1 -1
- package/dist/framework-mcp/src/tools/types.d.ts +11 -105
- package/dist/framework-mcp/src/tools/types.js +1 -0
- package/dist/framework-mcp/src/tools/types.js.map +1 -1
- package/dist/framework-mcp/src/utils/auth.d.ts +36 -0
- package/dist/framework-mcp/src/utils/auth.js +79 -0
- package/dist/framework-mcp/src/utils/auth.js.map +1 -0
- package/dist/framework-mcp/src/utils/auto-rollback.d.ts +71 -0
- package/dist/framework-mcp/src/utils/auto-rollback.js +266 -0
- package/dist/framework-mcp/src/utils/auto-rollback.js.map +1 -0
- package/dist/framework-mcp/src/utils/compliance.js +12 -4
- package/dist/framework-mcp/src/utils/compliance.js.map +1 -1
- package/dist/framework-mcp/src/utils/context-optimizer.d.ts +69 -0
- package/dist/framework-mcp/src/utils/context-optimizer.js +157 -0
- package/dist/framework-mcp/src/utils/context-optimizer.js.map +1 -0
- package/dist/framework-mcp/src/utils/discipline.d.ts +68 -0
- package/dist/framework-mcp/src/utils/discipline.js +218 -0
- package/dist/framework-mcp/src/utils/discipline.js.map +1 -0
- package/dist/framework-mcp/src/utils/finops.d.ts +143 -0
- package/dist/framework-mcp/src/utils/finops.js +326 -0
- package/dist/framework-mcp/src/utils/finops.js.map +1 -0
- package/dist/framework-mcp/src/utils/human-in-loop.d.ts +95 -0
- package/dist/framework-mcp/src/utils/human-in-loop.js +216 -0
- package/dist/framework-mcp/src/utils/human-in-loop.js.map +1 -0
- package/dist/framework-mcp/src/utils/license-scanner.d.ts +71 -0
- package/dist/framework-mcp/src/utils/license-scanner.js +284 -0
- package/dist/framework-mcp/src/utils/license-scanner.js.map +1 -0
- package/dist/framework-mcp/src/utils/loop-detector.d.ts +105 -0
- package/dist/framework-mcp/src/utils/loop-detector.js +362 -0
- package/dist/framework-mcp/src/utils/loop-detector.js.map +1 -0
- package/dist/framework-mcp/src/utils/quality.d.ts +19 -0
- package/dist/framework-mcp/src/utils/quality.js +125 -0
- package/dist/framework-mcp/src/utils/quality.js.map +1 -0
- package/dist/framework-mcp/src/utils/rules-engine.d.ts +78 -0
- package/dist/framework-mcp/src/utils/rules-engine.js +232 -0
- package/dist/framework-mcp/src/utils/rules-engine.js.map +1 -0
- package/dist/framework-mcp/src/utils/silent-router.d.ts +49 -0
- package/dist/framework-mcp/src/utils/silent-router.js +155 -0
- package/dist/framework-mcp/src/utils/silent-router.js.map +1 -0
- package/dist/framework-mcp/src/utils/storage.d.ts +1 -0
- package/dist/framework-mcp/src/utils/storage.js +2 -2
- package/dist/framework-mcp/src/utils/storage.js.map +1 -1
- package/dist/framework-mcp/src/utils/telemetry-streamer.d.ts +133 -0
- package/dist/framework-mcp/src/utils/telemetry-streamer.js +397 -0
- package/dist/framework-mcp/src/utils/telemetry-streamer.js.map +1 -0
- package/dist/framework-mcp/tests/tools/file_system/file_system_tools.test.js +2 -2
- package/dist/framework-mcp/tests/tools/file_system/file_system_tools.test.js.map +1 -1
- package/dist/framework-mcp/tests/tools/framework/run_tests.test.d.ts +1 -0
- package/dist/framework-mcp/tests/tools/framework/run_tests.test.js +49 -0
- package/dist/framework-mcp/tests/tools/framework/run_tests.test.js.map +1 -0
- package/dist/framework-mcp/tests/tools/messaging/send_message.test.js +14 -5
- package/dist/framework-mcp/tests/tools/messaging/send_message.test.js.map +1 -1
- package/dist/framework-mcp/tests/tools/observability/check_ports.test.d.ts +1 -0
- package/dist/framework-mcp/tests/tools/observability/check_ports.test.js +44 -0
- package/dist/framework-mcp/tests/tools/observability/check_ports.test.js.map +1 -0
- package/dist/framework-mcp/tests/tools/shell/run_command.test.js +44 -14
- package/dist/framework-mcp/tests/tools/shell/run_command.test.js.map +1 -1
- package/dist/framework-mcp/tests/utils/auto-rollback.test.d.ts +7 -0
- package/dist/framework-mcp/tests/utils/auto-rollback.test.js +178 -0
- package/dist/framework-mcp/tests/utils/auto-rollback.test.js.map +1 -0
- package/dist/framework-mcp/tests/utils/context-optimizer.test.d.ts +1 -0
- package/dist/framework-mcp/tests/utils/context-optimizer.test.js +62 -0
- package/dist/framework-mcp/tests/utils/context-optimizer.test.js.map +1 -0
- package/dist/framework-mcp/tests/utils/finops.test.d.ts +7 -0
- package/dist/framework-mcp/tests/utils/finops.test.js +157 -0
- package/dist/framework-mcp/tests/utils/finops.test.js.map +1 -0
- package/dist/framework-mcp/tests/utils/human-in-loop.test.d.ts +1 -0
- package/dist/framework-mcp/tests/utils/human-in-loop.test.js +59 -0
- package/dist/framework-mcp/tests/utils/human-in-loop.test.js.map +1 -0
- package/dist/framework-mcp/tests/utils/license-scanner.test.d.ts +7 -0
- package/dist/framework-mcp/tests/utils/license-scanner.test.js +131 -0
- package/dist/framework-mcp/tests/utils/license-scanner.test.js.map +1 -0
- package/dist/framework-mcp/tests/utils/loop-detector.test.d.ts +7 -0
- package/dist/framework-mcp/tests/utils/loop-detector.test.js +204 -0
- package/dist/framework-mcp/tests/utils/loop-detector.test.js.map +1 -0
- package/dist/framework-mcp/tests/utils/rules-engine.test.d.ts +1 -0
- package/dist/framework-mcp/tests/utils/rules-engine.test.js +106 -0
- package/dist/framework-mcp/tests/utils/rules-engine.test.js.map +1 -0
- package/dist/framework-mcp/tests/utils/telemetry-streamer.test.d.ts +7 -0
- package/dist/framework-mcp/tests/utils/telemetry-streamer.test.js +201 -0
- package/dist/framework-mcp/tests/utils/telemetry-streamer.test.js.map +1 -0
- package/dist/src/cli/commands/check.js +16 -1
- package/dist/src/cli/commands/check.js.map +1 -1
- package/dist/src/cli/commands/dashboard.js +188 -164
- package/dist/src/cli/commands/dashboard.js.map +1 -1
- package/dist/src/cli/commands/gateway.js +2 -2
- package/dist/src/cli/commands/gateway.js.map +1 -1
- package/dist/src/cli/commands/init/scaffold-core.d.ts +2 -0
- package/dist/src/cli/commands/init/scaffold-core.js +16 -1
- package/dist/src/cli/commands/init/scaffold-core.js.map +1 -1
- package/dist/src/cli/commands/init/scaffold-ops.js +2 -2
- package/dist/src/cli/commands/init/scaffold-ops.js.map +1 -1
- package/dist/src/cli/commands/init/scaffold-standards.js +13 -1
- package/dist/src/cli/commands/init/scaffold-standards.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts +4 -0
- package/dist/src/cli/commands/init.js +94 -31
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/mcp.js +3 -1
- package/dist/src/cli/commands/mcp.js.map +1 -1
- package/dist/src/cli/commands/quickstart.d.ts +1 -1
- package/dist/src/cli/commands/quickstart.js +12 -24
- package/dist/src/cli/commands/quickstart.js.map +1 -1
- package/dist/src/cli/commands/script.js +8 -1
- package/dist/src/cli/commands/script.js.map +1 -1
- package/dist/src/cli/index.js +24 -23
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/shims.js +7 -7
- package/dist/src/cli/utils/pkg.js +2 -3
- package/dist/src/cli/utils/pkg.js.map +1 -1
- package/dist/src/cli/utils/quality.d.ts +10 -0
- package/dist/src/cli/utils/quality.js +10 -0
- package/dist/src/cli/utils/quality.js.map +1 -0
- package/dist/src/modules/agents/definitions.js +45 -40
- package/dist/src/modules/agents/definitions.js.map +1 -1
- package/dist/src/modules/agents/registry/manager.js +6 -1
- package/dist/src/modules/agents/registry/manager.js.map +1 -1
- package/dist/src/modules/engines/agent-executor.d.ts +6 -10
- package/dist/src/modules/engines/agent-executor.js +63 -21
- package/dist/src/modules/engines/agent-executor.js.map +1 -1
- package/dist/src/modules/engines/agent-loop.d.ts +34 -0
- package/dist/src/modules/engines/agent-loop.js +102 -0
- package/dist/src/modules/engines/agent-loop.js.map +1 -0
- package/dist/src/modules/engines/evaluation-engine.d.ts +12 -2
- package/dist/src/modules/engines/evaluation-engine.js +78 -11
- package/dist/src/modules/engines/evaluation-engine.js.map +1 -1
- package/dist/src/modules/engines/quality-gate.d.ts +13 -5
- package/dist/src/modules/engines/quality-gate.js +39 -31
- package/dist/src/modules/engines/quality-gate.js.map +1 -1
- package/dist/src/modules/engines/routing-engine.d.ts +5 -3
- package/dist/src/modules/engines/routing-engine.js +16 -9
- package/dist/src/modules/engines/routing-engine.js.map +1 -1
- package/dist/src/modules/gateway/cost-tracker.d.ts +5 -0
- package/dist/src/modules/gateway/cost-tracker.js +71 -0
- package/dist/src/modules/gateway/cost-tracker.js.map +1 -1
- package/dist/src/modules/gateway/gateway.d.ts +4 -0
- package/dist/src/modules/gateway/gateway.js +8 -0
- package/dist/src/modules/gateway/gateway.js.map +1 -1
- package/dist/src/shared/audit.js +3 -2
- package/dist/src/shared/audit.js.map +1 -1
- package/dist/src/shared/pii.d.ts +41 -9
- package/dist/src/shared/pii.js +122 -31
- package/dist/src/shared/pii.js.map +1 -1
- package/dist/src/shared/storage.d.ts +62 -0
- package/dist/src/shared/storage.js +47 -7
- package/dist/src/shared/storage.js.map +1 -1
- package/dist/tests/embedding.test.d.ts +1 -0
- package/dist/tests/embedding.test.js +82 -0
- package/dist/tests/embedding.test.js.map +1 -0
- package/dist/tests/engines/evaluation-engine.test.d.ts +1 -0
- package/dist/tests/engines/evaluation-engine.test.js +71 -0
- package/dist/tests/engines/evaluation-engine.test.js.map +1 -0
- package/dist/tests/engines/planning-engine.test.d.ts +1 -0
- package/dist/tests/engines/planning-engine.test.js +100 -0
- package/dist/tests/engines/planning-engine.test.js.map +1 -0
- package/dist/tests/engines/quality-gate.test.d.ts +1 -0
- package/dist/tests/engines/quality-gate.test.js +59 -0
- package/dist/tests/engines/quality-gate.test.js.map +1 -0
- package/dist/tests/engines/risk-engine.test.d.ts +1 -0
- package/dist/tests/engines/risk-engine.test.js +80 -0
- package/dist/tests/engines/risk-engine.test.js.map +1 -0
- package/dist/tests/engines/routing-engine.test.d.ts +1 -0
- package/dist/tests/engines/routing-engine.test.js +78 -0
- package/dist/tests/engines/routing-engine.test.js.map +1 -0
- package/dist/tests/integration/hermes_locking.test.js +1 -0
- package/dist/tests/integration/hermes_locking.test.js.map +1 -1
- package/dist/tests/modules/engines/agent-executor.test.js +1 -1
- package/dist/tests/modules/engines/agent-executor.test.js.map +1 -1
- package/dist/tests/modules/gateway/cost-tracker.test.js +20 -1
- package/dist/tests/modules/gateway/cost-tracker.test.js.map +1 -1
- package/dist/tests/shared/lock.test.d.ts +1 -0
- package/dist/tests/shared/lock.test.js +95 -0
- package/dist/tests/shared/lock.test.js.map +1 -0
- package/dist/tests/shared/pii.test.d.ts +1 -0
- package/dist/tests/shared/pii.test.js +183 -0
- package/dist/tests/shared/pii.test.js.map +1 -0
- package/framework-mcp/README.md +307 -35
- package/framework-mcp/dist/dashboard/assets/index-B_rK57vi.js +1221 -0
- package/framework-mcp/dist/dashboard/index.html +1 -1
- package/framework-mcp/dist/framework-mcp/src/index.js +988 -63
- package/framework-mcp/dist/framework-mcp/src/tools/compliance/mask_pii.js +55 -0
- package/framework-mcp/dist/framework-mcp/src/tools/definitions.js +10 -9
- package/framework-mcp/dist/framework-mcp/src/tools/framework/run_tests.js +25 -0
- package/framework-mcp/dist/framework-mcp/src/tools/index.js +7 -8
- package/framework-mcp/dist/framework-mcp/src/tools/messaging/approve_operation.js +80 -0
- package/framework-mcp/dist/framework-mcp/src/tools/messaging/ask_human.js +89 -20
- package/framework-mcp/dist/framework-mcp/src/tools/observability/check_ports.js +24 -8
- package/framework-mcp/dist/framework-mcp/src/tools/quality/analyze_code_quality.js +13 -64
- package/framework-mcp/dist/framework-mcp/src/tools/schemas.js +18 -22
- package/framework-mcp/dist/framework-mcp/src/tools/shell/run_command.js +146 -90
- package/framework-mcp/dist/framework-mcp/src/tools/types.js +1 -0
- package/framework-mcp/dist/framework-mcp/src/utils/auth.js +78 -0
- package/framework-mcp/dist/framework-mcp/src/utils/auto-rollback.js +265 -0
- package/framework-mcp/dist/framework-mcp/src/utils/compliance.js +12 -4
- package/framework-mcp/dist/framework-mcp/src/utils/context-optimizer.js +156 -0
- package/framework-mcp/dist/framework-mcp/src/utils/discipline.js +217 -0
- package/framework-mcp/dist/framework-mcp/src/utils/finops.js +325 -0
- package/framework-mcp/dist/framework-mcp/src/utils/human-in-loop.js +215 -0
- package/framework-mcp/dist/framework-mcp/src/utils/license-scanner.js +283 -0
- package/framework-mcp/dist/framework-mcp/src/utils/loop-detector.js +361 -0
- package/framework-mcp/dist/framework-mcp/src/utils/quality.js +124 -0
- package/framework-mcp/dist/framework-mcp/src/utils/rules-engine.js +231 -0
- package/framework-mcp/dist/framework-mcp/src/utils/silent-router.js +154 -0
- package/framework-mcp/dist/framework-mcp/src/utils/storage.js +2 -2
- package/framework-mcp/dist/framework-mcp/src/utils/telemetry-streamer.js +396 -0
- package/framework-mcp/dist/src/cli/platforms/core.js +72 -0
- package/framework-mcp/dist/src/cli/platforms/index.js +5 -0
- package/framework-mcp/dist/src/cli/platforms/paths.js +101 -0
- package/framework-mcp/dist/src/cli/platforms/scaffold.js +72 -0
- package/framework-mcp/dist/src/cli/platforms/utils.js +75 -0
- package/framework-mcp/dist/src/cli/utils/claude.js +57 -0
- package/framework-mcp/dist/src/cli/utils/compliance.js +12 -0
- package/framework-mcp/dist/src/cli/utils/fs.js +138 -0
- package/framework-mcp/dist/src/cli/utils/pkg.js +282 -0
- package/framework-mcp/dist/src/cli/utils/quality.js +9 -0
- package/framework-mcp/dist/src/modules/agents/definitions.js +563 -0
- package/framework-mcp/dist/src/modules/agents/registry/analyst.js +39 -0
- package/framework-mcp/dist/src/modules/agents/registry/architect.js +42 -0
- package/framework-mcp/dist/src/modules/agents/registry/backend.js +50 -0
- package/framework-mcp/dist/src/modules/agents/registry/database.js +45 -0
- package/framework-mcp/dist/src/modules/agents/registry/devops.js +45 -0
- package/framework-mcp/dist/src/modules/agents/registry/explorer.js +37 -0
- package/framework-mcp/dist/src/modules/agents/registry/frontend.js +52 -0
- package/framework-mcp/dist/src/modules/agents/registry/git.js +36 -0
- package/framework-mcp/dist/src/modules/agents/registry/manager.js +64 -0
- package/framework-mcp/dist/src/modules/agents/registry/mobile.js +41 -0
- package/framework-mcp/dist/src/modules/agents/registry/native.js +41 -0
- package/framework-mcp/dist/src/modules/agents/registry/quality.js +43 -0
- package/framework-mcp/dist/src/modules/agents/registry/security.js +42 -0
- package/framework-mcp/dist/src/modules/agents/types.js +1 -0
- package/framework-mcp/dist/src/modules/engines/evaluation-engine.js +169 -0
- package/framework-mcp/dist/src/modules/engines/quality-gate.js +92 -0
- package/framework-mcp/dist/src/modules/engines/risk-engine.js +105 -0
- package/framework-mcp/dist/src/modules/engines/routing-engine.js +408 -0
- package/framework-mcp/dist/src/modules/engines/types.js +1 -0
- package/framework-mcp/dist/src/modules/providers/definitions.js +140 -0
- package/framework-mcp/dist/src/modules/providers/registry.js +18 -0
- package/framework-mcp/dist/src/modules/providers/shared.js +104 -0
- package/framework-mcp/dist/src/modules/providers/types.js +1 -0
- package/framework-mcp/dist/src/modules/skills/adapter-skills.js +449 -0
- package/framework-mcp/dist/src/modules/skills/definitions.js +70 -0
- package/framework-mcp/dist/src/shared/audit.js +220 -0
- package/framework-mcp/dist/src/shared/errors.js +68 -0
- package/framework-mcp/dist/src/shared/lock.js +159 -0
- package/framework-mcp/dist/src/shared/pii.js +122 -31
- package/framework-mcp/dist/src/shared/retention.js +170 -0
- package/framework-mcp/dist/src/shared/storage.js +47 -7
- package/framework-mcp/dist/src/shared/string.js +29 -0
- package/framework-mcp/package.json +8 -2
- package/mcp.json +12 -6
- package/package.json +11 -5
- package/templates/full/ATABEY_FULL.md +1 -1
- package/framework-mcp/dist/dashboard/assets/index-BAPGLiWE.js +0 -267
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { logger } from "../../shared/logger.js";
|
|
2
|
+
import { maskObject, maskText } from "../../shared/pii.js";
|
|
2
3
|
import { AtabeyStorage } from "../../shared/storage.js";
|
|
3
4
|
import { asAgentID, asTraceID } from "../../shared/types.js";
|
|
4
5
|
import { CoreMemory } from "../memory/core.js";
|
|
6
|
+
import { EvaluationEngine } from "./evaluation-engine.js";
|
|
5
7
|
import { QualityGate } from "./quality-gate.js";
|
|
6
8
|
import { RoutingEngine } from "./routing-engine.js";
|
|
7
9
|
/**
|
|
@@ -32,6 +34,7 @@ export class AgentExecutor {
|
|
|
32
34
|
let lastOutput = "";
|
|
33
35
|
let lastError = "";
|
|
34
36
|
for (let attempt = 1; attempt <= 3; attempt++) {
|
|
37
|
+
const startTime = Date.now();
|
|
35
38
|
try {
|
|
36
39
|
logger.info(`[EXECUTOR] Attempt ${attempt}/3: ${agent} executing...`);
|
|
37
40
|
// Execute the agent task via Hermes messaging
|
|
@@ -40,11 +43,19 @@ export class AgentExecutor {
|
|
|
40
43
|
// 3. Quality check
|
|
41
44
|
const qualityResult = await QualityGate.check(agent, output, taskDescription);
|
|
42
45
|
if (qualityResult.passed) {
|
|
46
|
+
const durationMs = Date.now() - startTime;
|
|
43
47
|
logger.info(`[EXECUTOR] ${agent} task PASSED quality check (attempt ${attempt})`);
|
|
44
48
|
// 4. Save to memory
|
|
45
49
|
await AgentExecutor.saveToMemory(agent, taskDescription, output, traceId);
|
|
46
50
|
// Update agent status
|
|
47
51
|
AtabeyStorage.updateAgentStatus(agent.replace("@", ""), "COMPLETED", taskDescription);
|
|
52
|
+
// Evaluate task to update specialty memory
|
|
53
|
+
try {
|
|
54
|
+
EvaluationEngine.evaluateTask(traceId, agent, durationMs, taskDescription);
|
|
55
|
+
}
|
|
56
|
+
catch (evalErr) {
|
|
57
|
+
logger.error(`[EXECUTOR] Failed to evaluate task for ${agent}: ${evalErr.message}`);
|
|
58
|
+
}
|
|
48
59
|
return {
|
|
49
60
|
success: true,
|
|
50
61
|
agent,
|
|
@@ -71,27 +82,54 @@ export class AgentExecutor {
|
|
|
71
82
|
};
|
|
72
83
|
}
|
|
73
84
|
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* 2. Wait for agent response (polling, max 30 seconds)
|
|
79
|
-
* 3. Parse response and return as output
|
|
80
|
-
*
|
|
81
|
-
* NOTE: In real MCP environment, agents read and process their own
|
|
82
|
-
* message queues. Here the queue is managed via SQLite.
|
|
85
|
+
* Directly acknowledges a task for a specific agent.
|
|
86
|
+
* Called by AgentLoop when a DELEGATION message is received.
|
|
87
|
+
* LLM execution is handled by the AI interface (Claude Code / Gemini CLI / Cursor).
|
|
88
|
+
* Writes a RESPONSE message back to Hermes for the executor to pick up.
|
|
83
89
|
*/
|
|
90
|
+
static async executeForAgent(agentName, task, traceId) {
|
|
91
|
+
const normalizedName = agentName.replace("@", "");
|
|
92
|
+
logger.info(`[EXECUTOR] executeForAgent: ${agentName} acknowledged`, {
|
|
93
|
+
agent: agentName,
|
|
94
|
+
traceId,
|
|
95
|
+
task: task.substring(0, 80),
|
|
96
|
+
});
|
|
97
|
+
AtabeyStorage.updateAgentStatus(normalizedName, "EXECUTING", task);
|
|
98
|
+
// LLM execution is handled by the AI interface (Claude Code / Gemini CLI / Cursor)
|
|
99
|
+
// Atabey acts as the MCP tool server — the AI interface calls the tools directly
|
|
100
|
+
const responseContent = `[AGENT:${agentName}] Task acknowledged. The AI interface (Claude Code / Gemini CLI / Cursor) will handle execution via MCP tools. Task: ${task}`;
|
|
101
|
+
logger.info(`[EXECUTOR] Task acknowledged for ${agentName}`, { traceId });
|
|
102
|
+
// Write RESPONSE back to Hermes so pollForAgentResponse can pick it up
|
|
103
|
+
AtabeyStorage.saveMessage({
|
|
104
|
+
from: asAgentID(agentName),
|
|
105
|
+
to: asAgentID("@manager"),
|
|
106
|
+
category: "RESPONSE",
|
|
107
|
+
content: responseContent,
|
|
108
|
+
traceId: asTraceID(traceId),
|
|
109
|
+
timestamp: new Date().toISOString(),
|
|
110
|
+
status: "PENDING",
|
|
111
|
+
priority: "HIGH",
|
|
112
|
+
requiresApproval: false,
|
|
113
|
+
});
|
|
114
|
+
AtabeyStorage.updateAgentStatus(normalizedName, "ACKNOWLEDGED", task);
|
|
115
|
+
return responseContent;
|
|
116
|
+
}
|
|
84
117
|
static async runAgentTask(agent, taskDescription, subTasks, traceId) {
|
|
85
118
|
const agentName = agent.replace("@", "");
|
|
86
119
|
const from = "@manager";
|
|
87
120
|
// ─── 1. Send Hermes Message ──────────────────────────────────────
|
|
88
|
-
|
|
121
|
+
// [KVKK/GDPR] Mask PII in task description before sending to message queue
|
|
122
|
+
const maskedTask = maskText(taskDescription);
|
|
123
|
+
const maskedSubTasks = subTasks.map(st => maskText(st));
|
|
124
|
+
// [KVKK/GDPR] Strict mode: mask any object fields that may contain PII
|
|
125
|
+
const safePayload = maskObject({
|
|
89
126
|
type: "DELEGATION",
|
|
90
|
-
task:
|
|
91
|
-
subTasks,
|
|
127
|
+
task: maskedTask,
|
|
128
|
+
subTasks: maskedSubTasks,
|
|
92
129
|
traceId,
|
|
93
130
|
from,
|
|
94
|
-
});
|
|
131
|
+
}, 0, true);
|
|
132
|
+
const messagePayload = JSON.stringify(safePayload);
|
|
95
133
|
AtabeyStorage.saveMessage({
|
|
96
134
|
from: asAgentID(from),
|
|
97
135
|
to: asAgentID(agent),
|
|
@@ -109,7 +147,7 @@ export class AgentExecutor {
|
|
|
109
147
|
AtabeyStorage.getDB().prepare(`
|
|
110
148
|
INSERT INTO logs (agent, action, trace_id, status, summary)
|
|
111
149
|
VALUES (?, ?, ?, ?, ?)
|
|
112
|
-
`).run(agentName, "DELEGATION_SENT", traceId, "IN_PROGRESS",
|
|
150
|
+
`).run(agentName, "DELEGATION_SENT", traceId, "IN_PROGRESS", maskedTask.substring(0, 200));
|
|
113
151
|
logger.info(`[HERMES] Delegation sent to ${agent} (trace: ${traceId})`);
|
|
114
152
|
// ─── 2. Wait for Agent Response (Polling) ────────────────────────
|
|
115
153
|
const output = await AgentExecutor.pollForAgentResponse(agentName, traceId);
|
|
@@ -120,11 +158,11 @@ export class AgentExecutor {
|
|
|
120
158
|
*
|
|
121
159
|
* Polling strategy:
|
|
122
160
|
* - Check every 500ms
|
|
123
|
-
* - Max
|
|
161
|
+
* - Max 10 seconds wait (20 attempts)
|
|
124
162
|
* - Return response if found, timeout if not
|
|
125
163
|
*/
|
|
126
164
|
static async pollForAgentResponse(agentName, traceId) {
|
|
127
|
-
const maxAttempts =
|
|
165
|
+
const maxAttempts = 20; // 10 seconds (500ms * 20) — AgentLoop responds much faster
|
|
128
166
|
const pollInterval = 500; // 500ms
|
|
129
167
|
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
130
168
|
// Check RESPONSE messages sent by the agent
|
|
@@ -138,11 +176,12 @@ export class AgentExecutor {
|
|
|
138
176
|
if (response.id !== undefined) {
|
|
139
177
|
AtabeyStorage.updateMessageStatus(response.id, "PROCESSED");
|
|
140
178
|
}
|
|
141
|
-
//
|
|
179
|
+
// [KVKK/GDPR] Mask PII in response content before logging
|
|
180
|
+
const maskedResponse = maskText(response.content);
|
|
142
181
|
AtabeyStorage.getDB().prepare(`
|
|
143
182
|
INSERT INTO logs (agent, action, trace_id, status, summary)
|
|
144
183
|
VALUES (?, ?, ?, ?, ?)
|
|
145
|
-
`).run(agentName, "RESPONSE_RECEIVED", traceId, "SUCCESS",
|
|
184
|
+
`).run(agentName, "RESPONSE_RECEIVED", traceId, "SUCCESS", maskedResponse.substring(0, 200));
|
|
146
185
|
logger.info(`[HERMES] Response received from @${agentName} (trace: ${traceId})`);
|
|
147
186
|
return response.content;
|
|
148
187
|
}
|
|
@@ -150,7 +189,7 @@ export class AgentExecutor {
|
|
|
150
189
|
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
151
190
|
}
|
|
152
191
|
// Timeout — agent did not respond
|
|
153
|
-
const timeoutMsg = `[TIMEOUT] @${agentName} did not respond within ${(maxAttempts * pollInterval) / 1000}s
|
|
192
|
+
const timeoutMsg = `[TIMEOUT] @${agentName} did not respond within ${(maxAttempts * pollInterval) / 1000}s. Ensure AgentLoop is running or a provider is configured.`;
|
|
154
193
|
logger.warn(`[HERMES] ${timeoutMsg} (trace: ${traceId})`);
|
|
155
194
|
AtabeyStorage.getDB().prepare(`
|
|
156
195
|
INSERT INTO logs (agent, action, trace_id, status, summary)
|
|
@@ -162,9 +201,12 @@ export class AgentExecutor {
|
|
|
162
201
|
* Saves the task result to memory.
|
|
163
202
|
*/
|
|
164
203
|
static async saveToMemory(agent, taskDescription, output, traceId) {
|
|
204
|
+
// [KVKK/GDPR] Mask PII before saving to memory
|
|
205
|
+
const maskedTask = maskText(taskDescription);
|
|
206
|
+
const maskedOutput = maskText(output);
|
|
165
207
|
// Save to Vector Memory
|
|
166
208
|
await CoreMemory.remember({
|
|
167
|
-
content: `${agent}: ${
|
|
209
|
+
content: `${agent}: ${maskedTask}\nResult: ${maskedOutput}`,
|
|
168
210
|
category: "TASK_HISTORY",
|
|
169
211
|
traceId: asTraceID(traceId),
|
|
170
212
|
tags: [agent.replace("@", ""), "task-execution"],
|
|
@@ -173,7 +215,7 @@ export class AgentExecutor {
|
|
|
173
215
|
AtabeyStorage.getDB().prepare(`
|
|
174
216
|
INSERT INTO logs (agent, action, trace_id, status, summary)
|
|
175
217
|
VALUES (?, ?, ?, ?, ?)
|
|
176
|
-
`).run(agent.replace("@", ""), "COMPLETED", traceId, "SUCCESS",
|
|
218
|
+
`).run(agent.replace("@", ""), "COMPLETED", traceId, "SUCCESS", maskedOutput.substring(0, 200));
|
|
177
219
|
// Update task status
|
|
178
220
|
const tasks = AtabeyStorage.getTasks(asTraceID(traceId));
|
|
179
221
|
const pendingTask = tasks.find(t => t.status === "IN_PROGRESS");
|
|
@@ -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,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAiB,MAAM,qBAAqB,CAAC;AAEnE;;;;;;;;GAQG;AACH,MAAM,OAAO,aAAa;IACtB;;;;;;;OAOG;IACI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,eAAuB,EAAE,OAAe;QAMhE,sCAAsC;QACtC,MAAM,aAAa,GAAkB,aAAa,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;QACvF,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC;QAClC,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;QAExC,MAAM,CAAC,IAAI,CAAC,uBAAuB,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,KAAK,iBAAiB,aAAa,CAAC,UAAU,GAAG,CAAC,CAAC;QAE/H,+CAA+C;QAC/C,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,SAAS,GAAG,EAAE,CAAC;QAEnB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,sBAAsB,OAAO,OAAO,KAAK,eAAe,CAAC,CAAC;gBAEtE,8CAA8C;gBAC9C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC3F,UAAU,GAAG,MAAM,CAAC;gBAEpB,mBAAmB;gBACnB,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;gBAE9E,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACvB,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,uCAAuC,OAAO,GAAG,CAAC,CAAC;oBAElF,oBAAoB;oBACpB,MAAM,aAAa,CAAC,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;oBAE1E,sBAAsB;oBACtB,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;oBAEtF,OAAO;wBACH,OAAO,EAAE,IAAI;wBACb,KAAK;wBACL,MAAM;wBACN,QAAQ,EAAE,OAAO;qBACpB,CAAC;gBACN,CAAC;gBAED,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,oCAAoC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAChG,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,SAAS,GAAI,GAAa,CAAC,OAAO,CAAC;gBACnC,MAAM,CAAC,KAAK,CAAC,qCAAqC,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACvF,CAAC;QACL,CAAC;QAED,sBAAsB;QACtB,MAAM,CAAC,KAAK,CAAC,cAAc,KAAK,yCAAyC,SAAS,EAAE,CAAC,CAAC;QAEtF,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAElH,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK;YACL,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,CAAC;SACd,CAAC;IACN,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"agent-executor.js","sourceRoot":"","sources":["../../../../src/modules/engines/agent-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* [ENGINE] AgentLoop — Real-time Hermes Message Consumer
|
|
3
|
+
*
|
|
4
|
+
* Runs as a background loop polling and consuming DELEGATION messages from the
|
|
5
|
+
* Hermes queue and forwarding them to agents for acknowledgment.
|
|
6
|
+
*
|
|
7
|
+
* Acts as a message-polling and workflow enforcer, ensuring task messages are
|
|
8
|
+
* routed to their designated target agents, which then get processed by the AI client interface.
|
|
9
|
+
*
|
|
10
|
+
* v0.0.14: First real implementation. Agents are now reliably acknowledged and routed.
|
|
11
|
+
*/
|
|
12
|
+
export declare class AgentLoop {
|
|
13
|
+
private static loopHandle;
|
|
14
|
+
private static running;
|
|
15
|
+
/**
|
|
16
|
+
* Start the agent dispatch loop.
|
|
17
|
+
* @param activeAgents - Agent names to process (empty = all registered agents)
|
|
18
|
+
* @param intervalMs - Poll interval in milliseconds (default: 1000ms)
|
|
19
|
+
*/
|
|
20
|
+
static start(activeAgents?: string[], intervalMs?: number): void;
|
|
21
|
+
/**
|
|
22
|
+
* Stop the agent dispatch loop gracefully.
|
|
23
|
+
*/
|
|
24
|
+
static stop(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Returns whether the loop is currently running.
|
|
27
|
+
*/
|
|
28
|
+
static isRunning(): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Single dispatch cycle — reads pending DELEGATION messages and executes them.
|
|
31
|
+
* Marks each message as PROCESSED immediately to prevent duplicate dispatch.
|
|
32
|
+
*/
|
|
33
|
+
private static processDelegations;
|
|
34
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { logger } from "../../shared/logger.js";
|
|
2
|
+
import { AtabeyStorage } from "../../shared/storage.js";
|
|
3
|
+
import { AgentExecutor } from "./agent-executor.js";
|
|
4
|
+
/**
|
|
5
|
+
* [ENGINE] AgentLoop — Real-time Hermes Message Consumer
|
|
6
|
+
*
|
|
7
|
+
* Runs as a background loop polling and consuming DELEGATION messages from the
|
|
8
|
+
* Hermes queue and forwarding them to agents for acknowledgment.
|
|
9
|
+
*
|
|
10
|
+
* Acts as a message-polling and workflow enforcer, ensuring task messages are
|
|
11
|
+
* routed to their designated target agents, which then get processed by the AI client interface.
|
|
12
|
+
*
|
|
13
|
+
* v0.0.14: First real implementation. Agents are now reliably acknowledged and routed.
|
|
14
|
+
*/
|
|
15
|
+
export class AgentLoop {
|
|
16
|
+
static loopHandle = null;
|
|
17
|
+
static running = false;
|
|
18
|
+
/**
|
|
19
|
+
* Start the agent dispatch loop.
|
|
20
|
+
* @param activeAgents - Agent names to process (empty = all registered agents)
|
|
21
|
+
* @param intervalMs - Poll interval in milliseconds (default: 1000ms)
|
|
22
|
+
*/
|
|
23
|
+
static start(activeAgents = [], intervalMs = 1000) {
|
|
24
|
+
if (this.running) {
|
|
25
|
+
logger.warn("[AGENT_LOOP] Loop already running. Ignoring duplicate start.");
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
this.running = true;
|
|
29
|
+
logger.info(`[AGENT_LOOP] Starting. Active agents: ${activeAgents.length === 0 ? "all" : activeAgents.join(", ")} | Interval: ${intervalMs}ms`);
|
|
30
|
+
this.loopHandle = setInterval(() => {
|
|
31
|
+
this.processDelegations(activeAgents).catch((err) => {
|
|
32
|
+
logger.error("[AGENT_LOOP] Error in dispatch cycle", {
|
|
33
|
+
error: err.message,
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}, intervalMs);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Stop the agent dispatch loop gracefully.
|
|
40
|
+
*/
|
|
41
|
+
static stop() {
|
|
42
|
+
if (this.loopHandle) {
|
|
43
|
+
clearInterval(this.loopHandle);
|
|
44
|
+
this.loopHandle = null;
|
|
45
|
+
}
|
|
46
|
+
this.running = false;
|
|
47
|
+
logger.info("[AGENT_LOOP] Stopped.");
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Returns whether the loop is currently running.
|
|
51
|
+
*/
|
|
52
|
+
static isRunning() {
|
|
53
|
+
return this.running;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Single dispatch cycle — reads pending DELEGATION messages and executes them.
|
|
57
|
+
* Marks each message as PROCESSED immediately to prevent duplicate dispatch.
|
|
58
|
+
*/
|
|
59
|
+
static async processDelegations(activeAgents) {
|
|
60
|
+
const pendingMessages = AtabeyStorage.getPendingMessages();
|
|
61
|
+
const delegations = pendingMessages.filter(m => m.category === "DELEGATION" && m.status === "PENDING");
|
|
62
|
+
if (delegations.length === 0)
|
|
63
|
+
return;
|
|
64
|
+
logger.debug(`[AGENT_LOOP] Processing ${delegations.length} pending DELEGATION(s)`);
|
|
65
|
+
for (const msg of delegations) {
|
|
66
|
+
const rawTarget = String(msg.to);
|
|
67
|
+
const agentName = rawTarget.startsWith("@") ? rawTarget : `@${rawTarget}`;
|
|
68
|
+
// If activeAgents is specified, only process those agents
|
|
69
|
+
if (activeAgents.length > 0 && !activeAgents.includes(agentName)) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
// Mark as PROCESSED immediately to prevent duplicate processing
|
|
73
|
+
if (msg.id !== undefined) {
|
|
74
|
+
AtabeyStorage.updateMessageStatus(msg.id, "PROCESSED");
|
|
75
|
+
}
|
|
76
|
+
// Parse task from message content (may be JSON or plain text)
|
|
77
|
+
let taskDescription = msg.content;
|
|
78
|
+
try {
|
|
79
|
+
const parsed = JSON.parse(msg.content);
|
|
80
|
+
if (parsed.task)
|
|
81
|
+
taskDescription = parsed.task;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Content is plain text task description — use as-is
|
|
85
|
+
}
|
|
86
|
+
logger.info(`[AGENT_LOOP] Dispatching → ${agentName}`, {
|
|
87
|
+
traceId: String(msg.traceId),
|
|
88
|
+
task: taskDescription.substring(0, 80),
|
|
89
|
+
});
|
|
90
|
+
try {
|
|
91
|
+
await AgentExecutor.executeForAgent(agentName, taskDescription, String(msg.traceId));
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
logger.error(`[AGENT_LOOP] Failed to execute task for ${agentName}`, {
|
|
95
|
+
error: err.message,
|
|
96
|
+
traceId: String(msg.traceId),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=agent-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../../../../src/modules/engines/agent-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
import { EvaluationResult } from "./types.js";
|
|
2
2
|
export declare class EvaluationEngine {
|
|
3
3
|
/**
|
|
4
|
-
* Evaluates a completed task, calculates a score, and updates Specialty Memory
|
|
4
|
+
* Evaluates a completed task, calculates a score, and updates Specialty Memory.
|
|
5
|
+
* Saves lessons from both failures AND successes.
|
|
5
6
|
*/
|
|
6
|
-
static evaluateTask(traceIdStr: string, agentName: string, durationMs: number): EvaluationResult;
|
|
7
|
+
static evaluateTask(traceIdStr: string, agentName: string, durationMs: number, taskDescription?: string): EvaluationResult;
|
|
8
|
+
/**
|
|
9
|
+
* Extract a meaningful success lesson from a completed task.
|
|
10
|
+
*/
|
|
11
|
+
private static extractSuccessLesson;
|
|
12
|
+
/**
|
|
13
|
+
* Reads learned conventions from an agent's specialty memory.
|
|
14
|
+
* Used by silent-router to inject context into AI calls.
|
|
15
|
+
*/
|
|
16
|
+
static readLearnedConventions(agentName: string): string;
|
|
7
17
|
/**
|
|
8
18
|
* Appends learned lessons to the agent's specialty memory.
|
|
9
19
|
*/
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import path from "path";
|
|
3
|
+
import { scanProjectCompliance } from "../../cli/utils/compliance.js";
|
|
3
4
|
import { getFrameworkDir } from "../../cli/utils/memory.js";
|
|
5
|
+
import { appendFile, ensureDir, runCommandQuiet, writeTextFile } from "../../shared/fs.js";
|
|
4
6
|
import { logger } from "../../shared/logger.js";
|
|
5
|
-
import { scanProjectCompliance } from "../../cli/utils/compliance.js";
|
|
6
7
|
import { asTraceID } from "../../shared/types.js";
|
|
7
|
-
import { appendFile, ensureDir, runCommandQuiet, writeTextFile } from "../../shared/fs.js";
|
|
8
8
|
export class EvaluationEngine {
|
|
9
9
|
/**
|
|
10
|
-
* Evaluates a completed task, calculates a score, and updates Specialty Memory
|
|
10
|
+
* Evaluates a completed task, calculates a score, and updates Specialty Memory.
|
|
11
|
+
* Saves lessons from both failures AND successes.
|
|
11
12
|
*/
|
|
12
|
-
static evaluateTask(traceIdStr, agentName, durationMs) {
|
|
13
|
+
static evaluateTask(traceIdStr, agentName, durationMs, taskDescription) {
|
|
13
14
|
const traceId = asTraceID(traceIdStr);
|
|
14
15
|
logger.debug(`Starting evaluation for Trace ${traceId} by ${agentName}`);
|
|
15
16
|
let score = 100;
|
|
@@ -20,13 +21,17 @@ export class EvaluationEngine {
|
|
|
20
21
|
compliance: 0
|
|
21
22
|
};
|
|
22
23
|
const projectRoot = process.cwd();
|
|
24
|
+
const lessons = [];
|
|
23
25
|
// 1. Compliance Check (AST-based discipline check)
|
|
24
26
|
try {
|
|
25
|
-
const issues = scanProjectCompliance("src");
|
|
27
|
+
const issues = scanProjectCompliance("src");
|
|
26
28
|
metrics.compliance = issues.length;
|
|
27
29
|
if (issues.length > 0) {
|
|
28
|
-
score -= Math.min(issues.length * 5, 40);
|
|
29
|
-
|
|
30
|
+
score -= Math.min(issues.length * 5, 40);
|
|
31
|
+
lessons.push("Compliance Violations Detected: Ensure strict adherence to zero-any, zero-console.log policies.");
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
lessons.push("Compliance check passed: No any types or console.log violations found.");
|
|
30
35
|
}
|
|
31
36
|
}
|
|
32
37
|
catch (e) {
|
|
@@ -36,37 +41,55 @@ export class EvaluationEngine {
|
|
|
36
41
|
try {
|
|
37
42
|
if (fs.existsSync(path.join(projectRoot, "tsconfig.json"))) {
|
|
38
43
|
runCommandQuiet("npx", ["tsc", "--noEmit"], projectRoot);
|
|
44
|
+
lessons.push("TypeScript compilation succeeded. Project is type-safe.");
|
|
39
45
|
}
|
|
40
46
|
}
|
|
41
47
|
catch {
|
|
42
48
|
metrics.compilation = false;
|
|
43
49
|
score -= 20;
|
|
44
|
-
|
|
50
|
+
lessons.push("Compilation Error: Always run 'npx tsc --noEmit' to verify type safety before completing a task.");
|
|
45
51
|
}
|
|
46
52
|
// 3. Lint Check
|
|
47
53
|
try {
|
|
48
54
|
if (fs.existsSync(path.join(projectRoot, "eslint.config.js"))) {
|
|
49
55
|
runCommandQuiet("npx", ["eslint", ".", "--max-warnings", "0"], projectRoot);
|
|
56
|
+
lessons.push("Lint check passed. Code follows project style guidelines.");
|
|
50
57
|
}
|
|
51
58
|
}
|
|
52
59
|
catch {
|
|
53
60
|
metrics.lint = false;
|
|
54
61
|
score -= 10;
|
|
55
62
|
}
|
|
56
|
-
// 4. Test Check
|
|
63
|
+
// 4. Test Check
|
|
57
64
|
try {
|
|
58
65
|
if (fs.existsSync(path.join(projectRoot, "vitest.config.ts"))) {
|
|
59
66
|
runCommandQuiet("npx", ["vitest", "run", "--passWithNoTests"], projectRoot);
|
|
67
|
+
lessons.push("All tests passed. Changes are verified.");
|
|
60
68
|
}
|
|
61
69
|
}
|
|
62
70
|
catch {
|
|
63
71
|
metrics.tests = false;
|
|
64
72
|
score -= 20;
|
|
65
|
-
|
|
73
|
+
lessons.push("Test Failure: Ensure all unit tests pass before marking a task as COMPLETED.");
|
|
66
74
|
}
|
|
67
75
|
// 5. Efficiency Check
|
|
68
|
-
if (durationMs > 120000) {
|
|
76
|
+
if (durationMs > 120000) {
|
|
69
77
|
score -= 10;
|
|
78
|
+
lessons.push("Task took longer than 2 minutes. Consider breaking large tasks into smaller steps.");
|
|
79
|
+
}
|
|
80
|
+
else if (score >= 80) {
|
|
81
|
+
lessons.push("Task completed efficiently within expected timeframe.");
|
|
82
|
+
}
|
|
83
|
+
// 6. Success Lesson — if score is high and no critical errors
|
|
84
|
+
if (score >= 80 && taskDescription) {
|
|
85
|
+
const successLesson = this.extractSuccessLesson(agentName, taskDescription);
|
|
86
|
+
if (successLesson) {
|
|
87
|
+
lessons.push(successLesson);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Save all lessons to specialty memory
|
|
91
|
+
for (const lesson of lessons) {
|
|
92
|
+
this.updateSpecialtyMemory(agentName, lesson);
|
|
70
93
|
}
|
|
71
94
|
const result = {
|
|
72
95
|
traceId,
|
|
@@ -79,6 +102,50 @@ export class EvaluationEngine {
|
|
|
79
102
|
logger.debug(`Evaluation completed for ${agentName}: Score ${result.score}/100`);
|
|
80
103
|
return result;
|
|
81
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* Extract a meaningful success lesson from a completed task.
|
|
107
|
+
*/
|
|
108
|
+
static extractSuccessLesson(agentName, taskDescription) {
|
|
109
|
+
const patterns = [
|
|
110
|
+
{ keywords: ["api", "endpoint", "route", "rest"], lesson: "REST API pattern used successfully for this task." },
|
|
111
|
+
{ keywords: ["auth", "login", "jwt", "token"], lesson: "Authentication/authorization pattern used successfully." },
|
|
112
|
+
{ keywords: ["test", "spec", "vitest"], lesson: "Test-driven approach used successfully." },
|
|
113
|
+
{ keywords: ["migration", "schema", "database", "sql"], lesson: "Database schema/migration pattern used successfully." },
|
|
114
|
+
{ keywords: ["component", "react", "ui", "page"], lesson: "UI component pattern used successfully for this task." },
|
|
115
|
+
{ keywords: ["middleware", "guard", "interceptor"], lesson: "Middleware/guard pattern used successfully." },
|
|
116
|
+
{ keywords: ["service", "repository", "inject"], lesson: "Service/repository pattern used successfully." },
|
|
117
|
+
{ keywords: ["error", "exception", "catch", "try"], lesson: "Error handling pattern used successfully." },
|
|
118
|
+
{ keywords: ["config", "env", "environment"], lesson: "Configuration/environment pattern used successfully." },
|
|
119
|
+
];
|
|
120
|
+
const lower = taskDescription.toLowerCase();
|
|
121
|
+
for (const { keywords, lesson } of patterns) {
|
|
122
|
+
if (keywords.some(k => lower.includes(k))) {
|
|
123
|
+
return lesson;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Generic success lesson if no specific pattern matched
|
|
127
|
+
return "Task completed with score >= 80. Pattern/approach used was effective.";
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Reads learned conventions from an agent's specialty memory.
|
|
131
|
+
* Used by silent-router to inject context into AI calls.
|
|
132
|
+
*/
|
|
133
|
+
static readLearnedConventions(agentName) {
|
|
134
|
+
const cleanName = agentName.replace("@", "");
|
|
135
|
+
const fwDir = getFrameworkDir();
|
|
136
|
+
const filePath = path.join(fwDir, "memory", "specialties", `${cleanName}.md`);
|
|
137
|
+
try {
|
|
138
|
+
if (fs.existsSync(filePath)) {
|
|
139
|
+
const content = fs.readFileSync(filePath, "utf8").trim();
|
|
140
|
+
if (content)
|
|
141
|
+
return content;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// File might not exist yet
|
|
146
|
+
}
|
|
147
|
+
return "";
|
|
148
|
+
}
|
|
82
149
|
/**
|
|
83
150
|
* Appends learned lessons to the agent's specialty memory.
|
|
84
151
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluation-engine.js","sourceRoot":"","sources":["../../../../src/modules/engines/evaluation-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"evaluation-engine.js","sourceRoot":"","sources":["../../../../src/modules/engines/evaluation-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,17 +7,25 @@ export interface QualityResult {
|
|
|
7
7
|
* [ENGINE] Quality Gate
|
|
8
8
|
* Atabey Order v2 — Deterministic Quality Inspection Center.
|
|
9
9
|
* Inspects agent outputs and codebase against constitutional rules.
|
|
10
|
+
*
|
|
11
|
+
* v0.0.14: Selective file-level lint (not full-project), removed test execution
|
|
12
|
+
* from quality gate (tests are a CI concern), added `any` type detection.
|
|
10
13
|
*/
|
|
11
14
|
export declare class QualityGate {
|
|
12
15
|
/**
|
|
13
16
|
* Puts an agent's work through quality testing.
|
|
14
|
-
* 1. Compliance (Constitutional compliance)
|
|
15
|
-
* 2. Lint (
|
|
16
|
-
* 3.
|
|
17
|
+
* 1. Compliance (Constitutional compliance via AST scan)
|
|
18
|
+
* 2. Lint (Targeted file lint if filePath is provided)
|
|
19
|
+
* 3. Content Validation (Output quality check)
|
|
20
|
+
*
|
|
21
|
+
* Note: Test execution is intentionally excluded from the quality gate.
|
|
22
|
+
* Tests are run separately via 'npm test' in CI. The gate focuses on
|
|
23
|
+
* the immediate output quality, not full regression coverage.
|
|
17
24
|
*/
|
|
18
|
-
static check(agent: string, output: string, task: string): Promise<QualityResult>;
|
|
25
|
+
static check(agent: string, output: string, task: string, filePath?: string): Promise<QualityResult>;
|
|
19
26
|
/**
|
|
20
|
-
*
|
|
27
|
+
* Validates the quality of agent output content.
|
|
28
|
+
* Checks for: empty output, error indicators, `any` type policy violations.
|
|
21
29
|
*/
|
|
22
30
|
private static validateOutputContent;
|
|
23
31
|
}
|