{"openapi":"3.1.0","info":{"title":"Phage Annotation Server","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Index","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/jobs":{"post":{"summary":"Create Job","operationId":"create_job_jobs_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/jobs/{job_id}":{"get":{"summary":"Job Status Page","operationId":"job_status_page_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/{job_id}/status.json":{"get":{"summary":"Job Status Json","operationId":"job_status_json_jobs__job_id__status_json_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/{job_id}/results":{"get":{"summary":"Job Results Page","operationId":"job_results_page_jobs__job_id__results_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/{job_id}/download":{"get":{"summary":"Job Download Zip","operationId":"job_download_zip_jobs__job_id__download_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/{job_id}/files/{rel_path}":{"get":{"summary":"Job File Download","description":"Serve a single tool-generated result file.\n\nDeliberately scoped to `paths.results_dir` only -- never `input_dir`\n(which holds the canonical FASTA / id_map, i.e. never the raw upload) --\nso this route can only ever return tool-generated derivatives regardless\nof what `rel_path` an attacker sends. Path-traversal is blocked by\nresolving the candidate path and checking containment, not by pattern-\nmatching the input.","operationId":"job_file_download_jobs__job_id__files__rel_path__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"rel_path","in":"path","required":true,"schema":{"type":"string","title":"Rel Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/{job_id}/browser.json":{"get":{"summary":"Job Genome Browser Json","description":"Per-contig CDS features for the results-page genome browser\n(web/static/js/genome-browser.js), parsed from the phynteny GenBank --\nthe most complete annotation, see PLAN.md 7.\n\nRead-only and strictly scoped to this job's results_dir with the same\npath-containment check `job_file_download` uses, even though the\ncandidate path is built from a fixed filename rather than a caller-\nsupplied one -- defence in depth costs nothing here. Parsing itself is\ncached by api.genome_browser (keyed on the file's mtime), so this is\ncheap to call more than once for the same completed job.","operationId":"job_genome_browser_json_jobs__job_id__browser_json_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/about":{"get":{"summary":"About Page","operationId":"about_page_about_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/help":{"get":{"summary":"Help Page","operationId":"help_page_help_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cite":{"get":{"summary":"Cite Page","operationId":"cite_page_cite_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api":{"get":{"summary":"Api Page","operationId":"api_page_api_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/client.py":{"get":{"summary":"Api Client Script","description":"Serve the template client (NAR: \"a template script in python ... and a\nprominent link on the home page\").\n\nServed as text/plain rather than an attachment so it can be read in the\nbrowser before downloading, and piped straight into python by anyone who\nprefers that. It is a static, repo-tracked file -- never generated.","operationId":"api_client_script_api_client_py_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/licenses":{"get":{"summary":"Licenses Page","operationId":"licenses_page_licenses_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/terms":{"get":{"summary":"Terms Page","operationId":"terms_page_terms_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/my-jobs":{"get":{"summary":"My Jobs Page","operationId":"my_jobs_page_my_jobs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/jobs/batch-status":{"post":{"summary":"Jobs Batch Status","description":"Read-only batch status lookup for the client-side \"My jobs\" list.\n\nThe caller (web/static/js/my-jobs.js) already knows every id it sends --\nthey come out of its own browser's localStorage -- so this can never be\nused to enumerate or discover jobs the caller doesn't already know\nabout; it only ever echoes back status for ids explicitly supplied,\nexactly like GET /jobs/{id}/status.json would for each one individually.\nNo mutation, no new information disclosure beyond what that per-job\nendpoint already exposes publicly to anyone holding the id.","operationId":"jobs_batch_status_jobs_batch_status_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}