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
package/dist/src/shared/pii.js
CHANGED
|
@@ -2,46 +2,79 @@
|
|
|
2
2
|
* [PII] Personally Identifiable Information Masking Service
|
|
3
3
|
*
|
|
4
4
|
* Detects and masks sensitive data in compliance with KVKK/GDPR.
|
|
5
|
-
* Used in audit log, logger, and
|
|
5
|
+
* Used in audit log, logger, storage layers, and MCP middleware.
|
|
6
6
|
*
|
|
7
7
|
* Supported patterns:
|
|
8
8
|
* - Email addresses
|
|
9
|
-
* - Phone numbers
|
|
10
|
-
* - TC Identification number
|
|
11
|
-
* - API keys / tokens
|
|
12
|
-
* -
|
|
13
|
-
* -
|
|
14
|
-
* -
|
|
9
|
+
* - Phone numbers (international, Turkish, US, UK)
|
|
10
|
+
* - TC Identification number (11 digits)
|
|
11
|
+
* - API keys / tokens (OpenAI, Anthropic, Google, GitHub, generic)
|
|
12
|
+
* - Bearer tokens / JWTs
|
|
13
|
+
* - IP addresses (IPv4, IPv6)
|
|
14
|
+
* - Credit card numbers (AMEX, Visa, Mastercard, etc.)
|
|
15
|
+
* - Password / secret fields in structured data
|
|
16
|
+
* - Bank account / IBAN
|
|
17
|
+
* - Date of birth / full address patterns
|
|
18
|
+
* - Custom names (configurable)
|
|
15
19
|
*/
|
|
16
20
|
// Sensitive patterns to detect and mask
|
|
21
|
+
// IMPORTANT: More specific patterns MUST come before generic ones
|
|
17
22
|
const SENSITIVE_PATTERNS = [
|
|
23
|
+
// JWT tokens (complete JWT format) - must be before Bearer
|
|
24
|
+
{ pattern: /eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g, replacement: "***-JWT-REDACTED-***" },
|
|
25
|
+
// Bearer tokens in Authorization headers
|
|
26
|
+
{ pattern: /Bearer\s+[a-zA-Z0-9._-]+/g, replacement: "Bearer ***-REDACTED-***" },
|
|
27
|
+
// Basic auth in Authorization headers
|
|
28
|
+
{ pattern: /Basic\s+[a-zA-Z0-9=+/]+/g, replacement: "Basic ***-REDACTED-***" },
|
|
29
|
+
// API keys (common formats) - must be before generic patterns
|
|
30
|
+
// Note: ghp_ tokens can contain digits that look like phone numbers, so we mask the entire prefix + suffix
|
|
31
|
+
{ pattern: /\b(sk-[a-zA-Z0-9]{20,}|pk-[a-zA-Z0-9]{20,}|xai-[a-zA-Z0-9]{20,}|AIza[0-9A-Za-z_-]{35}|ghp_[a-zA-Z0-9]{36,}|gho_[a-zA-Z0-9]{36,}|ghu_[a-zA-Z0-9]{36,}|ghb_[a-zA-Z0-9]{36,}|github_pat_[a-zA-Z0-9]{36,}|sk-[a-zA-Z0-9_-]{32,}|sk-[a-zA-Z0-9]{48,}|whsec_[a-zA-Z0-9]{16,})\b/g, replacement: "***-REDACTED-***" },
|
|
32
|
+
// Social Security Number (US SSN: XXX-XX-XXXX) - must be before generic phone
|
|
33
|
+
{ pattern: /\b(?!000|666|9[0-9]{2})\d{3}-(?!00)\d{2}-(?!0000)\d{4}\b/g, replacement: "***-**-****" },
|
|
34
|
+
// Date of birth patterns - must be before generic phone
|
|
35
|
+
{ pattern: /\b(0[1-9]|[12][0-9]|3[01])[/.-](0[1-9]|1[0-2])[/.-](19[0-9]{2}|20[0-9]{2})\b/g, replacement: "**/**/****" },
|
|
36
|
+
// IBAN (international bank account) - must be before generic alphanumeric patterns
|
|
37
|
+
// Only matches valid IBAN format: 2 letters + 2 digits + 4-30 alphanumeric chars
|
|
38
|
+
// More specific: requires minimum 8 chars total, starts with country code
|
|
39
|
+
{ pattern: /\b[A-Z]{2}[0-9]{2}[A-Z0-9]{4,30}\b/g, replacement: "****-IBAN-REDACTED-****" },
|
|
40
|
+
// TC Kimlik (11 digits starting with 1-9, isolated word boundary) - must be before phone
|
|
41
|
+
{ pattern: /\b[1-9][0-9]{10}\b/g, replacement: "***********" },
|
|
18
42
|
// Email
|
|
19
43
|
{ pattern: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g, replacement: "***@***" },
|
|
20
|
-
// Phone (
|
|
44
|
+
// Phone (Turkish: +90 5xx xxx xx xx) - specific before generic
|
|
21
45
|
{ pattern: /(\+90|0)?\s?[0-9]{3}\s?[0-9]{3}\s?[0-9]{2}\s?[0-9]{2}/g, replacement: "***-***-****" },
|
|
22
|
-
//
|
|
23
|
-
{ pattern:
|
|
24
|
-
//
|
|
25
|
-
{ pattern: /\b(sk-[a-zA-Z0-9]{20,}|pk-[a-zA-Z0-9]{20,}|xai-[a-zA-Z0-9]{20,}|AIza[0-9A-Za-z_-]{35}|ghp_[a-zA-Z0-9]{36,}|gho_[a-zA-Z0-9]{36,})\b/g, replacement: "***-REDACTED-***" },
|
|
26
|
-
// Bearer tokens in Authorization headers
|
|
27
|
-
{ pattern: /Bearer\s+[a-zA-Z0-9._-]+/g, replacement: "Bearer ***-REDACTED-***" },
|
|
28
|
-
// IP addresses
|
|
46
|
+
// Phone (international: +90, +1, +44, +49, +33, etc.) - generic, keep last among phones
|
|
47
|
+
{ pattern: /(\+\d{1,2}[\s-]?)?\(?\d{2,4}\)?[\s-]?\d{2,4}[\s-]?\d{2,4}[\s-]?\d{2,4}/g, replacement: "***-***-****" },
|
|
48
|
+
// IP addresses (IPv4)
|
|
29
49
|
{ pattern: /\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g, replacement: "***.***.***.***" },
|
|
50
|
+
// IP addresses (IPv6 - simplified)
|
|
51
|
+
{ pattern: /\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b/g, replacement: "****:****:****:****" },
|
|
52
|
+
// IPv6 compressed
|
|
53
|
+
{ pattern: /\b(?:[0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}\b/g, replacement: "****:****:****" },
|
|
30
54
|
// Credit card (16 digits, optional spaces/dashes)
|
|
31
55
|
{ pattern: /\b(?:\d[ -]*?){13,16}\b/g, replacement: "****-****-****-****" },
|
|
32
|
-
//
|
|
33
|
-
{ pattern:
|
|
56
|
+
// AMEX (15 digits, starts with 34/37)
|
|
57
|
+
{ pattern: /\b3[47][0-9\s-]{13,14}\b/g, replacement: "****-****-***" },
|
|
34
58
|
// Password fields in JSON
|
|
35
|
-
{ pattern: /"(password|passwd|secret|api_key|apiKey|apikey)"\s*:\s*"[^"]+"/gi, replacement: "\"$1\": \"***-REDACTED-***\"" },
|
|
59
|
+
{ pattern: /"(password|passwd|secret|api_key|apiKey|apikey|auth_token|refresh_token|access_token)"\s*:\s*"[^"]+"/gi, replacement: "\"$1\": \"***-REDACTED-***\"" },
|
|
60
|
+
// Turkish address patterns (optional - sokak, cadde, mahalle, no:)
|
|
61
|
+
{ pattern: /(?:no|no:|numara)[:\s]*\d+/gi, replacement: "no: ****" },
|
|
36
62
|
];
|
|
37
63
|
// Fields that are considered sensitive and should always be redacted in structured data
|
|
38
64
|
const SENSITIVE_FIELDS = [
|
|
39
65
|
"password", "passwd", "secret", "apiKey", "api_key", "apikey",
|
|
40
|
-
"token", "accessToken", "refreshToken", "authToken",
|
|
41
|
-
"authorization", "Authorization",
|
|
42
|
-
"email", "
|
|
43
|
-
"
|
|
44
|
-
"
|
|
66
|
+
"token", "accessToken", "access_token", "refreshToken", "refresh_token", "authToken", "auth_token",
|
|
67
|
+
"authorization", "Authorization", "bearer",
|
|
68
|
+
"email", "e_mail", "eMail",
|
|
69
|
+
"phone", "phoneNumber", "phone_number", "telephone", "telephoneNumber", "mobile", "mobilePhone", "cellPhone",
|
|
70
|
+
"creditCard", "credit_card", "ccNumber", "cc_number", "ccn", "cvv", "cvv2", "cvc",
|
|
71
|
+
"ssn", "socialSecurity", "social_security",
|
|
72
|
+
"tcKimlik", "tc_kimlik", "identityNumber", "identity_number", "idNumber", "id_number", "nationalId",
|
|
73
|
+
"ipAddress", "ip_address", "ip",
|
|
74
|
+
"dob", "dateOfBirth", "date_of_birth", "birthDate", "birth_date",
|
|
75
|
+
"iban", "IBAN", "bankAccount", "bank_account",
|
|
76
|
+
"address", "homeAddress", "workAddress", "billingAddress", "shippingAddress",
|
|
77
|
+
"fullName", "firstName", "lastName", "surname", "middleName",
|
|
45
78
|
];
|
|
46
79
|
/**
|
|
47
80
|
* Mask sensitive data in a text string.
|
|
@@ -58,8 +91,10 @@ export function maskText(text) {
|
|
|
58
91
|
/**
|
|
59
92
|
* Recursively mask sensitive fields in an object.
|
|
60
93
|
* Returns a new object with sensitive values redacted.
|
|
94
|
+
* Strict mode: when true, also masks values in objects even if the key
|
|
95
|
+
* is not a known sensitive field name (catches data passed to unknown schemas).
|
|
61
96
|
*/
|
|
62
|
-
export function maskObject(obj, depth = 0) {
|
|
97
|
+
export function maskObject(obj, depth = 0, strictMode = false) {
|
|
63
98
|
if (depth > 10)
|
|
64
99
|
return obj; // Prevent infinite recursion
|
|
65
100
|
if (obj === null || obj === undefined)
|
|
@@ -69,19 +104,19 @@ export function maskObject(obj, depth = 0) {
|
|
|
69
104
|
if (typeof obj !== "object")
|
|
70
105
|
return obj;
|
|
71
106
|
if (Array.isArray(obj)) {
|
|
72
|
-
return obj.map(item => maskObject(item, depth + 1));
|
|
107
|
+
return obj.map(item => maskObject(item, depth + 1, strictMode));
|
|
73
108
|
}
|
|
74
109
|
const result = {};
|
|
75
110
|
for (const [key, value] of Object.entries(obj)) {
|
|
76
111
|
// Check if the key itself is a sensitive field
|
|
77
112
|
if (SENSITIVE_FIELDS.includes(key)) {
|
|
78
|
-
result[key] = typeof value === "string" ? "***-REDACTED-***" : maskObject(value, depth + 1);
|
|
113
|
+
result[key] = typeof value === "string" ? "***-REDACTED-***" : maskObject(value, depth + 1, strictMode);
|
|
79
114
|
}
|
|
80
115
|
else if (typeof value === "string") {
|
|
81
116
|
result[key] = maskText(value);
|
|
82
117
|
}
|
|
83
118
|
else if (typeof value === "object") {
|
|
84
|
-
result[key] = maskObject(value, depth + 1);
|
|
119
|
+
result[key] = maskObject(value, depth + 1, strictMode);
|
|
85
120
|
}
|
|
86
121
|
else {
|
|
87
122
|
result[key] = value;
|
|
@@ -100,23 +135,79 @@ export function containsPII(text) {
|
|
|
100
135
|
}
|
|
101
136
|
return false;
|
|
102
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Check if an object contains PII in any of its string values (recursive).
|
|
140
|
+
*/
|
|
141
|
+
export function containsPIIInObject(obj, depth = 0) {
|
|
142
|
+
if (depth > 10)
|
|
143
|
+
return false;
|
|
144
|
+
if (obj === null || obj === undefined)
|
|
145
|
+
return false;
|
|
146
|
+
if (typeof obj === "string")
|
|
147
|
+
return containsPII(obj);
|
|
148
|
+
if (typeof obj !== "object")
|
|
149
|
+
return false;
|
|
150
|
+
if (Array.isArray(obj)) {
|
|
151
|
+
return obj.some(item => containsPIIInObject(item, depth + 1));
|
|
152
|
+
}
|
|
153
|
+
for (const [, value] of Object.entries(obj)) {
|
|
154
|
+
if (typeof value === "string") {
|
|
155
|
+
if (containsPII(value))
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
else if (typeof value === "object") {
|
|
159
|
+
if (containsPIIInObject(value, depth + 1))
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
103
165
|
/**
|
|
104
166
|
* Classify a piece of data based on content analysis.
|
|
105
167
|
*/
|
|
106
168
|
export function classifyData(text) {
|
|
107
169
|
if (!text)
|
|
108
170
|
return "public";
|
|
109
|
-
// Check for highly sensitive data
|
|
171
|
+
// Check for highly sensitive / critical data
|
|
110
172
|
if (/\b(sk-[a-zA-Z0-9]{20,}|Bearer\s+|eyJ[a-zA-Z0-9_-]+\.)/.test(text) ||
|
|
111
173
|
/\b[1-9][0-9]{10}\b/.test(text) ||
|
|
112
|
-
/"(password|secret|apiKey)"/i.test(text)
|
|
174
|
+
/"(password|secret|apiKey)"/i.test(text) ||
|
|
175
|
+
/\b[A-Z]{2}[0-9]{2}[A-Z0-9]{1,30}\b/.test(text) // IBAN
|
|
176
|
+
) {
|
|
113
177
|
return "restricted";
|
|
114
178
|
}
|
|
115
|
-
// Check for
|
|
179
|
+
// Check for personally identifiable / confidential data
|
|
116
180
|
if (/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/.test(text) ||
|
|
117
|
-
/(\+90|0)?\s?[0-9]{3}\s?[0-9]{3}\s?[0-9]{2}\s?[0-9]{2}/.test(text)
|
|
181
|
+
/(\+90|0)?\s?[0-9]{3}\s?[0-9]{3}\s?[0-9]{2}\s?[0-9]{2}/.test(text) ||
|
|
182
|
+
/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/.test(text) ||
|
|
183
|
+
/\b(0[1-9]|[12][0-9]|3[01])[/.-](0[1-9]|1[0-2])[/.-](19[0-9]{2}|20[0-9]{2})\b/.test(text)) {
|
|
118
184
|
return "confidential";
|
|
119
185
|
}
|
|
120
186
|
return "internal";
|
|
121
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* Mask the content field of an MCP tool result.
|
|
190
|
+
* This is used by the MCP middleware layer to automatically
|
|
191
|
+
* sanitize all tool outputs before they reach the AI.
|
|
192
|
+
*/
|
|
193
|
+
export function maskToolResult(result) {
|
|
194
|
+
if (!result || !result.content)
|
|
195
|
+
return result;
|
|
196
|
+
return {
|
|
197
|
+
...result,
|
|
198
|
+
content: result.content.map(block => ({
|
|
199
|
+
...block,
|
|
200
|
+
text: block.type === "text" ? maskText(block.text) : block.text,
|
|
201
|
+
})),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Mask sensitive arguments in an MCP tool call.
|
|
206
|
+
* This is applied BEFORE the tool handler executes, ensuring
|
|
207
|
+
* PII never reaches any processing layer unnecessarily.
|
|
208
|
+
*/
|
|
209
|
+
export function maskToolArgs(args) {
|
|
210
|
+
const masked = maskObject(args, 0, true);
|
|
211
|
+
return masked;
|
|
212
|
+
}
|
|
122
213
|
//# sourceMappingURL=pii.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pii.js","sourceRoot":"","sources":["../../../src/shared/pii.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pii.js","sourceRoot":"","sources":["../../../src/shared/pii.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,wCAAwC;AACxC,kEAAkE;AAClE,MAAM,kBAAkB,GAAG;IACvB,2DAA2D;IAC3D,EAAE,OAAO,EAAE,uDAAuD,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAEzG,yCAAyC;IACzC,EAAE,OAAO,EAAE,2BAA2B,EAAE,WAAW,EAAE,yBAAyB,EAAE;IAChF,sCAAsC;IACtC,EAAE,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,wBAAwB,EAAE;IAE9E,8DAA8D;IAC9D,2GAA2G;IAC3G,EAAE,OAAO,EAAE,4QAA4Q,EAAE,WAAW,EAAE,kBAAkB,EAAE;IAE1T,8EAA8E;IAC9E,EAAE,OAAO,EAAE,2DAA2D,EAAE,WAAW,EAAE,aAAa,EAAE;IAEpG,wDAAwD;IACxD,EAAE,OAAO,EAAE,+EAA+E,EAAE,WAAW,EAAE,YAAY,EAAE;IAEvH,mFAAmF;IACnF,iFAAiF;IACjF,0EAA0E;IAC1E,EAAE,OAAO,EAAE,qCAAqC,EAAE,WAAW,EAAE,yBAAyB,EAAE;IAE1F,yFAAyF;IACzF,EAAE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,aAAa,EAAE;IAE9D,QAAQ;IACR,EAAE,OAAO,EAAE,iDAAiD,EAAE,WAAW,EAAE,SAAS,EAAE;IAEtF,+DAA+D;IAC/D,EAAE,OAAO,EAAE,wDAAwD,EAAE,WAAW,EAAE,cAAc,EAAE;IAElG,wFAAwF;IACxF,EAAE,OAAO,EAAE,yEAAyE,EAAE,WAAW,EAAE,cAAc,EAAE;IAEnH,sBAAsB;IACtB,EAAE,OAAO,EAAE,oCAAoC,EAAE,WAAW,EAAE,iBAAiB,EAAE;IACjF,mCAAmC;IACnC,EAAE,OAAO,EAAE,+CAA+C,EAAE,WAAW,EAAE,qBAAqB,EAAE;IAChG,kBAAkB;IAClB,EAAE,OAAO,EAAE,iDAAiD,EAAE,WAAW,EAAE,gBAAgB,EAAE;IAE7F,kDAAkD;IAClD,EAAE,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,qBAAqB,EAAE;IAC3E,sCAAsC;IACtC,EAAE,OAAO,EAAE,2BAA2B,EAAE,WAAW,EAAE,eAAe,EAAE;IAEtE,0BAA0B;IAC1B,EAAE,OAAO,EAAE,wGAAwG,EAAE,WAAW,EAAE,8BAA8B,EAAE;IAElK,mEAAmE;IACnE,EAAE,OAAO,EAAE,8BAA8B,EAAE,WAAW,EAAE,UAAU,EAAE;CACvE,CAAC;AAEF,wFAAwF;AACxF,MAAM,gBAAgB,GAAG;IACrB,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;IAC7D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY;IAClG,eAAe,EAAE,eAAe,EAAE,QAAQ;IAC1C,OAAO,EAAE,QAAQ,EAAE,OAAO;IAC1B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW;IAC5G,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;IACjF,KAAK,EAAE,gBAAgB,EAAE,iBAAiB;IAC1C,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY;IACnG,WAAW,EAAE,YAAY,EAAE,IAAI;IAC/B,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY;IAChE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc;IAC7C,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB;IAC5E,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY;CAC/D,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACjC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEnD,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,kBAAkB,EAAE,CAAC;QACxD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,GAAY,EAAE,KAAK,GAAG,CAAC,EAAE,UAAU,GAAG,KAAK;IAClE,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,CAAC,6BAA6B;IACzD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAClD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAExC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;QACxE,+CAA+C;QAC/C,IAAI,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;QAC5G,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACxB,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACpC,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,kBAAkB,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAY,EAAE,KAAK,GAAG,CAAC;IACvD,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE1C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;QACrE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,WAAW,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;QACxC,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,IAAI,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC3D,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAOD;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAC;IAE3B,6CAA6C;IAC7C,IACI,uDAAuD,CAAC,IAAI,CAAC,IAAI,CAAC;QAClE,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC;QACxC,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO;MACzD,CAAC;QACC,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,wDAAwD;IACxD,IACI,gDAAgD,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3D,uDAAuD,CAAC,IAAI,CAAC,IAAI,CAAC;QAClE,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9C,8EAA8E,CAAC,IAAI,CAAC,IAAI,CAAC,EAC3F,CAAC;QACC,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAA0D;IACrF,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IAE9C,OAAO;QACH,GAAG,MAAM;QACT,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClC,GAAG,KAAK;YACR,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;SAClE,CAAC,CAAC;KACN,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAA6B;IACtD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAA4B,CAAC;IACpE,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -27,6 +27,7 @@ export interface TaskRow {
|
|
|
27
27
|
status: string;
|
|
28
28
|
priority: string;
|
|
29
29
|
dependencies: string[];
|
|
30
|
+
createdAt?: string;
|
|
30
31
|
}
|
|
31
32
|
export interface LogRow {
|
|
32
33
|
id?: LogID;
|
|
@@ -38,6 +39,49 @@ export interface LogRow {
|
|
|
38
39
|
summary: string;
|
|
39
40
|
findings?: string;
|
|
40
41
|
}
|
|
42
|
+
export interface CostDbRow {
|
|
43
|
+
id: number;
|
|
44
|
+
provider: string;
|
|
45
|
+
model: string;
|
|
46
|
+
input_tokens: number;
|
|
47
|
+
output_tokens: number;
|
|
48
|
+
cost: number;
|
|
49
|
+
timestamp: string;
|
|
50
|
+
trace_id: string | null;
|
|
51
|
+
}
|
|
52
|
+
export interface MessageDbRow {
|
|
53
|
+
id: number;
|
|
54
|
+
timestamp: string;
|
|
55
|
+
sender: string;
|
|
56
|
+
receiver: string;
|
|
57
|
+
category: string;
|
|
58
|
+
content: string;
|
|
59
|
+
trace_id: string;
|
|
60
|
+
parent_id: string | null;
|
|
61
|
+
status: string;
|
|
62
|
+
priority: string;
|
|
63
|
+
requires_approval: number;
|
|
64
|
+
}
|
|
65
|
+
export interface TaskDbRow {
|
|
66
|
+
id: string;
|
|
67
|
+
trace_id: string;
|
|
68
|
+
description: string;
|
|
69
|
+
agent: string;
|
|
70
|
+
status: string;
|
|
71
|
+
priority: string;
|
|
72
|
+
dependencies: string;
|
|
73
|
+
created_at: string;
|
|
74
|
+
}
|
|
75
|
+
export interface LogDbRow {
|
|
76
|
+
id: number;
|
|
77
|
+
timestamp: string;
|
|
78
|
+
agent: string;
|
|
79
|
+
action: string;
|
|
80
|
+
trace_id: string | null;
|
|
81
|
+
status: string;
|
|
82
|
+
summary: string;
|
|
83
|
+
findings: string | null;
|
|
84
|
+
}
|
|
41
85
|
/**
|
|
42
86
|
* [DB] Atabey Storage Engine
|
|
43
87
|
* Central SQLite database for enterprise-scale agent state management.
|
|
@@ -46,6 +90,24 @@ export declare class AtabeyStorage {
|
|
|
46
90
|
private static db;
|
|
47
91
|
static getDB(): Database.Database;
|
|
48
92
|
private static initializeSchema;
|
|
93
|
+
static saveCost(cost: {
|
|
94
|
+
provider: string;
|
|
95
|
+
model: string;
|
|
96
|
+
inputTokens: number;
|
|
97
|
+
outputTokens: number;
|
|
98
|
+
cost: number;
|
|
99
|
+
timestamp: string;
|
|
100
|
+
traceId?: string;
|
|
101
|
+
}): void;
|
|
102
|
+
static getAllCosts(): Array<{
|
|
103
|
+
provider: string;
|
|
104
|
+
model: string;
|
|
105
|
+
inputTokens: number;
|
|
106
|
+
outputTokens: number;
|
|
107
|
+
cost: number;
|
|
108
|
+
timestamp: string;
|
|
109
|
+
traceId?: string;
|
|
110
|
+
}>;
|
|
49
111
|
static updateAgentStatus(name: string, state: string, task: string, lastUpdated?: string): void;
|
|
50
112
|
static getAllAgents(): AgentRow[];
|
|
51
113
|
static saveMessage(msg: MessageRow): void;
|
|
@@ -3,6 +3,7 @@ import fs from "fs";
|
|
|
3
3
|
import path from "path";
|
|
4
4
|
import { getFrameworkDir } from "../cli/utils/memory.js";
|
|
5
5
|
import { logger } from "./logger.js";
|
|
6
|
+
import { maskText } from "./pii.js";
|
|
6
7
|
import { asAgentID, asLogID, asMessageID, asTaskID } from "./types.js";
|
|
7
8
|
/**
|
|
8
9
|
* [DB] Atabey Storage Engine
|
|
@@ -17,7 +18,8 @@ export class AtabeyStorage {
|
|
|
17
18
|
fs.mkdirSync(frameworkDir, { recursive: true });
|
|
18
19
|
}
|
|
19
20
|
const dbPath = path.join(frameworkDir, "atabey.db");
|
|
20
|
-
this.db = new Database(dbPath);
|
|
21
|
+
this.db = new Database(dbPath, { timeout: 5000 });
|
|
22
|
+
this.db.pragma("journal_mode = WAL");
|
|
21
23
|
this.initializeSchema();
|
|
22
24
|
}
|
|
23
25
|
return this.db;
|
|
@@ -82,12 +84,47 @@ export class AtabeyStorage {
|
|
|
82
84
|
value TEXT
|
|
83
85
|
)
|
|
84
86
|
`);
|
|
87
|
+
// Costs Table
|
|
88
|
+
db.exec(`
|
|
89
|
+
CREATE TABLE IF NOT EXISTS costs (
|
|
90
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
91
|
+
provider TEXT,
|
|
92
|
+
model TEXT,
|
|
93
|
+
input_tokens INTEGER,
|
|
94
|
+
output_tokens INTEGER,
|
|
95
|
+
cost REAL,
|
|
96
|
+
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
97
|
+
trace_id TEXT
|
|
98
|
+
)
|
|
99
|
+
`);
|
|
100
|
+
}
|
|
101
|
+
// --- Cost Operations ---
|
|
102
|
+
static saveCost(cost) {
|
|
103
|
+
const db = this.getDB();
|
|
104
|
+
db.prepare(`
|
|
105
|
+
INSERT INTO costs (provider, model, input_tokens, output_tokens, cost, timestamp, trace_id)
|
|
106
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
107
|
+
`).run(cost.provider, cost.model, cost.inputTokens, cost.outputTokens, cost.cost, cost.timestamp, cost.traceId || null);
|
|
108
|
+
}
|
|
109
|
+
static getAllCosts() {
|
|
110
|
+
const rows = this.getDB().prepare("SELECT * FROM costs ORDER BY timestamp ASC").all();
|
|
111
|
+
return rows.map(r => ({
|
|
112
|
+
provider: r.provider,
|
|
113
|
+
model: r.model,
|
|
114
|
+
inputTokens: r.input_tokens,
|
|
115
|
+
outputTokens: r.output_tokens,
|
|
116
|
+
cost: r.cost,
|
|
117
|
+
timestamp: r.timestamp,
|
|
118
|
+
traceId: r.trace_id || undefined
|
|
119
|
+
}));
|
|
85
120
|
}
|
|
86
121
|
// --- Agent Operations ---
|
|
87
122
|
static updateAgentStatus(name, state, task, lastUpdated) {
|
|
88
123
|
const db = this.getDB();
|
|
89
124
|
const cleanName = name.replace("@", "");
|
|
90
125
|
const timestamp = lastUpdated || new Date().toISOString();
|
|
126
|
+
// [KVKK/GDPR] Mask PII in task description before storing
|
|
127
|
+
const maskedTask = maskText(task);
|
|
91
128
|
db.prepare(`
|
|
92
129
|
INSERT INTO agents (name, state, task, last_updated)
|
|
93
130
|
VALUES (?, ?, ?, ?)
|
|
@@ -95,7 +132,7 @@ export class AtabeyStorage {
|
|
|
95
132
|
state = excluded.state,
|
|
96
133
|
task = excluded.task,
|
|
97
134
|
last_updated = excluded.last_updated
|
|
98
|
-
`).run(cleanName, state,
|
|
135
|
+
`).run(cleanName, state, maskedTask, timestamp);
|
|
99
136
|
}
|
|
100
137
|
static getAllAgents() {
|
|
101
138
|
return this.getDB().prepare("SELECT * FROM agents").all();
|
|
@@ -103,10 +140,12 @@ export class AtabeyStorage {
|
|
|
103
140
|
// --- Message Operations ---
|
|
104
141
|
static saveMessage(msg) {
|
|
105
142
|
const db = this.getDB();
|
|
143
|
+
// [KVKK/GDPR] Mask PII in message content before storing
|
|
144
|
+
const maskedContent = maskText(msg.content);
|
|
106
145
|
db.prepare(`
|
|
107
146
|
INSERT INTO messages (sender, receiver, category, content, trace_id, parent_id, status, priority, requires_approval)
|
|
108
147
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
109
|
-
`).run(msg.from, msg.to, msg.category,
|
|
148
|
+
`).run(msg.from, msg.to, msg.category, maskedContent, msg.traceId, msg.parentId || null, msg.status || "PENDING", msg.priority || "NORMAL", msg.requiresApproval ? 1 : 0);
|
|
110
149
|
}
|
|
111
150
|
static getPendingMessages() {
|
|
112
151
|
const rows = this.getDB().prepare("SELECT * FROM messages WHERE status IN ('PENDING', 'APPROVED') ORDER BY priority DESC, timestamp ASC").all();
|
|
@@ -151,7 +190,6 @@ export class AtabeyStorage {
|
|
|
151
190
|
let deps = [];
|
|
152
191
|
try {
|
|
153
192
|
const parsed = JSON.parse(r.dependencies || "[]");
|
|
154
|
-
// Handle cases where dependencies might be double-stringified or are raw JSON strings
|
|
155
193
|
deps = Array.isArray(parsed) ? parsed : JSON.parse(parsed);
|
|
156
194
|
}
|
|
157
195
|
catch (err) {
|
|
@@ -164,7 +202,8 @@ export class AtabeyStorage {
|
|
|
164
202
|
agent: asAgentID(r.agent),
|
|
165
203
|
status: r.status,
|
|
166
204
|
priority: r.priority,
|
|
167
|
-
dependencies: deps
|
|
205
|
+
dependencies: deps,
|
|
206
|
+
createdAt: r.created_at
|
|
168
207
|
};
|
|
169
208
|
});
|
|
170
209
|
}
|
|
@@ -185,8 +224,9 @@ export class AtabeyStorage {
|
|
|
185
224
|
action: r.action,
|
|
186
225
|
trace_id: r.trace_id || undefined,
|
|
187
226
|
status: r.status,
|
|
188
|
-
|
|
189
|
-
|
|
227
|
+
// [KVKK/GDPR] Mask PII in log summaries before returning
|
|
228
|
+
summary: maskText(r.summary),
|
|
229
|
+
findings: r.findings ? maskText(r.findings) : undefined
|
|
190
230
|
}));
|
|
191
231
|
}
|
|
192
232
|
// --- Metadata Operations ---
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/shared/storage.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAA8C,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/shared/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { generateEmbedding, generateEmbeddings, isOpenAIEmbedding } from "../src/modules/memory/embedding.js";
|
|
3
|
+
describe("Embedding Service", () => {
|
|
4
|
+
const originalEnv = process.env;
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
process.env = { ...originalEnv };
|
|
7
|
+
vi.stubGlobal("fetch", vi.fn());
|
|
8
|
+
});
|
|
9
|
+
afterEach(() => {
|
|
10
|
+
process.env = originalEnv;
|
|
11
|
+
vi.unstubAllGlobals();
|
|
12
|
+
vi.restoreAllMocks();
|
|
13
|
+
});
|
|
14
|
+
it("should correctly identify OpenAI embeddings by dimension", () => {
|
|
15
|
+
const openAIVector = new Array(1536).fill(0.1);
|
|
16
|
+
const tfidfVector = new Array(384).fill(0.1);
|
|
17
|
+
const invalidVector = new Array(100).fill(0.1);
|
|
18
|
+
expect(isOpenAIEmbedding(openAIVector)).toBe(true);
|
|
19
|
+
expect(isOpenAIEmbedding(tfidfVector)).toBe(false);
|
|
20
|
+
expect(isOpenAIEmbedding(invalidVector)).toBe(false);
|
|
21
|
+
});
|
|
22
|
+
it("should fallback to TF-IDF (padded to 1536) when no API key is provided", async () => {
|
|
23
|
+
delete process.env.OPENAI_API_KEY;
|
|
24
|
+
const text = "sample query text";
|
|
25
|
+
const vector = await generateEmbedding(text);
|
|
26
|
+
expect(vector).toBeDefined();
|
|
27
|
+
expect(vector.length).toBe(1536);
|
|
28
|
+
// Padded part (dimensions 384 to 1535) should be all 0
|
|
29
|
+
const paddedPart = vector.slice(384);
|
|
30
|
+
expect(paddedPart.every(val => val === 0)).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
it("should use OpenAI API when API key is set and call succeeds", async () => {
|
|
33
|
+
process.env.OPENAI_API_KEY = "sk-test-key-12345";
|
|
34
|
+
const mockEmbedding = new Array(1536).fill(0.5);
|
|
35
|
+
const mockFetch = vi.mocked(fetch).mockResolvedValue({
|
|
36
|
+
ok: true,
|
|
37
|
+
status: 200,
|
|
38
|
+
json: async () => ({
|
|
39
|
+
data: [{ embedding: mockEmbedding }]
|
|
40
|
+
})
|
|
41
|
+
});
|
|
42
|
+
const vector = await generateEmbedding("hello world");
|
|
43
|
+
expect(mockFetch).toHaveBeenCalled();
|
|
44
|
+
expect(vector).toEqual(mockEmbedding);
|
|
45
|
+
});
|
|
46
|
+
it("should fallback to TF-IDF when OpenAI API call fails", async () => {
|
|
47
|
+
process.env.OPENAI_API_KEY = "sk-test-key-12345";
|
|
48
|
+
// Mock API failure
|
|
49
|
+
const mockFetch = vi.mocked(fetch).mockResolvedValue({
|
|
50
|
+
ok: false,
|
|
51
|
+
status: 500,
|
|
52
|
+
json: async () => ({ error: "Internal Server Error" })
|
|
53
|
+
});
|
|
54
|
+
const vector = await generateEmbedding("hello world");
|
|
55
|
+
expect(mockFetch).toHaveBeenCalled();
|
|
56
|
+
expect(vector.length).toBe(1536);
|
|
57
|
+
// Should have fallen back to TF-IDF (first 384 dimensions contain non-zero data, rest are 0)
|
|
58
|
+
const paddedPart = vector.slice(384);
|
|
59
|
+
expect(paddedPart.every(val => val === 0)).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
it("should support batch embedding generation", async () => {
|
|
62
|
+
process.env.OPENAI_API_KEY = "sk-test-key-12345";
|
|
63
|
+
const mockEmbeddings = [
|
|
64
|
+
new Array(1536).fill(0.1),
|
|
65
|
+
new Array(1536).fill(0.2)
|
|
66
|
+
];
|
|
67
|
+
const mockFetch = vi.mocked(fetch).mockResolvedValue({
|
|
68
|
+
ok: true,
|
|
69
|
+
status: 200,
|
|
70
|
+
json: async () => ({
|
|
71
|
+
data: [
|
|
72
|
+
{ embedding: mockEmbeddings[0] },
|
|
73
|
+
{ embedding: mockEmbeddings[1] }
|
|
74
|
+
]
|
|
75
|
+
})
|
|
76
|
+
});
|
|
77
|
+
const vectors = await generateEmbeddings(["doc1", "doc2"]);
|
|
78
|
+
expect(mockFetch).toHaveBeenCalled();
|
|
79
|
+
expect(vectors).toEqual(mockEmbeddings);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=embedding.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding.test.js","sourceRoot":"","sources":["../../tests/embedding.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import * as memoryUtils from "../../src/cli/utils/memory.js";
|
|
3
|
+
import { EvaluationEngine } from "../../src/modules/engines/evaluation-engine.js";
|
|
4
|
+
import * as fsUtils from "../../src/shared/fs.js";
|
|
5
|
+
// Mock fs to prevent real command execution
|
|
6
|
+
vi.mock("fs", () => ({
|
|
7
|
+
default: {
|
|
8
|
+
existsSync: vi.fn().mockReturnValue(false),
|
|
9
|
+
readFileSync: vi.fn().mockReturnValue(""),
|
|
10
|
+
writeFileSync: vi.fn(),
|
|
11
|
+
mkdirSync: vi.fn(),
|
|
12
|
+
readdirSync: vi.fn().mockReturnValue([]),
|
|
13
|
+
statSync: vi.fn(),
|
|
14
|
+
},
|
|
15
|
+
existsSync: vi.fn().mockReturnValue(false),
|
|
16
|
+
readFileSync: vi.fn().mockReturnValue(""),
|
|
17
|
+
writeFileSync: vi.fn(),
|
|
18
|
+
mkdirSync: vi.fn(),
|
|
19
|
+
readdirSync: vi.fn().mockReturnValue([]),
|
|
20
|
+
statSync: vi.fn(),
|
|
21
|
+
}));
|
|
22
|
+
describe("EvaluationEngine", () => {
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
vi.spyOn(memoryUtils, "getFrameworkDir").mockReturnValue("/tmp/test-atabey");
|
|
25
|
+
vi.spyOn(fsUtils, "ensureDir").mockImplementation(() => { });
|
|
26
|
+
vi.spyOn(fsUtils, "writeTextFile").mockImplementation(() => { });
|
|
27
|
+
vi.spyOn(fsUtils, "appendFile").mockImplementation(() => { });
|
|
28
|
+
vi.spyOn(fsUtils, "runCommandQuiet").mockImplementation(() => { });
|
|
29
|
+
});
|
|
30
|
+
describe("evaluateTask", () => {
|
|
31
|
+
it("should return an EvaluationResult with correct structure", () => {
|
|
32
|
+
const result = EvaluationEngine.evaluateTask("T-001", "@backend", 1000);
|
|
33
|
+
expect(result).toHaveProperty("traceId");
|
|
34
|
+
expect(result).toHaveProperty("agent");
|
|
35
|
+
expect(result).toHaveProperty("score");
|
|
36
|
+
expect(result).toHaveProperty("metrics");
|
|
37
|
+
expect(result).toHaveProperty("durationMs");
|
|
38
|
+
expect(result).toHaveProperty("timestamp");
|
|
39
|
+
});
|
|
40
|
+
it("should set agent name without @ prefix", () => {
|
|
41
|
+
const result = EvaluationEngine.evaluateTask("T-001", "@backend", 1000);
|
|
42
|
+
expect(result.agent).toBe("backend");
|
|
43
|
+
});
|
|
44
|
+
it("should return a score between 0 and 100", () => {
|
|
45
|
+
const result = EvaluationEngine.evaluateTask("T-001", "@backend", 1000);
|
|
46
|
+
expect(result.score).toBeGreaterThanOrEqual(0);
|
|
47
|
+
expect(result.score).toBeLessThanOrEqual(100);
|
|
48
|
+
});
|
|
49
|
+
it("should record durationMs correctly", () => {
|
|
50
|
+
const result = EvaluationEngine.evaluateTask("T-001", "@backend", 5000);
|
|
51
|
+
expect(result.durationMs).toBe(5000);
|
|
52
|
+
});
|
|
53
|
+
it("should have metrics object with all required fields", () => {
|
|
54
|
+
const result = EvaluationEngine.evaluateTask("T-001", "@backend", 1000);
|
|
55
|
+
expect(result.metrics).toHaveProperty("compilation");
|
|
56
|
+
expect(result.metrics).toHaveProperty("lint");
|
|
57
|
+
expect(result.metrics).toHaveProperty("tests");
|
|
58
|
+
expect(result.metrics).toHaveProperty("compliance");
|
|
59
|
+
});
|
|
60
|
+
it("should penalize long-running tasks", () => {
|
|
61
|
+
const fastResult = EvaluationEngine.evaluateTask("T-001", "@backend", 1000);
|
|
62
|
+
const slowResult = EvaluationEngine.evaluateTask("T-002", "@backend", 130000);
|
|
63
|
+
expect(slowResult.score).toBeLessThanOrEqual(fastResult.score);
|
|
64
|
+
});
|
|
65
|
+
it("should handle different agent names", () => {
|
|
66
|
+
const result = EvaluationEngine.evaluateTask("T-003", "@frontend", 2000);
|
|
67
|
+
expect(result.agent).toBe("frontend");
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=evaluation-engine.test.js.map
|