@mamdouh-aboammar/agentic-workflow 1.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/.claude-plugin/plugin.json +10 -0
- package/.codex-plugin/plugin.json +13 -0
- package/.skills.json +19 -0
- package/AGENTS.md +1344 -0
- package/CLAUDE.md +178 -0
- package/GEMINI.md +102 -0
- package/LICENSE +21 -0
- package/README.md +350 -0
- package/SKILL.md +132 -0
- package/bin/agentic-hooks.sh +79 -0
- package/bin/cli.js +1060 -0
- package/core/__init__.py +52 -0
- package/core/ai_evaluator.py +117 -0
- package/core/autopilot_engine.py +368 -0
- package/core/clean_code_guard.py +188 -0
- package/core/engine_py/__init__.py +29 -0
- package/core/engine_py/agent_worker.py +136 -0
- package/core/engine_py/decider.py +150 -0
- package/core/engine_py/energy.py +45 -0
- package/core/engine_py/event_bus.py +63 -0
- package/core/engine_py/executor.py +186 -0
- package/core/engine_py/models.py +193 -0
- package/core/engine_py/queue.py +314 -0
- package/core/engine_py/runner.py +116 -0
- package/core/engine_py/system_workers.py +70 -0
- package/core/engine_py/toon_adapter.py +586 -0
- package/core/engine_py/verification_controller.py +208 -0
- package/core/engine_py/worker.py +167 -0
- package/core/engine_spec/event_schema.json +65 -0
- package/core/engine_spec/example_workflow.yaml +73 -0
- package/core/engine_spec/workflow_schema.json +127 -0
- package/core/hooks/__init__.py +29 -0
- package/core/hooks/adapters/__init__.py +25 -0
- package/core/hooks/adapters/claude_adapter.py +83 -0
- package/core/hooks/adapters/cli_agent_adapter.py +82 -0
- package/core/hooks/adapters/codex_adapter.py +78 -0
- package/core/hooks/adapters/cursor_adapter.py +73 -0
- package/core/hooks/adapters/gemini_adapter.py +93 -0
- package/core/hooks/adapters/homebrew_adapter.py +69 -0
- package/core/hooks/adapters/mcp_proxy.py +133 -0
- package/core/hooks/adapters/shell_adapter.py +65 -0
- package/core/hooks/dispatcher.py +118 -0
- package/core/hooks/policy_engine.py +375 -0
- package/core/hooks/session_end.py +141 -0
- package/core/hooks/types.py +147 -0
- package/core/integrations/__init__.py +28 -0
- package/core/integrations/installer.py +225 -0
- package/core/integrations/lifecycle_director.py +175 -0
- package/core/integrations/registry.py +105 -0
- package/core/multi_agent_system.py +164 -0
- package/core/skills_indexer.py +742 -0
- package/core/system/__init__.py +25 -0
- package/core/system/announcements.py +72 -0
- package/core/system/dependencies.py +69 -0
- package/core/system/doctor.py +171 -0
- package/core/system/health.py +144 -0
- package/core/system/installer.py +137 -0
- package/core/system/notifications.py +97 -0
- package/core/system/refresher.py +110 -0
- package/core/system/updater.py +167 -0
- package/core/system/version_tracker.py +65 -0
- package/docs/architecture_plan.md +7 -0
- package/docs/guides/failure-recovery.md +714 -0
- package/docs/implementation_summary.md +10 -0
- package/docs/protocols/autopilot-execution.md +148 -0
- package/docs/protocols/code-change-protocol.md +49 -0
- package/docs/protocols/context-preservation-detail.md +114 -0
- package/docs/protocols/quality-gates.md +110 -0
- package/docs/protocols/ulw-mode.md +60 -0
- package/docs/research_findings.md +10 -0
- package/docs/solutions/autonomous-autopilot-engine-architecture.md +38 -0
- package/install.sh +111 -0
- package/marketplace.json +37 -0
- package/package.json +81 -0
- package/skills/agentic-workflow/SKILL.md +132 -0
- package/skills/agentic-workflow/skill-spec.json +100 -0
- package/soul.md +445 -0
- package/src/engine_ts/decider.ts +186 -0
- package/src/engine_ts/event-bus.ts +57 -0
- package/src/engine_ts/executor.ts +262 -0
- package/src/engine_ts/index.ts +12 -0
- package/src/engine_ts/queue.ts +93 -0
- package/src/engine_ts/runner.ts +108 -0
- package/src/engine_ts/skills-indexer.ts +264 -0
- package/src/engine_ts/toon-adapter.ts +91 -0
- package/src/engine_ts/types.ts +134 -0
- package/src/engine_ts/verification-controller.ts +204 -0
- package/src/engine_ts/worker.ts +280 -0
- package/src/hooks/adapters/claude-adapter.ts +54 -0
- package/src/hooks/adapters/cli-agent-adapter.ts +46 -0
- package/src/hooks/adapters/codex-adapter.ts +69 -0
- package/src/hooks/adapters/cursor-adapter.ts +60 -0
- package/src/hooks/adapters/gemini-adapter.ts +71 -0
- package/src/hooks/adapters/homebrew-adapter.ts +36 -0
- package/src/hooks/adapters/mcp-proxy.ts +66 -0
- package/src/hooks/adapters/shell-adapter.ts +42 -0
- package/src/hooks/dispatcher.ts +113 -0
- package/src/hooks/index.ts +16 -0
- package/src/hooks/policy-engine.ts +376 -0
- package/src/hooks/session-end.ts +125 -0
- package/src/hooks/types.ts +61 -0
- package/src/index.d.ts +34 -0
- package/src/index.ts +23 -0
- package/src/integrations/index.ts +7 -0
- package/src/integrations/installer.ts +208 -0
- package/src/integrations/lifecycle-director.ts +139 -0
- package/src/integrations/registry.ts +82 -0
- package/src/system/announcements.ts +143 -0
- package/src/system/dependencies.ts +176 -0
- package/src/system/doctor.ts +374 -0
- package/src/system/health.ts +270 -0
- package/src/system/index.ts +14 -0
- package/src/system/installer.ts +262 -0
- package/src/system/notifications.ts +180 -0
- package/src/system/refresher.ts +207 -0
- package/src/system/types.ts +268 -0
- package/src/system/updater.ts +219 -0
- package/src/system/version-tracker.ts +137 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
runner.py ā CLI entry point for Python Agentic Engine.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
import asyncio
|
|
9
|
+
|
|
10
|
+
# Ensure project root is on sys.path
|
|
11
|
+
root_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../.."))
|
|
12
|
+
if root_dir not in sys.path:
|
|
13
|
+
sys.path.insert(0, root_dir)
|
|
14
|
+
|
|
15
|
+
from core.engine_py.models import (
|
|
16
|
+
WorkflowDefinition, StageDefinition, TaskDefinition, AgentRole
|
|
17
|
+
)
|
|
18
|
+
from core.engine_py.queue import InMemoryTaskQueue
|
|
19
|
+
from core.engine_py.event_bus import AsyncEventBus
|
|
20
|
+
from core.engine_py.verification_controller import VerificationController
|
|
21
|
+
from core.engine_py.system_workers import SystemWorker
|
|
22
|
+
from core.engine_py.agent_worker import AgentWorker
|
|
23
|
+
from core.engine_py.executor import AgenticExecutor
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
async def main():
|
|
27
|
+
project_dir = os.getcwd()
|
|
28
|
+
print("š [engine-py] Starting Event-Driven Agentic Engine (Python AsyncIO)...")
|
|
29
|
+
|
|
30
|
+
wf_def = WorkflowDefinition(
|
|
31
|
+
name="autonomous_agentic_pipeline",
|
|
32
|
+
version="1.0.0",
|
|
33
|
+
stages=[
|
|
34
|
+
StageDefinition(
|
|
35
|
+
id="stage_01_research",
|
|
36
|
+
name="Stage 1: Research",
|
|
37
|
+
tasks=[
|
|
38
|
+
TaskDefinition(
|
|
39
|
+
id="task_research_01",
|
|
40
|
+
name="Analyze System Architecture and Dependencies",
|
|
41
|
+
type="agent.task",
|
|
42
|
+
role=AgentRole.RESEARCHER,
|
|
43
|
+
deliverable_path="docs/research_findings.md",
|
|
44
|
+
criteria=["Analyze architecture patterns", "Establish baseline"]
|
|
45
|
+
)
|
|
46
|
+
]
|
|
47
|
+
),
|
|
48
|
+
StageDefinition(
|
|
49
|
+
id="stage_02_planning",
|
|
50
|
+
name="Stage 2: Planning",
|
|
51
|
+
tasks=[
|
|
52
|
+
TaskDefinition(
|
|
53
|
+
id="task_plan_approval",
|
|
54
|
+
name="Autopilot Plan Approval",
|
|
55
|
+
type="agent.human",
|
|
56
|
+
role=AgentRole.ORCHESTRATOR
|
|
57
|
+
)
|
|
58
|
+
]
|
|
59
|
+
),
|
|
60
|
+
StageDefinition(
|
|
61
|
+
id="stage_03_implementation",
|
|
62
|
+
name="Stage 3: Implementation",
|
|
63
|
+
tasks=[
|
|
64
|
+
TaskDefinition(
|
|
65
|
+
id="task_code_impl",
|
|
66
|
+
name="Implement Core Production Logic",
|
|
67
|
+
type="agent.task",
|
|
68
|
+
role=AgentRole.ENGINEER,
|
|
69
|
+
deliverable_path="docs/implementation_summary.md",
|
|
70
|
+
criteria=["Pass unit tests", "Generate comprehensive documentation"]
|
|
71
|
+
),
|
|
72
|
+
TaskDefinition(
|
|
73
|
+
id="task_review_01",
|
|
74
|
+
name="Adversarial Code & Fact-Check Review",
|
|
75
|
+
type="agent.review",
|
|
76
|
+
role=AgentRole.REVIEWER,
|
|
77
|
+
deliverable_path="review-logs/step-3-review.md",
|
|
78
|
+
criteria=["Zero critical vulnerabilities"]
|
|
79
|
+
)
|
|
80
|
+
]
|
|
81
|
+
)
|
|
82
|
+
]
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
queue = InMemoryTaskQueue()
|
|
86
|
+
ledger_path = os.path.join(project_dir, "ledger.jsonl")
|
|
87
|
+
event_bus = AsyncEventBus(ledger_path=ledger_path)
|
|
88
|
+
verifier = VerificationController(project_dir=project_dir)
|
|
89
|
+
|
|
90
|
+
sys_worker = SystemWorker(worker_id="sys_worker_py", queue=queue, event_bus=event_bus, verification_controller=verifier)
|
|
91
|
+
agent_worker = AgentWorker(worker_id="agent_worker_py", queue=queue, event_bus=event_bus, verification_controller=verifier, project_dir=project_dir)
|
|
92
|
+
|
|
93
|
+
executor = AgenticExecutor(
|
|
94
|
+
workflow_def=wf_def,
|
|
95
|
+
queue=queue,
|
|
96
|
+
event_bus=event_bus,
|
|
97
|
+
project_dir=project_dir,
|
|
98
|
+
sot_filename="state.yaml"
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
print(f"ā” Trace ID: {executor.instance.trace_id}")
|
|
102
|
+
print(f"ā” Workflow ID: {executor.instance.workflow_id}")
|
|
103
|
+
print(f"ā” SOT Path: {executor.sot_path}")
|
|
104
|
+
|
|
105
|
+
success = await executor.run_until_complete(workers=[sys_worker, agent_worker], poll_interval=0.02, max_iterations=50)
|
|
106
|
+
|
|
107
|
+
if success:
|
|
108
|
+
print("\nš [engine-py] Workflow Completed Successfully with All Gates Verified!")
|
|
109
|
+
sys.exit(0)
|
|
110
|
+
else:
|
|
111
|
+
print("\nā [engine-py] Workflow execution halted or failed gates.")
|
|
112
|
+
sys.exit(1)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
if __name__ == "__main__":
|
|
116
|
+
asyncio.run(main())
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""
|
|
2
|
+
system_workers.py ā Built-in System Task Workers.
|
|
3
|
+
|
|
4
|
+
Implements handlers for:
|
|
5
|
+
- system.code: executes inline Python or shell code
|
|
6
|
+
- system.wait: timer delays or external signal pauses
|
|
7
|
+
- system.switch: evaluates dynamic conditional branching
|
|
8
|
+
- system.transform: data projection and key transformation
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
import sys
|
|
13
|
+
import asyncio
|
|
14
|
+
from typing import Dict, Any, List
|
|
15
|
+
|
|
16
|
+
from core.engine_py.models import TaskInstance
|
|
17
|
+
from core.engine_py.worker import BaseWorker
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class SystemWorker(BaseWorker):
|
|
21
|
+
"""Worker handling core system task execution without external AI dependencies."""
|
|
22
|
+
|
|
23
|
+
def __init__(self, worker_id: str, queue, event_bus, verification_controller=None):
|
|
24
|
+
super().__init__(
|
|
25
|
+
worker_id=worker_id,
|
|
26
|
+
task_types=["system.code", "system.wait", "system.switch", "system.transform"],
|
|
27
|
+
queue=queue,
|
|
28
|
+
event_bus=event_bus,
|
|
29
|
+
verification_controller=verification_controller
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
async def execute_task(self, task: TaskInstance) -> Dict[str, Any]:
|
|
33
|
+
task_type = task.task_def.type
|
|
34
|
+
|
|
35
|
+
if task_type == "system.code":
|
|
36
|
+
return await self._execute_code(task)
|
|
37
|
+
elif task_type == "system.wait":
|
|
38
|
+
return await self._execute_wait(task)
|
|
39
|
+
elif task_type == "system.switch":
|
|
40
|
+
return await self._execute_switch(task)
|
|
41
|
+
elif task_type == "system.transform":
|
|
42
|
+
return await self._execute_transform(task)
|
|
43
|
+
else:
|
|
44
|
+
raise ValueError(f"Unsupported system task type: {task_type}")
|
|
45
|
+
|
|
46
|
+
async def _execute_code(self, task: TaskInstance) -> Dict[str, Any]:
|
|
47
|
+
code = task.task_def.input_parameters.get("code", "")
|
|
48
|
+
# Safe evaluation of deterministic expressions
|
|
49
|
+
local_scope: Dict[str, Any] = {"inputs": task.input_data, "result": None}
|
|
50
|
+
exec(code, {}, local_scope)
|
|
51
|
+
return {"result": local_scope.get("result", "COMPLETED")}
|
|
52
|
+
|
|
53
|
+
async def _execute_wait(self, task: TaskInstance) -> Dict[str, Any]:
|
|
54
|
+
duration = float(task.task_def.input_parameters.get("seconds", 1.0))
|
|
55
|
+
await asyncio.sleep(min(duration, 10.0)) # Capped for safety in test run
|
|
56
|
+
return {"waited_seconds": duration}
|
|
57
|
+
|
|
58
|
+
async def _execute_switch(self, task: TaskInstance) -> Dict[str, Any]:
|
|
59
|
+
condition_key = task.task_def.input_parameters.get("key", "status")
|
|
60
|
+
val = task.input_data.get(condition_key)
|
|
61
|
+
branches = task.task_def.branches
|
|
62
|
+
chosen_branch = branches.get(str(val), branches.get("default", "default_branch"))
|
|
63
|
+
return {"selected_branch": chosen_branch}
|
|
64
|
+
|
|
65
|
+
async def _execute_transform(self, task: TaskInstance) -> Dict[str, Any]:
|
|
66
|
+
mapping = task.task_def.input_parameters.get("mapping", {})
|
|
67
|
+
transformed = {}
|
|
68
|
+
for out_key, in_path in mapping.items():
|
|
69
|
+
transformed[out_key] = task.input_data.get(in_path)
|
|
70
|
+
return transformed
|