[eric] apps: CreateApp result points at SKILL.md instead of inlining the reference (no transcript rot)

This commit is contained in:
ciregenz
2026-07-02 16:03:54 -07:00
parent c0a40a4425
commit 30dccc3bf1
3 changed files with 11 additions and 7 deletions
+5 -5
View File
@@ -94,16 +94,16 @@ def handle_tool_call(tool_name: str, arguments: dict) -> dict:
})
if "error" in result:
return {"content": [{"type": "text", "text": f"Error: {result['error']}"}], "isError": True}
path = result.get("path")
# Point at SKILL.md instead of inlining the ~6.5k-token reference: it's written to the workspace at seed time, so a one-time Read keeps it out of the transcript (where an inline copy would rot for the rest of the session). Read it BEFORE building.
lines = [
f"App '{name}' created and its live preview card is now on the user's dashboard.",
f"- workspace: {result.get('path')}",
f"- workspace: {path}",
f"- output_id: {result.get('output_id')}",
"",
"Build it by writing files under the workspace path; the preview hot-reloads on save.",
f"NEXT: read {path}/SKILL.md now — it's the full App Builder reference (stack, layout, rules); follow it.",
"Then build by writing files under the workspace path; the preview hot-reloads on save.",
"Housekeeping: write meta.json (name/description) first; `bash restart.sh` restarts the runtime; `.openswarm/terminal.log` is the live terminal (check it before declaring done).",
"The full App Builder reference follows — FOLLOW IT (it also lives at SKILL.md in the workspace):",
"",
str(result.get("skill") or ""),
]
return {"content": [{"type": "text", "text": "\n".join(lines)}]}
+1 -1
View File
@@ -274,11 +274,11 @@ async def agent_create_app(body: AgentCreateAppRequest):
})
except Exception:
logger.exception("agent-create output_upserted broadcast failed")
# The reference isn't returned here: it's written to <folder>/SKILL.md at seed time and the agent reads it on demand, keeping the ~6.5k-token blob out of both this response and the agent transcript.
return {
"ok": True,
"output_id": output_id,
"path": os.path.abspath(folder),
"skill": load_app_builder_skill(),
}
+5 -1
View File
@@ -34,7 +34,11 @@ async def test_agent_create_registers_named_output_and_broadcasts(tmp_path, monk
))
assert res["ok"] is True
assert os.path.isfile(os.path.join(res["path"], "run.sh"))
assert "App Builder" in res["skill"] or len(res["skill"]) > 500
# The reference is NOT inlined in the response (context-rot fix) — it's on disk as SKILL.md for the agent to read on demand.
assert "skill" not in res
skill_path = os.path.join(res["path"], "SKILL.md")
assert os.path.isfile(skill_path)
assert len(open(skill_path, encoding="utf-8").read()) > 500
output = load_output(res["output_id"])
assert output.name == "Pomodoro Timer"