Implement task 014 assets and media library workflow

This commit is contained in:
2026-05-21 23:55:15 +03:00
parent c3914bf8be
commit 8243f20b0e
23 changed files with 2423 additions and 22 deletions
+623 -1
View File
@@ -655,6 +655,110 @@
"title": "ArticleWorkflowStatus",
"type": "string"
},
"AssetGenerateSpecsResponse": {
"additionalProperties": false,
"properties": {
"assets": {
"items": {
"$ref": "#/components/schemas/AssetSummary"
},
"title": "Assets",
"type": "array"
}
},
"title": "AssetGenerateSpecsResponse",
"type": "object"
},
"AssetListResponse": {
"additionalProperties": false,
"properties": {
"assets": {
"items": {
"$ref": "#/components/schemas/AssetSummary"
},
"title": "Assets",
"type": "array"
}
},
"title": "AssetListResponse",
"type": "object"
},
"AssetResponse": {
"additionalProperties": false,
"properties": {
"asset": {
"$ref": "#/components/schemas/AssetSummary"
}
},
"required": [
"asset"
],
"title": "AssetResponse",
"type": "object"
},
"AssetRevisionSummary": {
"additionalProperties": false,
"properties": {
"action": {
"minLength": 1,
"title": "Action",
"type": "string"
},
"actor_user_id": {
"anyOf": [
{
"format": "uuid",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Actor User Id"
},
"article_id": {
"format": "uuid",
"title": "Article Id",
"type": "string"
},
"asset_id": {
"format": "uuid",
"title": "Asset Id",
"type": "string"
},
"created_at": {
"format": "date-time",
"title": "Created At",
"type": "string"
},
"id": {
"format": "uuid",
"title": "Id",
"type": "string"
},
"payload": {
"additionalProperties": true,
"title": "Payload",
"type": "object"
},
"revision_index": {
"minimum": 1,
"title": "Revision Index",
"type": "integer"
}
},
"required": [
"id",
"asset_id",
"article_id",
"revision_index",
"action",
"created_at"
],
"title": "AssetRevisionSummary",
"type": "object"
},
"AssetStatus": {
"enum": [
"PENDING",
@@ -700,6 +804,11 @@
"default": null,
"title": "Caption"
},
"created_at": {
"format": "date-time",
"title": "Created At",
"type": "string"
},
"file_url": {
"anyOf": [
{
@@ -712,11 +821,30 @@
"default": null,
"title": "File Url"
},
"history": {
"items": {
"$ref": "#/components/schemas/AssetRevisionSummary"
},
"title": "History",
"type": "array"
},
"id": {
"format": "uuid",
"title": "Id",
"type": "string"
},
"object_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Object Key"
},
"prompt": {
"anyOf": [
{
@@ -729,6 +857,19 @@
"default": null,
"title": "Prompt"
},
"section_id": {
"anyOf": [
{
"format": "uuid",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Section Id"
},
"status": {
"$ref": "#/components/schemas/AssetStatus"
},
@@ -736,6 +877,11 @@
"minLength": 1,
"title": "Title",
"type": "string"
},
"updated_at": {
"format": "date-time",
"title": "Updated At",
"type": "string"
}
},
"required": [
@@ -743,7 +889,9 @@
"article_id",
"asset_type",
"title",
"status"
"status",
"created_at",
"updated_at"
],
"title": "AssetSummary",
"type": "object"
@@ -753,11 +901,140 @@
"hero_image",
"diagram",
"table",
"flowchart",
"comparison_matrix",
"architecture_diagram",
"inline_image"
],
"title": "AssetType",
"type": "string"
},
"AssetUpdateRequest": {
"additionalProperties": false,
"properties": {
"alt_text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Alt Text"
},
"caption": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Caption"
},
"prompt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Prompt"
},
"section_id": {
"anyOf": [
{
"format": "uuid",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Section Id"
},
"status": {
"anyOf": [
{
"$ref": "#/components/schemas/AssetStatus"
},
{
"type": "null"
}
],
"default": null
},
"title": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Title"
}
},
"title": "AssetUpdateRequest",
"type": "object"
},
"AssetUploadRequest": {
"additionalProperties": false,
"properties": {
"content_base64": {
"minLength": 1,
"title": "Content Base64",
"type": "string"
},
"content_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Content Type"
},
"filename": {
"minLength": 1,
"title": "Filename",
"type": "string"
}
},
"required": [
"filename",
"content_base64"
],
"title": "AssetUploadRequest",
"type": "object"
},
"AssetUploadResponse": {
"additionalProperties": false,
"properties": {
"asset": {
"$ref": "#/components/schemas/AssetSummary"
}
},
"required": [
"asset"
],
"title": "AssetUploadResponse",
"type": "object"
},
"BoundaryQuestionListResponse": {
"additionalProperties": false,
"properties": {
@@ -3648,6 +3925,351 @@
]
}
},
"/api/articles/{article_id}/assets": {
"get": {
"operationId": "get_article_assets_api_articles__article_id__assets_get",
"parameters": [
{
"in": "path",
"name": "article_id",
"required": true,
"schema": {
"format": "uuid",
"title": "Article Id",
"type": "string"
}
},
{
"in": "header",
"name": "X-Demo-User-Email",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Demo-User-Email"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AssetListResponse"
}
}
},
"description": "Successful Response"
},
"422": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
"description": "Validation Error"
}
},
"summary": "Get Article Assets",
"tags": [
"assets"
]
}
},
"/api/articles/{article_id}/assets/generate-specs": {
"post": {
"operationId": "post_generate_asset_specs_api_articles__article_id__assets_generate_specs_post",
"parameters": [
{
"in": "path",
"name": "article_id",
"required": true,
"schema": {
"format": "uuid",
"title": "Article Id",
"type": "string"
}
},
{
"in": "header",
"name": "X-Demo-User-Email",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Demo-User-Email"
}
}
],
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AssetGenerateSpecsResponse"
}
}
},
"description": "Successful Response"
},
"422": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
"description": "Validation Error"
}
},
"summary": "Post Generate Asset Specs",
"tags": [
"assets"
]
}
},
"/api/articles/{article_id}/assets/{asset_id}": {
"patch": {
"operationId": "patch_article_asset_api_articles__article_id__assets__asset_id__patch",
"parameters": [
{
"in": "path",
"name": "article_id",
"required": true,
"schema": {
"format": "uuid",
"title": "Article Id",
"type": "string"
}
},
{
"in": "path",
"name": "asset_id",
"required": true,
"schema": {
"format": "uuid",
"title": "Asset Id",
"type": "string"
}
},
{
"in": "header",
"name": "X-Demo-User-Email",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Demo-User-Email"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AssetUpdateRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AssetResponse"
}
}
},
"description": "Successful Response"
},
"422": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
"description": "Validation Error"
}
},
"summary": "Patch Article Asset",
"tags": [
"assets"
]
}
},
"/api/articles/{article_id}/assets/{asset_id}/approve": {
"post": {
"operationId": "post_approve_asset_api_articles__article_id__assets__asset_id__approve_post",
"parameters": [
{
"in": "path",
"name": "article_id",
"required": true,
"schema": {
"format": "uuid",
"title": "Article Id",
"type": "string"
}
},
{
"in": "path",
"name": "asset_id",
"required": true,
"schema": {
"format": "uuid",
"title": "Asset Id",
"type": "string"
}
},
{
"in": "header",
"name": "X-Demo-User-Email",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Demo-User-Email"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AssetResponse"
}
}
},
"description": "Successful Response"
},
"422": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
"description": "Validation Error"
}
},
"summary": "Post Approve Asset",
"tags": [
"assets"
]
}
},
"/api/articles/{article_id}/assets/{asset_id}/upload": {
"post": {
"operationId": "post_upload_asset_file_api_articles__article_id__assets__asset_id__upload_post",
"parameters": [
{
"in": "path",
"name": "article_id",
"required": true,
"schema": {
"format": "uuid",
"title": "Article Id",
"type": "string"
}
},
{
"in": "path",
"name": "asset_id",
"required": true,
"schema": {
"format": "uuid",
"title": "Asset Id",
"type": "string"
}
},
{
"in": "header",
"name": "X-Demo-User-Email",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Demo-User-Email"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AssetUploadRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AssetUploadResponse"
}
}
},
"description": "Successful Response"
},
"422": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
"description": "Validation Error"
}
},
"summary": "Post Upload Asset File",
"tags": [
"assets"
]
}
},
"/api/articles/{article_id}/boundary-questions": {
"get": {
"operationId": "get_boundary_questions_api_articles__article_id__boundary_questions_get",
+48 -1
View File
@@ -102,6 +102,29 @@ export type ArticleSummary = {
export type ArticleWorkflowStatus = "ARTICLE_BRIEF_CREATED" | "BOUNDARY_QUESTIONS_GENERATED" | "BOUNDARY_ANSWERS_SUBMITTED" | "PLAN_GENERATED" | "PLAN_REVIEW_REQUIRED" | "PLAN_REVISION_REQUIRED" | "RESEARCH_RUNNING" | "EVIDENCE_MATRIX_READY" | "PARALLEL_PRODUCTION_RUNNING" | "DRAFT_ASSEMBLED" | "SEO_AND_LANGUAGE_REVIEW_READY" | "FINAL_REVIEW_REQUIRED" | "FINAL_REVISION_REQUIRED" | "PUBLISH_DRY_RUN_REQUIRED" | "PUBLISH_COMMIT_READY" | "PUBLISH_COMMIT_CREATED";
export type AssetGenerateSpecsResponse = {
assets?: AssetSummary[];
};
export type AssetListResponse = {
assets?: AssetSummary[];
};
export type AssetResponse = {
asset: AssetSummary;
};
export type AssetRevisionSummary = {
action: string;
actor_user_id?: string | null;
article_id: string;
asset_id: string;
created_at: string;
id: string;
payload?: Record<string, unknown>;
revision_index: number;
};
export type AssetStatus = "PENDING" | "GENERATED" | "APPROVED" | "REJECTED";
export type AssetSummary = {
@@ -109,14 +132,38 @@ export type AssetSummary = {
article_id: string;
asset_type: AssetType;
caption?: string | null;
created_at: string;
file_url?: string | null;
history?: AssetRevisionSummary[];
id: string;
object_key?: string | null;
prompt?: string | null;
section_id?: string | null;
status: AssetStatus;
title: string;
updated_at: string;
};
export type AssetType = "hero_image" | "diagram" | "table" | "inline_image";
export type AssetType = "hero_image" | "diagram" | "table" | "flowchart" | "comparison_matrix" | "architecture_diagram" | "inline_image";
export type AssetUpdateRequest = {
alt_text?: string | null;
caption?: string | null;
prompt?: string | null;
section_id?: string | null;
status?: AssetStatus | null;
title?: string | null;
};
export type AssetUploadRequest = {
content_base64: string;
content_type?: string | null;
filename: string;
};
export type AssetUploadResponse = {
asset: AssetSummary;
};
export type BoundaryQuestionListResponse = {
job?: AgentJobSummary | null;