From 71f7dcbbad206de7d3a7acc9ceeda473a6c4d38b Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 2 Sep 2025 18:36:14 +0800 Subject: [PATCH] Enhance job management and category handling - Introduced field lists for job, category, execution, and log queries to streamline data retrieval. - Updated ListJobs, GetJob, GetCategories, and ListLogs functions to utilize new field lists for improved query efficiency. - Enhanced job creation logic to set default values for enabled status, ensuring new jobs are active by default. - Added category name resolution in job retrieval, enriching job data with associated category names. - Improved error handling and logging throughout job and category management processes for better traceability. --- data/bindata.go | 278 ++++++++++++------------- job/data.go | 184 ++++++++++++++++- job/job.go | 8 + openapi/job/categories.go | 180 +++++++++++++++++ openapi/job/executions.go | 333 ++++++++++++++++++++++++++++++ openapi/job/job.go | 55 +++++ openapi/job/jobs.go | 404 +++++++++++++++++++++++++++++++++++++ openapi/job/logs.go | 188 +++++++++++++++++ openapi/openapi.go | 4 + yao/models/job/job.mod.yao | 14 +- 10 files changed, 1504 insertions(+), 144 deletions(-) create mode 100644 openapi/job/categories.go create mode 100644 openapi/job/executions.go create mode 100644 openapi/job/jobs.go create mode 100644 openapi/job/logs.go diff --git a/data/bindata.go b/data/bindata.go index 17ed699c..bf8c40a6 100644 --- a/data/bindata.go +++ b/data/bindata.go @@ -316,7 +316,7 @@ func cuiSetupIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/setup/index.html", size: 10, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "cui/setup/index.html", size: 10, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -336,7 +336,7 @@ func cuiV09IndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/v0.9/index.html", size: 13, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "cui/v0.9/index.html", size: 13, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -356,7 +356,7 @@ func cuiV10IndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/v1.0/index.html", size: 49, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "cui/v1.0/index.html", size: 49, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -376,7 +376,7 @@ func cuiV10Layouts__indexAsyncJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/v1.0/layouts__index.async.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "cui/v1.0/layouts__index.async.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -396,7 +396,7 @@ func cuiV10UmiJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/v1.0/umi.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "cui/v1.0/umi.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -416,7 +416,7 @@ func initEnv() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.env", size: 219, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.env", size: 219, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -436,7 +436,7 @@ func initVscodeSettingsJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/settings.json", size: 4666, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/settings.json", size: 4666, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -456,7 +456,7 @@ func initVscodeTypesRuntimeConsoleDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/console.d.ts", size: 221, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/console.d.ts", size: 221, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -476,7 +476,7 @@ func initVscodeTypesRuntimeExceptionDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/exception.d.ts", size: 738, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/exception.d.ts", size: 738, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -496,7 +496,7 @@ func initVscodeTypesRuntimeFsDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/fs.d.ts", size: 8554, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/fs.d.ts", size: 8554, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -516,7 +516,7 @@ func initVscodeTypesRuntimeGlobalDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/global.d.ts", size: 1759, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/global.d.ts", size: 1759, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -536,7 +536,7 @@ func initVscodeTypesRuntimeHttpDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/http.d.ts", size: 6179, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/http.d.ts", size: 6179, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -556,7 +556,7 @@ func initVscodeTypesRuntimeIoDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/io.d.ts", size: 587, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/io.d.ts", size: 587, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -576,7 +576,7 @@ func initVscodeTypesRuntimeLogDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/log.d.ts", size: 1692, mode: os.FileMode(493), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/log.d.ts", size: 1692, mode: os.FileMode(493), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -596,7 +596,7 @@ func initVscodeTypesRuntimeNeoDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/neo.d.ts", size: 3750, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/neo.d.ts", size: 3750, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -616,7 +616,7 @@ func initVscodeTypesRuntimeProcessFsDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/process/fs.d.ts", size: 11133, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process/fs.d.ts", size: 11133, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -636,7 +636,7 @@ func initVscodeTypesRuntimeProcessHttpDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/process/http.d.ts", size: 5653, mode: os.FileMode(493), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process/http.d.ts", size: 5653, mode: os.FileMode(493), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -656,7 +656,7 @@ func initVscodeTypesRuntimeProcessModelDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/process/model.d.ts", size: 6656, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process/model.d.ts", size: 6656, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -676,7 +676,7 @@ func initVscodeTypesRuntimeProcessDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/process.d.ts", size: 23165, mode: os.FileMode(493), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process.d.ts", size: 23165, mode: os.FileMode(493), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -696,7 +696,7 @@ func initVscodeTypesRuntimeQueryDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/query.d.ts", size: 6124, mode: os.FileMode(493), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/query.d.ts", size: 6124, mode: os.FileMode(493), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -716,7 +716,7 @@ func initVscodeTypesRuntimeStoreDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/store.d.ts", size: 2251, mode: os.FileMode(493), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/store.d.ts", size: 2251, mode: os.FileMode(493), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -736,7 +736,7 @@ func initVscodeTypesRuntimeSuiDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/sui.d.ts", size: 1713, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/sui.d.ts", size: 1713, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -756,7 +756,7 @@ func initVscodeTypesRuntimeTimeDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/time.d.ts", size: 711, mode: os.FileMode(493), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/time.d.ts", size: 711, mode: os.FileMode(493), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -776,7 +776,7 @@ func initVscodeTypesRuntimeDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime.d.ts", size: 424, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime.d.ts", size: 424, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -796,7 +796,7 @@ func initVscodeTypesSuiDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/sui.d.ts", size: 8931, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/.vscode/types/sui.d.ts", size: 8931, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -816,7 +816,7 @@ func initAppYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/app.yao", size: 3115, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/app.yao", size: 3115, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -836,7 +836,7 @@ func initDataReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/README.md", size: 41, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/data/README.md", size: 41, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -856,7 +856,7 @@ func initDataTemplatesDefault__assetsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -876,7 +876,7 @@ func initDataTemplatesDefault__assetsImagesIconsAppPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/images/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/images/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -896,7 +896,7 @@ func initDataTemplatesDefault__assetsImagesLogosLogo_colorSvg() (*asset, error) return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/logo_color.svg", size: 2909, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/logo_color.svg", size: 2909, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -916,7 +916,7 @@ func initDataTemplatesDefault__assetsImagesLogosWordmarkSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/wordmark.svg", size: 3615, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/wordmark.svg", size: 3615, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -936,7 +936,7 @@ func initDataTemplatesDefault__dataJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__data.json", size: 30, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__data.json", size: 30, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -956,7 +956,7 @@ func initDataTemplatesDefault__documentHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__document.html", size: 492, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__document.html", size: 492, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -976,7 +976,7 @@ func initDataTemplatesDefaultIndexIndexCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/index/index.css", size: 2896, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.css", size: 2896, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -996,7 +996,7 @@ func initDataTemplatesDefaultIndexIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/index/index.html", size: 2361, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.html", size: 2361, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1016,7 +1016,7 @@ func initDataTemplatesDefaultIndexIndexJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/index/index.json", size: 31, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.json", size: 31, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1036,7 +1036,7 @@ func initDbReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/db/README.md", size: 84, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/db/README.md", size: 84, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1056,7 +1056,7 @@ func initFlowsMenuFlowYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/flows/menu.flow.yao", size: 813, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/flows/menu.flow.yao", size: 813, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1076,7 +1076,7 @@ func initFormsAccountFormYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/forms/account.form.yao", size: 1194, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/forms/account.form.yao", size: 1194, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1096,7 +1096,7 @@ func initIconsAppIcns() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/icons/app.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/icons/app.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1116,7 +1116,7 @@ func initIconsAppIco() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/icons/app.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/icons/app.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1136,7 +1136,7 @@ func initIconsAppPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1156,7 +1156,7 @@ func initLoginsAdminLoginYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/logins/admin.login.yao", size: 302, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/logins/admin.login.yao", size: 302, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1176,7 +1176,7 @@ func initLogsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/logs/README.md", size: 28, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/logs/README.md", size: 28, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1196,7 +1196,7 @@ func initModelsAdminUserModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/models/admin/user.mod.yao", size: 6416, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/models/admin/user.mod.yao", size: 6416, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1216,7 +1216,7 @@ func initModelsTestsPetModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/models/tests/pet.mod.yao", size: 525, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/models/tests/pet.mod.yao", size: 525, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1236,7 +1236,7 @@ func initNeoNeoYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/neo/neo.yml", size: 724, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/neo/neo.yml", size: 724, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1256,7 +1256,7 @@ func initPublicReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/README.md", size: 108, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/public/README.md", size: 108, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1276,7 +1276,7 @@ func initPublicAssetsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/public/assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1296,7 +1296,7 @@ func initPublicAssetsImagesIconsAppPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/assets/images/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/public/assets/images/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1316,7 +1316,7 @@ func initPublicAssetsImagesLogosLogo_colorSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/assets/images/logos/logo_color.svg", size: 2909, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/public/assets/images/logos/logo_color.svg", size: 2909, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1336,7 +1336,7 @@ func initPublicAssetsImagesLogosWordmarkSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/assets/images/logos/wordmark.svg", size: 3615, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/public/assets/images/logos/wordmark.svg", size: 3615, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1356,7 +1356,7 @@ func initPublicAssetsLibsuiMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/assets/libsui.min.js", size: 12569, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/public/assets/libsui.min.js", size: 12569, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1376,7 +1376,7 @@ func initPublicAssetsLibsuiMinJsMap() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/assets/libsui.min.js.map", size: 38553, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/public/assets/libsui.min.js.map", size: 38553, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1396,7 +1396,7 @@ func initPublicIndexCfg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/index.cfg", size: 85, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/public/index.cfg", size: 85, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1416,7 +1416,7 @@ func initPublicIndexSui() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/index.sui", size: 5682, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/public/index.sui", size: 5682, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1436,7 +1436,7 @@ func initScriptsAccountTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/account.ts", size: 2521, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/scripts/account.ts", size: 2521, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1456,7 +1456,7 @@ func initScriptsAiNeoTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/ai/neo.ts", size: 375, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/scripts/ai/neo.ts", size: 375, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1476,7 +1476,7 @@ func initScriptsTestsTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/tests.ts", size: 1044, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/scripts/tests.ts", size: 1044, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1496,7 +1496,7 @@ func initScriptsUtilsTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/utils.ts", size: 1230, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/scripts/utils.ts", size: 1230, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1516,7 +1516,7 @@ func initSuisWebSuiYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/suis/web.sui.yao", size: 675, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/suis/web.sui.yao", size: 675, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1536,7 +1536,7 @@ func initTablesAccountTabYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/tables/account.tab.yao", size: 5597, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/tables/account.tab.yao", size: 5597, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1556,7 +1556,7 @@ func initTsconfigJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/tsconfig.json", size: 178, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "init/tsconfig.json", size: 178, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1576,7 +1576,7 @@ func libsuiAgentTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/agent.ts", size: 15267, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "libsui/agent.ts", size: 15267, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1596,7 +1596,7 @@ func libsuiIndexTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/index.ts", size: 13049, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "libsui/index.ts", size: 13049, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1616,7 +1616,7 @@ func libsuiUtilsTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/utils.ts", size: 5959, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "libsui/utils.ts", size: 5959, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1636,7 +1636,7 @@ func libsuiYaoTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/yao.ts", size: 4338, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "libsui/yao.ts", size: 4338, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1656,7 +1656,7 @@ func publicIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "public/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "public/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1676,7 +1676,7 @@ func uiIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "ui/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "ui/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1696,7 +1696,7 @@ func yaoDataIcons404Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/404.png", size: 9342, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/icons/404.png", size: 9342, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1716,7 +1716,7 @@ func yaoDataIconsIconIcns() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/icon.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1736,7 +1736,7 @@ func yaoDataIconsIconIco() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/icon.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1756,7 +1756,7 @@ func yaoDataIconsIconPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/icon.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1776,7 +1776,7 @@ func yaoDataIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/index.html", size: 282, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/index.html", size: 282, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1796,7 +1796,7 @@ func yaoDataKbProvidersChunkingSemanticEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/en.json", size: 5543, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/en.json", size: 5543, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1816,7 +1816,7 @@ func yaoDataKbProvidersChunkingSemanticZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/zh-cn.json", size: 5446, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/zh-cn.json", size: 5446, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1836,7 +1836,7 @@ func yaoDataKbProvidersChunkingStructuredEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/en.json", size: 2423, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/en.json", size: 2423, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1856,7 +1856,7 @@ func yaoDataKbProvidersChunkingStructuredZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/zh-cn.json", size: 2321, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/zh-cn.json", size: 2321, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1876,7 +1876,7 @@ func yaoDataKbProvidersConverterMcpEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/en.json", size: 4235, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/en.json", size: 4235, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1896,7 +1896,7 @@ func yaoDataKbProvidersConverterMcpZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/zh-cn.json", size: 4060, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/zh-cn.json", size: 4060, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1916,7 +1916,7 @@ func yaoDataKbProvidersConverterOcrEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/en.json", size: 6631, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/en.json", size: 6631, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1936,7 +1936,7 @@ func yaoDataKbProvidersConverterOcrZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/zh-cn.json", size: 6501, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/zh-cn.json", size: 6501, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1956,7 +1956,7 @@ func yaoDataKbProvidersConverterOfficeEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/en.json", size: 5476, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/en.json", size: 5476, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1976,7 +1976,7 @@ func yaoDataKbProvidersConverterOfficeZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/zh-cn.json", size: 5356, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/zh-cn.json", size: 5356, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1996,7 +1996,7 @@ func yaoDataKbProvidersConverterUtf8EnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/en.json", size: 292, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/en.json", size: 292, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2016,7 +2016,7 @@ func yaoDataKbProvidersConverterUtf8ZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/zh-cn.json", size: 281, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/zh-cn.json", size: 281, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2036,7 +2036,7 @@ func yaoDataKbProvidersConverterVideoEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/en.json", size: 6411, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/en.json", size: 6411, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2056,7 +2056,7 @@ func yaoDataKbProvidersConverterVideoZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/zh-cn.json", size: 6297, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/zh-cn.json", size: 6297, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2076,7 +2076,7 @@ func yaoDataKbProvidersConverterVisionEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/en.json", size: 4085, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/en.json", size: 4085, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2096,7 +2096,7 @@ func yaoDataKbProvidersConverterVisionZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/zh-cn.json", size: 3949, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/zh-cn.json", size: 3949, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2116,7 +2116,7 @@ func yaoDataKbProvidersConverterWhisperEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/en.json", size: 4449, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/en.json", size: 4449, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2136,7 +2136,7 @@ func yaoDataKbProvidersConverterWhisperZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/zh-cn.json", size: 4312, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/zh-cn.json", size: 4312, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2156,7 +2156,7 @@ func yaoDataKbProvidersEmbeddingFastembedEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/en.json", size: 6865, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/en.json", size: 6865, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2176,7 +2176,7 @@ func yaoDataKbProvidersEmbeddingFastembedZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/zh-cn.json", size: 6685, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/zh-cn.json", size: 6685, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2196,7 +2196,7 @@ func yaoDataKbProvidersEmbeddingOpenaiEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/en.json", size: 5636, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/en.json", size: 5636, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2216,7 +2216,7 @@ func yaoDataKbProvidersEmbeddingOpenaiZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/zh-cn.json", size: 5463, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/zh-cn.json", size: 5463, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2236,7 +2236,7 @@ func yaoDataKbProvidersExtractionOpenaiEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/en.json", size: 9110, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/en.json", size: 9110, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2256,7 +2256,7 @@ func yaoDataKbProvidersExtractionOpenaiZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/zh-cn.json", size: 8827, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/zh-cn.json", size: 8827, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2276,7 +2276,7 @@ func yaoDataKbProvidersFetcherHttpEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/en.json", size: 5885, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/en.json", size: 5885, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2296,7 +2296,7 @@ func yaoDataKbProvidersFetcherHttpZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/zh-cn.json", size: 5925, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/zh-cn.json", size: 5925, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2316,7 +2316,7 @@ func yaoDataKbProvidersFetcherMcpEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/en.json", size: 6819, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/en.json", size: 6819, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2336,7 +2336,7 @@ func yaoDataKbProvidersFetcherMcpZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/zh-cn.json", size: 6611, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/zh-cn.json", size: 6611, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2356,7 +2356,7 @@ func yaoFieldsModelTransJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/fields/model.trans.json", size: 14938, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/fields/model.trans.json", size: 14938, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2376,7 +2376,7 @@ func yaoLangsEnUsJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/en-US.json", size: 66, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/langs/en-US.json", size: 66, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2396,7 +2396,7 @@ func yaoLangsZhCnGlobalYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-cn/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/langs/zh-cn/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2416,7 +2416,7 @@ func yaoLangsZhCnLoginsAdminLoginYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-cn/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/langs/zh-cn/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2436,7 +2436,7 @@ func yaoLangsZhCnLoginsUserLoginYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-cn/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/langs/zh-cn/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2456,7 +2456,7 @@ func yaoLangsZhHkGlobalYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-hk/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/langs/zh-hk/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2476,7 +2476,7 @@ func yaoLangsZhHkLoginsAdminLoginYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-hk/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/langs/zh-hk/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2496,7 +2496,7 @@ func yaoLangsZhHkLoginsUserLoginYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-hk/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/langs/zh-hk/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2516,7 +2516,7 @@ func yaoModelsAssistantModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/assistant.mod.yao", size: 4114, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/assistant.mod.yao", size: 4114, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2536,7 +2536,7 @@ func yaoModelsAttachmentModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/attachment.mod.yao", size: 3865, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/attachment.mod.yao", size: 3865, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2556,7 +2556,7 @@ func yaoModelsAuditModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/audit.mod.yao", size: 5588, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/audit.mod.yao", size: 5588, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2576,7 +2576,7 @@ func yaoModelsChatModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/chat.mod.yao", size: 1444, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/chat.mod.yao", size: 1444, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2596,7 +2596,7 @@ func yaoModelsConfigModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/config.mod.yao", size: 1649, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/config.mod.yao", size: 1649, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2616,7 +2616,7 @@ func yaoModelsDslModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/dsl.mod.yao", size: 3826, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/dsl.mod.yao", size: 3826, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2636,7 +2636,7 @@ func yaoModelsHistoryModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/history.mod.yao", size: 2902, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/history.mod.yao", size: 2902, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2656,7 +2656,7 @@ func yaoModelsJobCategoryModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/job/category.mod.yao", size: 2041, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/job/category.mod.yao", size: 2041, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2676,12 +2676,12 @@ func yaoModelsJobExecutionModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/job/execution.mod.yao", size: 7201, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/job/execution.mod.yao", size: 7201, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _yaoModelsJobJobModYao = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x58\xdd\x6e\xdb\xb8\x12\xbe\xcf\x53\x0c\x74\xd3\x04\x48\x91\x9e\xe2\xf4\xe0\x24\xc0\x5e\x74\x93\xa0\x68\xb1\x6d\x8a\x24\xc5\x5e\x14\x85\x41\x49\x63\x9b\x29\x45\xaa\xe4\xb0\xb5\xb0\xc8\xbb\x2f\x86\xfa\xa3\x6c\xd9\xb1\x8c\xf4\x26\x81\x29\xce\xcf\x37\xdf\x70\x66\xc8\x7f\x8e\x00\x12\x2d\x0a\x4c\x2e\x20\x79\x30\x69\x72\xca\x0b\x4a\xa4\xa8\x78\xe5\x43\xbb\x92\xa3\xcb\xac\x2c\x49\x1a\xdd\xac\x03\x89\x54\x21\xcc\x8d\x85\x42\x68\xb1\x90\x7a\x01\x24\xdc\x77\xc0\x15\x66\x9e\x37\x82\xd0\x39\xb8\x6c\x89\xb9\x57\x52\x2f\x6a\x45\x24\x16\x2e\xb9\x80\xaf\x89\xab\x1c\x61\x91\x7c\x0b\xab\xa9\x97\x8a\x24\xab\x26\xeb\x31\x2c\x59\x14\xb9\xd1\xaa\x4a\x2e\x60\x2e\x94\xab\x17\x9d\xb1\x94\x5c\xc0\xf9\xf9\xf9\x79\xa3\x2d\x55\xec\x3a\xc3\x18\x01\x02\x90\x64\xa6\x28\x50\x53\xeb\x74\x21\xa4\xae\x3d\x4f\x8e\x00\x1e\x83\x92\xcc\x28\x5f\xe8\xe0\x55\x90\xa9\x95\x45\xea\x64\xde\x68\x63\x8b\x55\x19\xd6\xde\x5f\xf5\x6b\x5d\xb8\xe2\xc5\xc8\xf0\x5b\x4f\xe6\xa5\xd4\x99\x45\x5e\x81\xd2\xca\x42\xd8\x0a\xbe\x63\x95\x84\xdd\x8f\xa7\xe3\x76\x1f\x4c\x3a\x1b\xb3\xed\xc8\xb6\xf1\x1c\xda\x67\x84\x5b\x7c\xf8\xa2\xe5\x0f\x8f\x50\x8b\x82\xcc\x51\x93\x9c\x4b\xb4\x81\x40\x5a\x22\xf4\x31\x63\x8d\xa8\x17\xb4\x4c\x2e\xe0\x7f\xff\xed\xd6\xb4\x57\xaa\x09\x77\x47\x48\xf8\xe0\x83\xea\x86\xbb\x9d\x80\xc2\xff\x69\x70\x3e\x0d\x44\x22\x40\x57\xd2\x95\x4a\x54\xc0\x3a\xc1\xcc\x77\x60\x78\xfd\xe6\xcd\xd3\x20\xa4\xce\x71\xb5\x0f\x06\x99\x19\x3d\x01\xc3\xfb\xc1\xf6\xc8\x7f\xfe\xb0\x3f\x0f\xff\x79\xf5\x6a\x0c\xc3\x93\xde\xc6\xe7\x76\xc3\x69\xc2\x15\x8d\xb8\x7c\x35\x26\xb3\x76\x8e\x46\xf5\x4e\x71\x2c\x13\x84\x0b\x63\xab\x69\x09\x7e\xd9\x48\x6d\xcb\xf2\x5b\x9c\xa3\x45\x9d\x21\x90\x09\xd1\x6c\xcd\x00\x2d\xa5\xe3\xd8\x42\x8a\xca\xe8\x85\x03\x32\x07\xa6\xfb\xde\x99\xe2\x48\x90\x77\x9b\xe8\x50\xfb\x62\x04\xdb\xdd\xda\xf6\xb5\x88\x9b\x9f\x68\x85\x52\xb0\xae\xd5\xb4\x45\xf9\x6b\xb3\xc2\xd5\xda\x8a\x39\x25\xa7\x70\x76\x06\x2c\x2a\x1d\xa4\xc8\xc7\x3e\x33\x7a\x2e\x17\xde\x62\x7e\x0a\xda\x10\x70\x8d\xad\x38\x54\xd6\xeb\x5e\x3a\xac\x0e\xa4\xbb\x7d\x29\x36\xe5\x1d\xf3\x68\xbf\xd7\x3a\xd0\xd5\x4a\x2c\x85\x03\x91\x91\xfc\x89\x7d\x33\x38\x76\x27\xbd\x44\x29\xbc\xc3\xbc\x17\xe8\x5b\x86\x74\x40\x58\x94\xc6\x0a\x2b\x55\x05\xf5\xc6\x5e\x30\x33\x45\xa9\x90\x62\xd9\xb9\xd4\xd2\x2d\x31\x07\xe7\xb3\x0c\x9d\x9b\x7b\xa5\x2a\x38\xe6\xe3\xf4\xc2\xe8\x0c\x5f\x30\xeb\xb1\xf1\xb9\x90\x6a\xa0\x20\xfc\x0e\xcd\xea\x97\xd1\x2f\x38\x2a\x64\x2b\x10\xba\x2a\x8c\xc5\x28\xa8\xd2\x71\x3e\xe4\x49\x14\x98\x76\x0d\xd2\x0a\xbc\x43\x7b\x56\x77\xb5\x46\xe8\x5b\x47\x52\x8e\x73\xe1\x55\xe0\xb2\xe1\xe6\xf9\xd2\xac\x30\xf9\x48\x51\xdd\x92\x64\x1f\x07\x9b\xd7\x52\xac\xa7\x61\xa8\x73\x2c\xc5\xde\xdd\xdc\xde\x7c\xb9\x7f\xff\xe9\xba\x0e\xe4\x75\x9d\x15\xe0\x1d\xe7\xd9\x3b\x03\x0b\x63\x8d\x27\xa9\x11\x8e\x95\x5c\x2c\xe9\x17\xf2\xdf\x53\x98\x0b\x47\x11\x19\x9f\x6f\x6f\x2e\xaf\xef\xee\x92\x58\x87\x70\xc0\xe0\x4b\xd4\x79\xdd\x2e\x0d\xf3\x0a\xc7\xd2\x19\x25\x88\x73\x77\x89\xe2\x67\x55\x6b\x3c\xd9\x15\xeb\xc8\xc9\x67\x3c\xd6\xf5\x44\x83\xb3\x10\xea\xbd\x4f\x77\x23\x05\xf7\x03\xa9\x35\x06\xfa\x69\x09\x4a\x41\x84\x56\xef\x66\x81\x13\x7c\x48\x00\xaf\x84\x5c\xae\xcf\x45\x74\x74\x2c\x97\xea\x78\x6b\x2a\x1c\xe6\x60\x34\xf0\xa7\xd6\x74\x9c\xf0\x02\x0b\xa3\x03\x35\xb7\x5e\x73\xf1\x20\xa9\xbd\xf1\x4e\x55\xcc\x51\xfd\xb9\xa5\x67\x17\x0d\xb5\x97\xbf\x81\x01\x5c\x95\x16\x9d\x1b\x6d\x6e\x5b\x7b\x48\xc7\xc4\xf5\x88\x74\xc4\xc7\x25\x47\xa5\xb7\x10\x1a\x74\x6b\x39\x0f\x45\xe5\x19\xfb\x74\x21\x56\xb3\x50\x77\x66\x99\xf1\x9a\x36\xe1\x48\x4d\xb8\x40\x3b\x76\xa4\xc5\x0a\x6e\x43\xc9\xba\x1c\x8a\x46\x58\x3e\x8a\x95\x2c\x7c\x01\xda\x17\x29\x5a\x1e\x97\x9a\x22\x47\x5c\x6d\xc9\x71\x16\x70\x1d\xf4\x36\x22\xaa\x67\x70\x14\x53\x20\xef\x89\xe1\x23\x28\x98\x91\x2c\xd0\xf8\x49\xa0\xae\x6a\x51\xb8\x5f\x17\x8d\x27\xc0\x66\x4f\x5f\xb6\x1a\x43\x20\x35\x38\xcc\x8c\xce\x1d\x1c\x67\x42\x73\xdb\xe2\xf6\x69\x65\x9e\xa3\x86\x12\x6d\x2f\x73\x72\xd8\xf8\x52\x5a\x69\xac\xa4\x6a\x0a\xa6\xcf\x1b\x32\x5b\xeb\x6f\xab\x1e\x8e\x97\x72\xb1\x44\xdb\x12\xf7\x07\x34\xbf\xdb\x0d\x27\xd3\xe8\x9a\x7e\xd6\x32\x8b\x5c\x73\x67\xe9\x08\xd4\xed\x63\x5a\x2d\x04\x7f\x8e\x63\xfd\xe2\xd0\xc2\xaf\xa5\x81\x46\x79\x37\x9c\x8d\x1d\xa8\xd7\xff\x7f\x46\x34\x1a\x57\x34\xb3\x5e\xcf\xc4\x48\x36\x72\xf6\x38\x12\x45\x39\x82\xe8\x13\xae\x28\x54\xc1\xb7\xe3\xb9\x78\xdf\xca\x86\x32\xc1\x66\xa2\x5a\xd1\xf1\xba\x35\xd7\xa6\x23\x51\xc2\x1d\x86\xe4\x2f\xe1\xf6\x44\x62\xe6\xc0\x56\x7e\x8b\xfb\x99\xb7\x16\x35\xcd\x3a\xdd\x13\xef\x01\xb5\x78\xd3\xca\xf8\xc4\xec\x73\x21\x68\x8c\x9e\xf1\x14\x11\xe3\x02\xa9\x1d\x89\x41\x93\x7a\xe2\x46\x70\x20\xe8\x30\x7e\x6f\xc2\x7c\x70\x71\x6c\x7b\x90\xcd\xb4\x2e\x76\xde\xc4\xb2\x78\x17\x94\xc2\x8a\x02\x09\xad\x3b\xac\xae\x85\x07\x96\x09\x35\xed\xce\x58\x82\x1b\x9b\xc7\x1f\x23\x07\xc3\x67\xc3\x9f\xc3\xb9\xc8\xeb\x3b\xfb\x33\xb6\x18\xd4\xf5\x4c\xbe\xe1\x72\x6a\x8c\x42\x31\x16\xd6\xeb\x75\x91\xc8\xdf\xbf\x97\x48\x5c\x5e\xbb\xdb\xa2\x74\xd0\x98\x08\x00\x46\x8e\x42\x0f\x61\x90\x14\xcf\x30\xe5\xd4\x0f\x64\x13\x90\xdd\x05\x09\xf8\x10\x17\xd2\x6d\xe0\xa4\x03\x01\xb5\x89\x61\xe5\xed\xf1\x0c\xfd\x9e\x44\x4b\xf7\x78\x37\xc1\xfb\xdb\x0d\x99\x27\x88\x61\x23\x2f\x87\x12\xd3\x9c\x3f\x6a\xe6\xd5\x9a\x13\xdc\xf9\x02\xb8\x9a\x3d\x98\x74\xd6\xbd\x5a\xac\xdf\xc2\xa3\x37\xc4\xe1\xd3\x46\xf7\x0c\xf0\x6d\x74\xc6\x34\x45\x69\x9c\x24\x0c\x37\x9e\x55\xc8\xb1\xee\xc9\x22\x3c\x9f\x06\x61\xf8\xe1\xd1\x4a\x74\xbb\x9f\x0b\x5b\x27\x9b\x89\x3c\xdc\x4f\x76\x3a\x1a\x6f\x3c\xc4\xd3\xf6\x66\xc6\xf2\x07\x7b\x3b\xb8\x4e\xcd\xda\x06\x3d\xee\xf0\xda\xd5\x6b\xd8\xcf\xf7\x76\x7b\x30\xc4\x4f\x73\xb6\x9f\x86\x76\x67\x40\x34\x34\x4d\x0f\xab\xe7\xf1\x68\xd3\xb5\x2e\x5b\xbb\x8b\x60\xf3\xea\x5d\xa2\x2d\x64\x7d\x8f\x89\x8b\x50\x3f\x05\xb8\xbe\xdc\x3c\x1e\x3d\x1e\xfd\x1b\x00\x00\xff\xff\x30\x83\xa7\x5e\xf4\x17\x00\x00") +var _yaoModelsJobJobModYao = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x58\x5f\x4f\xdc\x38\x10\x7f\xe7\x53\x8c\xf2\x52\x90\xa8\x68\xab\xeb\xe9\x40\xba\x87\x1e\xa0\xaa\xd5\x15\x2a\xa0\xea\x43\x55\x45\x4e\x32\xd9\x35\x75\xec\xd4\x7f\xca\x46\x27\xbe\xfb\x69\x9c\x7f\xce\xe2\x5d\x36\x88\xbe\x80\xd6\xf1\x6f\x66\x7e\x33\xe3\x99\xb1\xff\xdb\x03\x48\x24\xab\x30\x39\x81\xe4\x56\x65\xc9\x21\x2d\x08\x96\xa1\xa0\x95\x8f\xfd\x4a\x81\x26\xd7\xbc\xb6\x5c\xc9\x6e\x1d\x2c\xcb\x04\x42\xa9\x34\x54\x4c\xb2\x05\x97\x0b\xb0\xcc\xfc\x00\x5c\x61\xee\x68\x23\x30\x59\x80\xc9\x97\x58\x38\xc1\xe5\xa2\x15\x64\xd9\xc2\x24\x27\xf0\x2d\x31\x8d\xb1\x58\x25\xdf\xfd\x6a\xe6\xb8\xb0\x9c\x44\x5b\xed\xd0\x2f\x69\x64\x85\x92\xa2\x49\x4e\xa0\x64\xc2\xb4\x8b\x46\x69\x9b\x9c\xc0\xf1\xf1\xf1\x71\x27\x2d\x13\x64\x3a\xd1\x88\x10\x01\x48\x72\x55\x55\x28\x6d\x6f\x74\xc5\xb8\x6c\x2d\x4f\xf6\x00\xee\xbd\x90\x5c\x09\x57\x49\x6f\x95\xc7\xb4\xc2\x02\x71\xbc\xe8\xa4\x91\xc6\xa6\xf6\x6b\x1f\xce\xc6\xb5\xc1\x5d\xe1\x62\xa0\xf8\x9d\xb3\xea\x25\x97\xb9\x46\x5a\x81\x5a\xf3\x8a\xe9\x06\x7e\x60\x93\xf8\xdd\xf7\x87\x71\xbd\xb7\x2a\x4b\x63\xba\x8d\xd5\xbd\x3f\xa7\xfa\x89\xe1\x06\x1b\xbe\x48\xfe\xd3\x21\xb4\x50\xe0\x05\x4a\xcb\x4b\x8e\xda\x07\xd0\x2e\x11\x46\x9f\x91\x44\x94\x0b\xbb\x4c\x4e\xe0\xcf\x3f\x86\x35\xe9\x84\xe8\xdc\x3d\x04\xc4\x7f\x70\x5e\x74\x17\xbb\xad\x84\xfc\xff\x79\x74\x2e\x26\x90\x80\xd0\x19\x37\xb5\x60\x0d\x90\x4c\x50\xe5\x16\x0e\x6f\xde\xbe\x7d\x9c\x04\x97\x05\xae\x76\xe1\xc0\x73\x25\x67\x70\xf8\x30\xd9\x1e\xd8\x4f\x1f\x76\x8f\xc3\xeb\x57\xaf\x62\x1c\x1e\xb5\x36\x3c\xb7\x0f\x8c\xb6\xb8\xb2\x11\x93\xcf\x62\x98\xb5\x73\x14\x95\x3b\xc7\xb0\x9c\x59\x5c\x28\xdd\xcc\x4b\xf0\xd3\x0e\xb5\x29\xcb\xaf\xb0\x44\x8d\x32\x47\xb0\xca\x7b\xb3\x57\x03\x76\xc9\x0d\xf9\x16\x32\x14\x4a\x2e\x0c\x58\xf5\xc4\x74\xdf\x39\x53\x2a\xb6\x4a\xef\x94\xfe\x81\x3a\x95\xae\x32\x0f\x69\x72\x69\x71\x81\x3a\xc2\xf3\x13\x5b\xc1\x57\x0f\x85\x0b\x57\x65\xa8\x4d\x94\xee\x27\xb6\xe2\x95\xab\x40\xfa\x3d\x74\x0a\x72\x25\x73\xa7\x35\x95\x99\x56\xb5\xe9\x12\xab\x65\x3f\x4a\x29\xb0\x64\x4e\x90\x94\xd7\x1b\x29\x6f\x65\x67\x2c\xb3\x2e\x42\x0a\xa5\xab\x22\x8c\xae\xd7\xb6\xaf\xe5\x93\xfa\x85\x9a\x09\x01\xeb\x52\x55\xdf\x72\xbe\x75\x2b\x64\xba\x66\xa5\x4d\x0e\xe1\xe8\x08\x08\xca\x0d\x64\x48\x45\x2d\x57\xb2\xe4\x0b\xa7\xb1\x38\x04\xa9\x2c\x50\x07\x69\x28\x11\xb4\x93\x23\xda\xaf\x4e\xd0\xc3\xbe\x0c\xbb\xe6\x85\x45\xb0\xdf\x49\xe9\x93\xb1\x47\x2c\x99\x01\x96\x5b\xfe\x0b\xc7\x56\xb7\x6f\x0e\x46\x44\xcd\x9c\xc1\x62\x04\x8c\x0d\x91\x1b\xb0\x58\xd5\x4a\x33\xcd\x45\x03\xed\xc6\x11\x98\xab\xaa\x16\x68\x43\x6c\xc9\x25\x37\x4b\x2c\xc0\xb8\x3c\x47\x63\x4a\x27\x44\x03\xfb\x14\xd3\x17\x4a\xe6\xf8\x82\xa2\x1a\x2a\x2f\x19\x17\x13\x01\xfe\xb7\x6f\xc5\x77\x4a\xbe\x20\xaf\x58\xdd\x00\x93\x4d\xa5\x34\x06\x4e\xe5\x86\x42\x5f\x24\x81\x63\xfa\x35\xc8\x1a\x70\x06\xf5\x51\xdb\xb3\x3b\xd0\xf7\x48\x2e\xf5\xb1\x79\xc6\x43\xa4\x8a\x48\xcb\xd8\x90\x64\x9f\x26\x9b\xd7\x52\x6c\x0c\xc3\x54\x66\x2c\xc5\xde\x5f\x5e\x5d\x7e\xb9\xf9\x70\x71\xde\x3a\xf2\xbc\xcd\x0a\x70\x86\xf2\xec\xbd\x82\x85\xd2\xca\x59\x2e\x11\xf6\x05\x5f\x2c\xed\x1d\xd2\xdf\x43\x28\x99\xb1\x41\x30\x3e\x5f\x5d\x9e\x9e\x5f\x5f\x27\xa1\x0c\x66\x80\xc8\xd7\x28\x8b\x76\x18\x50\x14\x57\xd8\xe7\x46\x09\x66\x29\x77\x97\xc8\x7e\x35\xad\xc4\x83\x6d\xbe\x0e\x8c\x7c\x3e\x7f\x77\xf3\x1a\xa6\xde\xd5\x3b\x9f\xee\x0e\x05\x37\x13\xd4\x5a\x04\xc6\x59\x10\x6a\x66\x2d\x6a\xb9\x3d\x0a\x94\xe0\xd3\x00\xd0\x8a\xcf\xe5\xf6\x5c\x04\x47\x47\x53\x23\x0a\xb7\x66\xcc\x60\x01\x4a\x02\x7d\xea\x55\x87\x09\xcf\xb0\x52\xd2\x87\xe6\xca\x49\x2a\x1e\x96\x4b\xa7\x9c\x11\x0d\xc5\xa8\xfd\xdc\x87\x67\x5b\x18\x5a\x2b\x7f\x43\x04\x70\x55\x6b\x34\x26\xda\xba\x37\x76\xc8\x21\x12\xe7\x11\x74\x10\x8f\x53\xf2\xca\xa8\xc1\x77\x89\x5e\x73\xe1\x8b\xca\x33\x4e\x21\xd4\x09\x7d\xdd\x49\x73\xe5\xa4\x9d\xdb\x09\xaf\x7c\xc9\x3a\x9d\x42\xb7\xb6\xc1\xae\xc8\x59\xaa\xb6\xd6\x50\x16\x50\x1d\x74\x1a\x63\x0d\x30\xca\xe9\xf1\x06\xd8\x09\x48\x2d\xaf\x50\xb9\x59\xa4\xce\x5a\x28\xdc\xac\x43\xc3\xf9\xb6\xdb\x33\x96\xad\x4e\x11\x70\x09\x06\x73\x25\x0b\x03\xfb\x39\x93\xd4\xb6\xa8\x7d\x6a\x5e\x14\x28\xa1\x46\x3d\x62\x0e\x9e\x36\x9c\xd5\x9a\x2b\xcd\x6d\x33\x87\xd3\xe7\x07\x98\x8d\xf5\xb7\x17\x0f\xfb\x4b\xbe\x58\xa2\xee\x03\xf7\x37\x74\xbf\xfb\x0d\x07\xf3\xc2\x35\xff\xac\xe5\x1a\xa9\xe6\xa6\x59\x84\xea\xe6\x21\xb4\x05\xc1\x3f\x71\xae\x5f\x0c\x6a\xb8\x5b\x2a\xe8\x84\x47\x86\xaf\xf1\x40\xbd\xf9\xeb\x19\xd9\x48\x5c\xd9\x54\x3b\x99\xb2\x48\x36\x52\xf6\x18\xcb\xaa\x3a\xc2\xe8\x02\x57\xd6\x57\xc1\x77\xf1\x5c\xbc\xe9\xb1\xbe\x4c\x90\x9a\xa0\x56\x0c\x71\xdd\x98\x6b\xf3\x99\x08\x66\x9e\xc6\xe4\x5f\x66\x76\x64\xa2\x4a\x20\x2d\xbf\xc5\xfc\x6e\x04\x4f\x07\xd9\x33\x6f\x39\xdd\x04\x7f\x3e\x9c\x98\x5d\xae\x3b\x9d\xd2\x23\x9a\x22\x42\x5e\xc0\xa5\xb1\x6c\xd2\xa4\x1e\xb9\xef\x3c\x91\xb4\x1f\xbf\x1f\xd2\xbc\x35\xa1\x6f\x47\x92\xdd\xb4\xce\xb6\xde\x33\xf3\x70\x17\xd4\x4c\xb3\x0a\xed\xe4\x3a\x34\xa7\xae\xf9\xe7\xa3\x19\x35\xed\x5a\x69\x0b\x97\xba\x08\x3f\x06\x06\xfa\xcf\x8a\x3e\xfb\x73\x51\xb4\x2f\x12\xcf\xd8\x62\x50\xb6\x33\xf9\x03\x93\x33\xa5\x04\xb2\x98\x5b\xcf\xd7\x21\x81\xbd\x5f\x97\x68\xa9\xbc\x0e\x77\x61\x6e\xa0\x53\xe1\x09\x44\x8e\xc2\x48\x61\x92\x14\xcf\x30\xe5\xb4\xcf\x7f\x33\x98\x5d\x7b\x04\x7c\x0c\x0b\xe9\x26\x72\xdc\x00\x83\x56\xc5\xa6\x6b\xef\xd4\xee\x59\x61\x19\x9e\x26\x67\x58\x7f\xf5\x00\xf3\x48\x60\x48\xc9\xcb\x29\x62\x9e\xf1\x7b\xdd\xbc\xda\xc6\x04\xb7\xbe\x6f\xae\xd2\x5b\x95\xa5\xc3\x9b\xcc\xfa\x2d\x3c\x78\x21\x9d\x3e\xdc\x0c\xcf\x00\xdf\xa3\x33\xa6\xaa\x6a\x65\xb8\x45\x7f\xe3\x59\xf9\x1c\x1b\x1e\x64\xfc\xe3\xb0\x07\xc3\x4f\x87\x9a\xa3\xd9\xfe\x18\xda\x1b\x49\x97\xb7\xad\x06\xb6\xb7\xbb\xf9\x96\x11\xee\xc9\x56\x4d\xae\x4d\x69\xdf\x88\xe3\x06\xae\x5d\xb1\xa6\x7d\x7b\x67\x73\x27\xc3\xfa\x3c\x63\xc7\xa9\x67\x7b\xa4\x83\xe1\x68\xbe\x3b\x1d\x8d\x41\x0f\x4d\x1b\xb2\x72\xb8\xf0\x75\x6f\xf7\x35\xea\x8a\xb7\xf7\x95\xb0\xd8\x8c\xdd\xde\x8c\x65\xe5\x7e\xef\x7e\xef\xff\x00\x00\x00\xff\xff\x26\x86\x18\x22\xba\x18\x00\x00") func yaoModelsJobJobModYaoBytes() ([]byte, error) { return bindataRead( @@ -2696,7 +2696,7 @@ func yaoModelsJobJobModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/job/job.mod.yao", size: 6132, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/job/job.mod.yao", size: 6330, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2716,7 +2716,7 @@ func yaoModelsJobLogModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/job/log.mod.yao", size: 4711, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/job/log.mod.yao", size: 4711, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2736,7 +2736,7 @@ func yaoModelsKbCollectionModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/kb/collection.mod.yao", size: 5052, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/kb/collection.mod.yao", size: 5052, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2756,7 +2756,7 @@ func yaoModelsKbDocumentModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/kb/document.mod.yao", size: 9549, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/kb/document.mod.yao", size: 9549, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2776,7 +2776,7 @@ func yaoModelsUserModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/user.mod.yao", size: 10702, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/user.mod.yao", size: 10702, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2796,7 +2796,7 @@ func yaoModelsUser_oauth_accountModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/user_oauth_account.mod.yao", size: 6799, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/user_oauth_account.mod.yao", size: 6799, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2816,7 +2816,7 @@ func yaoModelsUser_roleModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/user_role.mod.yao", size: 6219, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/user_role.mod.yao", size: 6219, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2836,7 +2836,7 @@ func yaoModelsUser_typeModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/user_type.mod.yao", size: 4672, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/models/user_type.mod.yao", size: 4672, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2856,7 +2856,7 @@ func yaoReleaseAppYaz() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/release/app.yaz", size: 181682, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/release/app.yaz", size: 181682, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2876,7 +2876,7 @@ func yaoStoresAgentCacheLruYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/agent/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/stores/agent/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2896,7 +2896,7 @@ func yaoStoresAgentMemoryBadgerYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/agent/memory.badger.yao", size: 352, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/stores/agent/memory.badger.yao", size: 352, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2916,7 +2916,7 @@ func yaoStoresCacheLruYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/cache.lru.yao", size: 285, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/stores/cache.lru.yao", size: 285, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2936,7 +2936,7 @@ func yaoStoresKbCacheLruYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/kb/cache.lru.yao", size: 304, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/stores/kb/cache.lru.yao", size: 304, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2956,7 +2956,7 @@ func yaoStoresKbStoreBadgerYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/kb/store.badger.yao", size: 349, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/stores/kb/store.badger.yao", size: 349, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2976,7 +2976,7 @@ func yaoStoresOauthCacheLruYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/oauth/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/stores/oauth/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2996,7 +2996,7 @@ func yaoStoresOauthClientBadgerYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/oauth/client.badger.yao", size: 352, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/stores/oauth/client.badger.yao", size: 352, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3016,7 +3016,7 @@ func yaoStoresOauthStoreBadgerYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/oauth/store.badger.yao", size: 376, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/stores/oauth/store.badger.yao", size: 376, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3036,7 +3036,7 @@ func yaoStoresStoreBadgerYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/store.badger.yao", size: 341, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/stores/store.badger.yao", size: 341, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3056,7 +3056,7 @@ func yaoUploadersAttachmentLocalYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/uploaders/attachment.local.yao", size: 1163, mode: os.FileMode(420), modTime: time.Unix(1756801233, 0)} + info := bindataFileInfo{name: "yao/uploaders/attachment.local.yao", size: 1163, mode: os.FileMode(420), modTime: time.Unix(1756805984, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/job/data.go b/job/data.go index 18d8fc59..e5c294a4 100644 --- a/job/data.go +++ b/job/data.go @@ -12,6 +12,41 @@ import ( "github.com/yaoapp/xun/dbal" ) +// ======================== +// Field Lists for SELECT queries +// ======================== + +// JobFields defines the fields to select for job queries +var JobFields = []interface{}{ + "id", "job_id", "name", "icon", "description", "category_id", + "max_worker_nums", "status", "mode", "schedule_type", "schedule_expression", + "max_retry_count", "default_timeout", "priority", "created_by", + "next_run_at", "last_run_at", "current_execution_id", "config", + "sort", "enabled", "system", "readonly", "created_at", "updated_at", +} + +// CategoryFields defines the fields to select for category queries +var CategoryFields = []interface{}{ + "id", "category_id", "name", "icon", "description", + "sort", "system", "enabled", "readonly", "created_at", "updated_at", +} + +// ExecutionFields defines the fields to select for execution queries +var ExecutionFields = []interface{}{ + "id", "execution_id", "job_id", "status", "trigger_category", "trigger_source", + "trigger_context", "scheduled_at", "worker_id", "process_id", "retry_attempt", + "parent_execution_id", "started_at", "ended_at", "timeout_seconds", "duration", + "progress", "execution_config", "execution_options", "config_snapshot", + "result", "error_info", "stack_trace", "metrics", "context", "created_at", "updated_at", +} + +// LogFields defines the fields to select for log queries +var LogFields = []interface{}{ + "id", "job_id", "level", "message", "context", "source", "execution_id", + "step", "progress", "duration", "error_code", "stack_trace", + "worker_id", "process_id", "timestamp", "sequence", "created_at", "updated_at", +} + // ======================== // Jobs methods // ======================== @@ -22,7 +57,109 @@ func ListJobs(param model.QueryParam, page int, pagesize int) (maps.MapStrAny, e if mod == nil { return nil, fmt.Errorf("job model not found") } - return mod.Paginate(param, page, pagesize) + + // Set select fields if not already specified + if len(param.Select) == 0 { + param.Select = JobFields + } + + // Debug logging + log.Debug("ListJobs called with param: %+v, page: %d, pagesize: %d", param, page, pagesize) + + result, err := mod.Paginate(param, page, pagesize) + if err != nil { + log.Error("ListJobs query error: %v", err) + return nil, err + } + + // Extract jobs data + log.Debug("ListJobs raw result: %+v", result) + + jobsData, ok := result["data"].([]maps.MapStrAny) + if !ok { + log.Debug("Data type conversion failed, result[\"data\"] type: %T, value: %+v", result["data"], result["data"]) + // Try alternative type conversion + if dataSlice, ok := result["data"].([]interface{}); ok { + jobsData = make([]maps.MapStrAny, len(dataSlice)) + for i, item := range dataSlice { + if mapItem, ok := item.(maps.MapStrAny); ok { + jobsData[i] = mapItem + } else if mapItem, ok := item.(map[string]interface{}); ok { + jobsData[i] = maps.MapStrAny(mapItem) + } else { + log.Debug("Item %d type conversion failed: %T", i, item) + return result, nil + } + } + } else { + log.Debug("Alternative conversion also failed") + return result, nil + } + } + + if len(jobsData) == 0 { + log.Debug("No jobs found in data") + return result, nil + } + + // Collect unique category IDs + categoryIDs := make(map[string]bool) + for _, job := range jobsData { + if categoryID, exists := job["category_id"]; exists && categoryID != nil { + if categoryIDStr, ok := categoryID.(string); ok && categoryIDStr != "" { + categoryIDs[categoryIDStr] = true + } + } + } + + // Query categories if we have category IDs + categoryMap := make(map[string]string) + if len(categoryIDs) > 0 { + categoryIDList := make([]string, 0, len(categoryIDs)) + for categoryID := range categoryIDs { + categoryIDList = append(categoryIDList, categoryID) + } + + categoryMod := model.Select("__yao.job.category") + if categoryMod != nil { + categoryParam := model.QueryParam{ + Select: []interface{}{"category_id", "name"}, + Wheres: []model.QueryWhere{ + {Column: "category_id", OP: "in", Value: categoryIDList}, + }, + } + + categories, err := categoryMod.Get(categoryParam) + if err != nil { + log.Warn("Failed to fetch categories: %v", err) + } else { + for _, category := range categories { + if categoryID, ok := category["category_id"].(string); ok { + if categoryName, ok := category["name"].(string); ok { + categoryMap[categoryID] = categoryName + } + } + } + } + } + } + + // Add category_name to jobs + for i, job := range jobsData { + if categoryID, exists := job["category_id"]; exists && categoryID != nil { + if categoryIDStr, ok := categoryID.(string); ok { + if categoryName, exists := categoryMap[categoryIDStr]; exists { + jobsData[i]["category_name"] = categoryName + } else { + jobsData[i]["category_name"] = nil + } + } + } + } + + result["data"] = jobsData + log.Debug("ListJobs result with categories: %+v", result) + return result, nil } // GetActiveJobs get active jobs (running, ready status) @@ -33,6 +170,7 @@ func GetActiveJobs() ([]*Job, error) { } param := model.QueryParam{ + Select: JobFields, Wheres: []model.QueryWhere{ {Column: "status", OP: "in", Value: []string{"ready", "running"}}, {Column: "enabled", Value: true}, @@ -185,6 +323,7 @@ func GetJob(jobID string) (*Job, error) { } param := model.QueryParam{ + Select: JobFields, Wheres: []model.QueryWhere{ {Column: "job_id", Value: jobID}, }, @@ -199,8 +338,33 @@ func GetJob(jobID string) (*Job, error) { return nil, fmt.Errorf("job not found: %s", jobID) } + jobData := results[0] + + // Query category name if category_id exists + if categoryID, exists := jobData["category_id"]; exists && categoryID != nil { + if categoryIDStr, ok := categoryID.(string); ok && categoryIDStr != "" { + categoryMod := model.Select("__yao.job.category") + if categoryMod != nil { + categoryParam := model.QueryParam{ + Select: []interface{}{"name"}, + Wheres: []model.QueryWhere{ + {Column: "category_id", Value: categoryIDStr}, + }, + Limit: 1, + } + + categoryResults, err := categoryMod.Get(categoryParam) + if err == nil && len(categoryResults) > 0 { + if categoryName, ok := categoryResults[0]["name"].(string); ok { + jobData["category_name"] = categoryName + } + } + } + } + } + job := &Job{} - if err := mapToStruct(results[0], job); err != nil { + if err := mapToStruct(jobData, job); err != nil { return nil, err } @@ -218,6 +382,11 @@ func GetCategories(param model.QueryParam) ([]*Category, error) { return nil, fmt.Errorf("job category model not found") } + // Set select fields if not already specified + if len(param.Select) == 0 { + param.Select = CategoryFields + } + results, err := mod.Get(param) if err != nil { return nil, err @@ -523,6 +692,11 @@ func ListLogs(jobID string, param model.QueryParam, page int, pagesize int) (map return nil, fmt.Errorf("job log model not found") } + // Set select fields if not already specified + if len(param.Select) == 0 { + param.Select = LogFields + } + // Add job_id filter param.Wheres = append(param.Wheres, model.QueryWhere{ Column: "job_id", @@ -597,6 +771,7 @@ func GetExecutions(jobID string) ([]*Execution, error) { } param := model.QueryParam{ + Select: ExecutionFields, Wheres: []model.QueryWhere{ {Column: "job_id", Value: jobID}, }, @@ -701,6 +876,11 @@ func GetExecution(executionID string, param model.QueryParam) (*Execution, error return nil, fmt.Errorf("job execution model not found") } + // Set select fields if not already specified + if len(param.Select) == 0 { + param.Select = ExecutionFields + } + param.Wheres = append(param.Wheres, model.QueryWhere{ Column: "execution_id", Value: executionID, diff --git a/job/job.go b/job/job.go index db098bb1..e848cffe 100644 --- a/job/job.go +++ b/job/job.go @@ -320,6 +320,14 @@ func makeJob(data []byte) (*Job, error) { job.CreatedBy = "system" } + // Set default enabled to true if not specified + // Note: Go's zero value for bool is false, so we need to explicitly check if it was set + // Since we can't distinguish between explicitly set false and zero value, + // we'll assume new jobs should be enabled by default + if !job.System && !job.Readonly { + job.Enabled = true + } + return &job, nil } diff --git a/openapi/job/categories.go b/openapi/job/categories.go new file mode 100644 index 00000000..5156195b --- /dev/null +++ b/openapi/job/categories.go @@ -0,0 +1,180 @@ +package job + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/yaoapp/gou/model" + "github.com/yaoapp/gou/process" + "github.com/yaoapp/kun/log" + "github.com/yaoapp/yao/job" +) + +// ListCategories lists job categories +func ListCategories(c *gin.Context) { + // Build query parameters + param := model.QueryParam{} + + // Add enabled filter (default to true) + enabled := c.DefaultQuery("enabled", "true") + if enabled == "true" { + param.Wheres = append(param.Wheres, model.QueryWhere{ + Column: "enabled", + Value: true, + }) + } + + // Add system filter if provided + if system := c.Query("system"); system != "" { + systemBool := system == "true" + param.Wheres = append(param.Wheres, model.QueryWhere{ + Column: "system", + Value: systemBool, + }) + } + + // Order by sort and name + param.Orders = []model.QueryOrder{ + {Column: "sort", Option: "asc"}, + {Column: "name", Option: "asc"}, + } + + // Get categories + categories, err := job.GetCategories(param) + if err != nil { + log.Error("Failed to list categories: %v", err) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + response := gin.H{ + "data": categories, + "total": len(categories), + } + + c.JSON(http.StatusOK, response) +} + +// GetCategory gets a specific category by ID +func GetCategory(c *gin.Context) { + categoryID := c.Param("categoryID") + if categoryID == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "category_id is required"}) + return + } + + // Build query parameters to find by category_id + param := model.QueryParam{ + Wheres: []model.QueryWhere{ + {Column: "category_id", Value: categoryID}, + }, + Limit: 1, + } + + // Get categories with filter + categories, err := job.GetCategories(param) + if err != nil { + log.Error("Failed to get category %s: %v", categoryID, err) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + if len(categories) == 0 { + c.JSON(http.StatusNotFound, gin.H{"error": "Category not found"}) + return + } + + c.JSON(http.StatusOK, categories[0]) +} + +// ======================== +// Process Handlers +// ======================== + +// ProcessListCategories process handler for listing categories +func ProcessListCategories(process *process.Process) interface{} { + // TODO: Implement process handler for listing categories + args := process.Args + log.Info("ProcessListCategories called with args: %v", args) + + // Build query parameters + param := model.QueryParam{} + if len(args) > 0 { + if queryParam, ok := args[0].(model.QueryParam); ok { + param = queryParam + } + } + + // Call job.GetCategories function + categories, err := job.GetCategories(param) + if err != nil { + log.Error("Failed to list categories: %v", err) + return map[string]interface{}{"error": err.Error()} + } + + return map[string]interface{}{ + "categories": categories, + "count": len(categories), + } +} + +// ProcessGetCategory process handler for getting a category +func ProcessGetCategory(process *process.Process) interface{} { + // TODO: Implement process handler for getting a category + args := process.Args + if len(args) == 0 { + return map[string]interface{}{"error": "category_id is required"} + } + + categoryID, ok := args[0].(string) + if !ok { + return map[string]interface{}{"error": "category_id must be a string"} + } + + log.Info("ProcessGetCategory called for category: %s", categoryID) + + // Build query parameters to find by category_id + param := model.QueryParam{ + Wheres: []model.QueryWhere{ + {Column: "category_id", Value: categoryID}, + }, + Limit: 1, + } + + // Call job.GetCategories function with filter + categories, err := job.GetCategories(param) + if err != nil { + log.Error("Failed to get category %s: %v", categoryID, err) + return map[string]interface{}{"error": err.Error()} + } + + if len(categories) == 0 { + return map[string]interface{}{"error": "category not found"} + } + + return categories[0] +} + +// ProcessCountCategories process handler for counting categories +func ProcessCountCategories(process *process.Process) interface{} { + // TODO: Implement process handler for counting categories + args := process.Args + log.Info("ProcessCountCategories called with args: %v", args) + + // Build query parameters + param := model.QueryParam{} + if len(args) > 0 { + if queryParam, ok := args[0].(model.QueryParam); ok { + param = queryParam + } + } + + // Call job.CountCategories function + count, err := job.CountCategories(param) + if err != nil { + log.Error("Failed to count categories: %v", err) + return map[string]interface{}{"error": err.Error()} + } + + return map[string]interface{}{"count": count} +} diff --git a/openapi/job/executions.go b/openapi/job/executions.go new file mode 100644 index 00000000..6e70e987 --- /dev/null +++ b/openapi/job/executions.go @@ -0,0 +1,333 @@ +package job + +import ( + "net/http" + "strconv" + + "github.com/gin-gonic/gin" + "github.com/yaoapp/gou/model" + "github.com/yaoapp/gou/process" + "github.com/yaoapp/kun/log" + "github.com/yaoapp/yao/job" +) + +// ListExecutions lists executions for a specific job +func ListExecutions(c *gin.Context) { + jobID := c.Param("jobID") + if jobID == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "job_id is required"}) + return + } + + // Get executions for the job + executions, err := job.GetExecutions(jobID) + if err != nil { + log.Error("Failed to list executions for job %s: %v", jobID, err) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + // Add optional status filter + if status := c.Query("status"); status != "" { + filtered := make([]*job.Execution, 0) + for _, execution := range executions { + if execution.Status == status { + filtered = append(filtered, execution) + } + } + executions = filtered + } + + // Simple pagination (client-side) + page := 1 + pagesize := 50 + if p := c.Query("page"); p != "" { + if parsed, err := strconv.Atoi(p); err == nil && parsed > 0 { + page = parsed + } + } + if ps := c.Query("pagesize"); ps != "" { + if parsed, err := strconv.Atoi(ps); err == nil && parsed > 0 && parsed <= 1000 { + pagesize = parsed + } + } + + total := len(executions) + start := (page - 1) * pagesize + end := start + pagesize + + if start >= total { + executions = []*job.Execution{} + } else { + if end > total { + end = total + } + executions = executions[start:end] + } + + response := gin.H{ + "data": executions, + "page": page, + "pagesize": pagesize, + "total": total, + "job_id": jobID, + } + + c.JSON(http.StatusOK, response) +} + +// GetExecution gets a specific execution by ID +func GetExecution(c *gin.Context) { + executionID := c.Param("executionID") + if executionID == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "execution_id is required"}) + return + } + + // Get the execution + execution, err := job.GetExecution(executionID, model.QueryParam{}) + if err != nil { + log.Error("Failed to get execution %s: %v", executionID, err) + if err.Error() == "execution not found: "+executionID { + c.JSON(http.StatusNotFound, gin.H{"error": "Execution not found"}) + } else { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + } + return + } + + c.JSON(http.StatusOK, execution) +} + +// StopExecution stops a running execution +func StopExecution(c *gin.Context) { + executionID := c.Param("executionID") + if executionID == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "execution_id is required"}) + return + } + + // Get the execution first to find the job + execution, err := job.GetExecution(executionID, model.QueryParam{}) + if err != nil { + log.Error("Failed to get execution %s: %v", executionID, err) + if err.Error() == "execution not found: "+executionID { + c.JSON(http.StatusNotFound, gin.H{"error": "Execution not found"}) + } else { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + } + return + } + + // Get the job to stop the specific execution + jobInstance, err := job.GetJob(execution.JobID) + if err != nil { + log.Error("Failed to get job %s for execution %s: %v", execution.JobID, executionID, err) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + // For now, we stop the entire job since individual execution stopping + // would require more complex implementation in the job package + err = jobInstance.Stop() + if err != nil { + log.Error("Failed to stop job %s (execution %s): %v", execution.JobID, executionID, err) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusOK, gin.H{ + "message": "Execution stopped successfully (job stopped)", + "execution_id": executionID, + "job_id": execution.JobID, + "status": "stopped", + }) +} + +// GetExecutionProgress gets execution progress information +func GetExecutionProgress(c *gin.Context) { + executionID := c.Param("executionID") + if executionID == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "execution_id is required"}) + return + } + + // Get the execution + execution, err := job.GetExecution(executionID, model.QueryParam{}) + if err != nil { + log.Error("Failed to get execution %s: %v", executionID, err) + if err.Error() == "execution not found: "+executionID { + c.JSON(http.StatusNotFound, gin.H{"error": "Execution not found"}) + } else { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + } + return + } + + response := gin.H{ + "execution_id": executionID, + "job_id": execution.JobID, + "status": execution.Status, + "progress": execution.Progress, + "started_at": execution.StartedAt, + "ended_at": execution.EndedAt, + "duration": execution.Duration, + "worker_id": execution.WorkerID, + "process_id": execution.ProcessID, + "retry_attempt": execution.RetryAttempt, + } + + // Add error info if available + if execution.ErrorInfo != nil { + response["error_info"] = execution.ErrorInfo + } + + // Add result if available + if execution.Result != nil { + response["result"] = execution.Result + } + + c.JSON(http.StatusOK, response) +} + +// ======================== +// Process Handlers +// ======================== + +// ProcessListExecutions process handler for listing executions +func ProcessListExecutions(process *process.Process) interface{} { + // TODO: Implement process handler for listing executions + args := process.Args + if len(args) == 0 { + return map[string]interface{}{"error": "job_id is required"} + } + + jobID, ok := args[0].(string) + if !ok { + return map[string]interface{}{"error": "job_id must be a string"} + } + + log.Info("ProcessListExecutions called for job: %s", jobID) + + // Call job.GetExecutions function + executions, err := job.GetExecutions(jobID) + if err != nil { + log.Error("Failed to list executions for job %s: %v", jobID, err) + return map[string]interface{}{"error": err.Error()} + } + + return map[string]interface{}{ + "executions": executions, + "count": len(executions), + } +} + +// ProcessGetExecution process handler for getting an execution +func ProcessGetExecution(process *process.Process) interface{} { + // TODO: Implement process handler for getting an execution + args := process.Args + if len(args) == 0 { + return map[string]interface{}{"error": "execution_id is required"} + } + + executionID, ok := args[0].(string) + if !ok { + return map[string]interface{}{"error": "execution_id must be a string"} + } + + log.Info("ProcessGetExecution called for execution: %s", executionID) + + // Build query parameters + param := model.QueryParam{} + if len(args) > 1 { + if queryParam, ok := args[1].(model.QueryParam); ok { + param = queryParam + } + } + + // Call job.GetExecution function + execution, err := job.GetExecution(executionID, param) + if err != nil { + log.Error("Failed to get execution %s: %v", executionID, err) + return map[string]interface{}{"error": err.Error()} + } + + return execution +} + +// ProcessCountExecutions process handler for counting executions +func ProcessCountExecutions(process *process.Process) interface{} { + // TODO: Implement process handler for counting executions + args := process.Args + if len(args) == 0 { + return map[string]interface{}{"error": "job_id is required"} + } + + jobID, ok := args[0].(string) + if !ok { + return map[string]interface{}{"error": "job_id must be a string"} + } + + log.Info("ProcessCountExecutions called for job: %s", jobID) + + // Build query parameters + param := model.QueryParam{} + if len(args) > 1 { + if queryParam, ok := args[1].(model.QueryParam); ok { + param = queryParam + } + } + + // Call job.CountExecutions function + count, err := job.CountExecutions(jobID, param) + if err != nil { + log.Error("Failed to count executions for job %s: %v", jobID, err) + return map[string]interface{}{"error": err.Error()} + } + + return map[string]interface{}{"count": count} +} + +// ProcessStopExecution process handler for stopping an execution +func ProcessStopExecution(process *process.Process) interface{} { + // TODO: Implement process handler for stopping an execution + args := process.Args + if len(args) == 0 { + return map[string]interface{}{"error": "execution_id is required"} + } + + executionID, ok := args[0].(string) + if !ok { + return map[string]interface{}{"error": "execution_id must be a string"} + } + + log.Info("ProcessStopExecution called for execution: %s", executionID) + + // Get the execution first to find the job + execution, err := job.GetExecution(executionID, model.QueryParam{}) + if err != nil { + log.Error("Failed to get execution %s: %v", executionID, err) + return map[string]interface{}{"error": err.Error()} + } + + // Get the job to stop the specific execution + jobInstance, err := job.GetJob(execution.JobID) + if err != nil { + log.Error("Failed to get job %s for execution %s: %v", execution.JobID, executionID, err) + return map[string]interface{}{"error": err.Error()} + } + + // For now, we stop the entire job since individual execution stopping + // would require more complex implementation in the job package + err = jobInstance.Stop() + if err != nil { + log.Error("Failed to stop job %s (execution %s): %v", execution.JobID, executionID, err) + return map[string]interface{}{"error": err.Error()} + } + + return map[string]interface{}{ + "message": "Execution stopped successfully", + "execution_id": executionID, + "job_id": execution.JobID, + } +} diff --git a/openapi/job/job.go b/openapi/job/job.go index 8d7765aa..043e5e45 100644 --- a/openapi/job/job.go +++ b/openapi/job/job.go @@ -1 +1,56 @@ package job + +import ( + "github.com/gin-gonic/gin" + "github.com/yaoapp/gou/process" + "github.com/yaoapp/yao/openapi/oauth/types" +) + +func init() { + // Register job process handlers + process.RegisterGroup("job", map[string]process.Handler{ + "jobs.list": ProcessListJobs, + "jobs.get": ProcessGetJob, + "jobs.count": ProcessCountJobs, + "jobs.stop": ProcessStopJob, + "executions.list": ProcessListExecutions, + "executions.get": ProcessGetExecution, + "executions.count": ProcessCountExecutions, + "executions.stop": ProcessStopExecution, + "logs.list": ProcessListLogs, + "categories.list": ProcessListCategories, + "categories.get": ProcessGetCategory, + "categories.count": ProcessCountCategories, + }) +} + +// Attach attaches the Job API to the router +func Attach(group *gin.RouterGroup, oauth types.OAuth) { + // Protect all endpoints with OAuth + group.Use(oauth.Guard) + + // Job Management (Read-only operations) + group.GET("/jobs", ListJobs) + group.GET("/jobs/:jobID", GetJob) + group.POST("/jobs/:jobID/stop", StopJob) + + // Execution Management + group.GET("/jobs/:jobID/executions", ListExecutions) + group.GET("/executions/:executionID", GetExecution) + group.POST("/executions/:executionID/stop", StopExecution) + + // Log Management + group.GET("/jobs/:jobID/logs", ListLogs) + group.GET("/executions/:executionID/logs", ListExecutionLogs) + + // Category Management (Read-only) + group.GET("/categories", ListCategories) + group.GET("/categories/:categoryID", GetCategory) + + // Progress and Status + group.GET("/jobs/:jobID/progress", GetJobProgress) + group.GET("/executions/:executionID/progress", GetExecutionProgress) + + // Statistics + group.GET("/stats", GetStats) +} diff --git a/openapi/job/jobs.go b/openapi/job/jobs.go new file mode 100644 index 00000000..8c0162d4 --- /dev/null +++ b/openapi/job/jobs.go @@ -0,0 +1,404 @@ +package job + +import ( + "net/http" + "strconv" + + "github.com/gin-gonic/gin" + "github.com/yaoapp/gou/model" + "github.com/yaoapp/gou/process" + "github.com/yaoapp/kun/log" + "github.com/yaoapp/yao/job" +) + +// ListJobs lists jobs with pagination +func ListJobs(c *gin.Context) { + // Parse pagination parameters + page := 1 + pagesize := 20 + + if p := c.Query("page"); p != "" { + if parsed, err := strconv.Atoi(p); err == nil && parsed > 0 { + page = parsed + } + } + + if ps := c.Query("pagesize"); ps != "" { + if parsed, err := strconv.Atoi(ps); err == nil && parsed > 0 && parsed <= 1000 { + pagesize = parsed + } + } + + // Build query parameters from URL query + param := model.QueryParam{ + Orders: []model.QueryOrder{ + {Column: "created_at", Option: "desc"}, + }, + } + + // Add status filter if provided + if status := c.Query("status"); status != "" { + param.Wheres = append(param.Wheres, model.QueryWhere{ + Column: "status", + Value: status, + }) + } + + // Add category filter if provided + if categoryID := c.Query("category_id"); categoryID != "" { + param.Wheres = append(param.Wheres, model.QueryWhere{ + Column: "category_id", + Value: categoryID, + }) + } + + // Add enabled filter (default to show all for debugging) + enabled := c.Query("enabled") + if enabled == "true" { + param.Wheres = append(param.Wheres, model.QueryWhere{ + Column: "enabled", + Value: true, + }) + } else if enabled == "false" { + param.Wheres = append(param.Wheres, model.QueryWhere{ + Column: "enabled", + Value: false, + }) + } + // Default: show all records regardless of enabled status + + // Call job.ListJobs function + result, err := job.ListJobs(param, page, pagesize) + if err != nil { + log.Error("Failed to list jobs: %v", err) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusOK, result) +} + +// GetJob gets a specific job by ID +func GetJob(c *gin.Context) { + jobID := c.Param("jobID") + if jobID == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "job_id is required"}) + return + } + + // Call job.GetJob function + jobInstance, err := job.GetJob(jobID) + if err != nil { + log.Error("Failed to get job %s: %v", jobID, err) + if err.Error() == "job not found: "+jobID { + c.JSON(http.StatusNotFound, gin.H{"error": "Job not found"}) + } else { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + } + return + } + + c.JSON(http.StatusOK, jobInstance) +} + +// StopJob stops a running job +func StopJob(c *gin.Context) { + jobID := c.Param("jobID") + if jobID == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "job_id is required"}) + return + } + + // Get the job first + jobInstance, err := job.GetJob(jobID) + if err != nil { + log.Error("Failed to get job %s: %v", jobID, err) + if err.Error() == "job not found: "+jobID { + c.JSON(http.StatusNotFound, gin.H{"error": "Job not found"}) + } else { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + } + return + } + + // Stop the job + err = jobInstance.Stop() + if err != nil { + log.Error("Failed to stop job %s: %v", jobID, err) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusOK, gin.H{ + "message": "Job stopped successfully", + "job_id": jobID, + "status": "stopped", + }) +} + +// GetJobProgress gets job progress information +func GetJobProgress(c *gin.Context) { + jobID := c.Param("jobID") + if jobID == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "job_id is required"}) + return + } + + // Get the job first + jobInstance, err := job.GetJob(jobID) + if err != nil { + log.Error("Failed to get job %s: %v", jobID, err) + if err.Error() == "job not found: "+jobID { + c.JSON(http.StatusNotFound, gin.H{"error": "Job not found"}) + } else { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + } + return + } + + // Get executions for progress calculation + executions, err := job.GetExecutions(jobID) + if err != nil { + log.Error("Failed to get executions for job %s: %v", jobID, err) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + // Calculate progress + totalExecutions := len(executions) + completedCount := 0 + runningCount := 0 + failedCount := 0 + totalProgress := 0 + + for _, execution := range executions { + totalProgress += execution.Progress + switch execution.Status { + case "completed": + completedCount++ + case "running": + runningCount++ + case "failed": + failedCount++ + } + } + + averageProgress := 0 + if totalExecutions > 0 { + averageProgress = totalProgress / totalExecutions + } + + response := gin.H{ + "job_id": jobID, + "status": jobInstance.Status, + "progress": averageProgress, + "total_executions": totalExecutions, + "completed_count": completedCount, + "running_count": runningCount, + "failed_count": failedCount, + "last_run_at": jobInstance.LastRunAt, + "next_run_at": jobInstance.NextRunAt, + } + + c.JSON(http.StatusOK, response) +} + +// GetStats gets overall job statistics +func GetStats(c *gin.Context) { + // Count total jobs + totalJobs, err := job.CountJobs(model.QueryParam{}) + if err != nil { + log.Error("Failed to count total jobs: %v", err) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + // Count running jobs + runningJobs, err := job.CountJobs(model.QueryParam{ + Wheres: []model.QueryWhere{ + {Column: "status", Value: "running"}, + }, + }) + if err != nil { + log.Error("Failed to count running jobs: %v", err) + runningJobs = 0 + } + + // Count completed jobs + completedJobs, err := job.CountJobs(model.QueryParam{ + Wheres: []model.QueryWhere{ + {Column: "status", Value: "completed"}, + }, + }) + if err != nil { + log.Error("Failed to count completed jobs: %v", err) + completedJobs = 0 + } + + // Count failed jobs + failedJobs, err := job.CountJobs(model.QueryParam{ + Wheres: []model.QueryWhere{ + {Column: "status", Value: "failed"}, + }, + }) + if err != nil { + log.Error("Failed to count failed jobs: %v", err) + failedJobs = 0 + } + + // Get categories for category stats + categories, err := job.GetCategories(model.QueryParam{}) + if err != nil { + log.Error("Failed to get categories: %v", err) + categories = []*job.Category{} + } + + categoryStats := make(map[string]int) + for _, category := range categories { + count, err := job.CountJobs(model.QueryParam{ + Wheres: []model.QueryWhere{ + {Column: "category_id", Value: category.CategoryID}, + }, + }) + if err != nil { + count = 0 + } + categoryStats[category.Name] = count + } + + response := gin.H{ + "total_jobs": totalJobs, + "running_jobs": runningJobs, + "completed_jobs": completedJobs, + "failed_jobs": failedJobs, + "category_stats": categoryStats, + "total_categories": len(categories), + } + + c.JSON(http.StatusOK, response) +} + +// ======================== +// Process Handlers +// ======================== + +// ProcessListJobs process handler for listing jobs +func ProcessListJobs(process *process.Process) interface{} { + // TODO: Implement process handler for listing jobs + args := process.Args + log.Info("ProcessListJobs called with args: %v", args) + + // Default pagination values + page := 1 + pagesize := 20 + + // Parse arguments if provided + if len(args) > 0 { + if p, ok := args[0].(int); ok { + page = p + } + } + if len(args) > 1 { + if ps, ok := args[1].(int); ok { + pagesize = ps + } + } + + // Build query parameters + param := model.QueryParam{} + if len(args) > 2 { + if queryParam, ok := args[2].(model.QueryParam); ok { + param = queryParam + } + } + + // Call job.ListJobs function + result, err := job.ListJobs(param, page, pagesize) + if err != nil { + log.Error("Failed to list jobs: %v", err) + return map[string]interface{}{"error": err.Error()} + } + + return result +} + +// ProcessGetJob process handler for getting a job +func ProcessGetJob(process *process.Process) interface{} { + // TODO: Implement process handler for getting a job + args := process.Args + if len(args) == 0 { + return map[string]interface{}{"error": "job_id is required"} + } + + jobID, ok := args[0].(string) + if !ok { + return map[string]interface{}{"error": "job_id must be a string"} + } + + log.Info("ProcessGetJob called for job: %s", jobID) + + // Call job.GetJob function + result, err := job.GetJob(jobID) + if err != nil { + log.Error("Failed to get job %s: %v", jobID, err) + return map[string]interface{}{"error": err.Error()} + } + + return result +} + +// ProcessCountJobs process handler for counting jobs +func ProcessCountJobs(process *process.Process) interface{} { + // TODO: Implement process handler for counting jobs + args := process.Args + log.Info("ProcessCountJobs called with args: %v", args) + + // Build query parameters + param := model.QueryParam{} + if len(args) > 0 { + if queryParam, ok := args[0].(model.QueryParam); ok { + param = queryParam + } + } + + // Call job.CountJobs function + count, err := job.CountJobs(param) + if err != nil { + log.Error("Failed to count jobs: %v", err) + return map[string]interface{}{"error": err.Error()} + } + + return map[string]interface{}{"count": count} +} + +// ProcessStopJob process handler for stopping a job +func ProcessStopJob(process *process.Process) interface{} { + // TODO: Implement process handler for stopping a job + args := process.Args + if len(args) == 0 { + return map[string]interface{}{"error": "job_id is required"} + } + + jobID, ok := args[0].(string) + if !ok { + return map[string]interface{}{"error": "job_id must be a string"} + } + + log.Info("ProcessStopJob called for job: %s", jobID) + + // Get the job first + jobInstance, err := job.GetJob(jobID) + if err != nil { + log.Error("Failed to get job %s: %v", jobID, err) + return map[string]interface{}{"error": err.Error()} + } + + // Stop the job + err = jobInstance.Stop() + if err != nil { + log.Error("Failed to stop job %s: %v", jobID, err) + return map[string]interface{}{"error": err.Error()} + } + + return map[string]interface{}{"message": "Job stopped successfully", "job_id": jobID} +} diff --git a/openapi/job/logs.go b/openapi/job/logs.go new file mode 100644 index 00000000..3a9a6d60 --- /dev/null +++ b/openapi/job/logs.go @@ -0,0 +1,188 @@ +package job + +import ( + "net/http" + "strconv" + + "github.com/gin-gonic/gin" + "github.com/yaoapp/gou/model" + "github.com/yaoapp/gou/process" + "github.com/yaoapp/kun/log" + "github.com/yaoapp/yao/job" +) + +// ListLogs lists logs for a specific job +func ListLogs(c *gin.Context) { + jobID := c.Param("jobID") + if jobID == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "job_id is required"}) + return + } + + // Parse pagination parameters + page := 1 + pagesize := 50 + + if p := c.Query("page"); p != "" { + if parsed, err := strconv.Atoi(p); err == nil && parsed > 0 { + page = parsed + } + } + + if ps := c.Query("pagesize"); ps != "" { + if parsed, err := strconv.Atoi(ps); err == nil && parsed > 0 && parsed <= 1000 { + pagesize = parsed + } + } + + // Build query parameters + param := model.QueryParam{ + Orders: []model.QueryOrder{ + {Column: "timestamp", Option: "desc"}, // 日志按时间戳倒序 + }, + } + + // Add level filter if provided + if level := c.Query("level"); level != "" { + param.Wheres = append(param.Wheres, model.QueryWhere{ + Column: "level", + Value: level, + }) + } + + // Add execution_id filter if provided + if executionID := c.Query("execution_id"); executionID != "" { + param.Wheres = append(param.Wheres, model.QueryWhere{ + Column: "execution_id", + Value: executionID, + }) + } + + // Call job.ListLogs function + result, err := job.ListLogs(jobID, param, page, pagesize) + if err != nil { + log.Error("Failed to list logs for job %s: %v", jobID, err) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusOK, result) +} + +// ListExecutionLogs lists logs for a specific execution +func ListExecutionLogs(c *gin.Context) { + executionID := c.Param("executionID") + if executionID == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "execution_id is required"}) + return + } + + // First get the execution to find the job_id + execution, err := job.GetExecution(executionID, model.QueryParam{}) + if err != nil { + log.Error("Failed to get execution %s: %v", executionID, err) + if err.Error() == "execution not found: "+executionID { + c.JSON(http.StatusNotFound, gin.H{"error": "Execution not found"}) + } else { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + } + return + } + + // Parse pagination parameters + page := 1 + pagesize := 50 + + if p := c.Query("page"); p != "" { + if parsed, err := strconv.Atoi(p); err == nil && parsed > 0 { + page = parsed + } + } + + if ps := c.Query("pagesize"); ps != "" { + if parsed, err := strconv.Atoi(ps); err == nil && parsed > 0 && parsed <= 1000 { + pagesize = parsed + } + } + + // Build query parameters with execution_id filter + param := model.QueryParam{ + Wheres: []model.QueryWhere{ + {Column: "execution_id", Value: executionID}, + }, + Orders: []model.QueryOrder{ + {Column: "timestamp", Option: "desc"}, // 日志按时间戳倒序 + }, + } + + // Add level filter if provided + if level := c.Query("level"); level != "" { + param.Wheres = append(param.Wheres, model.QueryWhere{ + Column: "level", + Value: level, + }) + } + + // Call job.ListLogs function with job_id from execution + result, err := job.ListLogs(execution.JobID, param, page, pagesize) + if err != nil { + log.Error("Failed to list logs for execution %s: %v", executionID, err) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusOK, result) +} + +// ======================== +// Process Handlers +// ======================== + +// ProcessListLogs process handler for listing logs +func ProcessListLogs(process *process.Process) interface{} { + // TODO: Implement process handler for listing logs + args := process.Args + if len(args) == 0 { + return map[string]interface{}{"error": "job_id is required"} + } + + jobID, ok := args[0].(string) + if !ok { + return map[string]interface{}{"error": "job_id must be a string"} + } + + // Default pagination values + page := 1 + pagesize := 50 + + // Parse arguments if provided + if len(args) > 1 { + if p, ok := args[1].(int); ok && p > 0 { + page = p + } + } + if len(args) > 2 { + if ps, ok := args[2].(int); ok && ps > 0 { + pagesize = ps + } + } + + // Build query parameters + param := model.QueryParam{} + if len(args) > 3 { + if queryParam, ok := args[3].(model.QueryParam); ok { + param = queryParam + } + } + + log.Info("ProcessListLogs called for job: %s (page: %d, pagesize: %d)", jobID, page, pagesize) + + // Call job.ListLogs function + result, err := job.ListLogs(jobID, param, page, pagesize) + if err != nil { + log.Error("Failed to list logs for job %s: %v", jobID, err) + return map[string]interface{}{"error": err.Error()} + } + + return result +} diff --git a/openapi/openapi.go b/openapi/openapi.go index 9a82a329..3cd71d16 100644 --- a/openapi/openapi.go +++ b/openapi/openapi.go @@ -11,6 +11,7 @@ import ( "github.com/yaoapp/yao/openapi/dsl" "github.com/yaoapp/yao/openapi/file" "github.com/yaoapp/yao/openapi/hello" + "github.com/yaoapp/yao/openapi/job" "github.com/yaoapp/yao/openapi/kb" "github.com/yaoapp/yao/openapi/oauth" "github.com/yaoapp/yao/openapi/oauth/types" @@ -95,6 +96,9 @@ func (openapi *OpenAPI) Attach(router *gin.Engine) { // Knowledge Base handlers kb.Attach(group.Group("/kb"), openapi.OAuth) + // Job Management handlers + job.Attach(group.Group("/job"), openapi.OAuth) + // Chat handlers chat.Attach(group.Group("/chat"), openapi.OAuth) diff --git a/yao/models/job/job.mod.yao b/yao/models/job/job.mod.yao index 54cd6563..6be83434 100644 --- a/yao/models/job/job.mod.yao +++ b/yao/models/job/job.mod.yao @@ -59,6 +59,14 @@ "nullable": false, "index": true }, + { + "name": "max_worker_nums", + "type": "integer", + "label": "Max Worker Numbers", + "comment": "Maximum number of concurrent workers for this job", + "default": 1, + "nullable": false + }, { "name": "status", "type": "enum", @@ -218,9 +226,9 @@ "comment": "Composite index for category and status queries" }, { - "name": "idx_job_process_type_status", - "columns": ["process_type", "status"], - "comment": "Composite index for process type and status queries" + "name": "idx_job_mode_status", + "columns": ["mode", "status"], + "comment": "Composite index for mode and status queries" }, { "name": "idx_job_schedule_type_next_run",