@itphx/synth-core 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +18 -0
- package/dictionaries/coding.en.yaml +20 -0
- package/dictionaries/coding.ru.yaml +22 -0
- package/dictionaries/coding.tools.yaml +12 -0
- package/dictionaries/enum.en.yaml +54 -0
- package/dictionaries/enum.ru.yaml +67 -0
- package/dictionaries/injection.en.yaml +51 -0
- package/dictionaries/injection.ru.yaml +51 -0
- package/dictionaries/intents.en.yaml +68 -0
- package/dictionaries/intents.ru.yaml +78 -0
- package/dictionaries/research.en.yaml +17 -0
- package/dictionaries/research.ru.yaml +17 -0
- package/dictionaries/small-talk.en.yaml +67 -0
- package/dictionaries/small-talk.ru.yaml +81 -0
- package/dist/auth/local.d.ts +29 -0
- package/dist/auth/local.d.ts.map +1 -0
- package/dist/auth/local.js +107 -0
- package/dist/auth/local.js.map +1 -0
- package/dist/auth/local.test.d.ts +2 -0
- package/dist/auth/local.test.d.ts.map +1 -0
- package/dist/auth/local.test.js +131 -0
- package/dist/auth/local.test.js.map +1 -0
- package/dist/debug.d.ts +36 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +171 -0
- package/dist/debug.js.map +1 -0
- package/dist/dictionaries/coding.en.yaml +20 -0
- package/dist/dictionaries/coding.ru.yaml +22 -0
- package/dist/dictionaries/coding.tools.yaml +12 -0
- package/dist/dictionaries/dictionaries/coding.en.yaml +20 -0
- package/dist/dictionaries/dictionaries/coding.ru.yaml +22 -0
- package/dist/dictionaries/dictionaries/coding.tools.yaml +12 -0
- package/dist/dictionaries/dictionaries/enum.en.yaml +54 -0
- package/dist/dictionaries/dictionaries/enum.ru.yaml +67 -0
- package/dist/dictionaries/dictionaries/injection.en.yaml +51 -0
- package/dist/dictionaries/dictionaries/injection.ru.yaml +51 -0
- package/dist/dictionaries/dictionaries/intents.en.yaml +68 -0
- package/dist/dictionaries/dictionaries/intents.ru.yaml +78 -0
- package/dist/dictionaries/dictionaries/research.en.yaml +17 -0
- package/dist/dictionaries/dictionaries/research.ru.yaml +17 -0
- package/dist/dictionaries/dictionaries/small-talk.en.yaml +67 -0
- package/dist/dictionaries/dictionaries/small-talk.ru.yaml +81 -0
- package/dist/dictionaries/enum.en.yaml +54 -0
- package/dist/dictionaries/enum.ru.yaml +67 -0
- package/dist/dictionaries/injection.en.yaml +51 -0
- package/dist/dictionaries/injection.ru.yaml +51 -0
- package/dist/dictionaries/intents.en.yaml +68 -0
- package/dist/dictionaries/intents.ru.yaml +78 -0
- package/dist/dictionaries/research.en.yaml +17 -0
- package/dist/dictionaries/research.ru.yaml +17 -0
- package/dist/dictionaries/small-talk.en.yaml +67 -0
- package/dist/dictionaries/small-talk.ru.yaml +81 -0
- package/dist/engine/agents/definitions/admin.json +24 -0
- package/dist/engine/agents/definitions/analyst.json +20 -0
- package/dist/engine/agents/definitions/assistant.json +25 -0
- package/dist/engine/agents/definitions/auditor.json +19 -0
- package/dist/engine/agents/definitions/developer.json +23 -0
- package/dist/engine/agents/definitions/devops.json +23 -0
- package/dist/engine/agents/definitions/explore.json +15 -0
- package/dist/engine/agents/definitions/general.json +15 -0
- package/dist/engine/agents/definitions/pm.json +20 -0
- package/dist/engine/agents/definitions/qa.json +22 -0
- package/dist/engine/agents/definitions/title.json +19 -0
- package/dist/engine/agents/index.d.ts +8 -0
- package/dist/engine/agents/index.d.ts.map +1 -0
- package/dist/engine/agents/index.js +71 -0
- package/dist/engine/agents/index.js.map +1 -0
- package/dist/engine/agents/mode.d.ts +14 -0
- package/dist/engine/agents/mode.d.ts.map +1 -0
- package/dist/engine/agents/mode.js +21 -0
- package/dist/engine/agents/mode.js.map +1 -0
- package/dist/engine/agents/mode.test.d.ts +2 -0
- package/dist/engine/agents/mode.test.d.ts.map +1 -0
- package/dist/engine/agents/mode.test.js +27 -0
- package/dist/engine/agents/mode.test.js.map +1 -0
- package/dist/engine/agents/registry.d.ts +17 -0
- package/dist/engine/agents/registry.d.ts.map +1 -0
- package/dist/engine/agents/registry.js +48 -0
- package/dist/engine/agents/registry.js.map +1 -0
- package/dist/engine/agents/registry.test.d.ts +2 -0
- package/dist/engine/agents/registry.test.d.ts.map +1 -0
- package/dist/engine/agents/registry.test.js +76 -0
- package/dist/engine/agents/registry.test.js.map +1 -0
- package/dist/engine/context/builder.d.ts +44 -0
- package/dist/engine/context/builder.d.ts.map +1 -0
- package/dist/engine/context/builder.js +225 -0
- package/dist/engine/context/builder.js.map +1 -0
- package/dist/engine/context/builder.test.d.ts +2 -0
- package/dist/engine/context/builder.test.d.ts.map +1 -0
- package/dist/engine/context/builder.test.js +69 -0
- package/dist/engine/context/builder.test.js.map +1 -0
- package/dist/engine/context/config.d.ts +56 -0
- package/dist/engine/context/config.d.ts.map +1 -0
- package/dist/engine/context/config.js +391 -0
- package/dist/engine/context/config.js.map +1 -0
- package/dist/engine/context/config.test.d.ts +2 -0
- package/dist/engine/context/config.test.d.ts.map +1 -0
- package/dist/engine/context/config.test.js +54 -0
- package/dist/engine/context/config.test.js.map +1 -0
- package/dist/engine/context/index.d.ts +5 -0
- package/dist/engine/context/index.d.ts.map +1 -0
- package/dist/engine/context/index.js +5 -0
- package/dist/engine/context/index.js.map +1 -0
- package/dist/engine/context/interview.d.ts +17 -0
- package/dist/engine/context/interview.d.ts.map +1 -0
- package/dist/engine/context/interview.js +84 -0
- package/dist/engine/context/interview.js.map +1 -0
- package/dist/engine/context/optimizer.d.ts +112 -0
- package/dist/engine/context/optimizer.d.ts.map +1 -0
- package/dist/engine/context/optimizer.js +517 -0
- package/dist/engine/context/optimizer.js.map +1 -0
- package/dist/engine/context/optimizer.test.d.ts +2 -0
- package/dist/engine/context/optimizer.test.d.ts.map +1 -0
- package/dist/engine/context/optimizer.test.js +101 -0
- package/dist/engine/context/optimizer.test.js.map +1 -0
- package/dist/engine/gateway/audit-logger.d.ts +52 -0
- package/dist/engine/gateway/audit-logger.d.ts.map +1 -0
- package/dist/engine/gateway/audit-logger.js +86 -0
- package/dist/engine/gateway/audit-logger.js.map +1 -0
- package/dist/engine/gateway/audit-logger.test.d.ts +6 -0
- package/dist/engine/gateway/audit-logger.test.d.ts.map +1 -0
- package/dist/engine/gateway/audit-logger.test.js +86 -0
- package/dist/engine/gateway/audit-logger.test.js.map +1 -0
- package/dist/engine/gateway/gateway-provider.d.ts +46 -0
- package/dist/engine/gateway/gateway-provider.d.ts.map +1 -0
- package/dist/engine/gateway/gateway-provider.js +223 -0
- package/dist/engine/gateway/gateway-provider.js.map +1 -0
- package/dist/engine/gateway/gateway-provider.test.d.ts +7 -0
- package/dist/engine/gateway/gateway-provider.test.d.ts.map +1 -0
- package/dist/engine/gateway/gateway-provider.test.js +251 -0
- package/dist/engine/gateway/gateway-provider.test.js.map +1 -0
- package/dist/engine/gateway/index.d.ts +23 -0
- package/dist/engine/gateway/index.d.ts.map +1 -0
- package/dist/engine/gateway/index.js +15 -0
- package/dist/engine/gateway/index.js.map +1 -0
- package/dist/engine/gateway/input-guard.d.ts +38 -0
- package/dist/engine/gateway/input-guard.d.ts.map +1 -0
- package/dist/engine/gateway/input-guard.js +109 -0
- package/dist/engine/gateway/input-guard.js.map +1 -0
- package/dist/engine/gateway/input-guard.test.d.ts +6 -0
- package/dist/engine/gateway/input-guard.test.d.ts.map +1 -0
- package/dist/engine/gateway/input-guard.test.js +109 -0
- package/dist/engine/gateway/input-guard.test.js.map +1 -0
- package/dist/engine/gateway/integration.test.d.ts +8 -0
- package/dist/engine/gateway/integration.test.d.ts.map +1 -0
- package/dist/engine/gateway/integration.test.js +341 -0
- package/dist/engine/gateway/integration.test.js.map +1 -0
- package/dist/engine/gateway/obfuscation-map-store.d.ts +14 -0
- package/dist/engine/gateway/obfuscation-map-store.d.ts.map +1 -0
- package/dist/engine/gateway/obfuscation-map-store.js +30 -0
- package/dist/engine/gateway/obfuscation-map-store.js.map +1 -0
- package/dist/engine/gateway/obfuscator.d.ts +32 -0
- package/dist/engine/gateway/obfuscator.d.ts.map +1 -0
- package/dist/engine/gateway/obfuscator.js +83 -0
- package/dist/engine/gateway/obfuscator.js.map +1 -0
- package/dist/engine/gateway/obfuscator.test.d.ts +6 -0
- package/dist/engine/gateway/obfuscator.test.d.ts.map +1 -0
- package/dist/engine/gateway/obfuscator.test.js +104 -0
- package/dist/engine/gateway/obfuscator.test.js.map +1 -0
- package/dist/engine/gateway/output-guard.d.ts +12 -0
- package/dist/engine/gateway/output-guard.d.ts.map +1 -0
- package/dist/engine/gateway/output-guard.js +12 -0
- package/dist/engine/gateway/output-guard.js.map +1 -0
- package/dist/engine/gateway/output-guard.test.d.ts +5 -0
- package/dist/engine/gateway/output-guard.test.d.ts.map +1 -0
- package/dist/engine/gateway/output-guard.test.js +31 -0
- package/dist/engine/gateway/output-guard.test.js.map +1 -0
- package/dist/engine/gateway/payload-logger.d.ts +52 -0
- package/dist/engine/gateway/payload-logger.d.ts.map +1 -0
- package/dist/engine/gateway/payload-logger.js +82 -0
- package/dist/engine/gateway/payload-logger.js.map +1 -0
- package/dist/engine/gateway/payload-logger.test.d.ts +6 -0
- package/dist/engine/gateway/payload-logger.test.d.ts.map +1 -0
- package/dist/engine/gateway/payload-logger.test.js +106 -0
- package/dist/engine/gateway/payload-logger.test.js.map +1 -0
- package/dist/engine/gateway/rate-limiter.d.ts +18 -0
- package/dist/engine/gateway/rate-limiter.d.ts.map +1 -0
- package/dist/engine/gateway/rate-limiter.js +44 -0
- package/dist/engine/gateway/rate-limiter.js.map +1 -0
- package/dist/engine/gateway/rate-limiter.test.d.ts +5 -0
- package/dist/engine/gateway/rate-limiter.test.d.ts.map +1 -0
- package/dist/engine/gateway/rate-limiter.test.js +61 -0
- package/dist/engine/gateway/rate-limiter.test.js.map +1 -0
- package/dist/engine/gateway/secret-detector.d.ts +25 -0
- package/dist/engine/gateway/secret-detector.d.ts.map +1 -0
- package/dist/engine/gateway/secret-detector.js +109 -0
- package/dist/engine/gateway/secret-detector.js.map +1 -0
- package/dist/engine/gateway/secret-detector.test.d.ts +6 -0
- package/dist/engine/gateway/secret-detector.test.d.ts.map +1 -0
- package/dist/engine/gateway/secret-detector.test.js +107 -0
- package/dist/engine/gateway/secret-detector.test.js.map +1 -0
- package/dist/engine/gateway/secret-pattern-store.d.ts +54 -0
- package/dist/engine/gateway/secret-pattern-store.d.ts.map +1 -0
- package/dist/engine/gateway/secret-pattern-store.js +133 -0
- package/dist/engine/gateway/secret-pattern-store.js.map +1 -0
- package/dist/engine/gateway/secret-pattern-store.test.d.ts +7 -0
- package/dist/engine/gateway/secret-pattern-store.test.d.ts.map +1 -0
- package/dist/engine/gateway/secret-pattern-store.test.js +102 -0
- package/dist/engine/gateway/secret-pattern-store.test.js.map +1 -0
- package/dist/engine/mcp/client.d.ts +31 -0
- package/dist/engine/mcp/client.d.ts.map +1 -0
- package/dist/engine/mcp/client.js +150 -0
- package/dist/engine/mcp/client.js.map +1 -0
- package/dist/engine/mcp/client.test.d.ts +2 -0
- package/dist/engine/mcp/client.test.d.ts.map +1 -0
- package/dist/engine/mcp/client.test.js +204 -0
- package/dist/engine/mcp/client.test.js.map +1 -0
- package/dist/engine/mcp/index.d.ts +5 -0
- package/dist/engine/mcp/index.d.ts.map +1 -0
- package/dist/engine/mcp/index.js +4 -0
- package/dist/engine/mcp/index.js.map +1 -0
- package/dist/engine/mcp/manager.d.ts +46 -0
- package/dist/engine/mcp/manager.d.ts.map +1 -0
- package/dist/engine/mcp/manager.js +227 -0
- package/dist/engine/mcp/manager.js.map +1 -0
- package/dist/engine/mcp/manager.test.d.ts +2 -0
- package/dist/engine/mcp/manager.test.d.ts.map +1 -0
- package/dist/engine/mcp/manager.test.js +269 -0
- package/dist/engine/mcp/manager.test.js.map +1 -0
- package/dist/engine/mcp/settings.d.ts +23 -0
- package/dist/engine/mcp/settings.d.ts.map +1 -0
- package/dist/engine/mcp/settings.js +56 -0
- package/dist/engine/mcp/settings.js.map +1 -0
- package/dist/engine/orchestrator.d.ts +171 -0
- package/dist/engine/orchestrator.d.ts.map +1 -0
- package/dist/engine/orchestrator.js +1651 -0
- package/dist/engine/orchestrator.js.map +1 -0
- package/dist/engine/orchestrator.test.d.ts +2 -0
- package/dist/engine/orchestrator.test.d.ts.map +1 -0
- package/dist/engine/orchestrator.test.js +83 -0
- package/dist/engine/orchestrator.test.js.map +1 -0
- package/dist/engine/permission/approval.d.ts +32 -0
- package/dist/engine/permission/approval.d.ts.map +1 -0
- package/dist/engine/permission/approval.js +66 -0
- package/dist/engine/permission/approval.js.map +1 -0
- package/dist/engine/permission/approval.test.d.ts +2 -0
- package/dist/engine/permission/approval.test.d.ts.map +1 -0
- package/dist/engine/permission/approval.test.js +139 -0
- package/dist/engine/permission/approval.test.js.map +1 -0
- package/dist/engine/permission/derive.d.ts +12 -0
- package/dist/engine/permission/derive.d.ts.map +1 -0
- package/dist/engine/permission/derive.js +25 -0
- package/dist/engine/permission/derive.js.map +1 -0
- package/dist/engine/permission/evaluator.d.ts +64 -0
- package/dist/engine/permission/evaluator.d.ts.map +1 -0
- package/dist/engine/permission/evaluator.js +236 -0
- package/dist/engine/permission/evaluator.js.map +1 -0
- package/dist/engine/permission/evaluator.test.d.ts +2 -0
- package/dist/engine/permission/evaluator.test.d.ts.map +1 -0
- package/dist/engine/permission/evaluator.test.js +367 -0
- package/dist/engine/permission/evaluator.test.js.map +1 -0
- package/dist/engine/permission/groups.d.ts +10 -0
- package/dist/engine/permission/groups.d.ts.map +1 -0
- package/dist/engine/permission/groups.js +96 -0
- package/dist/engine/permission/groups.js.map +1 -0
- package/dist/engine/permission/index.d.ts +8 -0
- package/dist/engine/permission/index.d.ts.map +1 -0
- package/dist/engine/permission/index.js +6 -0
- package/dist/engine/permission/index.js.map +1 -0
- package/dist/engine/permission/integration.test.d.ts +2 -0
- package/dist/engine/permission/integration.test.d.ts.map +1 -0
- package/dist/engine/permission/integration.test.js +433 -0
- package/dist/engine/permission/integration.test.js.map +1 -0
- package/dist/engine/plan.integration.test.d.ts +2 -0
- package/dist/engine/plan.integration.test.d.ts.map +1 -0
- package/dist/engine/plan.integration.test.js +363 -0
- package/dist/engine/plan.integration.test.js.map +1 -0
- package/dist/engine/router/content-classifier.d.ts +27 -0
- package/dist/engine/router/content-classifier.d.ts.map +1 -0
- package/dist/engine/router/content-classifier.js +72 -0
- package/dist/engine/router/content-classifier.js.map +1 -0
- package/dist/engine/router/dictionary-store.d.ts +41 -0
- package/dist/engine/router/dictionary-store.d.ts.map +1 -0
- package/dist/engine/router/dictionary-store.js +239 -0
- package/dist/engine/router/dictionary-store.js.map +1 -0
- package/dist/engine/router/index.d.ts +21 -0
- package/dist/engine/router/index.d.ts.map +1 -0
- package/dist/engine/router/index.js +15 -0
- package/dist/engine/router/index.js.map +1 -0
- package/dist/engine/router/micro/index.d.ts +22 -0
- package/dist/engine/router/micro/index.d.ts.map +1 -0
- package/dist/engine/router/micro/index.js +72 -0
- package/dist/engine/router/micro/index.js.map +1 -0
- package/dist/engine/router/micro/index.test.d.ts +2 -0
- package/dist/engine/router/micro/index.test.d.ts.map +1 -0
- package/dist/engine/router/micro/index.test.js +81 -0
- package/dist/engine/router/micro/index.test.js.map +1 -0
- package/dist/engine/router/micro/models/base.d.ts +18 -0
- package/dist/engine/router/micro/models/base.d.ts.map +1 -0
- package/dist/engine/router/micro/models/base.js +2 -0
- package/dist/engine/router/micro/models/base.js.map +1 -0
- package/dist/engine/router/micro/models/embedding-model.d.ts +38 -0
- package/dist/engine/router/micro/models/embedding-model.d.ts.map +1 -0
- package/dist/engine/router/micro/models/embedding-model.js +248 -0
- package/dist/engine/router/micro/models/embedding-model.js.map +1 -0
- package/dist/engine/router/micro/models/index.d.ts +9 -0
- package/dist/engine/router/micro/models/index.d.ts.map +1 -0
- package/dist/engine/router/micro/models/index.js +4 -0
- package/dist/engine/router/micro/models/index.js.map +1 -0
- package/dist/engine/router/micro/models/micro-llm-model.d.ts +28 -0
- package/dist/engine/router/micro/models/micro-llm-model.d.ts.map +1 -0
- package/dist/engine/router/micro/models/micro-llm-model.js +115 -0
- package/dist/engine/router/micro/models/micro-llm-model.js.map +1 -0
- package/dist/engine/router/micro/models/rules-model.d.ts +23 -0
- package/dist/engine/router/micro/models/rules-model.d.ts.map +1 -0
- package/dist/engine/router/micro/models/rules-model.js +186 -0
- package/dist/engine/router/micro/models/rules-model.js.map +1 -0
- package/dist/engine/router/micro/models/rules-model.test.d.ts +2 -0
- package/dist/engine/router/micro/models/rules-model.test.d.ts.map +1 -0
- package/dist/engine/router/micro/models/rules-model.test.js +77 -0
- package/dist/engine/router/micro/models/rules-model.test.js.map +1 -0
- package/dist/engine/router/micro/task-classifier.d.ts +29 -0
- package/dist/engine/router/micro/task-classifier.d.ts.map +1 -0
- package/dist/engine/router/micro/task-classifier.js +106 -0
- package/dist/engine/router/micro/task-classifier.js.map +1 -0
- package/dist/engine/router/micro/task-classifier.test.d.ts +2 -0
- package/dist/engine/router/micro/task-classifier.test.d.ts.map +1 -0
- package/dist/engine/router/micro/task-classifier.test.js +134 -0
- package/dist/engine/router/micro/task-classifier.test.js.map +1 -0
- package/dist/engine/router/micro/tasks/classify-intent.d.ts +8 -0
- package/dist/engine/router/micro/tasks/classify-intent.d.ts.map +1 -0
- package/dist/engine/router/micro/tasks/classify-intent.js +36 -0
- package/dist/engine/router/micro/tasks/classify-intent.js.map +1 -0
- package/dist/engine/router/micro/tasks/classify-intent.test.d.ts +2 -0
- package/dist/engine/router/micro/tasks/classify-intent.test.d.ts.map +1 -0
- package/dist/engine/router/micro/tasks/classify-intent.test.js +107 -0
- package/dist/engine/router/micro/tasks/classify-intent.test.js.map +1 -0
- package/dist/engine/router/micro/tasks/enum-decision.d.ts +7 -0
- package/dist/engine/router/micro/tasks/enum-decision.d.ts.map +1 -0
- package/dist/engine/router/micro/tasks/enum-decision.js +36 -0
- package/dist/engine/router/micro/tasks/enum-decision.js.map +1 -0
- package/dist/engine/router/micro/tasks/enum-decision.test.d.ts +2 -0
- package/dist/engine/router/micro/tasks/enum-decision.test.d.ts.map +1 -0
- package/dist/engine/router/micro/tasks/enum-decision.test.js +96 -0
- package/dist/engine/router/micro/tasks/enum-decision.test.js.map +1 -0
- package/dist/engine/router/micro/tasks/index.d.ts +7 -0
- package/dist/engine/router/micro/tasks/index.d.ts.map +1 -0
- package/dist/engine/router/micro/tasks/index.js +7 -0
- package/dist/engine/router/micro/tasks/index.js.map +1 -0
- package/dist/engine/router/micro/tasks/small-talk.d.ts +7 -0
- package/dist/engine/router/micro/tasks/small-talk.d.ts.map +1 -0
- package/dist/engine/router/micro/tasks/small-talk.js +29 -0
- package/dist/engine/router/micro/tasks/small-talk.js.map +1 -0
- package/dist/engine/router/micro/tasks/small-talk.test.d.ts +2 -0
- package/dist/engine/router/micro/tasks/small-talk.test.d.ts.map +1 -0
- package/dist/engine/router/micro/tasks/small-talk.test.js +71 -0
- package/dist/engine/router/micro/tasks/small-talk.test.js.map +1 -0
- package/dist/engine/router/micro/types.d.ts +42 -0
- package/dist/engine/router/micro/types.d.ts.map +1 -0
- package/dist/engine/router/micro/types.js +2 -0
- package/dist/engine/router/micro/types.js.map +1 -0
- package/dist/engine/router/provider-pool.d.ts +24 -0
- package/dist/engine/router/provider-pool.d.ts.map +1 -0
- package/dist/engine/router/provider-pool.js +57 -0
- package/dist/engine/router/provider-pool.js.map +1 -0
- package/dist/engine/router/provider-pool.test.d.ts +7 -0
- package/dist/engine/router/provider-pool.test.d.ts.map +1 -0
- package/dist/engine/router/provider-pool.test.js +138 -0
- package/dist/engine/router/provider-pool.test.js.map +1 -0
- package/dist/engine/router/quality-checker.d.ts +25 -0
- package/dist/engine/router/quality-checker.d.ts.map +1 -0
- package/dist/engine/router/quality-checker.js +121 -0
- package/dist/engine/router/quality-checker.js.map +1 -0
- package/dist/engine/router/router.d.ts +48 -0
- package/dist/engine/router/router.d.ts.map +1 -0
- package/dist/engine/router/router.js +195 -0
- package/dist/engine/router/router.js.map +1 -0
- package/dist/engine/router/utils.d.ts +7 -0
- package/dist/engine/router/utils.d.ts.map +1 -0
- package/dist/engine/router/utils.js +14 -0
- package/dist/engine/router/utils.js.map +1 -0
- package/dist/engine/security/index.d.ts +5 -0
- package/dist/engine/security/index.d.ts.map +1 -0
- package/dist/engine/security/index.js +3 -0
- package/dist/engine/security/index.js.map +1 -0
- package/dist/engine/security/integration.test.d.ts +2 -0
- package/dist/engine/security/integration.test.d.ts.map +1 -0
- package/dist/engine/security/integration.test.js +246 -0
- package/dist/engine/security/integration.test.js.map +1 -0
- package/dist/engine/security/prompt-injection.d.ts +52 -0
- package/dist/engine/security/prompt-injection.d.ts.map +1 -0
- package/dist/engine/security/prompt-injection.js +78 -0
- package/dist/engine/security/prompt-injection.js.map +1 -0
- package/dist/engine/security/prompt-injection.test.d.ts +2 -0
- package/dist/engine/security/prompt-injection.test.d.ts.map +1 -0
- package/dist/engine/security/prompt-injection.test.js +110 -0
- package/dist/engine/security/prompt-injection.test.js.map +1 -0
- package/dist/engine/security/trust.d.ts +22 -0
- package/dist/engine/security/trust.d.ts.map +1 -0
- package/dist/engine/security/trust.js +107 -0
- package/dist/engine/security/trust.js.map +1 -0
- package/dist/engine/security/trust.test.d.ts +2 -0
- package/dist/engine/security/trust.test.d.ts.map +1 -0
- package/dist/engine/security/trust.test.js +92 -0
- package/dist/engine/security/trust.test.js.map +1 -0
- package/dist/engine/tools/classify-conversation.d.ts +3 -0
- package/dist/engine/tools/classify-conversation.d.ts.map +1 -0
- package/dist/engine/tools/classify-conversation.js +28 -0
- package/dist/engine/tools/classify-conversation.js.map +1 -0
- package/dist/engine/tools/fs-read.d.ts +5 -0
- package/dist/engine/tools/fs-read.d.ts.map +1 -0
- package/dist/engine/tools/fs-read.js +123 -0
- package/dist/engine/tools/fs-read.js.map +1 -0
- package/dist/engine/tools/fs-read.test.d.ts +2 -0
- package/dist/engine/tools/fs-read.test.d.ts.map +1 -0
- package/dist/engine/tools/fs-read.test.js +69 -0
- package/dist/engine/tools/fs-read.test.js.map +1 -0
- package/dist/engine/tools/fs-write.d.ts +6 -0
- package/dist/engine/tools/fs-write.d.ts.map +1 -0
- package/dist/engine/tools/fs-write.js +196 -0
- package/dist/engine/tools/fs-write.js.map +1 -0
- package/dist/engine/tools/fs-write.test.d.ts +2 -0
- package/dist/engine/tools/fs-write.test.d.ts.map +1 -0
- package/dist/engine/tools/fs-write.test.js +58 -0
- package/dist/engine/tools/fs-write.test.js.map +1 -0
- package/dist/engine/tools/git.d.ts +17 -0
- package/dist/engine/tools/git.d.ts.map +1 -0
- package/dist/engine/tools/git.js +501 -0
- package/dist/engine/tools/git.js.map +1 -0
- package/dist/engine/tools/git.test.d.ts +2 -0
- package/dist/engine/tools/git.test.d.ts.map +1 -0
- package/dist/engine/tools/git.test.js +47 -0
- package/dist/engine/tools/git.test.js.map +1 -0
- package/dist/engine/tools/index.d.ts +7 -0
- package/dist/engine/tools/index.d.ts.map +1 -0
- package/dist/engine/tools/index.js +53 -0
- package/dist/engine/tools/index.js.map +1 -0
- package/dist/engine/tools/json-schema.d.ts +3 -0
- package/dist/engine/tools/json-schema.d.ts.map +1 -0
- package/dist/engine/tools/json-schema.js +131 -0
- package/dist/engine/tools/json-schema.js.map +1 -0
- package/dist/engine/tools/obfuscation.d.ts +12 -0
- package/dist/engine/tools/obfuscation.d.ts.map +1 -0
- package/dist/engine/tools/obfuscation.js +24 -0
- package/dist/engine/tools/obfuscation.js.map +1 -0
- package/dist/engine/tools/path-utils.d.ts +3 -0
- package/dist/engine/tools/path-utils.d.ts.map +1 -0
- package/dist/engine/tools/path-utils.js +20 -0
- package/dist/engine/tools/path-utils.js.map +1 -0
- package/dist/engine/tools/path-utils.test.d.ts +2 -0
- package/dist/engine/tools/path-utils.test.d.ts.map +1 -0
- package/dist/engine/tools/path-utils.test.js +38 -0
- package/dist/engine/tools/path-utils.test.js.map +1 -0
- package/dist/engine/tools/plan.d.ts +13 -0
- package/dist/engine/tools/plan.d.ts.map +1 -0
- package/dist/engine/tools/plan.js +153 -0
- package/dist/engine/tools/plan.js.map +1 -0
- package/dist/engine/tools/plan.test.d.ts +2 -0
- package/dist/engine/tools/plan.test.d.ts.map +1 -0
- package/dist/engine/tools/plan.test.js +106 -0
- package/dist/engine/tools/plan.test.js.map +1 -0
- package/dist/engine/tools/project-context.d.ts +4 -0
- package/dist/engine/tools/project-context.d.ts.map +1 -0
- package/dist/engine/tools/project-context.js +232 -0
- package/dist/engine/tools/project-context.js.map +1 -0
- package/dist/engine/tools/project-context.test.d.ts +2 -0
- package/dist/engine/tools/project-context.test.d.ts.map +1 -0
- package/dist/engine/tools/project-context.test.js +175 -0
- package/dist/engine/tools/project-context.test.js.map +1 -0
- package/dist/engine/tools/read-reference.d.ts +3 -0
- package/dist/engine/tools/read-reference.d.ts.map +1 -0
- package/dist/engine/tools/read-reference.js +41 -0
- package/dist/engine/tools/read-reference.js.map +1 -0
- package/dist/engine/tools/read-reference.test.d.ts +2 -0
- package/dist/engine/tools/read-reference.test.d.ts.map +1 -0
- package/dist/engine/tools/read-reference.test.js +57 -0
- package/dist/engine/tools/read-reference.test.js.map +1 -0
- package/dist/engine/tools/registry.d.ts +15 -0
- package/dist/engine/tools/registry.d.ts.map +1 -0
- package/dist/engine/tools/registry.js +66 -0
- package/dist/engine/tools/registry.js.map +1 -0
- package/dist/engine/tools/search.d.ts +3 -0
- package/dist/engine/tools/search.d.ts.map +1 -0
- package/dist/engine/tools/search.js +70 -0
- package/dist/engine/tools/search.js.map +1 -0
- package/dist/engine/tools/shell.d.ts +3 -0
- package/dist/engine/tools/shell.d.ts.map +1 -0
- package/dist/engine/tools/shell.js +69 -0
- package/dist/engine/tools/shell.js.map +1 -0
- package/dist/engine/tools/shell.test.d.ts +2 -0
- package/dist/engine/tools/shell.test.d.ts.map +1 -0
- package/dist/engine/tools/shell.test.js +39 -0
- package/dist/engine/tools/shell.test.js.map +1 -0
- package/dist/engine/tools/task.d.ts +35 -0
- package/dist/engine/tools/task.d.ts.map +1 -0
- package/dist/engine/tools/task.js +944 -0
- package/dist/engine/tools/task.js.map +1 -0
- package/dist/engine/tools/task.test.d.ts +2 -0
- package/dist/engine/tools/task.test.d.ts.map +1 -0
- package/dist/engine/tools/task.test.js +707 -0
- package/dist/engine/tools/task.test.js.map +1 -0
- package/dist/engine/tools/todo.d.ts +10 -0
- package/dist/engine/tools/todo.d.ts.map +1 -0
- package/dist/engine/tools/todo.js +56 -0
- package/dist/engine/tools/todo.js.map +1 -0
- package/dist/engine/tools/todo.test.d.ts +2 -0
- package/dist/engine/tools/todo.test.d.ts.map +1 -0
- package/dist/engine/tools/todo.test.js +90 -0
- package/dist/engine/tools/todo.test.js.map +1 -0
- package/dist/engine/tools/web.d.ts +12 -0
- package/dist/engine/tools/web.d.ts.map +1 -0
- package/dist/engine/tools/web.js +355 -0
- package/dist/engine/tools/web.js.map +1 -0
- package/dist/engine/tools/web.test.d.ts +2 -0
- package/dist/engine/tools/web.test.d.ts.map +1 -0
- package/dist/engine/tools/web.test.js +223 -0
- package/dist/engine/tools/web.test.js.map +1 -0
- package/dist/events/bus.d.ts +20 -0
- package/dist/events/bus.d.ts.map +1 -0
- package/dist/events/bus.js +93 -0
- package/dist/events/bus.js.map +1 -0
- package/dist/events/bus.test.d.ts +2 -0
- package/dist/events/bus.test.d.ts.map +1 -0
- package/dist/events/bus.test.js +147 -0
- package/dist/events/bus.test.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +11 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +98 -0
- package/dist/logger.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +520 -0
- package/dist/main.js.map +1 -0
- package/dist/prompts/modes/act.md +18 -0
- package/dist/prompts/modes/plan.md +20 -0
- package/dist/prompts/modes/yolo.md +20 -0
- package/dist/prompts/prompts/modes/act.md +18 -0
- package/dist/prompts/prompts/modes/plan.md +20 -0
- package/dist/prompts/prompts/modes/yolo.md +20 -0
- package/dist/prompts/prompts/roles/ADMIN.en.md +33 -0
- package/dist/prompts/prompts/roles/ADMIN.ru.md +33 -0
- package/dist/prompts/prompts/roles/ANALYST.en.md +33 -0
- package/dist/prompts/prompts/roles/ANALYST.ru.md +33 -0
- package/dist/prompts/prompts/roles/ASSISTANT.en.md +38 -0
- package/dist/prompts/prompts/roles/ASSISTANT.ru.md +38 -0
- package/dist/prompts/prompts/roles/AUDITOR.en.md +33 -0
- package/dist/prompts/prompts/roles/AUDITOR.ru.md +33 -0
- package/dist/prompts/prompts/roles/DEVELOPER.en.md +42 -0
- package/dist/prompts/prompts/roles/DEVELOPER.ru.md +42 -0
- package/dist/prompts/prompts/roles/DEVOPS.en.md +35 -0
- package/dist/prompts/prompts/roles/DEVOPS.ru.md +35 -0
- package/dist/prompts/prompts/roles/PM.en.md +33 -0
- package/dist/prompts/prompts/roles/PM.ru.md +33 -0
- package/dist/prompts/prompts/roles/QA.en.md +33 -0
- package/dist/prompts/prompts/roles/QA.ru.md +33 -0
- package/dist/prompts/prompts/roles/TITLE.ru.md +30 -0
- package/dist/prompts/prompts/subagents/explore.ru.md +23 -0
- package/dist/prompts/prompts/subagents/general.ru.md +19 -0
- package/dist/prompts/prompts/system/COMPRESSED_DIALOG.en.md +5 -0
- package/dist/prompts/prompts/system/COMPRESSED_DIALOG.ru.md +5 -0
- package/dist/prompts/prompts/system/GATEWAY.en.md +10 -0
- package/dist/prompts/prompts/system/GATEWAY.ru.md +10 -0
- package/dist/prompts/prompts/system/INTERVIEW.en.md +18 -0
- package/dist/prompts/prompts/system/INTERVIEW.ru.md +18 -0
- package/dist/prompts/prompts/system/PARTICIPANTS_NOTICE.en.md +7 -0
- package/dist/prompts/prompts/system/PARTICIPANTS_NOTICE.ru.md +7 -0
- package/dist/prompts/prompts/system/ROLES_DESCRIPTION.en.md +16 -0
- package/dist/prompts/prompts/system/ROLES_DESCRIPTION.ru.md +16 -0
- package/dist/prompts/prompts/system/ROUTING.en.md +13 -0
- package/dist/prompts/prompts/system/ROUTING.md +6 -0
- package/dist/prompts/prompts/system/ROUTING.ru.md +13 -0
- package/dist/prompts/prompts/system/RULES.en.md +10 -0
- package/dist/prompts/prompts/system/RULES.md +10 -0
- package/dist/prompts/prompts/system/RULES.ru.md +10 -0
- package/dist/prompts/prompts/system/STICKY_NOTES.en.md +6 -0
- package/dist/prompts/prompts/system/STICKY_NOTES.ru.md +6 -0
- package/dist/prompts/prompts/system/SUMMARIZER.en.md +54 -0
- package/dist/prompts/prompts/system/SUMMARIZER.ru.md +54 -0
- package/dist/prompts/prompts/system/USER_CONTEXT.en.md +5 -0
- package/dist/prompts/prompts/system/USER_CONTEXT.ru.md +5 -0
- package/dist/prompts/roles/ADMIN.en.md +32 -0
- package/dist/prompts/roles/ADMIN.ru.md +32 -0
- package/dist/prompts/roles/ANALYST.en.md +32 -0
- package/dist/prompts/roles/ANALYST.ru.md +32 -0
- package/dist/prompts/roles/ASSISTANT.en.md +37 -0
- package/dist/prompts/roles/ASSISTANT.ru.md +37 -0
- package/dist/prompts/roles/AUDITOR.en.md +32 -0
- package/dist/prompts/roles/AUDITOR.ru.md +32 -0
- package/dist/prompts/roles/DEVELOPER.en.md +41 -0
- package/dist/prompts/roles/DEVELOPER.ru.md +41 -0
- package/dist/prompts/roles/DEVOPS.en.md +34 -0
- package/dist/prompts/roles/DEVOPS.ru.md +34 -0
- package/dist/prompts/roles/PM.en.md +32 -0
- package/dist/prompts/roles/PM.ru.md +32 -0
- package/dist/prompts/roles/QA.en.md +32 -0
- package/dist/prompts/roles/QA.ru.md +32 -0
- package/dist/prompts/roles/TITLE.ru.md +38 -0
- package/dist/prompts/subagents/explore.ru.md +23 -0
- package/dist/prompts/subagents/general.ru.md +19 -0
- package/dist/prompts/system/COMPRESSED_DIALOG.en.md +5 -0
- package/dist/prompts/system/COMPRESSED_DIALOG.ru.md +5 -0
- package/dist/prompts/system/INTERVIEW.en.md +18 -0
- package/dist/prompts/system/INTERVIEW.ru.md +18 -0
- package/dist/prompts/system/PARTICIPANTS_NOTICE.en.md +7 -0
- package/dist/prompts/system/PARTICIPANTS_NOTICE.ru.md +7 -0
- package/dist/prompts/system/ROLES_DESCRIPTION.en.md +16 -0
- package/dist/prompts/system/ROLES_DESCRIPTION.ru.md +16 -0
- package/dist/prompts/system/ROUTING.en.md +13 -0
- package/dist/prompts/system/ROUTING.md +6 -0
- package/dist/prompts/system/ROUTING.ru.md +13 -0
- package/dist/prompts/system/RULES.en.md +10 -0
- package/dist/prompts/system/RULES.md +10 -0
- package/dist/prompts/system/RULES.ru.md +10 -0
- package/dist/prompts/system/STICKY_NOTES.en.md +6 -0
- package/dist/prompts/system/STICKY_NOTES.ru.md +6 -0
- package/dist/prompts/system/SUMMARIZER.en.md +54 -0
- package/dist/prompts/system/SUMMARIZER.ru.md +54 -0
- package/dist/prompts/system/USER_CONTEXT.en.md +5 -0
- package/dist/prompts/system/USER_CONTEXT.ru.md +5 -0
- package/dist/providers/anthropic.d.ts +15 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +378 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +72 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +94 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/exceptions.d.ts +13 -0
- package/dist/providers/exceptions.d.ts.map +1 -0
- package/dist/providers/exceptions.js +25 -0
- package/dist/providers/exceptions.js.map +1 -0
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +14 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama.d.ts +15 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +301 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +14 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +292 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/queue/processor.d.ts +51 -0
- package/dist/queue/processor.d.ts.map +1 -0
- package/dist/queue/processor.js +363 -0
- package/dist/queue/processor.js.map +1 -0
- package/dist/server/app.d.ts +31 -0
- package/dist/server/app.d.ts.map +1 -0
- package/dist/server/app.js +573 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/chat.d.ts +11 -0
- package/dist/server/chat.d.ts.map +1 -0
- package/dist/server/chat.js +140 -0
- package/dist/server/chat.js.map +1 -0
- package/dist/server/routes/agents.d.ts +7 -0
- package/dist/server/routes/agents.d.ts.map +1 -0
- package/dist/server/routes/agents.js +91 -0
- package/dist/server/routes/agents.js.map +1 -0
- package/dist/server/routes/auth.d.ts +4 -0
- package/dist/server/routes/auth.d.ts.map +1 -0
- package/dist/server/routes/auth.js +82 -0
- package/dist/server/routes/auth.js.map +1 -0
- package/dist/server/routes/fs.d.ts +4 -0
- package/dist/server/routes/fs.d.ts.map +1 -0
- package/dist/server/routes/fs.js +67 -0
- package/dist/server/routes/fs.js.map +1 -0
- package/dist/server/routes/health.d.ts +3 -0
- package/dist/server/routes/health.d.ts.map +1 -0
- package/dist/server/routes/health.js +9 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/i18n.d.ts +3 -0
- package/dist/server/routes/i18n.d.ts.map +1 -0
- package/dist/server/routes/i18n.js +83 -0
- package/dist/server/routes/i18n.js.map +1 -0
- package/dist/server/routes/mcp.d.ts +15 -0
- package/dist/server/routes/mcp.d.ts.map +1 -0
- package/dist/server/routes/mcp.js +43 -0
- package/dist/server/routes/mcp.js.map +1 -0
- package/dist/server/routes/mcp.test.d.ts +2 -0
- package/dist/server/routes/mcp.test.d.ts.map +1 -0
- package/dist/server/routes/mcp.test.js +88 -0
- package/dist/server/routes/mcp.test.js.map +1 -0
- package/dist/server/routes/messages.d.ts +5 -0
- package/dist/server/routes/messages.d.ts.map +1 -0
- package/dist/server/routes/messages.js +122 -0
- package/dist/server/routes/messages.js.map +1 -0
- package/dist/server/routes/models.d.ts +6 -0
- package/dist/server/routes/models.d.ts.map +1 -0
- package/dist/server/routes/models.js +96 -0
- package/dist/server/routes/models.js.map +1 -0
- package/dist/server/routes/projects.d.ts +5 -0
- package/dist/server/routes/projects.d.ts.map +1 -0
- package/dist/server/routes/projects.js +92 -0
- package/dist/server/routes/projects.js.map +1 -0
- package/dist/server/routes/projects.test.d.ts +2 -0
- package/dist/server/routes/projects.test.d.ts.map +1 -0
- package/dist/server/routes/projects.test.js +65 -0
- package/dist/server/routes/projects.test.js.map +1 -0
- package/dist/server/routes/providers.d.ts +6 -0
- package/dist/server/routes/providers.d.ts.map +1 -0
- package/dist/server/routes/providers.js +118 -0
- package/dist/server/routes/providers.js.map +1 -0
- package/dist/server/routes/queue.d.ts +5 -0
- package/dist/server/routes/queue.d.ts.map +1 -0
- package/dist/server/routes/queue.js +64 -0
- package/dist/server/routes/queue.js.map +1 -0
- package/dist/server/routes/sessions.d.ts +5 -0
- package/dist/server/routes/sessions.d.ts.map +1 -0
- package/dist/server/routes/sessions.js +346 -0
- package/dist/server/routes/sessions.js.map +1 -0
- package/dist/server/routes/sessions.test.d.ts +2 -0
- package/dist/server/routes/sessions.test.d.ts.map +1 -0
- package/dist/server/routes/sessions.test.js +162 -0
- package/dist/server/routes/sessions.test.js.map +1 -0
- package/dist/server/routes/settings.d.ts +21 -0
- package/dist/server/routes/settings.d.ts.map +1 -0
- package/dist/server/routes/settings.js +125 -0
- package/dist/server/routes/settings.js.map +1 -0
- package/dist/server/routes/settings.test.d.ts +2 -0
- package/dist/server/routes/settings.test.d.ts.map +1 -0
- package/dist/server/routes/settings.test.js +358 -0
- package/dist/server/routes/settings.test.js.map +1 -0
- package/dist/server/routes/updates.d.ts +4 -0
- package/dist/server/routes/updates.d.ts.map +1 -0
- package/dist/server/routes/updates.js +82 -0
- package/dist/server/routes/updates.js.map +1 -0
- package/dist/server/serialize.d.ts +204 -0
- package/dist/server/serialize.d.ts.map +1 -0
- package/dist/server/serialize.js +133 -0
- package/dist/server/serialize.js.map +1 -0
- package/dist/sessions/auto-title.d.ts +5 -0
- package/dist/sessions/auto-title.d.ts.map +1 -0
- package/dist/sessions/auto-title.js +75 -0
- package/dist/sessions/auto-title.js.map +1 -0
- package/dist/sessions/manager.d.ts +81 -0
- package/dist/sessions/manager.d.ts.map +1 -0
- package/dist/sessions/manager.js +508 -0
- package/dist/sessions/manager.js.map +1 -0
- package/dist/sessions/manager.test.d.ts +2 -0
- package/dist/sessions/manager.test.d.ts.map +1 -0
- package/dist/sessions/manager.test.js +525 -0
- package/dist/sessions/manager.test.js.map +1 -0
- package/dist/storage/file-store.d.ts +27 -0
- package/dist/storage/file-store.d.ts.map +1 -0
- package/dist/storage/file-store.js +398 -0
- package/dist/storage/file-store.js.map +1 -0
- package/dist/storage/file-store.test.d.ts +2 -0
- package/dist/storage/file-store.test.d.ts.map +1 -0
- package/dist/storage/file-store.test.js +169 -0
- package/dist/storage/file-store.test.js.map +1 -0
- package/dist/storage/json-store.d.ts +19 -0
- package/dist/storage/json-store.d.ts.map +1 -0
- package/dist/storage/json-store.js +85 -0
- package/dist/storage/json-store.js.map +1 -0
- package/dist/storage/profile-store.d.ts +20 -0
- package/dist/storage/profile-store.d.ts.map +1 -0
- package/dist/storage/profile-store.js +147 -0
- package/dist/storage/profile-store.js.map +1 -0
- package/dist/storage/project-store.d.ts +23 -0
- package/dist/storage/project-store.d.ts.map +1 -0
- package/dist/storage/project-store.js +94 -0
- package/dist/storage/project-store.js.map +1 -0
- package/dist/storage/project-store.test.d.ts +2 -0
- package/dist/storage/project-store.test.d.ts.map +1 -0
- package/dist/storage/project-store.test.js +122 -0
- package/dist/storage/project-store.test.js.map +1 -0
- package/dist/storage/runtime-settings.d.ts +53 -0
- package/dist/storage/runtime-settings.d.ts.map +1 -0
- package/dist/storage/runtime-settings.js +95 -0
- package/dist/storage/runtime-settings.js.map +1 -0
- package/dist/update-checker.d.ts +9 -0
- package/dist/update-checker.d.ts.map +1 -0
- package/dist/update-checker.js +81 -0
- package/dist/update-checker.js.map +1 -0
- package/package.json +72 -0
- package/prompts/modes/act.md +18 -0
- package/prompts/modes/plan.md +20 -0
- package/prompts/modes/yolo.md +20 -0
- package/prompts/roles/ADMIN.en.md +33 -0
- package/prompts/roles/ADMIN.ru.md +33 -0
- package/prompts/roles/ANALYST.en.md +33 -0
- package/prompts/roles/ANALYST.ru.md +33 -0
- package/prompts/roles/ASSISTANT.en.md +38 -0
- package/prompts/roles/ASSISTANT.ru.md +38 -0
- package/prompts/roles/AUDITOR.en.md +33 -0
- package/prompts/roles/AUDITOR.ru.md +33 -0
- package/prompts/roles/DEVELOPER.en.md +42 -0
- package/prompts/roles/DEVELOPER.ru.md +42 -0
- package/prompts/roles/DEVOPS.en.md +35 -0
- package/prompts/roles/DEVOPS.ru.md +35 -0
- package/prompts/roles/PM.en.md +33 -0
- package/prompts/roles/PM.ru.md +33 -0
- package/prompts/roles/QA.en.md +33 -0
- package/prompts/roles/QA.ru.md +33 -0
- package/prompts/roles/TITLE.ru.md +30 -0
- package/prompts/subagents/explore.ru.md +23 -0
- package/prompts/subagents/general.ru.md +19 -0
- package/prompts/system/COMPRESSED_DIALOG.en.md +5 -0
- package/prompts/system/COMPRESSED_DIALOG.ru.md +5 -0
- package/prompts/system/GATEWAY.en.md +10 -0
- package/prompts/system/GATEWAY.ru.md +10 -0
- package/prompts/system/INTERVIEW.en.md +18 -0
- package/prompts/system/INTERVIEW.ru.md +18 -0
- package/prompts/system/PARTICIPANTS_NOTICE.en.md +7 -0
- package/prompts/system/PARTICIPANTS_NOTICE.ru.md +7 -0
- package/prompts/system/ROLES_DESCRIPTION.en.md +16 -0
- package/prompts/system/ROLES_DESCRIPTION.ru.md +16 -0
- package/prompts/system/ROUTING.en.md +13 -0
- package/prompts/system/ROUTING.md +6 -0
- package/prompts/system/ROUTING.ru.md +13 -0
- package/prompts/system/RULES.en.md +10 -0
- package/prompts/system/RULES.md +10 -0
- package/prompts/system/RULES.ru.md +10 -0
- package/prompts/system/STICKY_NOTES.en.md +6 -0
- package/prompts/system/STICKY_NOTES.ru.md +6 -0
- package/prompts/system/SUMMARIZER.en.md +54 -0
- package/prompts/system/SUMMARIZER.ru.md +54 -0
- package/prompts/system/USER_CONTEXT.en.md +5 -0
- package/prompts/system/USER_CONTEXT.ru.md +5 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../../src/engine/permission/evaluator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAoB,gBAAgB,EAAE,kBAAkB,EAAkB,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAIrL,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,qEAAqE;IACrE,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gEAAgE;IAChE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,oDAAoD;IACpD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CACzD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,WAAW,GAAG,SAAS,EACpC,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,YAAY,EAAE,OAAO,GAAG,SAAS,GAChC,OAAO,CAKT;AAED,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAEtF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAG7F;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,GAAG,SAAS,EAC3D,YAAY,EAAE,MAAM,GACnB,mBAAmB,GAAG,SAAS,CASjC;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,gBAAgB;IAEtD,IAAI,MAAM,IAAI,gBAAgB,CAE7B;IAED,KAAK,CAAC,KAAK,EAAE,oBAAoB,GAAG,kBAAkB;IAgBtD,OAAO,CAAC,gBAAgB;IAiFxB,OAAO,CAAC,YAAY;CA4CrB;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAWV;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAOnG;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAKzE"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { relative, resolve, isAbsolute, normalize, sep } from 'node:path';
|
|
2
|
+
import { globMatch, ToolCapability } from '@itphx/synth-shared';
|
|
3
|
+
import { resolvePath } from '../tools/path-utils.js';
|
|
4
|
+
import { getToolGroups, TOOL_PATH_PARAMS } from './groups.js';
|
|
5
|
+
/**
|
|
6
|
+
* AD-025: активна ли рестрикция write-тулов.
|
|
7
|
+
* - mode === 'plan' — сессия в режиме планирования (plan_enter).
|
|
8
|
+
* - planMode === 'strict' и план не утверждён — принудительный план перед записью.
|
|
9
|
+
* - planMode === 'off' — планирование отключено, рестрикция никогда не активна.
|
|
10
|
+
*/
|
|
11
|
+
export function isPlanRestricted(sessionMode, planMode, planApproved) {
|
|
12
|
+
if (planMode === 'off')
|
|
13
|
+
return false;
|
|
14
|
+
if (sessionMode === 'plan')
|
|
15
|
+
return true;
|
|
16
|
+
if (planMode === 'strict' && !planApproved)
|
|
17
|
+
return true;
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
/** Является ли тул write/edit/delete (группа edit по AD-029). */
|
|
21
|
+
export function isEditTool(toolName, capabilities) {
|
|
22
|
+
return getToolGroups(toolName, capabilities).includes('edit');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* AD-025: тулы, блокируемые в plan-режиме (и strict без утверждённого плана):
|
|
26
|
+
* edit-группа (write/edit/delete файлов) + git-запись (git_commit/git_push/...).
|
|
27
|
+
* Read-only git-тулы (git_status/git_diff/...) в группу не входят и остаются доступны.
|
|
28
|
+
*/
|
|
29
|
+
export function isPlanBlockedTool(toolName, capabilities) {
|
|
30
|
+
const groups = getToolGroups(toolName, capabilities);
|
|
31
|
+
return groups.includes('edit') || groups.includes('git_write');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Достаёт настройку доступности MCP-инструмента по имени сервера и локальному имени
|
|
35
|
+
* тула (без префикса). Полное имя инструмента: "{serverName}_{toolName}".
|
|
36
|
+
* Возвращает undefined, если для сервера/тула нет настроек (доступен по умолчанию).
|
|
37
|
+
*/
|
|
38
|
+
export function getMcpToolAvailability(settings, fullToolName) {
|
|
39
|
+
if (!settings)
|
|
40
|
+
return undefined;
|
|
41
|
+
const idx = fullToolName.indexOf('_');
|
|
42
|
+
if (idx === -1)
|
|
43
|
+
return undefined;
|
|
44
|
+
const serverName = fullToolName.slice(0, idx);
|
|
45
|
+
const localName = fullToolName.slice(idx + 1);
|
|
46
|
+
const server = settings[serverName];
|
|
47
|
+
if (!server)
|
|
48
|
+
return undefined;
|
|
49
|
+
return server.tools?.[localName] ?? server.default;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* AD-029: PermissionEvaluator — вычисление решения для одного tool_call.
|
|
53
|
+
*
|
|
54
|
+
* Приоритет правил:
|
|
55
|
+
* 1. Правило по конкретному имени тула (специфичный файловый паттерн > '*')
|
|
56
|
+
* 2. external_directory (только для путей вне workingDir)
|
|
57
|
+
* 3. Групповые правила (read/edit/shell/...): специфичный паттерн > '*'
|
|
58
|
+
* 4. Глобальный '*'
|
|
59
|
+
* 5. Дефолт: allow
|
|
60
|
+
*
|
|
61
|
+
* Файловые паттерны применяются к абсолютному пути файла (resolvePath) и к
|
|
62
|
+
* относительному пути от workingDir (для внутренних файлов). Это позволяет
|
|
63
|
+
* использовать как простые паттерны вида `*.env`, так и абсолютные `/tmp/*`.
|
|
64
|
+
*/
|
|
65
|
+
export class PermissionEvaluator {
|
|
66
|
+
_config;
|
|
67
|
+
constructor(_config) {
|
|
68
|
+
this._config = _config;
|
|
69
|
+
}
|
|
70
|
+
get config() {
|
|
71
|
+
return this._config;
|
|
72
|
+
}
|
|
73
|
+
check(input) {
|
|
74
|
+
const decision = this._computeDecision(input);
|
|
75
|
+
// AD-025-yolo: в режиме yolo все ask-запросы автоматически подтверждаются
|
|
76
|
+
// (allow) без события permission.asked и без ожидания пользователя.
|
|
77
|
+
// deny-правила остаются deny — трансформируется только действие ask.
|
|
78
|
+
if (decision.action === 'ask' && input.sessionMode === 'yolo') {
|
|
79
|
+
return {
|
|
80
|
+
...decision,
|
|
81
|
+
action: 'allow',
|
|
82
|
+
reason: `${decision.reason} (yolo-режим: автоподтверждение)`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return decision;
|
|
86
|
+
}
|
|
87
|
+
_computeDecision(input) {
|
|
88
|
+
const { toolName, params, workingDir, capabilities, sessionMode, planMode, planApproved, mcpToolSettings } = input;
|
|
89
|
+
const paths = extractPaths(toolName, params, workingDir);
|
|
90
|
+
const isFile = paths.length > 0;
|
|
91
|
+
// AD-025: plan-рестрикция применяется поверх конфига. В режиме plan (или
|
|
92
|
+
// strict без утверждённого плана) все write/edit/delete тулы и git-запись → deny,
|
|
93
|
+
// единственное исключение — файлы .synth/plans/*.md для edit-тулов.
|
|
94
|
+
if (isPlanRestricted(sessionMode, planMode, planApproved) && isPlanBlockedTool(toolName, capabilities)) {
|
|
95
|
+
if (isEditTool(toolName, capabilities) && isFile && paths.some((p) => matchPathPattern('.synth/plans/*.md', p, workingDir))) {
|
|
96
|
+
return {
|
|
97
|
+
action: 'allow',
|
|
98
|
+
reason: 'plan mode: запись в .synth/plans/*.md разрешена',
|
|
99
|
+
matchedRule: 'plan.plans',
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const restrictionSource = sessionMode === 'plan' ? 'режим plan' : 'strict: план не утверждён';
|
|
103
|
+
return {
|
|
104
|
+
action: 'deny',
|
|
105
|
+
reason: `plan mode: запись файлов заблокирована (${restrictionSource})`,
|
|
106
|
+
matchedRule: 'plan.deny',
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// MCP-доступность по режимам (настройки сессии): в plan-режиме инструмент
|
|
110
|
+
// доступен только если plan=true, в act — act=true. Применяется поверх конфига.
|
|
111
|
+
if (capabilities?.includes(ToolCapability.MCP) && mcpToolSettings) {
|
|
112
|
+
const availability = getMcpToolAvailability(mcpToolSettings, toolName);
|
|
113
|
+
if (availability) {
|
|
114
|
+
const modeKey = sessionMode === 'plan' ? 'plan' : 'act';
|
|
115
|
+
if (!availability[modeKey]) {
|
|
116
|
+
return {
|
|
117
|
+
action: 'deny',
|
|
118
|
+
reason: `MCP-инструмент недоступен в режиме ${modeKey}`,
|
|
119
|
+
matchedRule: 'mcp.mode',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// 1. Правило по конкретному имени тула
|
|
125
|
+
const toolRule = this._config.rules[toolName];
|
|
126
|
+
if (toolRule !== undefined) {
|
|
127
|
+
const d = this._resolveRule(toolName, toolRule, paths, workingDir);
|
|
128
|
+
if (d)
|
|
129
|
+
return d;
|
|
130
|
+
}
|
|
131
|
+
// 2. external_directory — только пути вне workingDir
|
|
132
|
+
if (isFile) {
|
|
133
|
+
const extRule = this._config.rules['external_directory'];
|
|
134
|
+
if (extRule !== undefined) {
|
|
135
|
+
for (const p of paths) {
|
|
136
|
+
if (isInsideWorkingDir(p, workingDir))
|
|
137
|
+
continue;
|
|
138
|
+
const d = this._resolveRule('external_directory', extRule, [p], workingDir);
|
|
139
|
+
if (d)
|
|
140
|
+
return d;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// 3. Групповые правила
|
|
145
|
+
for (const group of getToolGroups(toolName, capabilities)) {
|
|
146
|
+
const groupRule = this._config.rules[group];
|
|
147
|
+
if (groupRule === undefined)
|
|
148
|
+
continue;
|
|
149
|
+
const d = this._resolveRule(group, groupRule, isFile ? paths : [], workingDir);
|
|
150
|
+
if (d)
|
|
151
|
+
return d;
|
|
152
|
+
}
|
|
153
|
+
// 4. Глобальный '*'
|
|
154
|
+
const starRule = this._config.rules['*'];
|
|
155
|
+
if (starRule !== undefined) {
|
|
156
|
+
const d = this._resolveRule('*', starRule, isFile ? paths : [], workingDir);
|
|
157
|
+
if (d)
|
|
158
|
+
return d;
|
|
159
|
+
}
|
|
160
|
+
// 5. Дефолт: allow
|
|
161
|
+
return {
|
|
162
|
+
action: 'allow',
|
|
163
|
+
reason: `нет правил permissions для "${toolName}" — разрешено по умолчанию`,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
_resolveRule(key, rule, paths, workingDir) {
|
|
167
|
+
if (typeof rule === 'string') {
|
|
168
|
+
return { action: rule, reason: `правило "${key}" → ${rule}`, matchedRule: key };
|
|
169
|
+
}
|
|
170
|
+
// Объект — файловые паттерны. Для тулов без путей учитываем только '*'.
|
|
171
|
+
if (paths.length === 0) {
|
|
172
|
+
const star = rule['*'];
|
|
173
|
+
if (star) {
|
|
174
|
+
return { action: star, reason: `правило "${key}.*" → ${star}`, matchedRule: `${key}.*` };
|
|
175
|
+
}
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
let starAction;
|
|
179
|
+
for (const [pattern, action] of Object.entries(rule)) {
|
|
180
|
+
if (pattern === '*') {
|
|
181
|
+
starAction = action;
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
for (const p of paths) {
|
|
185
|
+
if (matchPathPattern(pattern, p, workingDir)) {
|
|
186
|
+
return {
|
|
187
|
+
action,
|
|
188
|
+
reason: `правило "${key}.${pattern}" → ${action} (путь: ${p})`,
|
|
189
|
+
matchedRule: `${key}.${pattern}`,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (starAction) {
|
|
195
|
+
return {
|
|
196
|
+
action: starAction,
|
|
197
|
+
reason: `правило "${key}.*" → ${starAction}`,
|
|
198
|
+
matchedRule: `${key}.*`,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
return undefined;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/** Резолвит все файловые параметры тула в абсолютные пути. */
|
|
205
|
+
export function extractPaths(toolName, params, workingDir) {
|
|
206
|
+
const paramNames = TOOL_PATH_PARAMS[toolName];
|
|
207
|
+
if (!paramNames || paramNames.length === 0)
|
|
208
|
+
return [];
|
|
209
|
+
const result = [];
|
|
210
|
+
for (const name of paramNames) {
|
|
211
|
+
const value = params[name];
|
|
212
|
+
if (typeof value === 'string' && value.trim() !== '') {
|
|
213
|
+
result.push(resolvePath(value, workingDir));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return result;
|
|
217
|
+
}
|
|
218
|
+
/** Совпадает ли путь с паттерном (абсолютный или относительный от workingDir). */
|
|
219
|
+
export function matchPathPattern(pattern, absolutePath, workingDir) {
|
|
220
|
+
if (globMatch(pattern, absolutePath))
|
|
221
|
+
return true;
|
|
222
|
+
if (isInsideWorkingDir(absolutePath, workingDir)) {
|
|
223
|
+
const rel = relative(workingDir, absolutePath);
|
|
224
|
+
if (globMatch(pattern, rel))
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
export function isInsideWorkingDir(p, workingDir) {
|
|
230
|
+
const abs = isAbsolute(p) ? normalize(p) : resolve(workingDir, p);
|
|
231
|
+
const dir = isAbsolute(workingDir) ? normalize(workingDir) : resolve(workingDir);
|
|
232
|
+
if (abs === dir)
|
|
233
|
+
return true;
|
|
234
|
+
return abs.startsWith(dir.endsWith(sep) ? dir : dir + sep);
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../src/engine/permission/evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.test.d.ts","sourceRoot":"","sources":["../../../src/engine/permission/evaluator.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { PermissionEvaluator, extractPaths, isInsideWorkingDir } from './evaluator.js';
|
|
4
|
+
import { deriveSubagentPermission } from './derive.js';
|
|
5
|
+
import { globMatch } from '@itphx/synth-shared';
|
|
6
|
+
const CWD = '/workspace/project';
|
|
7
|
+
function evalCheck(config, toolName, params, capabilities) {
|
|
8
|
+
return new PermissionEvaluator(config).check({ toolName, params, workingDir: CWD, capabilities });
|
|
9
|
+
}
|
|
10
|
+
describe('globMatch', () => {
|
|
11
|
+
it('базовые паттерны', () => {
|
|
12
|
+
expect(globMatch('*.env', '.env')).toBe(true);
|
|
13
|
+
expect(globMatch('*.env', 'config/.env')).toBe(false);
|
|
14
|
+
expect(globMatch('**/*.env', 'config/.env')).toBe(true);
|
|
15
|
+
expect(globMatch('**/credentials.*', 'src/credentials.json')).toBe(true);
|
|
16
|
+
expect(globMatch('/tmp/*', '/tmp/foo.txt')).toBe(true);
|
|
17
|
+
expect(globMatch('/tmp/*', '/tmp/a/b.txt')).toBe(false);
|
|
18
|
+
expect(globMatch('src/**/*.ts', 'src/a/b/c.ts')).toBe(true);
|
|
19
|
+
expect(globMatch('src/*.ts', 'src/a.ts')).toBe(true);
|
|
20
|
+
expect(globMatch('src/*.ts', 'src/a/b.ts')).toBe(false);
|
|
21
|
+
expect(globMatch('*.{ts,js}', 'a.ts')).toBe(true);
|
|
22
|
+
expect(globMatch('*.{ts,js}', 'a.md')).toBe(false);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe('PermissionEvaluator — приоритет правил', () => {
|
|
26
|
+
it('правило по имени тула приоритетнее группового и "*"', () => {
|
|
27
|
+
const cfg = {
|
|
28
|
+
rules: { '*': 'allow', read: { '*': 'allow' }, read_file: 'deny' },
|
|
29
|
+
askTimeoutMs: 30_000,
|
|
30
|
+
};
|
|
31
|
+
expect(evalCheck(cfg, 'read_file', { file_path: 'a.txt' }).action).toBe('deny');
|
|
32
|
+
});
|
|
33
|
+
it('групповое правило приоритетнее "*"', () => {
|
|
34
|
+
const cfg = {
|
|
35
|
+
rules: { '*': 'allow', read: 'deny' },
|
|
36
|
+
askTimeoutMs: 30_000,
|
|
37
|
+
};
|
|
38
|
+
expect(evalCheck(cfg, 'read_file', { file_path: 'a.txt' }).action).toBe('deny');
|
|
39
|
+
// не входящий в группу тул — только '*'
|
|
40
|
+
expect(evalCheck(cfg, 'web_fetch', { url: 'http://x' }).action).toBe('allow');
|
|
41
|
+
});
|
|
42
|
+
it('дефолт allow при пустом конфиге', () => {
|
|
43
|
+
const cfg = { rules: {}, askTimeoutMs: 30_000 };
|
|
44
|
+
expect(evalCheck(cfg, 'write_file', { file_path: 'a.txt' }).action).toBe('allow');
|
|
45
|
+
});
|
|
46
|
+
it('специфичный файловый паттерн побеждает "*" внутри группы', () => {
|
|
47
|
+
const cfg = {
|
|
48
|
+
rules: { read: { '*': 'allow', '*.env': 'ask' } },
|
|
49
|
+
askTimeoutMs: 30_000,
|
|
50
|
+
};
|
|
51
|
+
expect(evalCheck(cfg, 'read_file', { file_path: '.env' }).action).toBe('ask');
|
|
52
|
+
expect(evalCheck(cfg, 'read_file', { file_path: 'src/main.ts' }).action).toBe('allow');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('PermissionEvaluator — группы', () => {
|
|
56
|
+
it('read применяется к read_file/list_directory/glob', () => {
|
|
57
|
+
const cfg = { rules: { read: 'deny' }, askTimeoutMs: 30_000 };
|
|
58
|
+
expect(evalCheck(cfg, 'read_file', { file_path: 'a.txt' }).action).toBe('deny');
|
|
59
|
+
expect(evalCheck(cfg, 'list_directory', { path: 'src' }).action).toBe('deny');
|
|
60
|
+
expect(evalCheck(cfg, 'glob', { pattern: '**/*.ts', path: 'src' }).action).toBe('deny');
|
|
61
|
+
});
|
|
62
|
+
it('edit применяется к write_file/edit_file/delete_file/create_directory', () => {
|
|
63
|
+
const cfg = { rules: { edit: 'deny' }, askTimeoutMs: 30_000 };
|
|
64
|
+
expect(evalCheck(cfg, 'write_file', { file_path: 'a.txt', content: 'x' }).action).toBe('deny');
|
|
65
|
+
expect(evalCheck(cfg, 'edit_file', { file_path: 'a.txt', old_string: 'a', new_string: 'b' }).action).toBe('deny');
|
|
66
|
+
expect(evalCheck(cfg, 'delete_file', { file_path: 'a.txt' }).action).toBe('deny');
|
|
67
|
+
expect(evalCheck(cfg, 'create_directory', { path: 'new' }).action).toBe('deny');
|
|
68
|
+
});
|
|
69
|
+
it('shell применяется к execute_shell', () => {
|
|
70
|
+
const cfg = { rules: { shell: 'ask' }, askTimeoutMs: 30_000 };
|
|
71
|
+
expect(evalCheck(cfg, 'execute_shell', { command: 'ls' }).action).toBe('ask');
|
|
72
|
+
});
|
|
73
|
+
it('capability-имя группы работает (file_write)', () => {
|
|
74
|
+
const cfg = { rules: { file_write: 'deny' }, askTimeoutMs: 30_000 };
|
|
75
|
+
expect(evalCheck(cfg, 'write_file', { file_path: 'a.txt', content: 'x' }, ['file_write']).action).toBe('deny');
|
|
76
|
+
});
|
|
77
|
+
it('mcp-группа матчит динамические тулы по capability', () => {
|
|
78
|
+
const cfg = { rules: { mcp: 'deny' }, askTimeoutMs: 30_000 };
|
|
79
|
+
expect(evalCheck(cfg, 'some_mcp_tool', {}, ['mcp']).action).toBe('deny');
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe('PermissionEvaluator — файловые паттерны', () => {
|
|
83
|
+
it('паттерн матчится по относительному и абсолютному пути', () => {
|
|
84
|
+
const cfg = {
|
|
85
|
+
rules: { read: { '*': 'allow', '**/credentials.*': 'deny', '*.env': 'ask' } },
|
|
86
|
+
askTimeoutMs: 30_000,
|
|
87
|
+
};
|
|
88
|
+
const absCred = join(CWD, 'src', 'credentials.json');
|
|
89
|
+
expect(evalCheck(cfg, 'read_file', { file_path: absCred }).action).toBe('deny');
|
|
90
|
+
expect(evalCheck(cfg, 'read_file', { file_path: 'src/credentials.json' }).action).toBe('deny');
|
|
91
|
+
// *.env — только файлы в корне workingDir (вложенные требуют **)
|
|
92
|
+
expect(evalCheck(cfg, 'read_file', { file_path: 'config/.env' }).action).toBe('allow');
|
|
93
|
+
expect(evalCheck(cfg, 'read_file', { file_path: 'config/.env' }).matchedRule).toBe('read.*');
|
|
94
|
+
});
|
|
95
|
+
it('паттерн "*.env" матчит файл в корне workingDir', () => {
|
|
96
|
+
const cfg = {
|
|
97
|
+
rules: { read: { '*': 'allow', '*.env': 'ask' } },
|
|
98
|
+
askTimeoutMs: 30_000,
|
|
99
|
+
};
|
|
100
|
+
expect(evalCheck(cfg, 'read_file', { file_path: join(CWD, '.env') }).action).toBe('ask');
|
|
101
|
+
expect(evalCheck(cfg, 'read_file', { file_path: '.env' }).matchedRule).toBe('read.*.env');
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('PermissionEvaluator — external_directory', () => {
|
|
105
|
+
it('путь вне workingDir проверяется по секции external_directory', () => {
|
|
106
|
+
const cfg = {
|
|
107
|
+
rules: { external_directory: { '*': 'ask', '/tmp/*': 'allow' } },
|
|
108
|
+
askTimeoutMs: 30_000,
|
|
109
|
+
};
|
|
110
|
+
expect(evalCheck(cfg, 'read_file', { file_path: '/tmp/x.txt' }).action).toBe('allow');
|
|
111
|
+
expect(evalCheck(cfg, 'read_file', { file_path: '/etc/passwd' }).action).toBe('ask');
|
|
112
|
+
// внутри workingDir external_directory не применяется
|
|
113
|
+
expect(evalCheck(cfg, 'read_file', { file_path: 'a.txt' }).action).toBe('allow');
|
|
114
|
+
});
|
|
115
|
+
it('external_directory работает для execute_shell cwd', () => {
|
|
116
|
+
const cfg = {
|
|
117
|
+
rules: { external_directory: { '*': 'deny' }, '*': 'allow' },
|
|
118
|
+
askTimeoutMs: 30_000,
|
|
119
|
+
};
|
|
120
|
+
expect(evalCheck(cfg, 'execute_shell', { command: 'ls', cwd: '/elsewhere' }).action).toBe('deny');
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
describe('PermissionEvaluator — plan_enter/plan_exit (имена тулов)', () => {
|
|
124
|
+
it('слой готов к ещё не реализованным тулам', () => {
|
|
125
|
+
const cfg = {
|
|
126
|
+
rules: { '*': 'allow', plan_enter: 'deny', plan_exit: 'deny', doom_loop: 'ask', question: 'deny' },
|
|
127
|
+
askTimeoutMs: 30_000,
|
|
128
|
+
};
|
|
129
|
+
expect(evalCheck(cfg, 'plan_enter', {}).action).toBe('deny');
|
|
130
|
+
expect(evalCheck(cfg, 'plan_exit', {}).action).toBe('deny');
|
|
131
|
+
expect(evalCheck(cfg, 'doom_loop', {}).action).toBe('ask');
|
|
132
|
+
expect(evalCheck(cfg, 'question', {}).action).toBe('deny');
|
|
133
|
+
expect(evalCheck(cfg, 'read_file', { file_path: 'a.txt' }).action).toBe('allow');
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe('PermissionEvaluator — plan mode (AD-025)', () => {
|
|
137
|
+
function planCheck(toolName, params, opts = {}) {
|
|
138
|
+
return new PermissionEvaluator({ rules: {}, askTimeoutMs: 30_000 }).check({
|
|
139
|
+
toolName,
|
|
140
|
+
params,
|
|
141
|
+
workingDir: CWD,
|
|
142
|
+
sessionMode: opts.sessionMode ?? 'act',
|
|
143
|
+
planMode: opts.planMode ?? 'auto',
|
|
144
|
+
planApproved: opts.planApproved ?? false,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
it('mode=plan блокирует write/edit/delete тулы', () => {
|
|
148
|
+
expect(planCheck('write_file', { file_path: 'a.txt', content: 'x' }, { sessionMode: 'plan' }).action).toBe('deny');
|
|
149
|
+
expect(planCheck('edit_file', { file_path: 'a.txt', old_string: 'a', new_string: 'b' }, { sessionMode: 'plan' }).action).toBe('deny');
|
|
150
|
+
expect(planCheck('delete_file', { file_path: 'a.txt' }, { sessionMode: 'plan' }).action).toBe('deny');
|
|
151
|
+
expect(planCheck('create_directory', { path: 'new' }, { sessionMode: 'plan' }).action).toBe('deny');
|
|
152
|
+
});
|
|
153
|
+
it('mode=plan разрешает запись в .synth/plans/*.md', () => {
|
|
154
|
+
const d = planCheck('write_file', { file_path: '.synth/plans/2026-01-01-100000-plan.md', content: 'x' }, { sessionMode: 'plan' });
|
|
155
|
+
expect(d.action).toBe('allow');
|
|
156
|
+
expect(d.matchedRule).toBe('plan.plans');
|
|
157
|
+
});
|
|
158
|
+
it('mode=plan не блокирует read-тулы', () => {
|
|
159
|
+
expect(planCheck('read_file', { file_path: 'a.txt' }, { sessionMode: 'plan' }).action).toBe('allow');
|
|
160
|
+
expect(planCheck('grep_files', { path: 'src', pattern: 'x' }, { sessionMode: 'plan' }).action).toBe('allow');
|
|
161
|
+
});
|
|
162
|
+
it('mode=plan не блокирует plan_enter/plan_exit (сами управляют режимом)', () => {
|
|
163
|
+
expect(planCheck('plan_enter', {}, { sessionMode: 'plan' }).action).toBe('allow');
|
|
164
|
+
expect(planCheck('plan_exit', { plan: 'x' }, { sessionMode: 'plan' }).action).toBe('allow');
|
|
165
|
+
});
|
|
166
|
+
it('strict без утверждённого плана блокирует write', () => {
|
|
167
|
+
expect(planCheck('write_file', { file_path: 'a.txt', content: 'x' }, { planMode: 'strict', planApproved: false }).action).toBe('deny');
|
|
168
|
+
});
|
|
169
|
+
it('strict с утверждённым планом разрешает write', () => {
|
|
170
|
+
expect(planCheck('write_file', { file_path: 'a.txt', content: 'x' }, { planMode: 'strict', planApproved: true }).action).toBe('allow');
|
|
171
|
+
});
|
|
172
|
+
it('strict без плана разрешает чтение', () => {
|
|
173
|
+
expect(planCheck('read_file', { file_path: 'a.txt' }, { planMode: 'strict', planApproved: false }).action).toBe('allow');
|
|
174
|
+
});
|
|
175
|
+
it('mode=plan блокирует git-запись', () => {
|
|
176
|
+
expect(planCheck('git_commit', { path: '.' }, { sessionMode: 'plan' }).action).toBe('deny');
|
|
177
|
+
expect(planCheck('git_push', {}, { sessionMode: 'plan' }).action).toBe('deny');
|
|
178
|
+
expect(planCheck('git_pull', {}, { sessionMode: 'plan' }).action).toBe('deny');
|
|
179
|
+
expect(planCheck('git_checkout', { branch: 'main' }, { sessionMode: 'plan' }).action).toBe('deny');
|
|
180
|
+
expect(planCheck('git_stash', { action: 'push' }, { sessionMode: 'plan' }).action).toBe('deny');
|
|
181
|
+
});
|
|
182
|
+
it('strict без плана блокирует git-запись', () => {
|
|
183
|
+
expect(planCheck('git_commit', { path: '.' }, { planMode: 'strict', planApproved: false }).action).toBe('deny');
|
|
184
|
+
});
|
|
185
|
+
it('mode=plan оставляет git-чтение доступным', () => {
|
|
186
|
+
expect(planCheck('git_status', { path: '.' }, { sessionMode: 'plan' }).action).toBe('allow');
|
|
187
|
+
expect(planCheck('git_diff', {}, { sessionMode: 'plan' }).action).toBe('allow');
|
|
188
|
+
expect(planCheck('git_log', {}, { sessionMode: 'plan' }).action).toBe('allow');
|
|
189
|
+
expect(planCheck('git_branch_list', {}, { sessionMode: 'plan' }).action).toBe('allow');
|
|
190
|
+
expect(planCheck('git_show', {}, { sessionMode: 'plan' }).action).toBe('allow');
|
|
191
|
+
expect(planCheck('git_blame', {}, { sessionMode: 'plan' }).action).toBe('allow');
|
|
192
|
+
});
|
|
193
|
+
it('strict без плана оставляет git-чтение доступным', () => {
|
|
194
|
+
expect(planCheck('git_status', { path: '.' }, { planMode: 'strict', planApproved: false }).action).toBe('allow');
|
|
195
|
+
});
|
|
196
|
+
it('mode=plan в act-режиме не блокирует git-запись', () => {
|
|
197
|
+
expect(planCheck('git_commit', { path: '.' }, { sessionMode: 'act', planMode: 'auto' }).action).toBe('allow');
|
|
198
|
+
});
|
|
199
|
+
it('off никогда не блокирует write', () => {
|
|
200
|
+
expect(planCheck('write_file', { file_path: 'a.txt', content: 'x' }, { planMode: 'off', sessionMode: 'plan', planApproved: false }).action).toBe('allow');
|
|
201
|
+
});
|
|
202
|
+
it('auto в act-режиме не блокирует write', () => {
|
|
203
|
+
expect(planCheck('write_file', { file_path: 'a.txt', content: 'x' }, { planMode: 'auto', sessionMode: 'act' }).action).toBe('allow');
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
describe('PermissionEvaluator — MCP доступность по режимам (plan/act)', () => {
|
|
207
|
+
function mcpCheck(mcpToolSettings, opts = {}) {
|
|
208
|
+
return new PermissionEvaluator({ rules: {}, askTimeoutMs: 30_000 }).check({
|
|
209
|
+
toolName: 'github_create_issue',
|
|
210
|
+
params: {},
|
|
211
|
+
workingDir: CWD,
|
|
212
|
+
capabilities: ['mcp'],
|
|
213
|
+
sessionMode: opts.sessionMode ?? 'act',
|
|
214
|
+
mcpToolSettings,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
it('plan=false в plan-режиме — deny', () => {
|
|
218
|
+
const d = mcpCheck({ github: { default: { plan: false, act: true } } }, { sessionMode: 'plan' });
|
|
219
|
+
expect(d.action).toBe('deny');
|
|
220
|
+
expect(d.matchedRule).toBe('mcp.mode');
|
|
221
|
+
});
|
|
222
|
+
it('plan=true в plan-режиме — allow', () => {
|
|
223
|
+
const d = mcpCheck({ github: { default: { plan: true, act: true } } }, { sessionMode: 'plan' });
|
|
224
|
+
expect(d.action).toBe('allow');
|
|
225
|
+
});
|
|
226
|
+
it('act=false в act-режиме — deny', () => {
|
|
227
|
+
const d = mcpCheck({ github: { default: { plan: true, act: false } } }, { sessionMode: 'act' });
|
|
228
|
+
expect(d.action).toBe('deny');
|
|
229
|
+
});
|
|
230
|
+
it('act=true в act-режиме — allow', () => {
|
|
231
|
+
const d = mcpCheck({ github: { default: { plan: true, act: true } } }, { sessionMode: 'act' });
|
|
232
|
+
expect(d.action).toBe('allow');
|
|
233
|
+
});
|
|
234
|
+
it('точечная настройка tools приоритетнее default', () => {
|
|
235
|
+
const d = mcpCheck({
|
|
236
|
+
github: { default: { plan: true, act: true }, tools: { create_issue: { plan: false, act: true } } },
|
|
237
|
+
}, { sessionMode: 'plan' });
|
|
238
|
+
expect(d.action).toBe('deny');
|
|
239
|
+
});
|
|
240
|
+
it('без настроек для сервера — доступен (обратная совместимость)', () => {
|
|
241
|
+
const d = mcpCheck({ other_server: { default: { plan: false, act: false } } }, { sessionMode: 'plan' });
|
|
242
|
+
expect(d.action).toBe('allow');
|
|
243
|
+
});
|
|
244
|
+
it('без mcpToolSettings — доступен (обратная совместимость)', () => {
|
|
245
|
+
const d = new PermissionEvaluator({ rules: {}, askTimeoutMs: 30_000 }).check({
|
|
246
|
+
toolName: 'github_create_issue',
|
|
247
|
+
params: {},
|
|
248
|
+
workingDir: CWD,
|
|
249
|
+
capabilities: ['mcp'],
|
|
250
|
+
sessionMode: 'plan',
|
|
251
|
+
});
|
|
252
|
+
expect(d.action).toBe('allow');
|
|
253
|
+
});
|
|
254
|
+
it('не-MCP тулы не затрагиваются настройками', () => {
|
|
255
|
+
const d = new PermissionEvaluator({ rules: {}, askTimeoutMs: 30_000 }).check({
|
|
256
|
+
toolName: 'read_file',
|
|
257
|
+
params: { file_path: 'a.txt' },
|
|
258
|
+
workingDir: CWD,
|
|
259
|
+
sessionMode: 'plan',
|
|
260
|
+
mcpToolSettings: { github: { default: { plan: false, act: false } } },
|
|
261
|
+
});
|
|
262
|
+
expect(d.action).toBe('allow');
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
describe('PermissionEvaluator — yolo mode (AD-025)', () => {
|
|
266
|
+
function yoloCheck(config, toolName, params, opts = {}) {
|
|
267
|
+
return new PermissionEvaluator(config).check({
|
|
268
|
+
toolName,
|
|
269
|
+
params,
|
|
270
|
+
workingDir: CWD,
|
|
271
|
+
capabilities: opts.capabilities,
|
|
272
|
+
sessionMode: opts.sessionMode ?? 'yolo',
|
|
273
|
+
planMode: opts.planMode ?? 'auto',
|
|
274
|
+
planApproved: opts.planApproved ?? false,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
it('ask трансформируется в allow (автоподтверждение)', () => {
|
|
278
|
+
const cfg = { rules: { write_file: 'ask' }, askTimeoutMs: 30_000 };
|
|
279
|
+
const d = yoloCheck(cfg, 'write_file', { file_path: 'a.txt', content: 'x' });
|
|
280
|
+
expect(d.action).toBe('allow');
|
|
281
|
+
expect(d.reason).toContain('yolo');
|
|
282
|
+
});
|
|
283
|
+
it('ask на групповом правиле и "*" тоже трансформируется в allow', () => {
|
|
284
|
+
const cfg = { rules: { shell: 'ask' }, askTimeoutMs: 30_000 };
|
|
285
|
+
expect(yoloCheck(cfg, 'execute_shell', { command: 'ls' }).action).toBe('allow');
|
|
286
|
+
const starCfg = { rules: { '*': 'ask' }, askTimeoutMs: 30_000 };
|
|
287
|
+
expect(yoloCheck(starCfg, 'read_file', { file_path: 'a.txt' }).action).toBe('allow');
|
|
288
|
+
});
|
|
289
|
+
it('deny остаётся deny (не трансформируется)', () => {
|
|
290
|
+
const cfg = { rules: { write_file: 'deny', '*.env': 'deny' }, askTimeoutMs: 30_000 };
|
|
291
|
+
expect(yoloCheck(cfg, 'write_file', { file_path: 'a.txt', content: 'x' }).action).toBe('deny');
|
|
292
|
+
});
|
|
293
|
+
it('allow остаётся allow', () => {
|
|
294
|
+
const cfg = { rules: { read_file: 'allow' }, askTimeoutMs: 30_000 };
|
|
295
|
+
expect(yoloCheck(cfg, 'read_file', { file_path: 'a.txt' }).action).toBe('allow');
|
|
296
|
+
});
|
|
297
|
+
it('plan-рестрикция не активируется самим режимом yolo', () => {
|
|
298
|
+
// write не блокируется из-за yolo (режим plan блокирует — но yolo не plan)
|
|
299
|
+
const cfg = { rules: {}, askTimeoutMs: 30_000 };
|
|
300
|
+
expect(yoloCheck(cfg, 'write_file', { file_path: 'a.txt', content: 'x' }).action).toBe('allow');
|
|
301
|
+
});
|
|
302
|
+
it('в yolo deny от MCP-доступности остаётся deny', () => {
|
|
303
|
+
const cfg = { rules: {}, askTimeoutMs: 30_000 };
|
|
304
|
+
const d = new PermissionEvaluator(cfg).check({
|
|
305
|
+
toolName: 'github_create_issue',
|
|
306
|
+
params: {},
|
|
307
|
+
workingDir: CWD,
|
|
308
|
+
capabilities: ['mcp'],
|
|
309
|
+
sessionMode: 'yolo',
|
|
310
|
+
mcpToolSettings: { github: { default: { plan: true, act: false } } },
|
|
311
|
+
});
|
|
312
|
+
expect(d.action).toBe('deny');
|
|
313
|
+
});
|
|
314
|
+
it('strict без утверждённого плана блокирует write даже в yolo', () => {
|
|
315
|
+
const cfg = { rules: {}, askTimeoutMs: 30_000 };
|
|
316
|
+
const d = yoloCheck(cfg, 'write_file', { file_path: 'a.txt', content: 'x' }, { planMode: 'strict', planApproved: false });
|
|
317
|
+
expect(d.action).toBe('deny');
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
describe('deriveSubagentPermission', () => {
|
|
321
|
+
it('наследует правила родителя и добавляет deny на question/plan_enter/plan_exit/task', () => {
|
|
322
|
+
const parent = {
|
|
323
|
+
rules: { '*': 'allow', read: 'allow' },
|
|
324
|
+
askTimeoutMs: 10_000,
|
|
325
|
+
};
|
|
326
|
+
const derived = deriveSubagentPermission(parent);
|
|
327
|
+
expect(derived.askTimeoutMs).toBe(10_000);
|
|
328
|
+
expect(derived.rules['*']).toBe('allow');
|
|
329
|
+
expect(derived.rules.read).toBe('allow');
|
|
330
|
+
expect(derived.rules.question).toBe('deny');
|
|
331
|
+
expect(derived.rules.plan_enter).toBe('deny');
|
|
332
|
+
expect(derived.rules.plan_exit).toBe('deny');
|
|
333
|
+
expect(derived.rules.task).toBe('deny');
|
|
334
|
+
// deny на конкретное имя переопределяет allow из '*'
|
|
335
|
+
expect(evalCheck(derived, 'task', {}).action).toBe('deny');
|
|
336
|
+
expect(evalCheck(derived, 'question', {}).action).toBe('deny');
|
|
337
|
+
});
|
|
338
|
+
it('без родителя — только deny-дополнения', () => {
|
|
339
|
+
const derived = deriveSubagentPermission();
|
|
340
|
+
expect(derived.rules).toEqual({
|
|
341
|
+
question: 'deny',
|
|
342
|
+
plan_enter: 'deny',
|
|
343
|
+
plan_exit: 'deny',
|
|
344
|
+
task: 'deny',
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
it('не мутирует родительский конфиг', () => {
|
|
348
|
+
const parent = { rules: { '*': 'allow' }, askTimeoutMs: 5000 };
|
|
349
|
+
deriveSubagentPermission(parent);
|
|
350
|
+
expect(parent.rules).toEqual({ '*': 'allow' });
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
describe('extractPaths / isInsideWorkingDir', () => {
|
|
354
|
+
it('extractPaths резолвит файловые параметры', () => {
|
|
355
|
+
expect(extractPaths('read_file', { file_path: 'a.txt' }, CWD)).toEqual([join(CWD, 'a.txt')]);
|
|
356
|
+
expect(extractPaths('read_file', { file_path: '/abs/a.txt' }, CWD)).toEqual(['/abs/a.txt']);
|
|
357
|
+
expect(extractPaths('write_file', { file_path: '' }, CWD)).toEqual([]);
|
|
358
|
+
expect(extractPaths('execute_shell', { command: 'ls', cwd: 'sub' }, CWD)).toEqual([join(CWD, 'sub')]);
|
|
359
|
+
expect(extractPaths('web_fetch', { url: 'http://x' }, CWD)).toEqual([]);
|
|
360
|
+
});
|
|
361
|
+
it('isInsideWorkingDir', () => {
|
|
362
|
+
expect(isInsideWorkingDir(join(CWD, 'a.txt'), CWD)).toBe(true);
|
|
363
|
+
expect(isInsideWorkingDir(CWD, CWD)).toBe(true);
|
|
364
|
+
expect(isInsideWorkingDir('/tmp/x', CWD)).toBe(false);
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
//# sourceMappingURL=evaluator.test.js.map
|