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.
Files changed (287) hide show
  1. package/README.md +94 -0
  2. package/build/scripts/check_docs.d.ts +2 -0
  3. package/build/scripts/check_docs.d.ts.map +1 -0
  4. package/build/scripts/check_docs.js +48 -0
  5. package/build/scripts/check_docs.js.map +1 -0
  6. package/build/scripts/check_schema_paths.d.ts +3 -0
  7. package/build/scripts/check_schema_paths.d.ts.map +1 -0
  8. package/build/scripts/check_schema_paths.js +15 -0
  9. package/build/scripts/check_schema_paths.js.map +1 -0
  10. package/build/scripts/check_schema_paths_dist.d.ts +3 -0
  11. package/build/scripts/check_schema_paths_dist.d.ts.map +1 -0
  12. package/build/scripts/check_schema_paths_dist.js +16 -0
  13. package/build/scripts/check_schema_paths_dist.js.map +1 -0
  14. package/build/scripts/check_structure.d.ts +2 -0
  15. package/build/scripts/check_structure.d.ts.map +1 -0
  16. package/build/scripts/check_structure.js +59 -0
  17. package/build/scripts/check_structure.js.map +1 -0
  18. package/build/scripts/debug_validate.d.ts +3 -0
  19. package/build/scripts/debug_validate.d.ts.map +1 -0
  20. package/build/scripts/debug_validate.js +39 -0
  21. package/build/scripts/debug_validate.js.map +1 -0
  22. package/build/scripts/debug_validate2.d.ts +3 -0
  23. package/build/scripts/debug_validate2.d.ts.map +1 -0
  24. package/build/scripts/debug_validate2.js +18 -0
  25. package/build/scripts/debug_validate2.js.map +1 -0
  26. package/build/scripts/debug_validate_runtime.d.ts +3 -0
  27. package/build/scripts/debug_validate_runtime.d.ts.map +1 -0
  28. package/build/scripts/debug_validate_runtime.js +39 -0
  29. package/build/scripts/debug_validate_runtime.js.map +1 -0
  30. package/build/scripts/dump_ajv_schemas.d.ts +2 -0
  31. package/build/scripts/dump_ajv_schemas.d.ts.map +1 -0
  32. package/build/scripts/dump_ajv_schemas.js +22 -0
  33. package/build/scripts/dump_ajv_schemas.js.map +1 -0
  34. package/build/scripts/dump_resolved_schema.d.ts +3 -0
  35. package/build/scripts/dump_resolved_schema.d.ts.map +1 -0
  36. package/build/scripts/dump_resolved_schema.js +22 -0
  37. package/build/scripts/dump_resolved_schema.js.map +1 -0
  38. package/build/scripts/gen_types.d.ts +2 -0
  39. package/build/scripts/gen_types.d.ts.map +1 -0
  40. package/build/scripts/gen_types.js +133 -0
  41. package/build/scripts/gen_types.js.map +1 -0
  42. package/build/scripts/inspect_validation.d.ts +3 -0
  43. package/build/scripts/inspect_validation.d.ts.map +1 -0
  44. package/build/scripts/inspect_validation.js +36 -0
  45. package/build/scripts/inspect_validation.js.map +1 -0
  46. package/build/scripts/legacy/check_errors.d.ts +3 -0
  47. package/build/scripts/legacy/check_errors.d.ts.map +1 -0
  48. package/build/scripts/legacy/check_errors.js +14 -0
  49. package/build/scripts/legacy/check_errors.js.map +1 -0
  50. package/build/scripts/legacy/compile_test.d.ts +5 -0
  51. package/build/scripts/legacy/compile_test.d.ts.map +1 -0
  52. package/build/scripts/legacy/compile_test.js +25 -0
  53. package/build/scripts/legacy/compile_test.js.map +1 -0
  54. package/build/scripts/legacy/debug_neg.d.ts +6 -0
  55. package/build/scripts/legacy/debug_neg.d.ts.map +1 -0
  56. package/build/scripts/legacy/debug_neg.js +230 -0
  57. package/build/scripts/legacy/debug_neg.js.map +1 -0
  58. package/build/scripts/legacy/debug_quality_pos.d.ts +5 -0
  59. package/build/scripts/legacy/debug_quality_pos.d.ts.map +1 -0
  60. package/build/scripts/legacy/debug_quality_pos.js +195 -0
  61. package/build/scripts/legacy/debug_quality_pos.js.map +1 -0
  62. package/build/scripts/legacy/debug_test.d.ts +1 -0
  63. package/build/scripts/legacy/debug_test.d.ts.map +1 -0
  64. package/build/scripts/legacy/debug_test.js +51 -0
  65. package/build/scripts/legacy/debug_test.js.map +1 -0
  66. package/build/scripts/legacy/hello_test.d.ts +1 -0
  67. package/build/scripts/legacy/hello_test.d.ts.map +1 -0
  68. package/build/scripts/legacy/hello_test.js +3 -0
  69. package/build/scripts/legacy/hello_test.js.map +1 -0
  70. package/build/scripts/legacy/import_test.d.ts +2 -0
  71. package/build/scripts/legacy/import_test.d.ts.map +1 -0
  72. package/build/scripts/legacy/import_test.js +4 -0
  73. package/build/scripts/legacy/import_test.js.map +1 -0
  74. package/build/scripts/legacy/quality_neg.d.ts +6 -0
  75. package/build/scripts/legacy/quality_neg.d.ts.map +1 -0
  76. package/build/scripts/legacy/quality_neg.js +362 -0
  77. package/build/scripts/legacy/quality_neg.js.map +1 -0
  78. package/build/scripts/legacy/quality_pos.d.ts +7 -0
  79. package/build/scripts/legacy/quality_pos.d.ts.map +1 -0
  80. package/build/scripts/legacy/quality_pos.js +345 -0
  81. package/build/scripts/legacy/quality_pos.js.map +1 -0
  82. package/build/scripts/legacy/simple_test.d.ts +2 -0
  83. package/build/scripts/legacy/simple_test.d.ts.map +1 -0
  84. package/build/scripts/legacy/simple_test.js +4 -0
  85. package/build/scripts/legacy/simple_test.js.map +1 -0
  86. package/build/scripts/legacy/test.d.ts +1 -0
  87. package/build/scripts/legacy/test.d.ts.map +1 -0
  88. package/build/scripts/legacy/test.js +3 -0
  89. package/build/scripts/legacy/test.js.map +1 -0
  90. package/build/scripts/legacy/test_additional_props.d.ts +6 -0
  91. package/build/scripts/legacy/test_additional_props.d.ts.map +1 -0
  92. package/build/scripts/legacy/test_additional_props.js +45 -0
  93. package/build/scripts/legacy/test_additional_props.js.map +1 -0
  94. package/build/scripts/legacy/test_ajv_validation.d.ts +2 -0
  95. package/build/scripts/legacy/test_ajv_validation.d.ts.map +1 -0
  96. package/build/scripts/legacy/test_ajv_validation.js +35 -0
  97. package/build/scripts/legacy/test_ajv_validation.js.map +1 -0
  98. package/build/scripts/legacy/test_build.d.ts +2 -0
  99. package/build/scripts/legacy/test_build.d.ts.map +1 -0
  100. package/build/scripts/legacy/test_build.js +14 -0
  101. package/build/scripts/legacy/test_build.js.map +1 -0
  102. package/build/scripts/legacy/test_direct.d.ts +3 -0
  103. package/build/scripts/legacy/test_direct.d.ts.map +1 -0
  104. package/build/scripts/legacy/test_direct.js +24 -0
  105. package/build/scripts/legacy/test_direct.js.map +1 -0
  106. package/build/scripts/legacy/test_import.d.ts +2 -0
  107. package/build/scripts/legacy/test_import.d.ts.map +1 -0
  108. package/build/scripts/legacy/test_import.js +7 -0
  109. package/build/scripts/legacy/test_import.js.map +1 -0
  110. package/build/scripts/legacy/test_mova_schemas.d.ts +2 -0
  111. package/build/scripts/legacy/test_mova_schemas.d.ts.map +1 -0
  112. package/build/scripts/legacy/test_mova_schemas.js +37 -0
  113. package/build/scripts/legacy/test_mova_schemas.js.map +1 -0
  114. package/build/scripts/legacy/test_scenario_integration.d.ts +13 -0
  115. package/build/scripts/legacy/test_scenario_integration.d.ts.map +1 -0
  116. package/build/scripts/legacy/test_scenario_integration.js +156 -0
  117. package/build/scripts/legacy/test_scenario_integration.js.map +1 -0
  118. package/build/scripts/legacy/test_schemas.d.ts +2 -0
  119. package/build/scripts/legacy/test_schemas.d.ts.map +1 -0
  120. package/build/scripts/legacy/test_schemas.js +48 -0
  121. package/build/scripts/legacy/test_schemas.js.map +1 -0
  122. package/build/scripts/legacy/test_schemas_simple.d.ts +2 -0
  123. package/build/scripts/legacy/test_schemas_simple.d.ts.map +1 -0
  124. package/build/scripts/legacy/test_schemas_simple.js +36 -0
  125. package/build/scripts/legacy/test_schemas_simple.js.map +1 -0
  126. package/build/scripts/legacy/test_simple.d.ts +4 -0
  127. package/build/scripts/legacy/test_simple.d.ts.map +1 -0
  128. package/build/scripts/legacy/test_simple.js +17 -0
  129. package/build/scripts/legacy/test_simple.js.map +1 -0
  130. package/build/scripts/legacy/test_warnings.d.ts +6 -0
  131. package/build/scripts/legacy/test_warnings.d.ts.map +1 -0
  132. package/build/scripts/legacy/test_warnings.js +48 -0
  133. package/build/scripts/legacy/test_warnings.js.map +1 -0
  134. package/build/scripts/legacy/very_simple_test.d.ts +1 -0
  135. package/build/scripts/legacy/very_simple_test.d.ts.map +1 -0
  136. package/build/scripts/legacy/very_simple_test.js +3 -0
  137. package/build/scripts/legacy/very_simple_test.js.map +1 -0
  138. package/build/scripts/merge_and_validate.d.ts +6 -0
  139. package/build/scripts/merge_and_validate.d.ts.map +1 -0
  140. package/build/scripts/merge_and_validate.js +53 -0
  141. package/build/scripts/merge_and_validate.js.map +1 -0
  142. package/build/src/ajv/ajv_loader.d.ts +47 -0
  143. package/build/src/ajv/ajv_loader.d.ts.map +1 -0
  144. package/build/src/ajv/ajv_loader.js +274 -0
  145. package/build/src/ajv/ajv_loader.js.map +1 -0
  146. package/build/src/ajv/schema_registry.d.ts +19 -0
  147. package/build/src/ajv/schema_registry.d.ts.map +1 -0
  148. package/build/src/ajv/schema_registry.js +121 -0
  149. package/build/src/ajv/schema_registry.js.map +1 -0
  150. package/build/src/drivers/__tests__/registry.test.d.ts +2 -0
  151. package/build/src/drivers/__tests__/registry.test.d.ts.map +1 -0
  152. package/build/src/drivers/__tests__/registry.test.js +100 -0
  153. package/build/src/drivers/__tests__/registry.test.js.map +1 -0
  154. package/build/src/drivers/httpDriver.d.ts +3 -0
  155. package/build/src/drivers/httpDriver.d.ts.map +1 -0
  156. package/build/src/drivers/httpDriver.js +76 -0
  157. package/build/src/drivers/httpDriver.js.map +1 -0
  158. package/build/src/drivers/index.d.ts +20 -0
  159. package/build/src/drivers/index.d.ts.map +1 -0
  160. package/build/src/drivers/index.js +33 -0
  161. package/build/src/drivers/index.js.map +1 -0
  162. package/build/src/drivers/restrictedShellDriver.d.ts +12 -0
  163. package/build/src/drivers/restrictedShellDriver.d.ts.map +1 -0
  164. package/build/src/drivers/restrictedShellDriver.js +88 -0
  165. package/build/src/drivers/restrictedShellDriver.js.map +1 -0
  166. package/build/src/episodes/__tests__/episode_writer_atomic.test.d.ts +2 -0
  167. package/build/src/episodes/__tests__/episode_writer_atomic.test.d.ts.map +1 -0
  168. package/build/src/episodes/__tests__/episode_writer_atomic.test.js +86 -0
  169. package/build/src/episodes/__tests__/episode_writer_atomic.test.js.map +1 -0
  170. package/build/src/episodes/episode_writer.d.ts +100 -0
  171. package/build/src/episodes/episode_writer.d.ts.map +1 -0
  172. package/build/src/episodes/episode_writer.js +503 -0
  173. package/build/src/episodes/episode_writer.js.map +1 -0
  174. package/build/src/episodes/episode_writer_atomic.d.ts +10 -0
  175. package/build/src/episodes/episode_writer_atomic.d.ts.map +1 -0
  176. package/build/src/episodes/episode_writer_atomic.js +46 -0
  177. package/build/src/episodes/episode_writer_atomic.js.map +1 -0
  178. package/build/src/evidence/evidence_writer.d.ts +16 -0
  179. package/build/src/evidence/evidence_writer.d.ts.map +1 -0
  180. package/build/src/evidence/evidence_writer.js +78 -0
  181. package/build/src/evidence/evidence_writer.js.map +1 -0
  182. package/build/src/handlers/registry.d.ts +20 -0
  183. package/build/src/handlers/registry.d.ts.map +1 -0
  184. package/build/src/handlers/registry.js +38 -0
  185. package/build/src/handlers/registry.js.map +1 -0
  186. package/build/src/interpreter/interpreter.d.ts +90 -0
  187. package/build/src/interpreter/interpreter.d.ts.map +1 -0
  188. package/build/src/interpreter/interpreter.js +732 -0
  189. package/build/src/interpreter/interpreter.js.map +1 -0
  190. package/build/src/interpreter/interpreter_with_budget.d.ts +92 -0
  191. package/build/src/interpreter/interpreter_with_budget.d.ts.map +1 -0
  192. package/build/src/interpreter/interpreter_with_budget.js +678 -0
  193. package/build/src/interpreter/interpreter_with_budget.js.map +1 -0
  194. package/build/src/logging/logger.d.ts +83 -0
  195. package/build/src/logging/logger.d.ts.map +1 -0
  196. package/build/src/logging/logger.js +226 -0
  197. package/build/src/logging/logger.js.map +1 -0
  198. package/build/src/policy/policy_engine.d.ts +116 -0
  199. package/build/src/policy/policy_engine.d.ts.map +1 -0
  200. package/build/src/policy/policy_engine.js +296 -0
  201. package/build/src/policy/policy_engine.js.map +1 -0
  202. package/build/src/skills/skills_layer.d.ts +94 -0
  203. package/build/src/skills/skills_layer.d.ts.map +1 -0
  204. package/build/src/skills/skills_layer.js +405 -0
  205. package/build/src/skills/skills_layer.js.map +1 -0
  206. package/build/src/telemetry/token_budget_enforcer.d.ts +113 -0
  207. package/build/src/telemetry/token_budget_enforcer.d.ts.map +1 -0
  208. package/build/src/telemetry/token_budget_enforcer.js +253 -0
  209. package/build/src/telemetry/token_budget_enforcer.js.map +1 -0
  210. package/build/src/telemetry/token_budget_loader.d.ts +29 -0
  211. package/build/src/telemetry/token_budget_loader.d.ts.map +1 -0
  212. package/build/src/telemetry/token_budget_loader.js +112 -0
  213. package/build/src/telemetry/token_budget_loader.js.map +1 -0
  214. package/build/src/telemetry/token_meter.d.ts +65 -0
  215. package/build/src/telemetry/token_meter.d.ts.map +1 -0
  216. package/build/src/telemetry/token_meter.js +153 -0
  217. package/build/src/telemetry/token_meter.js.map +1 -0
  218. package/build/src/ux/cli_interface.d.ts +85 -0
  219. package/build/src/ux/cli_interface.d.ts.map +1 -0
  220. package/build/src/ux/cli_interface.js +651 -0
  221. package/build/src/ux/cli_interface.js.map +1 -0
  222. package/build/test/drivers/registry.test.d.ts +2 -0
  223. package/build/test/drivers/registry.test.d.ts.map +1 -0
  224. package/build/test/drivers/registry.test.js +100 -0
  225. package/build/test/drivers/registry.test.js.map +1 -0
  226. package/build/test/episodes/episode_writer_atomic.test.d.ts +2 -0
  227. package/build/test/episodes/episode_writer_atomic.test.d.ts.map +1 -0
  228. package/build/test/episodes/episode_writer_atomic.test.js +86 -0
  229. package/build/test/episodes/episode_writer_atomic.test.js.map +1 -0
  230. package/build/tests/ajv/check_schemas.d.ts +4 -0
  231. package/build/tests/ajv/check_schemas.d.ts.map +1 -0
  232. package/build/tests/ajv/check_schemas.js +27 -0
  233. package/build/tests/ajv/check_schemas.js.map +1 -0
  234. package/build/tests/ajv/final_test.d.ts +2 -0
  235. package/build/tests/ajv/final_test.d.ts.map +1 -0
  236. package/build/tests/ajv/final_test.js +42 -0
  237. package/build/tests/ajv/final_test.js.map +1 -0
  238. package/build/tests/ajv/simple_test.d.ts +2 -0
  239. package/build/tests/ajv/simple_test.d.ts.map +1 -0
  240. package/build/tests/ajv/simple_test.js +40 -0
  241. package/build/tests/ajv/simple_test.js.map +1 -0
  242. package/build/tests/ajv/test_schema_loading.d.ts +2 -0
  243. package/build/tests/ajv/test_schema_loading.d.ts.map +1 -0
  244. package/build/tests/ajv/test_schema_loading.js +39 -0
  245. package/build/tests/ajv/test_schema_loading.js.map +1 -0
  246. package/build/tools/mova-agent.d.ts +2 -0
  247. package/build/tools/mova-agent.d.ts.map +1 -0
  248. package/build/tools/mova-agent.js +15 -0
  249. package/build/tools/mova-agent.js.map +1 -0
  250. package/package.json +63 -0
  251. package/src/ajv/ajv_loader.ts +311 -0
  252. package/src/ajv/schema_registry.ts +92 -0
  253. package/src/drivers/httpDriver.ts +90 -0
  254. package/src/drivers/index.ts +48 -0
  255. package/src/drivers/restrictedShellDriver.ts +68 -0
  256. package/src/episodes/episode_writer.ts +675 -0
  257. package/src/episodes/episode_writer_atomic.ts +44 -0
  258. package/src/evidence/evidence_writer.ts +74 -0
  259. package/src/handlers/registry.ts +53 -0
  260. package/src/interpreter/interpreter.ts +1009 -0
  261. package/src/interpreter/interpreter_with_budget.ts +923 -0
  262. package/src/logging/logger.ts +269 -0
  263. package/src/policy/policy_engine.ts +395 -0
  264. package/src/skills/skills_layer.ts +510 -0
  265. package/src/telemetry/token_budget_enforcer.ts +338 -0
  266. package/src/telemetry/token_budget_loader.ts +133 -0
  267. package/src/telemetry/token_meter.ts +185 -0
  268. package/src/types/generated/ds.connector_core_v1.d.ts +116 -0
  269. package/src/types/generated/ds.instruction_profile_core_v1.d.ts +141 -0
  270. package/src/types/generated/ds.mova4_core_catalog_v1.d.ts +80 -0
  271. package/src/types/generated/ds.mova_agent_run_summary_v1.d.ts +120 -0
  272. package/src/types/generated/ds.mova_agent_step_v1.d.ts +53 -0
  273. package/src/types/generated/ds.mova_agent_tool_pool_v1.d.ts +152 -0
  274. package/src/types/generated/ds.mova_agent_validation_report_v1.d.ts +43 -0
  275. package/src/types/generated/ds.mova_episode_core_v1.d.ts +56 -0
  276. package/src/types/generated/ds.mova_schema_core_v1.d.ts +49 -0
  277. package/src/types/generated/ds.mova_token_budget_contract_v0.d.ts +140 -0
  278. package/src/types/generated/ds.runtime_binding_core_v1.d.ts +112 -0
  279. package/src/types/generated/ds.security_event_episode_core_v1.d.ts +138 -0
  280. package/src/types/generated/ds.ui_text_bundle_core_v1.d.ts +118 -0
  281. package/src/types/generated/env.instruction_profile_publish_v1.d.ts +159 -0
  282. package/src/types/generated/env.mova4_core_catalog_publish_v1.d.ts +25 -0
  283. package/src/types/generated/env.mova_agent_plan_v1.d.ts +40 -0
  284. package/src/types/generated/env.mova_agent_request_v1.d.ts +43 -0
  285. package/src/types/generated/env.security_event_store_v1.d.ts +191 -0
  286. package/src/types/generated/index.d.ts +25 -0
  287. package/src/ux/cli_interface.ts +719 -0
@@ -0,0 +1,510 @@
1
+ /**
2
+ * Phase 5: Skills (planner/repair/explain)
3
+ *
4
+ * This phase implements the skills layer that provides higher-level
5
+ * capabilities built on top of the core interpreter.
6
+ */
7
+
8
+ // planner/planner.ts
9
+ // Используем any для краткосрочного решения, так как типы требуют адаптации
10
+ // Позже можно будет определить правильные интерфейсы
11
+
12
+ interface PlanningRequest {
13
+ goal: string;
14
+ constraints?: any;
15
+ available_tools?: string[];
16
+ context?: any;
17
+ }
18
+
19
+ interface PlanningResponse {
20
+ plan: any;
21
+ confidence: number;
22
+ reasoning: string;
23
+ }
24
+
25
+ class Planner {
26
+ /**
27
+ * Creates a plan based on a goal and available resources
28
+ */
29
+ async createPlan(request: PlanningRequest): Promise<PlanningResponse> {
30
+ // This is a simplified planner that creates a basic plan
31
+ // In a real implementation, this would use more sophisticated planning algorithms
32
+
33
+ const plan: any = {
34
+ id: `plan_${Date.now()}`,
35
+ payload: {
36
+ steps: [],
37
+ },
38
+ signature: null,
39
+ };
40
+
41
+ // More comprehensive pattern matching
42
+ const lowerGoal = request.goal.toLowerCase();
43
+
44
+ if (
45
+ lowerGoal.includes('get data from api') ||
46
+ lowerGoal.includes('fetch from api') ||
47
+ lowerGoal.includes('retrieve from api')
48
+ ) {
49
+ plan.payload.steps = [
50
+ {
51
+ id: 'fetch-data',
52
+ verb: 'http',
53
+ connector_id: 'http_connector_1',
54
+ input: {
55
+ url: 'https://api.example.com/data',
56
+ method: 'GET',
57
+ },
58
+ tool_binding: {
59
+ driver_kind: 'http',
60
+ destination_allowlist: ['https://api.example.com'],
61
+ limits: {
62
+ timeout_ms: 5000,
63
+ max_data_size: 102400,
64
+ },
65
+ },
66
+ },
67
+ {
68
+ id: 'parse-response',
69
+ verb: 'noop',
70
+ connector_id: 'noop_connector_1',
71
+ input: {
72
+ raw_response: '{{outputs.fetch-data}}',
73
+ },
74
+ tool_binding: {
75
+ driver_kind: 'noop',
76
+ limits: {
77
+ timeout_ms: 1000,
78
+ max_data_size: 10240,
79
+ },
80
+ },
81
+ },
82
+ ];
83
+ } else if (lowerGoal.includes('process data') || lowerGoal.includes('transform data')) {
84
+ plan.payload.steps = [
85
+ {
86
+ id: 'load-data',
87
+ verb: 'noop',
88
+ connector_id: 'noop_connector_1',
89
+ input: {
90
+ source: 'input_data',
91
+ },
92
+ tool_binding: {
93
+ driver_kind: 'noop',
94
+ limits: {
95
+ timeout_ms: 1000,
96
+ max_data_size: 10240,
97
+ },
98
+ },
99
+ },
100
+ {
101
+ id: 'transform-data',
102
+ verb: 'noop',
103
+ connector_id: 'noop_connector_2',
104
+ input: {
105
+ data: '{{outputs.load-data}}',
106
+ transformation: 'uppercase',
107
+ },
108
+ tool_binding: {
109
+ driver_kind: 'noop',
110
+ limits: {
111
+ timeout_ms: 2000,
112
+ max_data_size: 10240,
113
+ },
114
+ },
115
+ },
116
+ {
117
+ id: 'save-result',
118
+ verb: 'noop',
119
+ connector_id: 'noop_connector_3',
120
+ input: {
121
+ data: '{{outputs.transform-data}}',
122
+ destination: 'output_location',
123
+ },
124
+ tool_binding: {
125
+ driver_kind: 'noop',
126
+ limits: {
127
+ timeout_ms: 1000,
128
+ max_data_size: 10240,
129
+ },
130
+ },
131
+ },
132
+ ];
133
+ } else if (lowerGoal.includes('weather') || lowerGoal.includes('temperature')) {
134
+ plan.payload.steps = [
135
+ {
136
+ id: 'fetch-weather',
137
+ verb: 'http',
138
+ connector_id: 'http_connector_1',
139
+ input: {
140
+ url: 'https://api.weather.com/v1/current',
141
+ method: 'GET',
142
+ headers: {
143
+ Authorization: 'Bearer {{API_KEY}}',
144
+ },
145
+ },
146
+ tool_binding: {
147
+ driver_kind: 'http',
148
+ destination_allowlist: ['https://api.weather.com'],
149
+ limits: {
150
+ timeout_ms: 5000,
151
+ max_data_size: 102400,
152
+ },
153
+ },
154
+ },
155
+ {
156
+ id: 'extract-temperature',
157
+ verb: 'noop',
158
+ connector_id: 'noop_connector_1',
159
+ input: {
160
+ weather_data: '{{outputs.fetch-weather}}',
161
+ path: '$.current.temperature',
162
+ },
163
+ tool_binding: {
164
+ driver_kind: 'noop',
165
+ limits: {
166
+ timeout_ms: 1000,
167
+ max_data_size: 10240,
168
+ },
169
+ },
170
+ },
171
+ {
172
+ id: 'store-temperature',
173
+ verb: 'noop',
174
+ connector_id: 'noop_connector_2',
175
+ input: {
176
+ temperature: '{{outputs.extract-temperature}}',
177
+ storage_key: 'current_temperature',
178
+ },
179
+ tool_binding: {
180
+ driver_kind: 'noop',
181
+ limits: {
182
+ timeout_ms: 1000,
183
+ max_data_size: 10240,
184
+ },
185
+ },
186
+ },
187
+ ];
188
+ } else {
189
+ // Default plan with basic noop operations
190
+ plan.payload.steps = [
191
+ {
192
+ id: 'default-action',
193
+ verb: 'noop',
194
+ connector_id: 'noop_connector_1',
195
+ input: {
196
+ message: `Processing request: ${request.goal}`,
197
+ },
198
+ tool_binding: {
199
+ driver_kind: 'noop',
200
+ limits: {
201
+ timeout_ms: 1000,
202
+ max_data_size: 10240,
203
+ },
204
+ },
205
+ },
206
+ ];
207
+ }
208
+
209
+ return {
210
+ plan,
211
+ confidence: 0.8,
212
+ reasoning: 'Pattern matching used to generate appropriate plan',
213
+ };
214
+ }
215
+ }
216
+
217
+ // repair/repair_service.ts
218
+ interface RepairRequest {
219
+ failed_plan: any;
220
+ failure_context: any;
221
+ error_details: string;
222
+ recovery_strategy?: 'retry' | 'fallback' | 'manual';
223
+ }
224
+
225
+ interface RepairResponse {
226
+ repaired_plan: any;
227
+ success_probability: number;
228
+ recommended_actions: string[];
229
+ }
230
+
231
+ class RepairService {
232
+ /**
233
+ * Attempts to repair a failed plan by identifying and correcting issues
234
+ */
235
+ async repairPlan(request: RepairRequest): Promise<RepairResponse> {
236
+ const repairedPlan = JSON.parse(JSON.stringify(request.failed_plan)); // Deep copy
237
+
238
+ // Example repair strategies
239
+ const recommendedActions: string[] = [];
240
+
241
+ // If the error mentions timeout, increase timeout in binding
242
+ if (request.error_details.toLowerCase().includes('timeout')) {
243
+ for (const step of repairedPlan.payload.steps) {
244
+ if (step.tool_binding && step.tool_binding.limits) {
245
+ // Increase timeout by 50%
246
+ step.tool_binding.limits.timeout_ms = Math.round(
247
+ step.tool_binding.limits.timeout_ms * 1.5
248
+ );
249
+ }
250
+ }
251
+ recommendedActions.push('Increased timeout limits for steps');
252
+ }
253
+
254
+ // If the error mentions invalid destination, check for allowlist issues
255
+ if (request.error_details.toLowerCase().includes('destination not allowlisted')) {
256
+ // This would typically involve adding the destination to allowlist
257
+ // after appropriate checks, but for safety, we'll recommend manual review
258
+ recommendedActions.push(
259
+ 'Destination allowlist issue detected - requires manual verification'
260
+ );
261
+ }
262
+
263
+ return {
264
+ repaired_plan: repairedPlan,
265
+ success_probability: 0.7,
266
+ recommended_actions: recommendedActions,
267
+ };
268
+ }
269
+ }
270
+
271
+ // explain/explanation_service.ts
272
+ interface ExplanationRequest {
273
+ plan: any;
274
+ query: string; // e.g., "Why did this step fail?", "What does this plan do?"
275
+ execution_context?: any;
276
+ execution_results?: any;
277
+ }
278
+
279
+ interface ExplanationResponse {
280
+ explanation: string;
281
+ supporting_facts: string[];
282
+ confidence: number;
283
+ }
284
+
285
+ interface Episode {
286
+ id: string;
287
+ request: string;
288
+ plan?: any;
289
+ }
290
+
291
+ interface Evidence {
292
+ id: string;
293
+ type: string;
294
+ summary: string;
295
+ related_episode_id?: string;
296
+ related_step_id?: string;
297
+ }
298
+
299
+ interface ExplanationResult {
300
+ explanation: string;
301
+ confidence: number;
302
+ supporting_facts: Array<{
303
+ id: string;
304
+ type: string;
305
+ summary: string;
306
+ }>;
307
+ }
308
+
309
+ class ExplanationService {
310
+ /**
311
+ * Provides explanations about plans, executions, and their results
312
+ */
313
+ async explain(request: ExplanationRequest): Promise<ExplanationResponse> {
314
+ let explanation = '';
315
+ const facts: string[] = [];
316
+
317
+ if (
318
+ request.query.toLowerCase().includes('fail') ||
319
+ request.query.toLowerCase().includes('error')
320
+ ) {
321
+ // Explain why a step might have failed
322
+ if (request.execution_results) {
323
+ const error = request.execution_results.error || request.execution_results.message;
324
+
325
+ if (error && error.toLowerCase().includes('timeout')) {
326
+ explanation =
327
+ 'The operation failed due to a timeout. The request took longer than the allowed time limit.';
328
+ facts.push('Failure cause: Timeout exceeded');
329
+ facts.push('Recommendation: Increase timeout limits or optimize the operation');
330
+ } else if (
331
+ error &&
332
+ (error.toLowerCase().includes('forbidden') || error.toLowerCase().includes('denied'))
333
+ ) {
334
+ explanation =
335
+ 'The operation failed due to security policy violation. The requested action is not allowed by the current security configuration.';
336
+ facts.push('Failure cause: Security policy violation');
337
+ facts.push('Recommendation: Check allowlists and permissions');
338
+ } else if (
339
+ error &&
340
+ (error.toLowerCase().includes('not found') || error.toLowerCase().includes('404'))
341
+ ) {
342
+ explanation = 'The operation failed because the requested resource was not found.';
343
+ facts.push('Failure cause: Resource not found');
344
+ facts.push('Recommendation: Verify the resource identifier or availability');
345
+ } else {
346
+ explanation = `The operation failed with an error: ${error || 'Unknown error occurred'}`;
347
+ facts.push(`Error details: ${error || 'No specific error details'}`);
348
+ }
349
+ } else {
350
+ explanation =
351
+ 'The failure appears to be related to policy violations or resource constraints during execution.';
352
+ facts.push('Possible causes: Security policies, resource limits, or unavailable resources');
353
+ }
354
+ } else if (
355
+ request.query.toLowerCase().includes('do') ||
356
+ request.query.toLowerCase().includes('purpose') ||
357
+ request.query.toLowerCase().includes('what')
358
+ ) {
359
+ // Explain what the plan does
360
+ explanation = 'This plan executes a sequence of steps to achieve the specified goal. ';
361
+
362
+ if (request.plan && request.plan.payload && request.plan.payload.steps) {
363
+ const steps = request.plan.payload.steps;
364
+ explanation += `It includes ${steps.length} steps: `;
365
+
366
+ const verbs = steps
367
+ .map((step: any) => step.verb || 'unknown')
368
+ .filter((v: any) => v !== 'unknown');
369
+ explanation += verbs.join(', ') + '.';
370
+
371
+ facts.push(`Plan has ${steps.length} steps`);
372
+ facts.push(`Operations: ${verbs.join(', ')}`);
373
+
374
+ // Additional details about steps
375
+ for (let i = 0; i < steps.length; i++) {
376
+ const step = steps[i];
377
+ if (step.input) {
378
+ facts.push(`Step ${i + 1} (${step.verb}): processes input data`);
379
+ }
380
+ if (step.tool_binding && step.tool_binding.driver_kind) {
381
+ facts.push(`Step ${i + 1}: uses ${step.tool_binding.driver_kind} driver`);
382
+ }
383
+ if (step.tool_binding && step.tool_binding.destination_allowlist) {
384
+ facts.push(
385
+ `Step ${i + 1}: restricted to destinations: ${step.tool_binding.destination_allowlist.join(', ')}`
386
+ );
387
+ }
388
+ }
389
+
390
+ // Security aspects
391
+ if (
392
+ steps.some((step: any) => step.tool_binding && step.tool_binding.destination_allowlist)
393
+ ) {
394
+ facts.push('Security: Destination allowlists applied to restrict network access');
395
+ }
396
+ } else {
397
+ explanation += 'The plan structure is not available or invalid.';
398
+ facts.push('Plan structure: Invalid or unavailable');
399
+ }
400
+ } else if (
401
+ request.query.toLowerCase().includes('security') ||
402
+ request.query.toLowerCase().includes('safe')
403
+ ) {
404
+ explanation =
405
+ 'This system follows strict security policies with a deny-by-default approach. All operations are validated against security rules before execution.';
406
+ facts.push('Security model: Deny-by-default');
407
+ facts.push('All HTTP requests require destination allowlists');
408
+ facts.push('Resource limits enforced: timeouts and data sizes');
409
+ facts.push('Sensitive data is automatically redacted');
410
+ } else {
411
+ // Generic explanation
412
+ explanation =
413
+ 'This system processes requests through a series of validated steps, ensuring security and compliance at each stage.';
414
+ facts.push('System type: Deterministic interpreter (not LLM-based)');
415
+ facts.push('Security: Enforced policies with allowlist approach');
416
+ facts.push('Processing: Sequential step execution with validation');
417
+ }
418
+
419
+ return {
420
+ explanation,
421
+ supporting_facts: facts,
422
+ confidence: 0.9,
423
+ };
424
+ }
425
+
426
+ /**
427
+ * Provides explanations about episodes and their evidence
428
+ */
429
+ async explainEpisode(episode: Episode, evidence: Evidence[]): Promise<ExplanationResult> {
430
+ // This is a more comprehensive explanation service
431
+ // Analyze the episode and evidence to provide detailed explanations
432
+
433
+ const stepsCount = episode.plan?.payload?.steps ? episode.plan.payload.steps.length : 0;
434
+ const evidenceTypes = [...new Set(evidence.map((e) => e.type))];
435
+ const errorEvidence = evidence.filter((e) => e.type.includes('error'));
436
+
437
+ let explanation = `Episode ${episode.id} was processed with ${evidence.length} pieces of evidence of types: [${evidenceTypes.join(', ')}].\n`;
438
+
439
+ explanation += `The request was: "${episode.request}". `;
440
+ explanation += `The plan contained ${stepsCount} steps. `;
441
+
442
+ if (errorEvidence.length > 0) {
443
+ explanation += `There were ${errorEvidence.length} error evidences indicating potential issues. `;
444
+ } else {
445
+ explanation += `No errors were detected during processing. `;
446
+ }
447
+
448
+ // Add information about the plan execution
449
+ if (episode.plan && episode.plan.payload && episode.plan.payload.steps) {
450
+ const successfulSteps = episode.plan.payload.steps.filter((step: any) =>
451
+ evidence.some((e) => e.related_step_id === step.id && !e.type.includes('error'))
452
+ ).length;
453
+
454
+ explanation += `Successfully executed ${successfulSteps}/${stepsCount} steps. `;
455
+ }
456
+
457
+ // Add security-related information
458
+ const policyChecks = evidence.filter((e) => e.type === 'security.policy_check');
459
+ if (policyChecks.length > 0) {
460
+ explanation += `Security policy was checked ${policyChecks.length} times during execution. `;
461
+ }
462
+
463
+ // Add dry-run information
464
+ const dryRunEvidence = evidence.filter((e) => e.type === 'execution.dry_run_marker');
465
+ if (dryRunEvidence.length > 0) {
466
+ explanation += 'Execution was performed in dry-run mode. ';
467
+ }
468
+
469
+ return {
470
+ explanation,
471
+ confidence: 0.85,
472
+ supporting_facts: evidence.map((e) => ({
473
+ id: e.id,
474
+ type: e.type,
475
+ summary: e.summary,
476
+ })),
477
+ };
478
+ }
479
+ }
480
+
481
+ // skills/skills_layer.ts - Main skills interface
482
+ class SkillsLayer {
483
+ private planner: Planner;
484
+ private repairService: RepairService;
485
+ private explanationService: ExplanationService;
486
+
487
+ constructor() {
488
+ this.planner = new Planner();
489
+ this.repairService = new RepairService();
490
+ this.explanationService = new ExplanationService();
491
+ }
492
+
493
+ /**
494
+ * Entry point for skill-based operations
495
+ */
496
+ async executeSkill(skill: 'plan' | 'repair' | 'explain', params: any): Promise<any> {
497
+ switch (skill) {
498
+ case 'plan':
499
+ return await this.planner.createPlan(params as PlanningRequest);
500
+ case 'repair':
501
+ return await this.repairService.repairPlan(params as RepairRequest);
502
+ case 'explain':
503
+ return await this.explanationService.explain(params as ExplanationRequest);
504
+ default:
505
+ throw new Error(`Unknown skill: ${skill}`);
506
+ }
507
+ }
508
+ }
509
+
510
+ export { SkillsLayer, Planner, RepairService, ExplanationService };