fix: identity effect links to GitHub, others to rose-ash
- Identity effect is part of artdag package on GitHub - Other effects (dog) link to rose-ash effects repo with commit hash - Added effect_url field to RunStatus for proper URL storage - Extract repo_url from provenance instead of building it 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
19
server.py
19
server.py
@@ -95,6 +95,7 @@ class RunStatus(BaseModel):
|
|||||||
error: Optional[str] = None
|
error: Optional[str] = None
|
||||||
celery_task_id: Optional[str] = None
|
celery_task_id: Optional[str] = None
|
||||||
effects_commit: Optional[str] = None
|
effects_commit: Optional[str] = None
|
||||||
|
effect_url: Optional[str] = None # URL to effect source code
|
||||||
username: Optional[str] = None # Owner of the run
|
username: Optional[str] = None # Owner of the run
|
||||||
|
|
||||||
|
|
||||||
@@ -317,10 +318,11 @@ async def get_run(run_id: str):
|
|||||||
run.completed_at = datetime.now(timezone.utc).isoformat()
|
run.completed_at = datetime.now(timezone.utc).isoformat()
|
||||||
run.output_hash = result.get("output", {}).get("content_hash")
|
run.output_hash = result.get("output", {}).get("content_hash")
|
||||||
|
|
||||||
# Extract effects commit from provenance
|
# Extract effects info from provenance
|
||||||
effects = result.get("effects", [])
|
effects = result.get("effects", [])
|
||||||
if effects:
|
if effects:
|
||||||
run.effects_commit = effects[0].get("repo_commit")
|
run.effects_commit = effects[0].get("repo_commit")
|
||||||
|
run.effect_url = effects[0].get("repo_url")
|
||||||
|
|
||||||
# Cache the output
|
# Cache the output
|
||||||
output_path = Path(result.get("output", {}).get("local_path", ""))
|
output_path = Path(result.get("output", {}).get("local_path", ""))
|
||||||
@@ -893,10 +895,11 @@ async def ui_detail_page(run_id: str):
|
|||||||
run.status = "completed"
|
run.status = "completed"
|
||||||
run.completed_at = datetime.now(timezone.utc).isoformat()
|
run.completed_at = datetime.now(timezone.utc).isoformat()
|
||||||
run.output_hash = result.get("output", {}).get("content_hash")
|
run.output_hash = result.get("output", {}).get("content_hash")
|
||||||
# Extract effects commit
|
# Extract effects info from provenance
|
||||||
effects = result.get("effects", [])
|
effects = result.get("effects", [])
|
||||||
if effects:
|
if effects:
|
||||||
run.effects_commit = effects[0].get("repo_commit")
|
run.effects_commit = effects[0].get("repo_commit")
|
||||||
|
run.effect_url = effects[0].get("repo_url")
|
||||||
output_path = Path(result.get("output", {}).get("local_path", ""))
|
output_path = Path(result.get("output", {}).get("local_path", ""))
|
||||||
if output_path.exists():
|
if output_path.exists():
|
||||||
cache_file(output_path)
|
cache_file(output_path)
|
||||||
@@ -905,8 +908,10 @@ async def ui_detail_page(run_id: str):
|
|||||||
run.error = str(task.result)
|
run.error = str(task.result)
|
||||||
save_run(run)
|
save_run(run)
|
||||||
|
|
||||||
# Build effect URL - use commit hash if available
|
# Use stored effect URL or build fallback
|
||||||
if run.effects_commit and run.effects_commit != "unknown":
|
if run.effect_url:
|
||||||
|
effect_url = run.effect_url
|
||||||
|
elif run.effects_commit and run.effects_commit != "unknown":
|
||||||
effect_url = f"https://git.rose-ash.com/art-dag/effects/src/commit/{run.effects_commit}/{run.recipe}"
|
effect_url = f"https://git.rose-ash.com/art-dag/effects/src/commit/{run.effects_commit}/{run.recipe}"
|
||||||
else:
|
else:
|
||||||
effect_url = f"https://git.rose-ash.com/art-dag/effects/src/branch/main/{run.recipe}"
|
effect_url = f"https://git.rose-ash.com/art-dag/effects/src/branch/main/{run.recipe}"
|
||||||
@@ -1030,12 +1035,13 @@ async def ui_detail_page(run_id: str):
|
|||||||
"status": run.status,
|
"status": run.status,
|
||||||
"recipe": run.recipe,
|
"recipe": run.recipe,
|
||||||
"effects_commit": run.effects_commit,
|
"effects_commit": run.effects_commit,
|
||||||
"effect_url": effect_url,
|
"effect_url": run.effect_url or effect_url,
|
||||||
"inputs": run.inputs,
|
"inputs": run.inputs,
|
||||||
"output_hash": run.output_hash,
|
"output_hash": run.output_hash,
|
||||||
"output_name": run.output_name,
|
"output_name": run.output_name,
|
||||||
"created_at": run.created_at,
|
"created_at": run.created_at,
|
||||||
"completed_at": run.completed_at,
|
"completed_at": run.completed_at,
|
||||||
|
"username": run.username,
|
||||||
"error": run.error
|
"error": run.error
|
||||||
}, indent=2)
|
}, indent=2)
|
||||||
|
|
||||||
@@ -1066,10 +1072,11 @@ async def ui_run_partial(run_id: str):
|
|||||||
run.status = "completed"
|
run.status = "completed"
|
||||||
run.completed_at = datetime.now(timezone.utc).isoformat()
|
run.completed_at = datetime.now(timezone.utc).isoformat()
|
||||||
run.output_hash = result.get("output", {}).get("content_hash")
|
run.output_hash = result.get("output", {}).get("content_hash")
|
||||||
# Extract effects commit
|
# Extract effects info from provenance
|
||||||
effects = result.get("effects", [])
|
effects = result.get("effects", [])
|
||||||
if effects:
|
if effects:
|
||||||
run.effects_commit = effects[0].get("repo_commit")
|
run.effects_commit = effects[0].get("repo_commit")
|
||||||
|
run.effect_url = effects[0].get("repo_url")
|
||||||
output_path = Path(result.get("output", {}).get("local_path", ""))
|
output_path = Path(result.get("output", {}).get("local_path", ""))
|
||||||
if output_path.exists():
|
if output_path.exists():
|
||||||
cache_file(output_path)
|
cache_file(output_path)
|
||||||
|
|||||||
30
tasks.py
30
tasks.py
@@ -125,8 +125,25 @@ def render_effect(self, input_hash: str, effect_name: str, output_name: str) ->
|
|||||||
if output_hash != expected_hash:
|
if output_hash != expected_hash:
|
||||||
raise ValueError(f"Output hash mismatch: expected {expected_hash}, got {output_hash}")
|
raise ValueError(f"Output hash mismatch: expected {expected_hash}, got {output_hash}")
|
||||||
|
|
||||||
# Get effects repo commit
|
# Build effect info based on source
|
||||||
effects_commit = get_effects_commit()
|
if effect_name == "identity":
|
||||||
|
# Identity is from artdag package on GitHub
|
||||||
|
effect_info = {
|
||||||
|
"name": f"effect:{effect_name}",
|
||||||
|
"content_hash": REGISTRY[f"effect:{effect_name}"]["hash"],
|
||||||
|
"repo": "github",
|
||||||
|
"repo_url": "https://github.com/gilesbradshaw/art-dag/blob/main/artdag/nodes/effect.py"
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
# Other effects from rose-ash effects repo
|
||||||
|
effects_commit = get_effects_commit()
|
||||||
|
effect_info = {
|
||||||
|
"name": f"effect:{effect_name}",
|
||||||
|
"content_hash": REGISTRY[f"effect:{effect_name}"]["hash"],
|
||||||
|
"repo": "rose-ash",
|
||||||
|
"repo_commit": effects_commit,
|
||||||
|
"repo_url": f"https://git.rose-ash.com/art-dag/effects/src/commit/{effects_commit}/{effect_name}"
|
||||||
|
}
|
||||||
|
|
||||||
# Build provenance
|
# Build provenance
|
||||||
provenance = {
|
provenance = {
|
||||||
@@ -141,14 +158,7 @@ def render_effect(self, input_hash: str, effect_name: str, output_name: str) ->
|
|||||||
"inputs": [
|
"inputs": [
|
||||||
{"content_hash": input_hash}
|
{"content_hash": input_hash}
|
||||||
],
|
],
|
||||||
"effects": [
|
"effects": [effect_info],
|
||||||
{
|
|
||||||
"name": f"effect:{effect_name}",
|
|
||||||
"content_hash": REGISTRY[f"effect:{effect_name}"]["hash"],
|
|
||||||
"repo_commit": effects_commit,
|
|
||||||
"repo_url": f"https://git.rose-ash.com/art-dag/effects/src/commit/{effects_commit}/{effect_name}"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"infrastructure": {
|
"infrastructure": {
|
||||||
"software": {"name": "infra:artdag", "content_hash": REGISTRY["infra:artdag"]["hash"]},
|
"software": {"name": "infra:artdag", "content_hash": REGISTRY["infra:artdag"]["hash"]},
|
||||||
"hardware": {"name": "infra:giles-hp", "content_hash": REGISTRY["infra:giles-hp"]["hash"]}
|
"hardware": {"name": "infra:giles-hp", "content_hash": REGISTRY["infra:giles-hp"]["hash"]}
|
||||||
|
|||||||
Reference in New Issue
Block a user