| 126 | |
| 127 | |
| 128 | def create_manual_blueprint(get_visualizer_path: Callable[[], str]) -> Blueprint: |
| 129 | bp = Blueprint("manual", __name__, url_prefix="/manual") |
| 130 | |
| 131 | @bp.route("", methods=["GET"], strict_slashes=False) |
| 132 | @bp.route("/", methods=["GET"], strict_slashes=False) |
| 133 | def manual_page(): |
| 134 | return render_template("manual_page.html") |
| 135 | |
| 136 | @bp.get("/api/tasks") |
| 137 | def api_tasks(): |
| 138 | run_root = _resolve_run_root(get_visualizer_path()) |
| 139 | qdir = _queue_dir(run_root) |
| 140 | items = _list_tasks(qdir) |
| 141 | data = [{"id": t.id, "created_at": t.created_at, "model": t.model} for t in items] |
| 142 | return jsonify({"tasks": data}) |
| 143 | |
| 144 | @bp.get("/api/tasks/<task_id>") |
| 145 | def api_task_detail(task_id: str): |
| 146 | run_root = _resolve_run_root(get_visualizer_path()) |
| 147 | qdir = _queue_dir(run_root) |
| 148 | data = _read_task(qdir, task_id) |
| 149 | if data is None: |
| 150 | return ("Task not found", 404) |
| 151 | |
| 152 | return jsonify({ |
| 153 | "id": data.get("id"), |
| 154 | "created_at": data.get("created_at"), |
| 155 | "model": data.get("model"), |
| 156 | "display_prompt": data.get("display_prompt", ""), |
| 157 | }) |
| 158 | |
| 159 | @bp.post("/api/tasks/<task_id>/answer") |
| 160 | def api_task_answer(task_id: str): |
| 161 | run_root = _resolve_run_root(get_visualizer_path()) |
| 162 | qdir = _queue_dir(run_root) |
| 163 | |
| 164 | # Accept form POST (current UI), optionally JSON too. |
| 165 | answer = (request.form.get("answer") or "").strip() |
| 166 | if not answer and request.is_json: |
| 167 | body = request.get_json(silent=True) or {} |
| 168 | answer = str(body.get("answer") or "").strip() |
| 169 | |
| 170 | if not answer: |
| 171 | return ("Answer must not be empty", 400) |
| 172 | |
| 173 | if not (qdir / f"{task_id}.json").exists(): |
| 174 | return ("Task not found", 404) |
| 175 | |
| 176 | _write_answer(qdir, task_id, answer) |
| 177 | return jsonify({"ok": True}) |
| 178 | |
| 179 | return bp |