diff --git a/tasks/orchestrate.py b/tasks/orchestrate.py index 5d1446a..562a9ab 100644 --- a/tasks/orchestrate.py +++ b/tasks/orchestrate.py @@ -296,22 +296,26 @@ def run_recipe( logger.info(f"Generated plan with {len(plan.steps)} steps") - # Save plan as S-expression (content-addressed by plan_id hash) - PLAN_CACHE_DIR.mkdir(parents=True, exist_ok=True) - plan_sexp_path = PLAN_CACHE_DIR / f"{plan.plan_id}.sexp" - if hasattr(plan, 'to_sexp_string'): - with open(plan_sexp_path, "w") as f: - f.write(plan.to_sexp_string()) - else: - # Fallback to JSON for legacy plans - plan_json_path = PLAN_CACHE_DIR / f"{plan.plan_id}.json" - with open(plan_json_path, "w") as f: - f.write(plan.to_json()) + # Save plan as S-expression through cache manager (goes to IPFS) + import tempfile + from cache_manager import get_cache_manager + cache_mgr = get_cache_manager() - # Also save a reference by run_id for easy lookup + plan_sexp = plan.to_sexp_string() if hasattr(plan, 'to_sexp_string') else plan.to_json() + plan_suffix = ".sexp" if hasattr(plan, 'to_sexp_string') else ".json" + + with tempfile.NamedTemporaryFile(delete=False, suffix=plan_suffix, mode="w") as tmp: + tmp.write(plan_sexp) + tmp_path = Path(tmp.name) + + # Store in cache (content-addressed, auto-pins to IPFS) + cached, plan_ipfs_cid = cache_mgr.put(tmp_path, node_type="plan", move=True) + logger.info(f"Plan cached: hash={cached.content_hash}, ipfs={plan_ipfs_cid}") + + # Also save to plans dir for legacy lookup by run_id + PLAN_CACHE_DIR.mkdir(parents=True, exist_ok=True) run_plan_path = PLAN_CACHE_DIR / f"{run_id}.sexp" - if plan_sexp_path.exists(): - run_plan_path.write_text(plan_sexp_path.read_text()) + run_plan_path.write_text(plan_sexp) # Phase 3: Execute logger.info("Phase 3: Executing plan...") @@ -323,6 +327,8 @@ def run_recipe( "run_id": run_id, "recipe": recipe.name, "plan_id": plan.plan_id, + "plan_cache_id": cached.content_hash, + "plan_ipfs_cid": plan_ipfs_cid, "output_path": result.get("output_path"), "output_cache_id": result.get("output_cache_id"), "output_ipfs_cid": result.get("output_ipfs_cid"),