mova_agent 0.1.1
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/README.md +94 -0
- package/build/scripts/check_docs.d.ts +2 -0
- package/build/scripts/check_docs.d.ts.map +1 -0
- package/build/scripts/check_docs.js +48 -0
- package/build/scripts/check_docs.js.map +1 -0
- package/build/scripts/check_schema_paths.d.ts +3 -0
- package/build/scripts/check_schema_paths.d.ts.map +1 -0
- package/build/scripts/check_schema_paths.js +15 -0
- package/build/scripts/check_schema_paths.js.map +1 -0
- package/build/scripts/check_schema_paths_dist.d.ts +3 -0
- package/build/scripts/check_schema_paths_dist.d.ts.map +1 -0
- package/build/scripts/check_schema_paths_dist.js +16 -0
- package/build/scripts/check_schema_paths_dist.js.map +1 -0
- package/build/scripts/check_structure.d.ts +2 -0
- package/build/scripts/check_structure.d.ts.map +1 -0
- package/build/scripts/check_structure.js +59 -0
- package/build/scripts/check_structure.js.map +1 -0
- package/build/scripts/debug_validate.d.ts +3 -0
- package/build/scripts/debug_validate.d.ts.map +1 -0
- package/build/scripts/debug_validate.js +39 -0
- package/build/scripts/debug_validate.js.map +1 -0
- package/build/scripts/debug_validate2.d.ts +3 -0
- package/build/scripts/debug_validate2.d.ts.map +1 -0
- package/build/scripts/debug_validate2.js +18 -0
- package/build/scripts/debug_validate2.js.map +1 -0
- package/build/scripts/debug_validate_runtime.d.ts +3 -0
- package/build/scripts/debug_validate_runtime.d.ts.map +1 -0
- package/build/scripts/debug_validate_runtime.js +39 -0
- package/build/scripts/debug_validate_runtime.js.map +1 -0
- package/build/scripts/dump_ajv_schemas.d.ts +2 -0
- package/build/scripts/dump_ajv_schemas.d.ts.map +1 -0
- package/build/scripts/dump_ajv_schemas.js +22 -0
- package/build/scripts/dump_ajv_schemas.js.map +1 -0
- package/build/scripts/dump_resolved_schema.d.ts +3 -0
- package/build/scripts/dump_resolved_schema.d.ts.map +1 -0
- package/build/scripts/dump_resolved_schema.js +22 -0
- package/build/scripts/dump_resolved_schema.js.map +1 -0
- package/build/scripts/gen_types.d.ts +2 -0
- package/build/scripts/gen_types.d.ts.map +1 -0
- package/build/scripts/gen_types.js +133 -0
- package/build/scripts/gen_types.js.map +1 -0
- package/build/scripts/inspect_validation.d.ts +3 -0
- package/build/scripts/inspect_validation.d.ts.map +1 -0
- package/build/scripts/inspect_validation.js +36 -0
- package/build/scripts/inspect_validation.js.map +1 -0
- package/build/scripts/legacy/check_errors.d.ts +3 -0
- package/build/scripts/legacy/check_errors.d.ts.map +1 -0
- package/build/scripts/legacy/check_errors.js +14 -0
- package/build/scripts/legacy/check_errors.js.map +1 -0
- package/build/scripts/legacy/compile_test.d.ts +5 -0
- package/build/scripts/legacy/compile_test.d.ts.map +1 -0
- package/build/scripts/legacy/compile_test.js +25 -0
- package/build/scripts/legacy/compile_test.js.map +1 -0
- package/build/scripts/legacy/debug_neg.d.ts +6 -0
- package/build/scripts/legacy/debug_neg.d.ts.map +1 -0
- package/build/scripts/legacy/debug_neg.js +230 -0
- package/build/scripts/legacy/debug_neg.js.map +1 -0
- package/build/scripts/legacy/debug_quality_pos.d.ts +5 -0
- package/build/scripts/legacy/debug_quality_pos.d.ts.map +1 -0
- package/build/scripts/legacy/debug_quality_pos.js +195 -0
- package/build/scripts/legacy/debug_quality_pos.js.map +1 -0
- package/build/scripts/legacy/debug_test.d.ts +1 -0
- package/build/scripts/legacy/debug_test.d.ts.map +1 -0
- package/build/scripts/legacy/debug_test.js +51 -0
- package/build/scripts/legacy/debug_test.js.map +1 -0
- package/build/scripts/legacy/hello_test.d.ts +1 -0
- package/build/scripts/legacy/hello_test.d.ts.map +1 -0
- package/build/scripts/legacy/hello_test.js +3 -0
- package/build/scripts/legacy/hello_test.js.map +1 -0
- package/build/scripts/legacy/import_test.d.ts +2 -0
- package/build/scripts/legacy/import_test.d.ts.map +1 -0
- package/build/scripts/legacy/import_test.js +4 -0
- package/build/scripts/legacy/import_test.js.map +1 -0
- package/build/scripts/legacy/quality_neg.d.ts +6 -0
- package/build/scripts/legacy/quality_neg.d.ts.map +1 -0
- package/build/scripts/legacy/quality_neg.js +362 -0
- package/build/scripts/legacy/quality_neg.js.map +1 -0
- package/build/scripts/legacy/quality_pos.d.ts +7 -0
- package/build/scripts/legacy/quality_pos.d.ts.map +1 -0
- package/build/scripts/legacy/quality_pos.js +345 -0
- package/build/scripts/legacy/quality_pos.js.map +1 -0
- package/build/scripts/legacy/simple_test.d.ts +2 -0
- package/build/scripts/legacy/simple_test.d.ts.map +1 -0
- package/build/scripts/legacy/simple_test.js +4 -0
- package/build/scripts/legacy/simple_test.js.map +1 -0
- package/build/scripts/legacy/test.d.ts +1 -0
- package/build/scripts/legacy/test.d.ts.map +1 -0
- package/build/scripts/legacy/test.js +3 -0
- package/build/scripts/legacy/test.js.map +1 -0
- package/build/scripts/legacy/test_additional_props.d.ts +6 -0
- package/build/scripts/legacy/test_additional_props.d.ts.map +1 -0
- package/build/scripts/legacy/test_additional_props.js +45 -0
- package/build/scripts/legacy/test_additional_props.js.map +1 -0
- package/build/scripts/legacy/test_ajv_validation.d.ts +2 -0
- package/build/scripts/legacy/test_ajv_validation.d.ts.map +1 -0
- package/build/scripts/legacy/test_ajv_validation.js +35 -0
- package/build/scripts/legacy/test_ajv_validation.js.map +1 -0
- package/build/scripts/legacy/test_build.d.ts +2 -0
- package/build/scripts/legacy/test_build.d.ts.map +1 -0
- package/build/scripts/legacy/test_build.js +14 -0
- package/build/scripts/legacy/test_build.js.map +1 -0
- package/build/scripts/legacy/test_direct.d.ts +3 -0
- package/build/scripts/legacy/test_direct.d.ts.map +1 -0
- package/build/scripts/legacy/test_direct.js +24 -0
- package/build/scripts/legacy/test_direct.js.map +1 -0
- package/build/scripts/legacy/test_import.d.ts +2 -0
- package/build/scripts/legacy/test_import.d.ts.map +1 -0
- package/build/scripts/legacy/test_import.js +7 -0
- package/build/scripts/legacy/test_import.js.map +1 -0
- package/build/scripts/legacy/test_mova_schemas.d.ts +2 -0
- package/build/scripts/legacy/test_mova_schemas.d.ts.map +1 -0
- package/build/scripts/legacy/test_mova_schemas.js +37 -0
- package/build/scripts/legacy/test_mova_schemas.js.map +1 -0
- package/build/scripts/legacy/test_scenario_integration.d.ts +13 -0
- package/build/scripts/legacy/test_scenario_integration.d.ts.map +1 -0
- package/build/scripts/legacy/test_scenario_integration.js +156 -0
- package/build/scripts/legacy/test_scenario_integration.js.map +1 -0
- package/build/scripts/legacy/test_schemas.d.ts +2 -0
- package/build/scripts/legacy/test_schemas.d.ts.map +1 -0
- package/build/scripts/legacy/test_schemas.js +48 -0
- package/build/scripts/legacy/test_schemas.js.map +1 -0
- package/build/scripts/legacy/test_schemas_simple.d.ts +2 -0
- package/build/scripts/legacy/test_schemas_simple.d.ts.map +1 -0
- package/build/scripts/legacy/test_schemas_simple.js +36 -0
- package/build/scripts/legacy/test_schemas_simple.js.map +1 -0
- package/build/scripts/legacy/test_simple.d.ts +4 -0
- package/build/scripts/legacy/test_simple.d.ts.map +1 -0
- package/build/scripts/legacy/test_simple.js +17 -0
- package/build/scripts/legacy/test_simple.js.map +1 -0
- package/build/scripts/legacy/test_warnings.d.ts +6 -0
- package/build/scripts/legacy/test_warnings.d.ts.map +1 -0
- package/build/scripts/legacy/test_warnings.js +48 -0
- package/build/scripts/legacy/test_warnings.js.map +1 -0
- package/build/scripts/legacy/very_simple_test.d.ts +1 -0
- package/build/scripts/legacy/very_simple_test.d.ts.map +1 -0
- package/build/scripts/legacy/very_simple_test.js +3 -0
- package/build/scripts/legacy/very_simple_test.js.map +1 -0
- package/build/scripts/merge_and_validate.d.ts +6 -0
- package/build/scripts/merge_and_validate.d.ts.map +1 -0
- package/build/scripts/merge_and_validate.js +53 -0
- package/build/scripts/merge_and_validate.js.map +1 -0
- package/build/src/ajv/ajv_loader.d.ts +47 -0
- package/build/src/ajv/ajv_loader.d.ts.map +1 -0
- package/build/src/ajv/ajv_loader.js +274 -0
- package/build/src/ajv/ajv_loader.js.map +1 -0
- package/build/src/ajv/schema_registry.d.ts +19 -0
- package/build/src/ajv/schema_registry.d.ts.map +1 -0
- package/build/src/ajv/schema_registry.js +121 -0
- package/build/src/ajv/schema_registry.js.map +1 -0
- package/build/src/drivers/__tests__/registry.test.d.ts +2 -0
- package/build/src/drivers/__tests__/registry.test.d.ts.map +1 -0
- package/build/src/drivers/__tests__/registry.test.js +100 -0
- package/build/src/drivers/__tests__/registry.test.js.map +1 -0
- package/build/src/drivers/httpDriver.d.ts +3 -0
- package/build/src/drivers/httpDriver.d.ts.map +1 -0
- package/build/src/drivers/httpDriver.js +76 -0
- package/build/src/drivers/httpDriver.js.map +1 -0
- package/build/src/drivers/index.d.ts +20 -0
- package/build/src/drivers/index.d.ts.map +1 -0
- package/build/src/drivers/index.js +33 -0
- package/build/src/drivers/index.js.map +1 -0
- package/build/src/drivers/restrictedShellDriver.d.ts +12 -0
- package/build/src/drivers/restrictedShellDriver.d.ts.map +1 -0
- package/build/src/drivers/restrictedShellDriver.js +88 -0
- package/build/src/drivers/restrictedShellDriver.js.map +1 -0
- package/build/src/episodes/__tests__/episode_writer_atomic.test.d.ts +2 -0
- package/build/src/episodes/__tests__/episode_writer_atomic.test.d.ts.map +1 -0
- package/build/src/episodes/__tests__/episode_writer_atomic.test.js +86 -0
- package/build/src/episodes/__tests__/episode_writer_atomic.test.js.map +1 -0
- package/build/src/episodes/episode_writer.d.ts +100 -0
- package/build/src/episodes/episode_writer.d.ts.map +1 -0
- package/build/src/episodes/episode_writer.js +503 -0
- package/build/src/episodes/episode_writer.js.map +1 -0
- package/build/src/episodes/episode_writer_atomic.d.ts +10 -0
- package/build/src/episodes/episode_writer_atomic.d.ts.map +1 -0
- package/build/src/episodes/episode_writer_atomic.js +46 -0
- package/build/src/episodes/episode_writer_atomic.js.map +1 -0
- package/build/src/evidence/evidence_writer.d.ts +16 -0
- package/build/src/evidence/evidence_writer.d.ts.map +1 -0
- package/build/src/evidence/evidence_writer.js +78 -0
- package/build/src/evidence/evidence_writer.js.map +1 -0
- package/build/src/handlers/registry.d.ts +20 -0
- package/build/src/handlers/registry.d.ts.map +1 -0
- package/build/src/handlers/registry.js +38 -0
- package/build/src/handlers/registry.js.map +1 -0
- package/build/src/interpreter/interpreter.d.ts +90 -0
- package/build/src/interpreter/interpreter.d.ts.map +1 -0
- package/build/src/interpreter/interpreter.js +732 -0
- package/build/src/interpreter/interpreter.js.map +1 -0
- package/build/src/interpreter/interpreter_with_budget.d.ts +92 -0
- package/build/src/interpreter/interpreter_with_budget.d.ts.map +1 -0
- package/build/src/interpreter/interpreter_with_budget.js +678 -0
- package/build/src/interpreter/interpreter_with_budget.js.map +1 -0
- package/build/src/logging/logger.d.ts +83 -0
- package/build/src/logging/logger.d.ts.map +1 -0
- package/build/src/logging/logger.js +226 -0
- package/build/src/logging/logger.js.map +1 -0
- package/build/src/policy/policy_engine.d.ts +116 -0
- package/build/src/policy/policy_engine.d.ts.map +1 -0
- package/build/src/policy/policy_engine.js +296 -0
- package/build/src/policy/policy_engine.js.map +1 -0
- package/build/src/skills/skills_layer.d.ts +94 -0
- package/build/src/skills/skills_layer.d.ts.map +1 -0
- package/build/src/skills/skills_layer.js +405 -0
- package/build/src/skills/skills_layer.js.map +1 -0
- package/build/src/telemetry/token_budget_enforcer.d.ts +113 -0
- package/build/src/telemetry/token_budget_enforcer.d.ts.map +1 -0
- package/build/src/telemetry/token_budget_enforcer.js +253 -0
- package/build/src/telemetry/token_budget_enforcer.js.map +1 -0
- package/build/src/telemetry/token_budget_loader.d.ts +29 -0
- package/build/src/telemetry/token_budget_loader.d.ts.map +1 -0
- package/build/src/telemetry/token_budget_loader.js +112 -0
- package/build/src/telemetry/token_budget_loader.js.map +1 -0
- package/build/src/telemetry/token_meter.d.ts +65 -0
- package/build/src/telemetry/token_meter.d.ts.map +1 -0
- package/build/src/telemetry/token_meter.js +153 -0
- package/build/src/telemetry/token_meter.js.map +1 -0
- package/build/src/ux/cli_interface.d.ts +85 -0
- package/build/src/ux/cli_interface.d.ts.map +1 -0
- package/build/src/ux/cli_interface.js +651 -0
- package/build/src/ux/cli_interface.js.map +1 -0
- package/build/test/drivers/registry.test.d.ts +2 -0
- package/build/test/drivers/registry.test.d.ts.map +1 -0
- package/build/test/drivers/registry.test.js +100 -0
- package/build/test/drivers/registry.test.js.map +1 -0
- package/build/test/episodes/episode_writer_atomic.test.d.ts +2 -0
- package/build/test/episodes/episode_writer_atomic.test.d.ts.map +1 -0
- package/build/test/episodes/episode_writer_atomic.test.js +86 -0
- package/build/test/episodes/episode_writer_atomic.test.js.map +1 -0
- package/build/tests/ajv/check_schemas.d.ts +4 -0
- package/build/tests/ajv/check_schemas.d.ts.map +1 -0
- package/build/tests/ajv/check_schemas.js +27 -0
- package/build/tests/ajv/check_schemas.js.map +1 -0
- package/build/tests/ajv/final_test.d.ts +2 -0
- package/build/tests/ajv/final_test.d.ts.map +1 -0
- package/build/tests/ajv/final_test.js +42 -0
- package/build/tests/ajv/final_test.js.map +1 -0
- package/build/tests/ajv/simple_test.d.ts +2 -0
- package/build/tests/ajv/simple_test.d.ts.map +1 -0
- package/build/tests/ajv/simple_test.js +40 -0
- package/build/tests/ajv/simple_test.js.map +1 -0
- package/build/tests/ajv/test_schema_loading.d.ts +2 -0
- package/build/tests/ajv/test_schema_loading.d.ts.map +1 -0
- package/build/tests/ajv/test_schema_loading.js +39 -0
- package/build/tests/ajv/test_schema_loading.js.map +1 -0
- package/build/tools/mova-agent.d.ts +2 -0
- package/build/tools/mova-agent.d.ts.map +1 -0
- package/build/tools/mova-agent.js +15 -0
- package/build/tools/mova-agent.js.map +1 -0
- package/package.json +63 -0
- package/src/ajv/ajv_loader.ts +311 -0
- package/src/ajv/schema_registry.ts +92 -0
- package/src/drivers/httpDriver.ts +90 -0
- package/src/drivers/index.ts +48 -0
- package/src/drivers/restrictedShellDriver.ts +68 -0
- package/src/episodes/episode_writer.ts +675 -0
- package/src/episodes/episode_writer_atomic.ts +44 -0
- package/src/evidence/evidence_writer.ts +74 -0
- package/src/handlers/registry.ts +53 -0
- package/src/interpreter/interpreter.ts +1009 -0
- package/src/interpreter/interpreter_with_budget.ts +923 -0
- package/src/logging/logger.ts +269 -0
- package/src/policy/policy_engine.ts +395 -0
- package/src/skills/skills_layer.ts +510 -0
- package/src/telemetry/token_budget_enforcer.ts +338 -0
- package/src/telemetry/token_budget_loader.ts +133 -0
- package/src/telemetry/token_meter.ts +185 -0
- package/src/types/generated/ds.connector_core_v1.d.ts +116 -0
- package/src/types/generated/ds.instruction_profile_core_v1.d.ts +141 -0
- package/src/types/generated/ds.mova4_core_catalog_v1.d.ts +80 -0
- package/src/types/generated/ds.mova_agent_run_summary_v1.d.ts +120 -0
- package/src/types/generated/ds.mova_agent_step_v1.d.ts +53 -0
- package/src/types/generated/ds.mova_agent_tool_pool_v1.d.ts +152 -0
- package/src/types/generated/ds.mova_agent_validation_report_v1.d.ts +43 -0
- package/src/types/generated/ds.mova_episode_core_v1.d.ts +56 -0
- package/src/types/generated/ds.mova_schema_core_v1.d.ts +49 -0
- package/src/types/generated/ds.mova_token_budget_contract_v0.d.ts +140 -0
- package/src/types/generated/ds.runtime_binding_core_v1.d.ts +112 -0
- package/src/types/generated/ds.security_event_episode_core_v1.d.ts +138 -0
- package/src/types/generated/ds.ui_text_bundle_core_v1.d.ts +118 -0
- package/src/types/generated/env.instruction_profile_publish_v1.d.ts +159 -0
- package/src/types/generated/env.mova4_core_catalog_publish_v1.d.ts +25 -0
- package/src/types/generated/env.mova_agent_plan_v1.d.ts +40 -0
- package/src/types/generated/env.mova_agent_request_v1.d.ts +43 -0
- package/src/types/generated/env.security_event_store_v1.d.ts +191 -0
- package/src/types/generated/index.d.ts +25 -0
- package/src/ux/cli_interface.ts +719 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ajvLoader = exports.AjvSchemaLoader = void 0;
|
|
7
|
+
exports.validate = validate;
|
|
8
|
+
const ajv_1 = __importDefault(require("ajv"));
|
|
9
|
+
const ajv_formats_1 = __importDefault(require("ajv-formats"));
|
|
10
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
// Класс для загрузки и валидации схем
|
|
13
|
+
class AjvSchemaLoader {
|
|
14
|
+
ajv;
|
|
15
|
+
schemaCache;
|
|
16
|
+
schemaSourcePaths;
|
|
17
|
+
// Getter to access the AJV instance for advanced validation
|
|
18
|
+
get getAjv() {
|
|
19
|
+
return this.ajv;
|
|
20
|
+
}
|
|
21
|
+
constructor() {
|
|
22
|
+
// Инициализация AJV с нужными опциями
|
|
23
|
+
this.ajv = new ajv_1.default({
|
|
24
|
+
strict: false, // Disable strict mode to handle complex schemas
|
|
25
|
+
allErrors: true,
|
|
26
|
+
validateFormats: true,
|
|
27
|
+
// Разрешить использование метасхем
|
|
28
|
+
validateSchema: false, // Отключаем валидацию схем при добавлении
|
|
29
|
+
// Для поддержки JSON Schema Draft 2020-12
|
|
30
|
+
$data: true,
|
|
31
|
+
});
|
|
32
|
+
// Добавляем поддержку форматов
|
|
33
|
+
(0, ajv_formats_1.default)(this.ajv);
|
|
34
|
+
// Кэш для загруженных схем
|
|
35
|
+
this.schemaCache = new Map();
|
|
36
|
+
this.schemaSourcePaths = new Map();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Загружает схему из vendor/MOVA или из локальных схем проекта
|
|
40
|
+
*/
|
|
41
|
+
async loadSchema(schemaId) {
|
|
42
|
+
// Определяем путь к схеме
|
|
43
|
+
let schemaPath;
|
|
44
|
+
let isProjectSchema = false;
|
|
45
|
+
// First try local project schemas, then vendor schemas as fallback
|
|
46
|
+
const possibleBasePaths = [
|
|
47
|
+
path_1.default.resolve(__dirname, '../../../schemas'), // Local schemas when built to build/src/ajv/
|
|
48
|
+
path_1.default.resolve(__dirname, '../../schemas'), // Alternative local path
|
|
49
|
+
path_1.default.resolve(__dirname, '../../../../schemas'), // Another local path option
|
|
50
|
+
// Vendor schemas as fallback for MOVA schemas not found locally
|
|
51
|
+
path_1.default.resolve(__dirname, '../../../vendor/MOVA/schemas'), // From build/src/ajv/
|
|
52
|
+
path_1.default.resolve(__dirname, '../../vendor/MOVA/schemas'), // Alternative from build/src/ajv/
|
|
53
|
+
path_1.default.resolve(__dirname, '../../../../vendor/MOVA/schemas'), // From build/tools/ or similar
|
|
54
|
+
];
|
|
55
|
+
let basePathFound = '';
|
|
56
|
+
for (const basePath of possibleBasePaths) {
|
|
57
|
+
const testPath = path_1.default.join(basePath, `${schemaId}.schema.json`);
|
|
58
|
+
if (await fs_extra_1.default.pathExists(testPath)) {
|
|
59
|
+
basePathFound = basePath;
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (basePathFound) {
|
|
64
|
+
schemaPath = path_1.default.join(basePathFound, `${schemaId}.schema.json`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// If no path was found, use the last possible path as fallback
|
|
68
|
+
schemaPath = path_1.default.join(possibleBasePaths[possibleBasePaths.length - 1], `${schemaId}.schema.json`);
|
|
69
|
+
}
|
|
70
|
+
const cachedSchema = this.schemaCache.get(schemaId);
|
|
71
|
+
const cachedPath = this.schemaSourcePaths.get(schemaId);
|
|
72
|
+
if (cachedSchema && cachedPath === schemaPath) {
|
|
73
|
+
return cachedSchema;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
// Загружаем схему из файла
|
|
77
|
+
const schemaContent = await fs_extra_1.default.readJson(schemaPath);
|
|
78
|
+
// Кэшируем схему
|
|
79
|
+
this.schemaCache.set(schemaId, schemaContent);
|
|
80
|
+
this.schemaSourcePaths.set(schemaId, schemaPath);
|
|
81
|
+
return schemaContent;
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
// Если это схема проекта и файл не найден, попробуем найти в директории schemas с расширением
|
|
85
|
+
if (isProjectSchema && !(await fs_extra_1.default.pathExists(schemaPath))) {
|
|
86
|
+
// Пробуем альтернативные пути для схем проекта
|
|
87
|
+
for (const basePath of [
|
|
88
|
+
path_1.default.resolve(__dirname, '../../../schemas'),
|
|
89
|
+
path_1.default.resolve(__dirname, '../../schemas'),
|
|
90
|
+
]) {
|
|
91
|
+
const altSchemaPath = path_1.default.join(basePath, `${schemaId}.schema.json`);
|
|
92
|
+
if (await fs_extra_1.default.pathExists(altSchemaPath)) {
|
|
93
|
+
const schemaContent = await fs_extra_1.default.readJson(altSchemaPath);
|
|
94
|
+
this.schemaCache.set(schemaId, schemaContent);
|
|
95
|
+
this.schemaSourcePaths.set(schemaId, altSchemaPath);
|
|
96
|
+
return schemaContent;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
throw new Error(`Failed to load schema ${schemaId} from ${schemaPath}: ${error.message}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Регистрирует схему в AJV
|
|
105
|
+
*/
|
|
106
|
+
async registerSchema(schemaId) {
|
|
107
|
+
const schema = await this.loadSchema(schemaId);
|
|
108
|
+
// Проверяем, что схема имеет правильный $id
|
|
109
|
+
if (!schema.$id) {
|
|
110
|
+
// Если у схемы нет $id, устанавливаем его
|
|
111
|
+
schema.$id = schemaId;
|
|
112
|
+
}
|
|
113
|
+
// Проверяем, не зарегистрирована ли схема уже
|
|
114
|
+
if (!this.ajv.getSchema(schema.$id)) {
|
|
115
|
+
// Компилируем схему в AJV
|
|
116
|
+
try {
|
|
117
|
+
this.ajv.addSchema(schema);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
// Если ошибка связана с отсутствием зависимостей, это нормально
|
|
121
|
+
// Мы должны сначала загрузить все зависимости, а затем зарегистрировать схему
|
|
122
|
+
if (error.message &&
|
|
123
|
+
(error.message.includes('no schema') || error.message.includes('$ref'))) {
|
|
124
|
+
// Попробуем рекурсивно загрузить зависимости
|
|
125
|
+
await this.loadSchemaDependencies(schema);
|
|
126
|
+
// После загрузки зависимостей, повторно попробуем зарегистрировать схему
|
|
127
|
+
// Remove existing schema first if it was added partially
|
|
128
|
+
if (this.ajv.getSchema(schema.$id)) {
|
|
129
|
+
this.ajv.removeSchema(schema.$id);
|
|
130
|
+
}
|
|
131
|
+
this.ajv.addSchema(schema);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
if (Array.isArray(error) || (error && typeof error === 'object' && 'message' in error)) {
|
|
135
|
+
throw new Error(`Schema ${schemaId} validation error: ${error.message}`);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Загружает зависимости схемы рекурсивно
|
|
146
|
+
*/
|
|
147
|
+
async loadSchemaDependencies(schema) {
|
|
148
|
+
if (!schema || typeof schema !== 'object') {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
// Ищем ссылки на другие схемы
|
|
152
|
+
if (schema.$ref) {
|
|
153
|
+
const ref = schema.$ref;
|
|
154
|
+
if (ref.startsWith('https://') || ref.startsWith('http://')) {
|
|
155
|
+
// Это внешняя ссылка, извлекаем ID схемы из URL
|
|
156
|
+
const schemaId = this.extractSchemaIdFromUrl(ref);
|
|
157
|
+
if (schemaId) {
|
|
158
|
+
await this.registerSchema(schemaId);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else if (ref.includes('.schema.json')) {
|
|
162
|
+
// Это ссылка на файл, извлекаем ID схемы из имени файла
|
|
163
|
+
const schemaId = ref.replace('.schema.json', '').replace('/', '.');
|
|
164
|
+
await this.registerSchema(schemaId);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Рекурсивно обрабатываем свойства схемы
|
|
168
|
+
for (const key in schema) {
|
|
169
|
+
if (typeof schema[key] === 'object' && schema[key] !== null) {
|
|
170
|
+
if (Array.isArray(schema[key])) {
|
|
171
|
+
for (const item of schema[key]) {
|
|
172
|
+
await this.loadSchemaDependencies(item);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
await this.loadSchemaDependencies(schema[key]);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Извлекает ID схемы из URL
|
|
183
|
+
*/
|
|
184
|
+
extractSchemaIdFromUrl(url) {
|
|
185
|
+
// Извлекаем имя файла из URL
|
|
186
|
+
const parts = url.split('/');
|
|
187
|
+
const fileName = parts[parts.length - 1];
|
|
188
|
+
if (fileName.endsWith('.schema.json')) {
|
|
189
|
+
return fileName.replace('.schema.json', '');
|
|
190
|
+
}
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Валидирует данные против схемы
|
|
195
|
+
*/
|
|
196
|
+
async validate(schemaId, data) {
|
|
197
|
+
try {
|
|
198
|
+
// Проверяем, зарегистрирована ли схема
|
|
199
|
+
if (!this.ajv.getSchema(schemaId)) {
|
|
200
|
+
await this.registerSchema(schemaId);
|
|
201
|
+
}
|
|
202
|
+
// Получаем валидатор для схемы
|
|
203
|
+
const validate = this.ajv.getSchema(schemaId);
|
|
204
|
+
if (!validate) {
|
|
205
|
+
// If schema is not compiled, try to compile it directly
|
|
206
|
+
const schema = await this.loadSchema(schemaId);
|
|
207
|
+
if (!schema.$id) {
|
|
208
|
+
schema.$id = schemaId;
|
|
209
|
+
}
|
|
210
|
+
// Compile the schema directly
|
|
211
|
+
const compiledValidate = this.ajv.compile(schema);
|
|
212
|
+
// Execute validation with the compiled function
|
|
213
|
+
const valid = compiledValidate(data);
|
|
214
|
+
if (valid) {
|
|
215
|
+
return { ok: true };
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
// Формируем сообщения об ошибках
|
|
219
|
+
const errors = compiledValidate.errors?.map((error) => `${error.instancePath || 'data'} ${error.message || ''}`) || [];
|
|
220
|
+
return {
|
|
221
|
+
ok: false,
|
|
222
|
+
errors,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Выполняем валидацию
|
|
227
|
+
const valid = validate(data);
|
|
228
|
+
if (valid) {
|
|
229
|
+
return { ok: true };
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
// Формируем сообщения об ошибках
|
|
233
|
+
const errors = validate.errors?.map((error) => `${error.instancePath || 'data'} ${error.message || ''}`) || [];
|
|
234
|
+
return {
|
|
235
|
+
ok: false,
|
|
236
|
+
errors,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
return {
|
|
242
|
+
ok: false,
|
|
243
|
+
errors: [`Validation error: ${error.message}`],
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Проверяет, существует ли схема
|
|
249
|
+
*/
|
|
250
|
+
async schemaExists(schemaId) {
|
|
251
|
+
try {
|
|
252
|
+
await this.loadSchema(schemaId);
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Возвращает список всех загруженных схем
|
|
261
|
+
*/
|
|
262
|
+
getLoadedSchemas() {
|
|
263
|
+
return Array.from(this.schemaCache.keys());
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
exports.AjvSchemaLoader = AjvSchemaLoader;
|
|
267
|
+
// Экспортируем экземпляр загрузчика схем
|
|
268
|
+
const ajvLoader = new AjvSchemaLoader();
|
|
269
|
+
exports.ajvLoader = ajvLoader;
|
|
270
|
+
// Функция validate, которая требуется по спецификации
|
|
271
|
+
async function validate(schemaId, data) {
|
|
272
|
+
return await ajvLoader.validate(schemaId, data);
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=ajv_loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ajv_loader.js","sourceRoot":"","sources":["../../../src/ajv/ajv_loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AjvSchemaLoader } from './ajv_loader';
|
|
2
|
+
declare class SchemaRegistry {
|
|
3
|
+
private loader;
|
|
4
|
+
constructor(loader: AjvSchemaLoader);
|
|
5
|
+
/**
|
|
6
|
+
* Loads all vendor/MOVA schemas
|
|
7
|
+
*/
|
|
8
|
+
loadAllMovaSchemas(): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Loads all local project schemas
|
|
11
|
+
*/
|
|
12
|
+
loadAllLocalSchemas(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Loads all schemas (both vendor and local)
|
|
15
|
+
*/
|
|
16
|
+
loadAllSchemas(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export { SchemaRegistry };
|
|
19
|
+
//# sourceMappingURL=schema_registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema_registry.d.ts","sourceRoot":"","sources":["../../../src/ajv/schema_registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAK/C,cAAM,cAAc;IAClB,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE,eAAe;IAInC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBzC;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB1C;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAmBtC;AAGD,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SchemaRegistry = void 0;
|
|
37
|
+
const fs = __importStar(require("fs-extra"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const logger_1 = require("../logging/logger");
|
|
40
|
+
class SchemaRegistry {
|
|
41
|
+
loader;
|
|
42
|
+
constructor(loader) {
|
|
43
|
+
this.loader = loader;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Loads all vendor/MOVA schemas
|
|
47
|
+
*/
|
|
48
|
+
async loadAllMovaSchemas() {
|
|
49
|
+
const logger = (0, logger_1.getLogger)();
|
|
50
|
+
const movaSchemasDir = path.join(__dirname, '..', '..', '..', 'vendor', 'MOVA', 'schemas');
|
|
51
|
+
if (await fs.pathExists(movaSchemasDir)) {
|
|
52
|
+
const schemaFiles = await fs.readdir(movaSchemasDir);
|
|
53
|
+
for (const file of schemaFiles) {
|
|
54
|
+
if (file.endsWith('.schema.json')) {
|
|
55
|
+
const schemaId = file.replace('.schema.json', '');
|
|
56
|
+
logger.info(`Loading MOVA schema: ${schemaId}`);
|
|
57
|
+
try {
|
|
58
|
+
await this.loader.registerSchema(schemaId);
|
|
59
|
+
logger.info(`✓ Successfully loaded MOVA schema: ${schemaId}`);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
logger.error(`✗ Failed to load MOVA schema ${schemaId}: ${error.message}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
logger.error(`MOVA schemas directory not found: ${movaSchemasDir}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Loads all local project schemas
|
|
73
|
+
*/
|
|
74
|
+
async loadAllLocalSchemas() {
|
|
75
|
+
const logger = (0, logger_1.getLogger)();
|
|
76
|
+
const localSchemasDir = path.join(__dirname, '..', '..', '..', 'schemas');
|
|
77
|
+
if (await fs.pathExists(localSchemasDir)) {
|
|
78
|
+
const schemaFiles = await fs.readdir(localSchemasDir);
|
|
79
|
+
for (const file of schemaFiles) {
|
|
80
|
+
if (file.endsWith('.schema.json')) {
|
|
81
|
+
const schemaId = file.replace('.schema.json', '');
|
|
82
|
+
logger.info(`Loading local schema: ${schemaId}`);
|
|
83
|
+
try {
|
|
84
|
+
await this.loader.registerSchema(schemaId);
|
|
85
|
+
logger.info(`✓ Successfully loaded local schema: ${schemaId}`);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
logger.error(`✗ Failed to load local schema ${schemaId}: ${error.message}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
logger.error(`Local schemas directory not found: ${localSchemasDir}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Loads all schemas (both vendor and local)
|
|
99
|
+
*/
|
|
100
|
+
async loadAllSchemas() {
|
|
101
|
+
const logger = (0, logger_1.getLogger)();
|
|
102
|
+
logger.info('Loading all MOVA schemas...');
|
|
103
|
+
// Register base core schemas first to ensure $ref resolution
|
|
104
|
+
const coreOrder = ['ds.mova_schema_core_v1', 'ds.mova_episode_core_v1'];
|
|
105
|
+
for (const coreId of coreOrder) {
|
|
106
|
+
try {
|
|
107
|
+
logger.info(`Preloading core schema: ${coreId}`);
|
|
108
|
+
await this.loader.registerSchema(coreId);
|
|
109
|
+
logger.info(`✓ Preloaded core schema: ${coreId}`);
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
logger.error(`✗ Preload failed for core schema ${coreId}: ${e.message}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
await this.loadAllMovaSchemas();
|
|
116
|
+
logger.info('Loading all local schemas...');
|
|
117
|
+
await this.loadAllLocalSchemas();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.SchemaRegistry = SchemaRegistry;
|
|
121
|
+
//# sourceMappingURL=schema_registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema_registry.js","sourceRoot":"","sources":["../../../src/ajv/schema_registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../../../../src/drivers/__tests__/registry.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const index_1 = require("../index");
|
|
8
|
+
const httpDriver_1 = require("../httpDriver");
|
|
9
|
+
const restrictedShellDriver_1 = require("../restrictedShellDriver");
|
|
10
|
+
async function testRegisterAndGet() {
|
|
11
|
+
(0, index_1.registerDriver)('test_driver', () => ({
|
|
12
|
+
async execute(input) {
|
|
13
|
+
return { echo: input };
|
|
14
|
+
},
|
|
15
|
+
}));
|
|
16
|
+
const driver = (0, index_1.getDriver)('test_driver');
|
|
17
|
+
const result = await driver.execute({ ping: true });
|
|
18
|
+
assert_1.default.deepStrictEqual(result, { echo: { ping: true } });
|
|
19
|
+
}
|
|
20
|
+
async function testGetUnknownThrows() {
|
|
21
|
+
let threw = false;
|
|
22
|
+
try {
|
|
23
|
+
(0, index_1.getDriver)('unknown_driver');
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
threw = true;
|
|
27
|
+
assert_1.default.ok(error.message.includes('Driver not found'));
|
|
28
|
+
}
|
|
29
|
+
assert_1.default.ok(threw, 'Expected getDriver to throw for unknown driver');
|
|
30
|
+
}
|
|
31
|
+
async function testHttpDriver() {
|
|
32
|
+
const driver = (0, httpDriver_1.httpDriverFactory)();
|
|
33
|
+
// Mock fetch
|
|
34
|
+
const originalFetch = global.fetch;
|
|
35
|
+
global.fetch = (async (url, init) => {
|
|
36
|
+
return {
|
|
37
|
+
status: 200,
|
|
38
|
+
async text() {
|
|
39
|
+
return JSON.stringify({ url, method: init?.method || 'GET' });
|
|
40
|
+
},
|
|
41
|
+
headers: {
|
|
42
|
+
entries: () => [],
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
const result = await driver.execute({ url: 'https://example.com', method: 'GET' }, { allowlist: ['https://example.com'] });
|
|
47
|
+
assert_1.default.strictEqual(result.status, 200);
|
|
48
|
+
assert_1.default.deepStrictEqual(result.body, { url: 'https://example.com', method: 'GET' });
|
|
49
|
+
// disallow
|
|
50
|
+
let blocked = false;
|
|
51
|
+
try {
|
|
52
|
+
await driver.execute({ url: 'https://not-allowed.test' }, { allowlist: ['https://example.com'] });
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
blocked = true;
|
|
56
|
+
assert_1.default.ok(err.message.includes('allowlisted'));
|
|
57
|
+
}
|
|
58
|
+
assert_1.default.ok(blocked, 'Should block URL not in allowlist');
|
|
59
|
+
global.fetch = originalFetch;
|
|
60
|
+
}
|
|
61
|
+
async function testRestrictedShellDriver() {
|
|
62
|
+
const driver = (0, restrictedShellDriver_1.restrictedShellDriverFactory)();
|
|
63
|
+
// Mock execFile runner
|
|
64
|
+
const originalRunner = (0, restrictedShellDriver_1.__getExecFileRunner)();
|
|
65
|
+
(0, restrictedShellDriver_1.__setExecFileRunner)(async (cmd, args = []) => {
|
|
66
|
+
const safeArgs = args ?? [];
|
|
67
|
+
return {
|
|
68
|
+
stdout: `ran ${cmd} ${safeArgs.join(' ')}`,
|
|
69
|
+
stderr: '',
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
const result = await driver.execute({ command: 'echo', args: ['hello'] }, { allowlist: ['echo'] });
|
|
73
|
+
assert_1.default.strictEqual(result.exit_code, 0);
|
|
74
|
+
assert_1.default.ok(result.stdout.includes('echo hello'));
|
|
75
|
+
let blocked = false;
|
|
76
|
+
try {
|
|
77
|
+
await driver.execute({ command: 'rm', args: ['-rf', '/'] }, { allowlist: ['echo'] });
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
blocked = true;
|
|
81
|
+
assert_1.default.ok(err.message.includes('allowlisted'));
|
|
82
|
+
}
|
|
83
|
+
assert_1.default.ok(blocked, 'Should block command not in allowlist');
|
|
84
|
+
// restore
|
|
85
|
+
(0, restrictedShellDriver_1.__setExecFileRunner)(originalRunner);
|
|
86
|
+
}
|
|
87
|
+
async function run() {
|
|
88
|
+
await testRegisterAndGet();
|
|
89
|
+
await testGetUnknownThrows();
|
|
90
|
+
await testHttpDriver();
|
|
91
|
+
await testRestrictedShellDriver();
|
|
92
|
+
// eslint-disable-next-line no-console
|
|
93
|
+
console.log('driver registry tests passed');
|
|
94
|
+
}
|
|
95
|
+
run().catch((err) => {
|
|
96
|
+
// eslint-disable-next-line no-console
|
|
97
|
+
console.error(err);
|
|
98
|
+
process.exit(1);
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=registry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../../../src/drivers/__tests__/registry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpDriver.d.ts","sourceRoot":"","sources":["../../../src/drivers/httpDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,SAAS,CAAC;AA8BhD,wBAAgB,iBAAiB,IAAI,MAAM,CA2D1C"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.httpDriverFactory = httpDriverFactory;
|
|
4
|
+
function isUrlAllowed(url, allowlist) {
|
|
5
|
+
if (!allowlist || allowlist.length === 0)
|
|
6
|
+
return true;
|
|
7
|
+
return allowlist.some((allowed) => {
|
|
8
|
+
try {
|
|
9
|
+
const inputUrl = new URL(url);
|
|
10
|
+
const allowedUrl = new URL(allowed);
|
|
11
|
+
return (inputUrl.hostname === allowedUrl.hostname &&
|
|
12
|
+
inputUrl.protocol === allowedUrl.protocol &&
|
|
13
|
+
(inputUrl.port === allowedUrl.port || allowedUrl.port === ''));
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function httpDriverFactory() {
|
|
21
|
+
return {
|
|
22
|
+
async execute(input, context) {
|
|
23
|
+
const url = input.url || input.endpoint;
|
|
24
|
+
if (!url) {
|
|
25
|
+
throw new Error('HTTP driver requires url or endpoint');
|
|
26
|
+
}
|
|
27
|
+
if (!isUrlAllowed(url, context?.allowlist)) {
|
|
28
|
+
throw new Error(`Destination not allowlisted: ${url}`);
|
|
29
|
+
}
|
|
30
|
+
const method = (input.method || 'GET').toUpperCase();
|
|
31
|
+
const controller = new AbortController();
|
|
32
|
+
const timeout = context?.limits?.timeout_ms ?? 5000;
|
|
33
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
34
|
+
try {
|
|
35
|
+
const fetchOptions = {
|
|
36
|
+
method,
|
|
37
|
+
headers: input.headers,
|
|
38
|
+
signal: controller.signal,
|
|
39
|
+
};
|
|
40
|
+
if (method !== 'GET' && method !== 'HEAD' && input.body !== undefined) {
|
|
41
|
+
fetchOptions.body =
|
|
42
|
+
typeof input.body === 'string' ? input.body : JSON.stringify(input.body);
|
|
43
|
+
fetchOptions.headers = {
|
|
44
|
+
'Content-Type': 'application/json',
|
|
45
|
+
...(input.headers || {}),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const response = await fetch(url, fetchOptions);
|
|
49
|
+
const text = await response.text();
|
|
50
|
+
let parsed = text;
|
|
51
|
+
try {
|
|
52
|
+
parsed = JSON.parse(text);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// leave as text if not JSON
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
status: response.status,
|
|
59
|
+
headers: Object.fromEntries(response.headers.entries()),
|
|
60
|
+
body: parsed,
|
|
61
|
+
url,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (error.name === 'AbortError') {
|
|
66
|
+
throw new Error(`HTTP request timed out after ${timeout}ms`);
|
|
67
|
+
}
|
|
68
|
+
throw new Error(`HTTP request failed: ${error.message}`);
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
clearTimeout(timeoutId);
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=httpDriver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpDriver.js","sourceRoot":"","sources":["../../../src/drivers/httpDriver.ts"],"names":[],"mappings":"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"}
|