atabey 0.0.12 → 0.0.14
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 +553 -88
- package/bin/validate-al-registry.js +4 -4
- package/dist/framework-mcp/src/index.js +914 -62
- 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 +24 -1
- 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/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 +34 -20
- 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.js +3 -1
- package/dist/framework-mcp/src/tools/observability/check_ports.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 +115 -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 +90 -15
- package/dist/framework-mcp/src/tools/schemas.js +32 -7
- package/dist/framework-mcp/src/tools/schemas.js.map +1 -1
- package/dist/framework-mcp/src/tools/shell/run_command.js +12 -2
- 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 +124 -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 +47 -0
- package/dist/framework-mcp/src/utils/silent-router.js +129 -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 +30 -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 +7 -0
- 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 +18 -3
- 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 +343 -96
- 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 +3 -1
- package/dist/src/cli/commands/init/scaffold-core.js +17 -2
- 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 +6 -0
- package/dist/src/cli/commands/init.js +163 -25
- 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 +30 -42
- package/dist/src/cli/commands/quickstart.js.map +1 -1
- package/dist/src/cli/index.js +228 -317
- 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 +11 -11
- 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/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.d.ts +2 -2
- package/dist/src/modules/agents/definitions.js +104 -63
- 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/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 +25 -30
- package/dist/src/modules/engines/agent-executor.js +133 -73
- 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.js +2 -2
- package/dist/src/modules/engines/evaluation-engine.js.map +1 -1
- package/dist/src/modules/engines/quality-gate.d.ts +16 -8
- package/dist/src/modules/engines/quality-gate.js +42 -34
- package/dist/src/modules/engines/quality-gate.js.map +1 -1
- package/dist/src/modules/engines/routing-engine.d.ts +21 -28
- package/dist/src/modules/engines/routing-engine.js +83 -50
- 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 +60 -0
- package/dist/src/modules/gateway/cost-tracker.js +198 -0
- package/dist/src/modules/gateway/cost-tracker.js.map +1 -0
- package/dist/src/modules/gateway/gateway.d.ts +72 -0
- package/dist/src/modules/gateway/gateway.js +243 -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 +221 -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 +69 -0
- package/dist/src/shared/pii.js +213 -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 +22 -1
- package/dist/src/shared/storage.js +49 -7
- 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/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/agent_flow.test.js +14 -8
- package/dist/tests/integration/agent_flow.test.js.map +1 -1
- 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/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 +93 -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/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/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 +596 -77
- package/framework-mcp/dist/dashboard/assets/index-B2mYld0c.js +1221 -0
- package/framework-mcp/dist/dashboard/index.html +15 -0
- package/framework-mcp/dist/framework-mcp/src/index.js +914 -62
- package/framework-mcp/dist/framework-mcp/src/tools/compliance/mask_pii.js +55 -0
- package/framework-mcp/dist/framework-mcp/src/tools/definitions.js +24 -1
- package/framework-mcp/dist/framework-mcp/src/tools/framework/run_tests.js +25 -0
- 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 +34 -20
- 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 +3 -1
- package/framework-mcp/dist/framework-mcp/src/tools/quality/analyze_code_quality.js +114 -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 +32 -7
- package/framework-mcp/dist/framework-mcp/src/tools/shell/run_command.js +12 -2
- 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 +123 -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 +128 -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/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/memory/core.js +10 -17
- package/framework-mcp/dist/src/modules/memory/embedding.js +130 -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/fs.js +4 -2
- package/framework-mcp/dist/src/shared/lock.js +159 -0
- package/framework-mcp/dist/src/shared/logger.js +15 -5
- package/framework-mcp/dist/src/shared/pii.js +212 -0
- package/framework-mcp/dist/src/shared/retention.js +170 -0
- package/framework-mcp/dist/src/shared/storage.js +49 -7
- package/framework-mcp/dist/src/shared/string.js +29 -0
- package/framework-mcp/package.json +8 -2
- package/mcp.json +11 -6
- package/package.json +22 -9
- package/templates/full/ATABEY_FULL.md +515 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { classifyData, containsPII, maskObject, maskText } from "../../../../src/shared/pii.js";
|
|
2
|
+
export function handleMaskPII(root, args) {
|
|
3
|
+
const mode = args.mode || "auto";
|
|
4
|
+
const strictMode = args.strictMode ?? false;
|
|
5
|
+
// Mode: text
|
|
6
|
+
if (mode === "text" || (mode === "auto" && args.text && !args.data)) {
|
|
7
|
+
if (!args.text) {
|
|
8
|
+
return {
|
|
9
|
+
isError: true,
|
|
10
|
+
content: [{ type: "text", text: "[ERROR] 'text' parameter is required when mode is 'text'." }],
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
const masked = maskText(args.text);
|
|
14
|
+
const hasPII = containsPII(args.text);
|
|
15
|
+
const classification = classifyData(args.text);
|
|
16
|
+
return {
|
|
17
|
+
content: [{
|
|
18
|
+
type: "text",
|
|
19
|
+
text: JSON.stringify({
|
|
20
|
+
originalLength: args.text.length,
|
|
21
|
+
maskedLength: masked.length,
|
|
22
|
+
hasPII,
|
|
23
|
+
classification,
|
|
24
|
+
masked,
|
|
25
|
+
}, null, 2),
|
|
26
|
+
}],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// Mode: object
|
|
30
|
+
if (mode === "object" || (mode === "auto" && args.data)) {
|
|
31
|
+
if (!args.data) {
|
|
32
|
+
return {
|
|
33
|
+
isError: true,
|
|
34
|
+
content: [{ type: "text", text: "[ERROR] 'data' parameter is required when mode is 'object'." }],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const masked = maskObject(args.data, 0, strictMode);
|
|
38
|
+
const hasPII = containsPII(JSON.stringify(args.data));
|
|
39
|
+
const classification = classifyData(JSON.stringify(args.data));
|
|
40
|
+
return {
|
|
41
|
+
content: [{
|
|
42
|
+
type: "text",
|
|
43
|
+
text: JSON.stringify({
|
|
44
|
+
hasPII,
|
|
45
|
+
classification,
|
|
46
|
+
masked,
|
|
47
|
+
}, null, 2),
|
|
48
|
+
}],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
isError: true,
|
|
53
|
+
content: [{ type: "text", text: "[ERROR] Provide either 'text' (string) or 'data' (object) parameter." }],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import * as schemas from "./schemas.js";
|
|
2
1
|
import { zodToMcpSchema } from "../utils/zod-to-mcp.js";
|
|
2
|
+
import * as schemas from "./schemas.js";
|
|
3
3
|
/**
|
|
4
4
|
* ─── SUPREME TOOL REGISTRY ─────────────────────────────────────────
|
|
5
5
|
* Every tool is dynamically generated from its Zod schema.
|
|
@@ -172,4 +172,27 @@ export const TOOLS = [
|
|
|
172
172
|
description: "Pause execution and ask the human developer a clarifying question via the terminal.",
|
|
173
173
|
inputSchema: zodToMcpSchema(schemas.AskHumanSchema),
|
|
174
174
|
},
|
|
175
|
+
// ─── PII / Compliance ─────────────────────────────────────────
|
|
176
|
+
{
|
|
177
|
+
name: "mask_pii",
|
|
178
|
+
description: "Mask Personally Identifiable Information (PII) in text or structured data. Compliant with KVKK (Law No. 6698) and GDPR. Detects and masks emails, phone numbers, TC IDs, API keys, tokens, IPs, credit cards, IBANs, and more.",
|
|
179
|
+
inputSchema: zodToMcpSchema(schemas.MaskPIISchema),
|
|
180
|
+
},
|
|
181
|
+
// ─── Code Quality ─────────────────────────────────────────────
|
|
182
|
+
{
|
|
183
|
+
name: "analyze_code_quality",
|
|
184
|
+
description: "Analyze code quality in a given path. Checks TypeScript types, lint rules, and code complexity.",
|
|
185
|
+
inputSchema: zodToMcpSchema(schemas.AnalyzeCodeQualitySchema),
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: "check_architecture_compliance",
|
|
189
|
+
description: "Check architecture compliance in a given path. Verifies layer boundaries (Controller→Service→Repository), import direction rules, and strict mode.",
|
|
190
|
+
inputSchema: zodToMcpSchema(schemas.CheckArchitectureComplianceSchema),
|
|
191
|
+
},
|
|
192
|
+
// ─── Human-in-the-Loop ────────────────────────────────────────
|
|
193
|
+
{
|
|
194
|
+
name: "approve_operation",
|
|
195
|
+
description: "Approve, reject, or list pending risk-gated operations. Use this when an operation was blocked by the Risk Gate (risk score ≥ 60). Action: 'approve' | 'reject' | 'list'.",
|
|
196
|
+
inputSchema: zodToMcpSchema(schemas.ApproveOperationSchema),
|
|
197
|
+
},
|
|
175
198
|
];
|
|
@@ -1,11 +1,36 @@
|
|
|
1
1
|
import { execSync } from "child_process";
|
|
2
2
|
import { getBackendLanguage, getDefaultTestCommand } from "../../utils/cli.js";
|
|
3
|
+
const TEST_COMMAND_ALLOW_LIST = [
|
|
4
|
+
"npm test",
|
|
5
|
+
"npm run test",
|
|
6
|
+
"npx vitest",
|
|
7
|
+
"pytest",
|
|
8
|
+
"go test",
|
|
9
|
+
"dotnet test",
|
|
10
|
+
"mvn test",
|
|
11
|
+
"./gradlew test",
|
|
12
|
+
"cargo test"
|
|
13
|
+
];
|
|
3
14
|
/**
|
|
4
15
|
* Executes project tests and returns results for agent analysis.
|
|
5
16
|
*/
|
|
6
17
|
export function handleRunTests(projectRoot, args) {
|
|
7
18
|
const language = getBackendLanguage(projectRoot);
|
|
8
19
|
const testCommand = args.command || getDefaultTestCommand(language);
|
|
20
|
+
// Validate command to prevent shell injection / chaining
|
|
21
|
+
const isAllowed = TEST_COMMAND_ALLOW_LIST.some(allowedCmd => testCommand.startsWith(allowedCmd));
|
|
22
|
+
if (!isAllowed) {
|
|
23
|
+
return {
|
|
24
|
+
isError: true,
|
|
25
|
+
content: [{ type: "text", text: `[ERROR] Test command not allowed: "${testCommand}". Must start with one of: ${TEST_COMMAND_ALLOW_LIST.join(", ")}` }]
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (/[;&|><$`\n\r]/.test(testCommand)) {
|
|
29
|
+
return {
|
|
30
|
+
isError: true,
|
|
31
|
+
content: [{ type: "text", text: "[ERROR] Test command rejected: Shell metacharacters are forbidden to prevent command injection." }]
|
|
32
|
+
};
|
|
33
|
+
}
|
|
9
34
|
try {
|
|
10
35
|
const output = execSync(testCommand, { cwd: projectRoot, encoding: "utf8", stdio: "pipe" });
|
|
11
36
|
return {
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ATABEY MCP Tool — LLM Gateway Query
|
|
3
|
+
*
|
|
4
|
+
* Sends a chat completion request through the ATABEY LLM Gateway.
|
|
5
|
+
* The gateway automatically selects the best provider based on the
|
|
6
|
+
* configured load balancing strategy (failover, round-robin, cost-optimized, etc.)
|
|
7
|
+
*
|
|
8
|
+
* This tool allows ANY MCP-connected AI (Gemini CLI, Claude CLI, Cursor, Grok, etc.)
|
|
9
|
+
* to route LLM requests through the gateway to any supported provider.
|
|
10
|
+
*
|
|
11
|
+
* The gateway module is loaded dynamically from the project root at runtime,
|
|
12
|
+
* not at compile time (since it lives outside the MCP workspace).
|
|
13
|
+
*/
|
|
14
|
+
import path from "path";
|
|
15
|
+
/**
|
|
16
|
+
* Dynamically load the LLM Gateway from the project root.
|
|
17
|
+
* Falls back gracefully if the gateway module is not available.
|
|
18
|
+
*/
|
|
19
|
+
async function loadGateway(projectRoot) {
|
|
20
|
+
try {
|
|
21
|
+
const gatewayPath = path.join(projectRoot, "dist/src/modules/gateway/index.js");
|
|
22
|
+
const mod = await import(gatewayPath);
|
|
23
|
+
return mod.gateway;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
try {
|
|
27
|
+
// Fallback: try tsx resolution for development
|
|
28
|
+
const gatewayPath = path.join(projectRoot, "src/modules/gateway/index.ts");
|
|
29
|
+
const mod = await import(gatewayPath);
|
|
30
|
+
return mod.gateway;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Handle llm_gateway_query tool call.
|
|
39
|
+
* Routes the request through the LLM Gateway with load balancing.
|
|
40
|
+
*/
|
|
41
|
+
export async function handleLLMGatewayQuery(projectRoot, args) {
|
|
42
|
+
const startTime = Date.now();
|
|
43
|
+
try {
|
|
44
|
+
// Load gateway dynamically
|
|
45
|
+
const gateway = await loadGateway(projectRoot);
|
|
46
|
+
if (!gateway) {
|
|
47
|
+
return {
|
|
48
|
+
isError: true,
|
|
49
|
+
content: [
|
|
50
|
+
{
|
|
51
|
+
type: "text",
|
|
52
|
+
text: JSON.stringify({
|
|
53
|
+
success: false,
|
|
54
|
+
error: "LLM Gateway is not initialized. The project may need to be built first. " +
|
|
55
|
+
"Run: npm run build:core",
|
|
56
|
+
solution: "Gateway module not found at dist/src/modules/gateway/index.js. " +
|
|
57
|
+
"Ensure the main package is built and ATABEY_PROJECT_ROOT is set correctly.",
|
|
58
|
+
}, null, 2),
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// Build gateway request
|
|
64
|
+
const gatewayRequest = {
|
|
65
|
+
messages: args.messages.map(m => ({
|
|
66
|
+
role: m.role,
|
|
67
|
+
content: m.content,
|
|
68
|
+
})),
|
|
69
|
+
system: args.system,
|
|
70
|
+
model: args.model,
|
|
71
|
+
temperature: args.temperature ?? 0.7,
|
|
72
|
+
maxTokens: args.maxTokens ?? 4096,
|
|
73
|
+
traceId: args.traceId || `MCP-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`,
|
|
74
|
+
};
|
|
75
|
+
// Provider override
|
|
76
|
+
if (args.provider) {
|
|
77
|
+
gatewayRequest.provider = args.provider;
|
|
78
|
+
}
|
|
79
|
+
// Strategy override
|
|
80
|
+
if (args.strategy) {
|
|
81
|
+
gatewayRequest.strategy = args.strategy;
|
|
82
|
+
}
|
|
83
|
+
// Send through gateway
|
|
84
|
+
const response = await gateway.chat(gatewayRequest);
|
|
85
|
+
const elapsed = Date.now() - startTime;
|
|
86
|
+
if (response.success) {
|
|
87
|
+
return {
|
|
88
|
+
content: [
|
|
89
|
+
{
|
|
90
|
+
type: "text",
|
|
91
|
+
text: JSON.stringify({
|
|
92
|
+
success: true,
|
|
93
|
+
content: response.content,
|
|
94
|
+
provider: response.provider,
|
|
95
|
+
model: response.model,
|
|
96
|
+
usage: response.usage,
|
|
97
|
+
latencyMs: response.latencyMs,
|
|
98
|
+
cost: response.cost,
|
|
99
|
+
traceId: response.traceId,
|
|
100
|
+
elapsed,
|
|
101
|
+
}, null, 2),
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
isError: true,
|
|
108
|
+
content: [
|
|
109
|
+
{
|
|
110
|
+
type: "text",
|
|
111
|
+
text: JSON.stringify({
|
|
112
|
+
success: false,
|
|
113
|
+
error: response.content,
|
|
114
|
+
provider: response.provider,
|
|
115
|
+
traceId: response.traceId,
|
|
116
|
+
elapsed,
|
|
117
|
+
}, null, 2),
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
return {
|
|
124
|
+
isError: true,
|
|
125
|
+
content: [
|
|
126
|
+
{
|
|
127
|
+
type: "text",
|
|
128
|
+
text: JSON.stringify({
|
|
129
|
+
success: false,
|
|
130
|
+
error: `Gateway query failed: ${error.message}`,
|
|
131
|
+
elapsed: Date.now() - startTime,
|
|
132
|
+
}, null, 2),
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ATABEY MCP Tool — LLM Gateway Status
|
|
3
|
+
*
|
|
4
|
+
* Returns the current status of the LLM Gateway, including provider health,
|
|
5
|
+
* current load balancing strategy, usage statistics, and budget info.
|
|
6
|
+
*
|
|
7
|
+
* Useful for monitoring and debugging gateway behavior without CLI access.
|
|
8
|
+
*/
|
|
9
|
+
import path from "path";
|
|
10
|
+
/**
|
|
11
|
+
* Dynamically load the LLM Gateway from the project root.
|
|
12
|
+
*/
|
|
13
|
+
async function loadGateway(projectRoot) {
|
|
14
|
+
try {
|
|
15
|
+
const gatewayPath = path.join(projectRoot, "dist/src/modules/gateway/index.js");
|
|
16
|
+
const mod = await import(gatewayPath);
|
|
17
|
+
return mod.gateway;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
try {
|
|
21
|
+
const gatewayPath = path.join(projectRoot, "src/modules/gateway/index.ts");
|
|
22
|
+
const mod = await import(gatewayPath);
|
|
23
|
+
return mod.gateway;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Handle llm_gateway_status tool call.
|
|
32
|
+
*/
|
|
33
|
+
export async function handleLLMGatewayStatus(projectRoot, args) {
|
|
34
|
+
const detail = args.detail || "overview";
|
|
35
|
+
try {
|
|
36
|
+
const gateway = await loadGateway(projectRoot);
|
|
37
|
+
if (!gateway) {
|
|
38
|
+
return {
|
|
39
|
+
content: [
|
|
40
|
+
{
|
|
41
|
+
type: "text",
|
|
42
|
+
text: JSON.stringify({
|
|
43
|
+
status: "unavailable",
|
|
44
|
+
message: "LLM Gateway is not initialized. " +
|
|
45
|
+
"Build the project first with: npm run build:core",
|
|
46
|
+
}, null, 2),
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const result = {
|
|
52
|
+
status: "active",
|
|
53
|
+
strategy: gateway.loadBalancer.getStrategy(),
|
|
54
|
+
};
|
|
55
|
+
if (detail === "providers" || detail === "overview") {
|
|
56
|
+
result.providers = gateway.getProviderHealth();
|
|
57
|
+
}
|
|
58
|
+
if (detail === "stats" || detail === "overview") {
|
|
59
|
+
result.stats = gateway.getStats();
|
|
60
|
+
}
|
|
61
|
+
if (detail === "overview" || detail === "stats") {
|
|
62
|
+
const budget = gateway.costTracker.getBudgetStatus();
|
|
63
|
+
if (budget) {
|
|
64
|
+
result.budget = budget;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
content: [
|
|
69
|
+
{
|
|
70
|
+
type: "text",
|
|
71
|
+
text: JSON.stringify(result, null, 2),
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
return {
|
|
78
|
+
isError: true,
|
|
79
|
+
content: [
|
|
80
|
+
{
|
|
81
|
+
type: "text",
|
|
82
|
+
text: JSON.stringify({
|
|
83
|
+
status: "error",
|
|
84
|
+
error: `Failed to get gateway status: ${error.message}`,
|
|
85
|
+
}, null, 2),
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -1,35 +1,39 @@
|
|
|
1
|
+
import { handleMaskPII } from "./compliance/mask_pii.js";
|
|
2
|
+
import { handleAcquireLock, handleReleaseLock } from "./control_plane/locking.js";
|
|
3
|
+
import { handleRegisterAgent } from "./control_plane/registry.js";
|
|
1
4
|
import { TOOLS } from "./definitions.js";
|
|
2
|
-
import { handleReadFile } from "./file_system/read_file.js";
|
|
3
|
-
import { handleWriteFile } from "./file_system/write_file.js";
|
|
4
|
-
import { handleReplaceText } from "./file_system/replace_text.js";
|
|
5
5
|
import { handleBatchSurgicalEdit } from "./file_system/batch_surgical_edit.js";
|
|
6
6
|
import { handlePatchFile } from "./file_system/patch_file.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { handleGetProjectMap } from "./search/get_map.js";
|
|
11
|
-
import { handleGetFrameworkStatus } from "./framework/get_status.js";
|
|
12
|
-
import { handleUpdateProjectMemory } from "./framework/update_memory.js";
|
|
7
|
+
import { handleReadFile } from "./file_system/read_file.js";
|
|
8
|
+
import { handleReplaceText } from "./file_system/replace_text.js";
|
|
9
|
+
import { handleWriteFile } from "./file_system/write_file.js";
|
|
13
10
|
import { handleAuditDependencies } from "./framework/audit_deps.js";
|
|
14
|
-
import {
|
|
15
|
-
import { handleGetSystemHealth } from "./observability/get_health.js";
|
|
16
|
-
import { handleCheckPorts } from "./observability/check_ports.js";
|
|
11
|
+
import { handleGetFrameworkStatus } from "./framework/get_status.js";
|
|
17
12
|
import { handleOrchestrateLoop } from "./framework/orchestrate.js";
|
|
13
|
+
import { handleRunTests } from "./framework/run_tests.js";
|
|
18
14
|
import { handleSubmitPlan } from "./framework/submit_plan.js";
|
|
19
15
|
import { handleUpdateContractHash } from "./framework/update_contract_hash.js";
|
|
20
|
-
import {
|
|
16
|
+
import { handleUpdateProjectMemory } from "./framework/update_memory.js";
|
|
17
|
+
import { handleDeleteKnowledge } from "./memory/delete_knowledge.js";
|
|
21
18
|
import { handleGetMemoryInsights } from "./memory/get_insights.js";
|
|
22
|
-
import {
|
|
19
|
+
import { handleReadProjectMemory } from "./memory/read_memory.js";
|
|
23
20
|
import { handleSearchKnowledge } from "./memory/search_knowledge.js";
|
|
24
|
-
import {
|
|
25
|
-
import { handleSendAgentMessage } from "./messaging/send_message.js";
|
|
26
|
-
import { handleLogAgentAction } from "./messaging/log_action.js";
|
|
21
|
+
import { handleStoreKnowledge } from "./memory/store_knowledge.js";
|
|
27
22
|
import { handleAskHuman } from "./messaging/ask_human.js";
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
23
|
+
import { handleApproveOperation } from "./messaging/approve_operation.js";
|
|
24
|
+
import { handleLogAgentAction } from "./messaging/log_action.js";
|
|
25
|
+
import { handleSendAgentMessage } from "./messaging/send_message.js";
|
|
26
|
+
import { handleCheckPorts } from "./observability/check_ports.js";
|
|
27
|
+
import { handleGetSystemHealth } from "./observability/get_health.js";
|
|
28
|
+
import { handleAnalyzeCodeQuality } from "./quality/analyze_code_quality.js";
|
|
29
|
+
import { handleCheckArchitectureCompliance } from "./quality/check_architecture_compliance.js";
|
|
31
30
|
import { handleCheckLint } from "./quality/check_lint.js";
|
|
32
31
|
import * as schemas from "./schemas.js";
|
|
32
|
+
import { handleGetProjectGaps } from "./search/get_gaps.js";
|
|
33
|
+
import { handleGetProjectMap } from "./search/get_map.js";
|
|
34
|
+
import { handleGrepSearch } from "./search/grep_search.js";
|
|
35
|
+
import { handleListDir } from "./search/list_dir.js";
|
|
36
|
+
import { handleRunCommand } from "./shell/run_command.js";
|
|
33
37
|
// Map of tool names to their handler functions
|
|
34
38
|
const bind = (fn) => {
|
|
35
39
|
return (root, args) => fn(root, args);
|
|
@@ -61,12 +65,16 @@ export const toolHandlers = {
|
|
|
61
65
|
send_agent_message: bind(handleSendAgentMessage),
|
|
62
66
|
log_agent_action: bind(handleLogAgentAction),
|
|
63
67
|
ask_human: bind(handleAskHuman),
|
|
68
|
+
approve_operation: bind(handleApproveOperation),
|
|
64
69
|
update_contract_hash: bind(handleUpdateContractHash),
|
|
65
70
|
acquire_lock: bind(handleAcquireLock),
|
|
66
71
|
release_lock: bind(handleReleaseLock),
|
|
67
72
|
register_agent: bind(handleRegisterAgent),
|
|
68
73
|
run_shell_command: bind(handleRunCommand),
|
|
69
74
|
check_lint: bind(handleCheckLint),
|
|
75
|
+
analyze_code_quality: bind(handleAnalyzeCodeQuality),
|
|
76
|
+
check_architecture_compliance: bind(handleCheckArchitectureCompliance),
|
|
77
|
+
mask_pii: bind(handleMaskPII),
|
|
70
78
|
};
|
|
71
79
|
// Map of tool names to their Zod validation schemas
|
|
72
80
|
export const toolSchemas = {
|
|
@@ -107,5 +115,11 @@ export const toolSchemas = {
|
|
|
107
115
|
send_agent_message: schemas.SendAgentMessageSchema,
|
|
108
116
|
log_agent_action: schemas.LogAgentActionSchema,
|
|
109
117
|
ask_human: schemas.AskHumanSchema,
|
|
118
|
+
approve_operation: schemas.ApproveOperationSchema,
|
|
119
|
+
// Code Quality
|
|
120
|
+
analyze_code_quality: schemas.AnalyzeCodeQualitySchema,
|
|
121
|
+
check_architecture_compliance: schemas.CheckArchitectureComplianceSchema,
|
|
122
|
+
// PII / Compliance
|
|
123
|
+
mask_pii: schemas.MaskPIISchema,
|
|
110
124
|
};
|
|
111
125
|
export { TOOLS };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { approveOperation, rejectOperation, getPendingApprovals } from "../../utils/human-in-loop.js";
|
|
2
|
+
/**
|
|
3
|
+
* ─── APPROVE OPERATION — In-Chat Risk Gate ──────────────────────────
|
|
4
|
+
*
|
|
5
|
+
* AI CLI kullanımında "atabey approve <traceId>" CLI komutu çalıştırmak mümkün
|
|
6
|
+
* değildir — chat'e yazılan şey CLI komutu olarak değil mesaj olarak işlenir.
|
|
7
|
+
*
|
|
8
|
+
* Bu tool, risk gate approval flow'unu doğrudan MCP tool çağrısına taşır:
|
|
9
|
+
*
|
|
10
|
+
* 1. Atabey yüksek riskli bir operasyonu bloklar
|
|
11
|
+
* 2. Geliştiriciye: "approve_operation tool'unu çağır" der
|
|
12
|
+
* 3. AI bu tool'u çağırır → operasyon onaylanır/reddedilir
|
|
13
|
+
*
|
|
14
|
+
* Geliştirici terminale geçmek zorunda kalmaz.
|
|
15
|
+
*/
|
|
16
|
+
export async function handleApproveOperation(_root, args) {
|
|
17
|
+
const { action, traceId, reason } = args;
|
|
18
|
+
// LIST: Bekleyen approval'ları göster
|
|
19
|
+
if (action === "list") {
|
|
20
|
+
const pending = getPendingApprovals();
|
|
21
|
+
if (pending.length === 0) {
|
|
22
|
+
return {
|
|
23
|
+
content: [{ type: "text", text: "[APPROVALS] No pending operations waiting for approval." }],
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const lines = [
|
|
27
|
+
`[APPROVALS] ${pending.length} pending operation(s):\n`,
|
|
28
|
+
...pending.map(req => [
|
|
29
|
+
" ─────────────────────────────────────",
|
|
30
|
+
` Trace ID: ${req.traceId}`,
|
|
31
|
+
` Tool: ${req.toolName}`,
|
|
32
|
+
` Agent: ${req.agent}`,
|
|
33
|
+
` Risk Score: ${req.riskScore}/100 (${req.riskLevel})`,
|
|
34
|
+
` Reason: ${req.reason}`,
|
|
35
|
+
` Expires: ${new Date(req.expiresAt).toISOString()}`,
|
|
36
|
+
].join("\n")),
|
|
37
|
+
"",
|
|
38
|
+
"To approve: call approve_operation with action=\"approve\" and traceId=\"<id>\"",
|
|
39
|
+
"To reject: call approve_operation with action=\"reject\" and traceId=\"<id>\"",
|
|
40
|
+
];
|
|
41
|
+
return {
|
|
42
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// APPROVE or REJECT: traceId zorunlu
|
|
46
|
+
if (!traceId) {
|
|
47
|
+
return {
|
|
48
|
+
isError: true,
|
|
49
|
+
content: [{ type: "text", text: `[ERROR] traceId is required for "${action}" action.` }],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (action === "approve") {
|
|
53
|
+
const result = approveOperation(traceId);
|
|
54
|
+
return {
|
|
55
|
+
content: [{
|
|
56
|
+
type: "text",
|
|
57
|
+
text: result.success
|
|
58
|
+
? `[APPROVED] ✅ ${result.message}\nYou may retry the blocked operation now.`
|
|
59
|
+
: `[ERROR] ${result.message}`,
|
|
60
|
+
}],
|
|
61
|
+
isError: !result.success,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (action === "reject") {
|
|
65
|
+
const result = rejectOperation(traceId);
|
|
66
|
+
return {
|
|
67
|
+
content: [{
|
|
68
|
+
type: "text",
|
|
69
|
+
text: result.success
|
|
70
|
+
? `[REJECTED] ⛔ ${result.message}${reason ? `\nReason: ${reason}` : ""}`
|
|
71
|
+
: `[ERROR] ${result.message}`,
|
|
72
|
+
}],
|
|
73
|
+
isError: !result.success,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
isError: true,
|
|
78
|
+
content: [{ type: "text", text: `[ERROR] Unknown action: "${String(action)}". Use "approve", "reject", or "list".` }],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
@@ -1,30 +1,99 @@
|
|
|
1
|
-
import
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
/**
|
|
4
|
+
* ─── ASK HUMAN — File Bridge ─────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* AI CLI'lar (Claude Code, Gemini CLI) MCP server'ı stdio subprocess olarak
|
|
7
|
+
* başlatır. Bu subprocess'te stdin isTTY=false olur (MCP JSON-RPC için kullanılır).
|
|
8
|
+
*
|
|
9
|
+
* Çözüm: File-based Q&A bridge.
|
|
10
|
+
* 1. Soru → .atabey/hitl/question.txt dosyasına yazılır
|
|
11
|
+
* 2. Geliştirici `atabey hitl` komutuyla cevap girer
|
|
12
|
+
* 3. Cevap → .atabey/hitl/answer.txt dosyasına yazılır
|
|
13
|
+
* 4. Bu handler cevabı okur ve AI'ya döner
|
|
14
|
+
*
|
|
15
|
+
* Dashboard: /api/approvals endpoint'i üzerinden web dashboard'dan da cevaplanabilir.
|
|
16
|
+
*/
|
|
2
17
|
export async function handleAskHuman(root, args) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
18
|
+
const timeoutSeconds = args.timeoutSeconds ?? 120;
|
|
19
|
+
const hitlDir = path.join(root, ".atabey", "hitl");
|
|
20
|
+
const questionFile = path.join(hitlDir, "question.txt");
|
|
21
|
+
const answerFile = path.join(hitlDir, "answer.txt");
|
|
6
22
|
try {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
23
|
+
// Ensure hitl directory exists
|
|
24
|
+
fs.mkdirSync(hitlDir, { recursive: true });
|
|
25
|
+
// Clear any stale answer file
|
|
26
|
+
if (fs.existsSync(answerFile)) {
|
|
27
|
+
fs.unlinkSync(answerFile);
|
|
28
|
+
}
|
|
29
|
+
// Write the question with metadata
|
|
30
|
+
const questionPayload = JSON.stringify({
|
|
31
|
+
timestamp: new Date().toISOString(),
|
|
32
|
+
question: args.question,
|
|
33
|
+
timeoutAt: new Date(Date.now() + timeoutSeconds * 1000).toISOString(),
|
|
34
|
+
}, null, 2);
|
|
35
|
+
fs.writeFileSync(questionFile, questionPayload);
|
|
36
|
+
// Write human-readable prompt file alongside
|
|
37
|
+
fs.writeFileSync(path.join(hitlDir, "PENDING.txt"), [
|
|
38
|
+
"═══════════════════════════════════════════════════",
|
|
39
|
+
" [ATABEY] AGENT WAITING FOR YOUR ANSWER",
|
|
40
|
+
"═══════════════════════════════════════════════════",
|
|
41
|
+
"",
|
|
42
|
+
`QUESTION: ${args.question}`,
|
|
43
|
+
"",
|
|
44
|
+
"To answer, run in your terminal:",
|
|
45
|
+
" atabey hitl answer \"your answer here\"",
|
|
46
|
+
"",
|
|
47
|
+
"Or use the dashboard: http://localhost:5858",
|
|
48
|
+
"═══════════════════════════════════════════════════",
|
|
49
|
+
].join("\n"));
|
|
50
|
+
process.stderr.write(`[HITL] Question written to ${questionFile}\n`);
|
|
51
|
+
process.stderr.write("[HITL] Run: atabey hitl answer \"your answer\"\n");
|
|
52
|
+
// Poll for answer file
|
|
53
|
+
const pollIntervalMs = 1000;
|
|
54
|
+
const maxAttempts = timeoutSeconds;
|
|
55
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
56
|
+
await new Promise(resolve => setTimeout(resolve, pollIntervalMs));
|
|
57
|
+
if (fs.existsSync(answerFile)) {
|
|
58
|
+
const answer = fs.readFileSync(answerFile, "utf8").trim();
|
|
59
|
+
// Clean up
|
|
60
|
+
try {
|
|
61
|
+
fs.unlinkSync(questionFile);
|
|
62
|
+
fs.unlinkSync(answerFile);
|
|
63
|
+
const pendingFile = path.join(hitlDir, "PENDING.txt");
|
|
64
|
+
if (fs.existsSync(pendingFile))
|
|
65
|
+
fs.unlinkSync(pendingFile);
|
|
66
|
+
}
|
|
67
|
+
catch { /* cleanup is best-effort */ }
|
|
68
|
+
process.stderr.write("[HITL] Answer received.\n");
|
|
69
|
+
return {
|
|
70
|
+
content: [{ type: "text", text: `[HUMAN RESPONSE] ${answer}` }],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Timeout — clean up question file
|
|
75
|
+
try {
|
|
76
|
+
if (fs.existsSync(questionFile))
|
|
77
|
+
fs.unlinkSync(questionFile);
|
|
78
|
+
const pendingFile = path.join(hitlDir, "PENDING.txt");
|
|
79
|
+
if (fs.existsSync(pendingFile))
|
|
80
|
+
fs.unlinkSync(pendingFile);
|
|
81
|
+
}
|
|
82
|
+
catch { /* cleanup is best-effort */ }
|
|
83
|
+
return {
|
|
84
|
+
content: [{
|
|
85
|
+
type: "text",
|
|
86
|
+
text: `[HITL TIMEOUT] No answer received within ${timeoutSeconds}s.\n` +
|
|
87
|
+
`Question was: "${args.question}"\n` +
|
|
88
|
+
"To answer pending questions, run: atabey hitl answer \"your answer\"",
|
|
89
|
+
}],
|
|
90
|
+
};
|
|
22
91
|
}
|
|
23
92
|
catch (error) {
|
|
24
93
|
const message = error instanceof Error ? error.message : String(error);
|
|
25
94
|
return {
|
|
26
95
|
isError: true,
|
|
27
|
-
content: [{ type: "text", text: `[ERROR]
|
|
96
|
+
content: [{ type: "text", text: `[ERROR] ask_human failed: ${message}` }],
|
|
28
97
|
};
|
|
29
98
|
}
|
|
30
99
|
}
|
|
@@ -3,7 +3,9 @@ import { execSync } from "child_process";
|
|
|
3
3
|
* Checks for active network ports and their status.
|
|
4
4
|
*/
|
|
5
5
|
export function handleCheckPorts(projectRoot, args) {
|
|
6
|
-
const
|
|
6
|
+
const rawFilter = args.filter || "";
|
|
7
|
+
// Sanitize filter to prevent command injection (allow only alphanumeric, dots, colons, dashes, underscores)
|
|
8
|
+
const filter = rawFilter.replace(/[^a-zA-Z0-9.:_-]/g, "");
|
|
7
9
|
try {
|
|
8
10
|
// Using 'lsof -i -P -n' to list open files and network connections
|
|
9
11
|
// Note: may require permissions or behave differently on non-Unix systems
|