target-supabase-sdk 0.1.9 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -0
- package/dist/browser.d.ts +52 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +45 -0
- package/dist/browser.js.map +1 -0
- package/dist/command/command.api.js +5 -5
- package/dist/command/command.api.js.map +1 -1
- package/dist/index.d.ts +2 -48
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -41
- package/dist/index.js.map +1 -1
- package/dist/link/link.interface.d.ts +1 -1
- package/dist/link/link.interface.d.ts.map +1 -1
- package/dist/node/node-log-scope.d.ts +11 -0
- package/dist/node/node-log-scope.d.ts.map +1 -0
- package/dist/node/node-log-scope.js +7 -0
- package/dist/node/node-log-scope.js.map +1 -0
- package/dist/node/node-runtime.base.d.ts +42 -0
- package/dist/node/node-runtime.base.d.ts.map +1 -0
- package/dist/node/node-runtime.base.js +397 -0
- package/dist/node/node-runtime.base.js.map +1 -0
- package/dist/node/node.api.d.ts +3 -3
- package/dist/node/node.api.js +3 -3
- package/dist/node/node.api.js.map +1 -1
- package/dist/node/task-node.d.ts +20 -0
- package/dist/node/task-node.d.ts.map +1 -0
- package/dist/node/task-node.js +245 -0
- package/dist/node/task-node.js.map +1 -0
- package/dist/node/trigger-node.d.ts +18 -0
- package/dist/node/trigger-node.d.ts.map +1 -0
- package/dist/node/trigger-node.js +150 -0
- package/dist/node/trigger-node.js.map +1 -0
- package/dist/node.d.ts +22 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +19 -0
- package/dist/node.js.map +1 -0
- package/dist/repo/repo-manager.d.ts +14 -3
- package/dist/repo/repo-manager.d.ts.map +1 -1
- package/dist/repo/repo-manager.js +27 -17
- package/dist/repo/repo-manager.js.map +1 -1
- package/dist/repo/repo.script-loader.d.ts +3 -3
- package/dist/repo/repo.script-loader.d.ts.map +1 -1
- package/dist/repo/repo.script-loader.js +10 -10
- package/dist/repo/repo.script-loader.js.map +1 -1
- package/dist/shared/log/create-api-logger.d.ts +10 -6
- package/dist/shared/log/create-api-logger.d.ts.map +1 -1
- package/dist/shared/log/create-api-logger.js +10 -6
- package/dist/shared/log/create-api-logger.js.map +1 -1
- package/dist/shared/log/index.d.ts +10 -0
- package/dist/shared/log/index.d.ts.map +1 -0
- package/dist/shared/log/index.js +10 -0
- package/dist/shared/log/index.js.map +1 -0
- package/dist/shared/log/log-manager.d.ts +25 -46
- package/dist/shared/log/log-manager.d.ts.map +1 -1
- package/dist/shared/log/log-manager.js +59 -40
- package/dist/shared/log/log-manager.js.map +1 -1
- package/dist/shared/log/log-scope.d.ts +49 -0
- package/dist/shared/log/log-scope.d.ts.map +1 -0
- package/dist/shared/log/log-scope.js +70 -0
- package/dist/shared/log/log-scope.js.map +1 -0
- package/dist/task/index.d.ts +15 -0
- package/dist/task/index.d.ts.map +1 -0
- package/dist/task/index.js +14 -0
- package/dist/task/index.js.map +1 -0
- package/dist/task/local-task-registry.d.ts +10 -0
- package/dist/task/local-task-registry.d.ts.map +1 -1
- package/dist/task/local-task-registry.js +83 -22
- package/dist/task/local-task-registry.js.map +1 -1
- package/dist/task/task-manager.d.ts +18 -6
- package/dist/task/task-manager.d.ts.map +1 -1
- package/dist/task/task-manager.js +46 -67
- package/dist/task/task-manager.js.map +1 -1
- package/dist/task/task-post.api.d.ts +49 -0
- package/dist/task/task-post.api.d.ts.map +1 -0
- package/dist/task/task-post.api.js +91 -0
- package/dist/task/task-post.api.js.map +1 -0
- package/dist/task/task-repo-context.d.ts +2 -0
- package/dist/task/task-repo-context.d.ts.map +1 -1
- package/dist/task/task-repo-context.js.map +1 -1
- package/dist/task/task-repo-validation.d.ts +46 -0
- package/dist/task/task-repo-validation.d.ts.map +1 -0
- package/dist/task/task-repo-validation.js +96 -0
- package/dist/task/task-repo-validation.js.map +1 -0
- package/dist/task/task.api.d.ts +11 -53
- package/dist/task/task.api.d.ts.map +1 -1
- package/dist/task/task.api.js +13 -61
- package/dist/task/task.api.js.map +1 -1
- package/dist/task/task.interface.d.ts +2 -0
- package/dist/task/task.interface.d.ts.map +1 -1
- package/dist/task/task.interface.js.map +1 -1
- package/dist/trigger/trigger.api.d.ts +140 -0
- package/dist/trigger/trigger.api.d.ts.map +1 -0
- package/dist/trigger/trigger.api.js +125 -0
- package/dist/trigger/trigger.api.js.map +1 -0
- package/dist/trigger/trigger.interface.d.ts +43 -0
- package/dist/trigger/trigger.interface.d.ts.map +1 -0
- package/dist/trigger/trigger.interface.js +11 -0
- package/dist/trigger/trigger.interface.js.map +1 -0
- package/dist/trigger/trigger.utils.d.ts +6 -0
- package/dist/trigger/trigger.utils.d.ts.map +1 -0
- package/dist/trigger/trigger.utils.js +39 -0
- package/dist/trigger/trigger.utils.js.map +1 -0
- package/package.json +21 -6
- package/src/browser.ts +100 -0
- package/src/command/command.api.ts +5 -5
- package/src/index.ts +2 -79
- package/src/link/link.interface.ts +1 -1
- package/src/node/node-log-scope.ts +15 -0
- package/src/node/node-runtime.base.ts +450 -0
- package/src/node/node.api.ts +3 -3
- package/src/node/task-node.ts +284 -0
- package/src/node/trigger-node.ts +180 -0
- package/src/node.ts +62 -0
- package/src/repo/repo-manager.ts +49 -21
- package/src/repo/repo.script-loader.ts +13 -13
- package/src/shared/log/create-api-logger.ts +23 -12
- package/src/shared/log/index.ts +23 -0
- package/src/shared/log/log-manager.ts +85 -90
- package/src/shared/log/log-scope.ts +123 -0
- package/src/task/index.ts +48 -0
- package/src/task/local-task-registry.ts +110 -23
- package/src/task/task-manager.ts +73 -84
- package/src/task/task-post.api.ts +116 -0
- package/src/task/task-repo-context.ts +2 -0
- package/src/task/task-repo-validation.ts +171 -0
- package/src/task/task.api.ts +13 -73
- package/src/task/task.interface.ts +2 -0
- package/src/trigger/trigger.api.ts +166 -0
- package/src/trigger/trigger.interface.ts +50 -0
- package/src/trigger/trigger.utils.ts +56 -0
- package/dist/node/node-manager.d.ts +0 -48
- package/dist/node/node-manager.d.ts.map +0 -1
- package/dist/node/node-manager.js +0 -619
- package/dist/node/node-manager.js.map +0 -1
- package/src/node/node-manager.ts +0 -673
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LoggerWithScope } from "../shared/log";
|
|
2
2
|
import { ResultCode, Task } from "./task.interface";
|
|
3
3
|
import { ExecutableTaskFn } from "./task-repo-context";
|
|
4
4
|
export type { TaskFn, TaskRepoContext, TaskRunResult, ExecutableTaskFn, TaskRepoScriptDetails, TaskRepoScriptRecord, TaskRunnerRootConfig, TaskLocalPackageConfig, BootstrapLocalTasksResult, BootstrapLocalTasksStatus, } from "./task-repo-context";
|
|
5
5
|
export { TASK_REPO_SCRIPT_CATEGORY, TASK_RUNNER_CONFIG_DIR, TASK_RUNNER_ROOT_CONFIG_FILENAME, TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH, TASK_RUNNER_ROOT_CONFIG_LEGACY_RELATIVE_PATH, TASK_LOCAL_PACKAGE_CONFIG_FILENAME, } from "./task-repo-context";
|
|
6
|
-
import { bootstrapLocalTasks, BootstrapLocalTasksOptions, getRegisteredLocalTaskTypeKeys } from "./local-task-registry";
|
|
6
|
+
import { bootstrapLocalTasks, BootstrapLocalTasksOptions, clearBootstrapLocalTasksCache, getRegisteredLocalTaskTypeKeys } from "./local-task-registry";
|
|
7
7
|
import type { BootstrapLocalTasksResult } from "./task-repo-context";
|
|
8
|
-
|
|
8
|
+
import { type TaskRepoValidationFailureReason } from "./task-repo-validation";
|
|
9
|
+
/** @deprecated use {@link TaskRepoValidationFailureReason} */
|
|
10
|
+
export type PrepareTaskFailureReason = TaskRepoValidationFailureReason;
|
|
11
|
+
export type { TaskRepoValidationFailureReason, ValidateTaskRepoAndParamsInput, ValidateTaskRepoAndParamsResult, } from "./task-repo-validation";
|
|
12
|
+
export { TaskRepoValidation } from "./task-repo-validation";
|
|
9
13
|
export interface PrepareTaskResponse {
|
|
10
14
|
isSuccess: boolean;
|
|
11
15
|
taskFn: ExecutableTaskFn | null;
|
|
@@ -16,11 +20,17 @@ export interface PrepareTaskResponse {
|
|
|
16
20
|
step?: string;
|
|
17
21
|
}
|
|
18
22
|
export interface PrepareTaskParams {
|
|
19
|
-
logger:
|
|
23
|
+
logger: LoggerWithScope;
|
|
20
24
|
task: Task;
|
|
25
|
+
/**
|
|
26
|
+
* When false, do not fetch Repo from Supabase during validation.
|
|
27
|
+
* Should match {@link RegisterTasksOptions.includeRemote} on the worker.
|
|
28
|
+
*/
|
|
29
|
+
includeRemote?: boolean;
|
|
30
|
+
bootstrapLocalOptions?: BootstrapLocalTasksOptions;
|
|
21
31
|
}
|
|
22
32
|
export interface RegisterTasksOptions {
|
|
23
|
-
logger:
|
|
33
|
+
logger: LoggerWithScope;
|
|
24
34
|
local?: BootstrapLocalTasksOptions;
|
|
25
35
|
/** When `true` (default), union local keys with remote `Repo.value` from Supabase. */
|
|
26
36
|
includeRemote?: boolean;
|
|
@@ -31,6 +41,7 @@ export interface RegisterTasksResult {
|
|
|
31
41
|
remote: {
|
|
32
42
|
values: string[];
|
|
33
43
|
};
|
|
44
|
+
includeRemote: boolean;
|
|
34
45
|
}
|
|
35
46
|
/**
|
|
36
47
|
* Worker startup: discover local task packages + remote Repo rows, merge into `availableTaskList`.
|
|
@@ -44,9 +55,10 @@ export interface RegisterTasksResult {
|
|
|
44
55
|
declare function registerTasks({ logger, local: localOptions, includeRemote, }: RegisterTasksOptions): Promise<RegisterTasksResult>;
|
|
45
56
|
declare const TaskManager: {
|
|
46
57
|
registerTasks: typeof registerTasks;
|
|
47
|
-
prepareTask: ({ logger, task }: PrepareTaskParams) => Promise<PrepareTaskResponse>;
|
|
58
|
+
prepareTask: ({ logger, task, includeRemote, bootstrapLocalOptions, }: PrepareTaskParams) => Promise<PrepareTaskResponse>;
|
|
48
59
|
bootstrapLocalTasks: typeof bootstrapLocalTasks;
|
|
49
60
|
getRegisteredLocalTaskTypeKeys: typeof getRegisteredLocalTaskTypeKeys;
|
|
61
|
+
clearBootstrapLocalTasksCache: typeof clearBootstrapLocalTasksCache;
|
|
50
62
|
};
|
|
51
63
|
export { TaskManager };
|
|
52
64
|
//# sourceMappingURL=task-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-manager.d.ts","sourceRoot":"","sources":["../../src/task/task-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"task-manager.d.ts","sourceRoot":"","sources":["../../src/task/task-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAyB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,YAAY,EACR,MAAM,EACN,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACH,yBAAyB,EACzB,sBAAsB,EACtB,gCAAgC,EAChC,qCAAqC,EACrC,4CAA4C,EAC5C,kCAAkC,GACrC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACH,mBAAmB,EACnB,0BAA0B,EAC1B,6BAA6B,EAC7B,8BAA8B,EACjC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAsB,KAAK,+BAA+B,EAAE,MAAM,wBAAwB,CAAC;AAElG,8DAA8D;AAC9D,MAAM,MAAM,wBAAwB,GAAG,+BAA+B,CAAC;AAEvE,YAAY,EACR,+BAA+B,EAC/B,8BAA8B,EAC9B,+BAA+B,GAClC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,eAAe,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC;IACX;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qBAAqB,CAAC,EAAE,0BAA0B,CAAC;CACtD;AAED,MAAM,WAAW,oBAAoB;IACjC,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,CAAC,EAAE,0BAA0B,CAAC;IACnC,sFAAsF;IACtF,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAChC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,KAAK,EAAE,yBAAyB,CAAC;IACjC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;CAC1B;AAmCD;;;;;;;;GAQG;AACH,iBAAe,aAAa,CAAC,EACzB,MAAM,EACN,KAAK,EAAE,YAAY,EACnB,aAAoB,GACvB,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA2CrD;AA2HD,QAAA,MAAM,WAAW;;2EAhGd,iBAAiB,KAAG,OAAO,CAAC,mBAAmB,CAAC;;;;CAsGlD,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
import { RepoManager } from "../repo/repo-manager";
|
|
2
1
|
import { getScanRemoteRepoValues } from "../repo/repo.api";
|
|
3
2
|
import { TASK_REPO_USAGE } from "../repo/repo.interface";
|
|
4
|
-
import { ResultCode } from "./task.interface";
|
|
5
3
|
export { TASK_REPO_SCRIPT_CATEGORY, TASK_RUNNER_CONFIG_DIR, TASK_RUNNER_ROOT_CONFIG_FILENAME, TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH, TASK_RUNNER_ROOT_CONFIG_LEGACY_RELATIVE_PATH, TASK_LOCAL_PACKAGE_CONFIG_FILENAME, } from "./task-repo-context";
|
|
6
|
-
import { bootstrapLocalTasks, getRegisteredLocalTaskTypeKeys, } from "./local-task-registry";
|
|
4
|
+
import { bootstrapLocalTasks, clearBootstrapLocalTasksCache, getRegisteredLocalTaskTypeKeys, } from "./local-task-registry";
|
|
5
|
+
import { TaskRepoValidation } from "./task-repo-validation";
|
|
6
|
+
export { TaskRepoValidation } from "./task-repo-validation";
|
|
7
7
|
function logLocalBootstrap(logger, bootstrap) {
|
|
8
8
|
switch (bootstrap.status) {
|
|
9
9
|
case "not_configured":
|
|
10
10
|
logger.info("未找到本地任務配置,跳過本地註冊", {
|
|
11
11
|
topic: "task",
|
|
12
|
-
|
|
12
|
+
data: { message: bootstrap.message },
|
|
13
13
|
});
|
|
14
14
|
break;
|
|
15
15
|
case "failed":
|
|
16
16
|
logger.warn("本地任務註冊失敗", {
|
|
17
17
|
topic: "task",
|
|
18
|
-
|
|
18
|
+
data: { message: bootstrap.message, errors: bootstrap.errors },
|
|
19
19
|
});
|
|
20
20
|
break;
|
|
21
21
|
case "empty":
|
|
22
22
|
logger.info("本地任務掃描完成,無已註冊任務", {
|
|
23
23
|
topic: "task",
|
|
24
|
-
|
|
24
|
+
data: { message: bootstrap.message, skipped: bootstrap.skipped },
|
|
25
25
|
});
|
|
26
26
|
break;
|
|
27
27
|
case "loaded":
|
|
28
28
|
logger.info("本地任務註冊完成", {
|
|
29
29
|
topic: "task",
|
|
30
|
-
|
|
30
|
+
data: {
|
|
31
31
|
registered: bootstrap.registered,
|
|
32
32
|
skipped: bootstrap.skipped,
|
|
33
33
|
errors: bootstrap.errors,
|
|
@@ -53,7 +53,7 @@ async function registerTasks({ logger, local: localOptions, includeRemote = true
|
|
|
53
53
|
if (includeRemote) {
|
|
54
54
|
logger.info("查詢遠程 Repo 列表", {
|
|
55
55
|
topic: "task",
|
|
56
|
-
|
|
56
|
+
data: { usage: TASK_REPO_USAGE },
|
|
57
57
|
});
|
|
58
58
|
const { data, error: remoteError } = await getScanRemoteRepoValues({ usage: TASK_REPO_USAGE });
|
|
59
59
|
if (remoteError) {
|
|
@@ -62,7 +62,7 @@ async function registerTasks({ logger, local: localOptions, includeRemote = true
|
|
|
62
62
|
remoteValues = data ?? [];
|
|
63
63
|
logger.info("遠程 Repo 查詢完成", {
|
|
64
64
|
topic: "task",
|
|
65
|
-
|
|
65
|
+
data: { count: remoteValues.length, values: remoteValues },
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
68
|
const availableTaskList = [...new Set([...local.registered, ...remoteValues])];
|
|
@@ -71,7 +71,7 @@ async function registerTasks({ logger, local: localOptions, includeRemote = true
|
|
|
71
71
|
}
|
|
72
72
|
logger.success("任務註冊完成", {
|
|
73
73
|
topic: "task",
|
|
74
|
-
|
|
74
|
+
data: {
|
|
75
75
|
availableTaskList,
|
|
76
76
|
localRegistered: local.registered,
|
|
77
77
|
remoteValues,
|
|
@@ -81,9 +81,10 @@ async function registerTasks({ logger, local: localOptions, includeRemote = true
|
|
|
81
81
|
availableTaskList,
|
|
82
82
|
local,
|
|
83
83
|
remote: { values: remoteValues },
|
|
84
|
+
includeRemote,
|
|
84
85
|
};
|
|
85
86
|
}
|
|
86
|
-
/** 将 taskFn 与 params 闭包绑定,供
|
|
87
|
+
/** 将 taskFn 与 params 闭包绑定,供 TaskNode 无参调用 `await taskFn()` */
|
|
87
88
|
function bindTaskFn(taskFn, taskParams) {
|
|
88
89
|
const run = async () => taskFn(taskParams);
|
|
89
90
|
return Object.assign(run, {
|
|
@@ -91,36 +92,22 @@ function bindTaskFn(taskFn, taskParams) {
|
|
|
91
92
|
taskTypeKey: taskFn.taskTypeKey,
|
|
92
93
|
});
|
|
93
94
|
}
|
|
94
|
-
/** 调用 Repo 模块导出的 taskParamsValidator;抛错视为校验失败 */
|
|
95
|
-
function validateTaskParams(validator, taskParams, logger) {
|
|
96
|
-
try {
|
|
97
|
-
return validator(taskParams) === true;
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
logger.warn("taskParamsValidator 拋出異常", {
|
|
101
|
-
topic: "task",
|
|
102
|
-
context: { error: error instanceof Error ? error.message : error },
|
|
103
|
-
});
|
|
104
|
-
return false;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
95
|
/**
|
|
108
96
|
* 將 Supabase 認領到的 Task 解析為可執行的 `ExecutableTaskFn`。
|
|
109
97
|
*
|
|
110
98
|
* 流程:
|
|
111
99
|
* 1. 從 task.details 取出 `params`;`task.value` 作為 taskTypeKey(同 {@link Repo.value})
|
|
112
|
-
* 2. {@link
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
* 5. bindTaskFn,返回閉包後的無參執行函數
|
|
100
|
+
* 2. {@link TaskRepoValidation.validate} — 本地註冊優先;未命中時可選遠端(`includeRemote`)
|
|
101
|
+
* Worker 在 registry 未命中時會補掃本地(`local_bootstrap_on_miss`)
|
|
102
|
+
* 3. bindTaskFn,返回閉包後的無參執行函數
|
|
116
103
|
*
|
|
117
104
|
* 失敗時返回 `{ isSuccess: false, code, message, reason, step }`(不 throw)。
|
|
118
105
|
*/
|
|
119
|
-
const prepareTask = async ({ logger, task }) => {
|
|
106
|
+
const prepareTask = async ({ logger, task, includeRemote = true, bootstrapLocalOptions, }) => {
|
|
120
107
|
const fail = (params) => {
|
|
121
108
|
logger.warn(params.message, {
|
|
122
109
|
topic: "task",
|
|
123
|
-
|
|
110
|
+
data: {
|
|
124
111
|
taskId: task.id,
|
|
125
112
|
taskTypeKey: task.value,
|
|
126
113
|
reason: params.reason,
|
|
@@ -139,63 +126,54 @@ const prepareTask = async ({ logger, task }) => {
|
|
|
139
126
|
const { id: taskId, name: taskName, value: taskTypeKey, details } = task;
|
|
140
127
|
logger.info(`開始準備任務 ${taskName}-${taskTypeKey}`, {
|
|
141
128
|
topic: "task",
|
|
142
|
-
|
|
129
|
+
data: { taskId, taskName, taskTypeKey },
|
|
143
130
|
});
|
|
144
131
|
const { params: taskParams } = details;
|
|
145
|
-
if (
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
132
|
+
if (!getRegisteredLocalTaskTypeKeys().includes(taskTypeKey)) {
|
|
133
|
+
const bootstrap = await bootstrapLocalTasks({
|
|
134
|
+
...bootstrapLocalOptions,
|
|
135
|
+
forTaskTypeKey: taskTypeKey,
|
|
136
|
+
});
|
|
137
|
+
logger.debug("本地 registry 未命中,補掃本地任務", {
|
|
138
|
+
topic: "task",
|
|
139
|
+
data: {
|
|
140
|
+
taskId,
|
|
141
|
+
taskTypeKey,
|
|
142
|
+
step: "local_bootstrap_on_miss",
|
|
143
|
+
status: bootstrap.status,
|
|
144
|
+
registered: bootstrap.registered,
|
|
145
|
+
cached: bootstrap.cached ?? false,
|
|
146
|
+
message: bootstrap.message,
|
|
147
|
+
},
|
|
151
148
|
});
|
|
152
149
|
}
|
|
153
|
-
|
|
154
|
-
topic: "task",
|
|
155
|
-
context: { taskTypeKey, step: "repo_load" },
|
|
156
|
-
});
|
|
157
|
-
const { context: repoContext, error: repoError } = await RepoManager.getRepoContext({
|
|
150
|
+
const validation = await TaskRepoValidation.validate({
|
|
158
151
|
logger,
|
|
159
152
|
taskTypeKey,
|
|
153
|
+
params: taskParams,
|
|
154
|
+
includeRemote,
|
|
160
155
|
});
|
|
161
|
-
if (
|
|
156
|
+
if (!validation.isValid) {
|
|
162
157
|
return fail({
|
|
163
|
-
reason:
|
|
164
|
-
code:
|
|
165
|
-
message:
|
|
166
|
-
step:
|
|
158
|
+
reason: validation.reason,
|
|
159
|
+
code: validation.code,
|
|
160
|
+
message: validation.message,
|
|
161
|
+
step: validation.step,
|
|
167
162
|
});
|
|
168
163
|
}
|
|
164
|
+
const { repoContext } = validation;
|
|
169
165
|
logger.info("Repo 上下文加載成功", {
|
|
170
166
|
topic: "task",
|
|
171
|
-
|
|
167
|
+
data: {
|
|
172
168
|
taskTypeKey,
|
|
173
169
|
taskFnDisplayName: repoContext.taskFn.displayName,
|
|
174
170
|
step: "repo_load",
|
|
175
171
|
},
|
|
176
172
|
});
|
|
177
|
-
if (repoContext.taskFn.taskTypeKey !== taskTypeKey) {
|
|
178
|
-
return fail({
|
|
179
|
-
reason: "TASK_TYPE_KEY_MISMATCH",
|
|
180
|
-
code: ResultCode.REPO_NOT_VALID,
|
|
181
|
-
message: `taskFn.taskTypeKey (${repoContext.taskFn.taskTypeKey}) 與 task.value (${taskTypeKey}) 不一致`,
|
|
182
|
-
step: "task_type_key",
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
logger.debug("開始校驗任務參數", { topic: "task", context: { taskTypeKey, step: "params_validation" } });
|
|
186
|
-
if (!validateTaskParams(repoContext.taskParamsValidator, taskParams, logger)) {
|
|
187
|
-
return fail({
|
|
188
|
-
reason: "PARAMS_VALIDATION_FAILED",
|
|
189
|
-
code: ResultCode.PARAMS_NOT_VALID,
|
|
190
|
-
message: "任務參數校驗失敗",
|
|
191
|
-
step: "params_validation",
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
logger.debug("任務參數校驗通過", { topic: "task", context: { taskTypeKey, step: "params_validation" } });
|
|
195
173
|
const boundTaskFn = bindTaskFn(repoContext.taskFn, taskParams);
|
|
196
174
|
logger.success("任務準備完成", {
|
|
197
175
|
topic: "task",
|
|
198
|
-
|
|
176
|
+
data: {
|
|
199
177
|
taskId,
|
|
200
178
|
taskTypeKey,
|
|
201
179
|
displayName: boundTaskFn.displayName,
|
|
@@ -212,6 +190,7 @@ const TaskManager = {
|
|
|
212
190
|
prepareTask,
|
|
213
191
|
bootstrapLocalTasks,
|
|
214
192
|
getRegisteredLocalTaskTypeKeys,
|
|
193
|
+
clearBootstrapLocalTasksCache,
|
|
215
194
|
};
|
|
216
195
|
export { TaskManager };
|
|
217
196
|
//# sourceMappingURL=task-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-manager.js","sourceRoot":"","sources":["../../src/task/task-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"task-manager.js","sourceRoot":"","sources":["../../src/task/task-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type SupabaseResponse } from "../core.interface";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { Task, TaskStatus } from "./task.interface";
|
|
4
|
+
export declare const postTaskSchema: z.ZodObject<{
|
|
5
|
+
name: z.ZodString;
|
|
6
|
+
/** Task type key — matches `task.value`, {@link patchClaimTask}, {@link Repo.value}, and local Repo registry. */
|
|
7
|
+
value: z.ZodString;
|
|
8
|
+
params: z.ZodUnknown;
|
|
9
|
+
taskStatus: z.ZodDefault<z.ZodOptional<z.ZodUnion<[z.ZodLiteral<TaskStatus.OPEN>, z.ZodLiteral<TaskStatus.TODO>]>>>;
|
|
10
|
+
tagList: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
11
|
+
extra: z.ZodOptional<z.ZodString>;
|
|
12
|
+
traceId: z.ZodOptional<z.ZodString>;
|
|
13
|
+
traceParentId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
14
|
+
}, "strip", z.ZodTypeAny, {
|
|
15
|
+
name: string;
|
|
16
|
+
value: string;
|
|
17
|
+
tagList: string[];
|
|
18
|
+
taskStatus: TaskStatus.OPEN | TaskStatus.TODO;
|
|
19
|
+
extra?: string | undefined;
|
|
20
|
+
traceId?: string | undefined;
|
|
21
|
+
traceParentId?: string | null | undefined;
|
|
22
|
+
params?: unknown;
|
|
23
|
+
}, {
|
|
24
|
+
name: string;
|
|
25
|
+
value: string;
|
|
26
|
+
tagList?: string[] | undefined;
|
|
27
|
+
extra?: string | undefined;
|
|
28
|
+
traceId?: string | undefined;
|
|
29
|
+
traceParentId?: string | null | undefined;
|
|
30
|
+
params?: unknown;
|
|
31
|
+
taskStatus?: TaskStatus.OPEN | TaskStatus.TODO | undefined;
|
|
32
|
+
}>;
|
|
33
|
+
export type PostTaskPayload = z.infer<typeof postTaskSchema>;
|
|
34
|
+
/**
|
|
35
|
+
* Create a task row (scheduler / admin). **Node entry only** — requires local Repo bootstrap.
|
|
36
|
+
*
|
|
37
|
+
* @see target-supabase-sdk/node
|
|
38
|
+
*/
|
|
39
|
+
export declare const postTask: (payload: {
|
|
40
|
+
name: string;
|
|
41
|
+
value: string;
|
|
42
|
+
tagList: string[];
|
|
43
|
+
taskStatus: TaskStatus.OPEN | TaskStatus.TODO;
|
|
44
|
+
extra?: string | undefined;
|
|
45
|
+
traceId?: string | undefined;
|
|
46
|
+
traceParentId?: string | null | undefined;
|
|
47
|
+
params?: unknown;
|
|
48
|
+
}) => SupabaseResponse<Task> | Promise<SupabaseResponse<Task>>;
|
|
49
|
+
//# sourceMappingURL=task-post.api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-post.api.d.ts","sourceRoot":"","sources":["../../src/task/task-post.api.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE5E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAA4B,IAAI,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAY9E,eAAO,MAAM,cAAc;;IAE1B,iHAAiH;;;;;;;;;;;;;;;;;;;;;;;;;;EAQhH,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE7D;;;;GAIG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;8DAgFnB,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { createTarget, validateWithSchema } from "../core.api";
|
|
2
|
+
import { generateResponse } from "../core.interface";
|
|
3
|
+
import { createApiLogger, logManager } from "../shared/log";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { CategoryTask, TaskStatus } from "./task.interface";
|
|
6
|
+
import { TaskRepoValidation } from "./task-repo-validation";
|
|
7
|
+
const traceIdSchema = z.string().trim().min(1).optional();
|
|
8
|
+
const traceParentIdSchema = z.string().trim().min(1).nullable().optional();
|
|
9
|
+
/** Initial status for a new task — OPEN (draft) or TODO (claimable by workers). */
|
|
10
|
+
const postTaskInitialStatusSchema = z
|
|
11
|
+
.union([z.literal(TaskStatus.OPEN), z.literal(TaskStatus.TODO)])
|
|
12
|
+
.optional()
|
|
13
|
+
.default(TaskStatus.TODO);
|
|
14
|
+
export const postTaskSchema = z.object({
|
|
15
|
+
name: z.string().trim().min(1),
|
|
16
|
+
/** Task type key — matches `task.value`, {@link patchClaimTask}, {@link Repo.value}, and local Repo registry. */
|
|
17
|
+
value: z.string().trim().min(1),
|
|
18
|
+
params: z.unknown(),
|
|
19
|
+
taskStatus: postTaskInitialStatusSchema,
|
|
20
|
+
tagList: z.array(z.string()).optional().default([]),
|
|
21
|
+
extra: z.string().optional(),
|
|
22
|
+
traceId: traceIdSchema,
|
|
23
|
+
traceParentId: traceParentIdSchema,
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* Create a task row (scheduler / admin). **Node entry only** — requires local Repo bootstrap.
|
|
27
|
+
*
|
|
28
|
+
* @see target-supabase-sdk/node
|
|
29
|
+
*/
|
|
30
|
+
export const postTask = validateWithSchema(postTaskSchema, "postTaskSchema")(async ({ name, value, params, taskStatus, tagList, extra, traceId, traceParentId, }) => {
|
|
31
|
+
const taskTraceId = traceId?.trim() || logManager.generateTraceId();
|
|
32
|
+
const logger = createApiLogger("postTask", {
|
|
33
|
+
traceId: taskTraceId,
|
|
34
|
+
traceParentId: traceParentId ?? null,
|
|
35
|
+
});
|
|
36
|
+
const validation = await TaskRepoValidation.validate({
|
|
37
|
+
logger,
|
|
38
|
+
taskTypeKey: value,
|
|
39
|
+
params,
|
|
40
|
+
bootstrapLocal: true,
|
|
41
|
+
});
|
|
42
|
+
if (!validation.isValid) {
|
|
43
|
+
logger.warn(validation.message, {
|
|
44
|
+
topic: "task",
|
|
45
|
+
data: {
|
|
46
|
+
taskTypeKey: value,
|
|
47
|
+
reason: validation.reason,
|
|
48
|
+
step: validation.step,
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
return generateResponse.error(validation.message, undefined, String(validation.code));
|
|
52
|
+
}
|
|
53
|
+
const result = await createTarget({
|
|
54
|
+
payload: {
|
|
55
|
+
name,
|
|
56
|
+
value,
|
|
57
|
+
params,
|
|
58
|
+
taskStatus,
|
|
59
|
+
tagList,
|
|
60
|
+
extra,
|
|
61
|
+
traceId: taskTraceId,
|
|
62
|
+
traceParentId,
|
|
63
|
+
},
|
|
64
|
+
createFn: () => ({
|
|
65
|
+
name,
|
|
66
|
+
value,
|
|
67
|
+
category: CategoryTask.TASK,
|
|
68
|
+
tagList,
|
|
69
|
+
extra,
|
|
70
|
+
details: {
|
|
71
|
+
manifestVersion: 0,
|
|
72
|
+
status: taskStatus,
|
|
73
|
+
params,
|
|
74
|
+
progress: 0,
|
|
75
|
+
nodeId: null,
|
|
76
|
+
traceId: taskTraceId,
|
|
77
|
+
},
|
|
78
|
+
}),
|
|
79
|
+
});
|
|
80
|
+
logger.info("任務已創建", {
|
|
81
|
+
topic: "task",
|
|
82
|
+
data: {
|
|
83
|
+
taskId: result.data?.id,
|
|
84
|
+
taskTypeKey: value,
|
|
85
|
+
status: taskStatus,
|
|
86
|
+
traceId: taskTraceId,
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
return result;
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=task-post.api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-post.api.js","sourceRoot":"","sources":["../../src/task/task-post.api.ts"],"names":[],"mappings":"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"}
|
|
@@ -82,6 +82,8 @@ export interface BootstrapLocalTasksResult {
|
|
|
82
82
|
taskDir: string;
|
|
83
83
|
error: string;
|
|
84
84
|
}[];
|
|
85
|
+
/** True when scan was skipped due to unchanged config fingerprint */
|
|
86
|
+
cached?: boolean;
|
|
85
87
|
}
|
|
86
88
|
/** Host app config directory (relative to `cwd`) — recommended for library consumers */
|
|
87
89
|
export declare const TASK_RUNNER_CONFIG_DIR: "config";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-repo-context.d.ts","sourceRoot":"","sources":["../../src/task/task-repo-context.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACjD;AAED,qEAAqE;AACrE,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC5B,mBAAmB,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,OAAO,CAAC;IACtD,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,0EAA0E;AAC1E,eAAO,MAAM,yBAAyB,EAAG,QAAiB,CAAC;AAE3D;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,8FAA8F;AAC9F,MAAM,WAAW,oBAAoB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,qBAAqB,CAAC;CAClC;AAED,8FAA8F;AAC9F,MAAM,WAAW,oBAAoB;IACjC,gGAAgG;IAChG,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,2DAA2D;AAC3D,MAAM,WAAW,sBAAsB;IACnC,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,yBAAyB;AACjC,mFAAmF;AACjF,QAAQ;AACV,kDAAkD;GAChD,OAAO;AACT,qGAAqG;GACnG,gBAAgB;AAClB,qCAAqC;GACnC,QAAQ,CAAC;AAEf,MAAM,WAAW,yBAAyB;IACtC,MAAM,EAAE,yBAAyB,CAAC;IAClC,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/C,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"task-repo-context.d.ts","sourceRoot":"","sources":["../../src/task/task-repo-context.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACjD;AAED,qEAAqE;AACrE,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC5B,mBAAmB,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,OAAO,CAAC;IACtD,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,0EAA0E;AAC1E,eAAO,MAAM,yBAAyB,EAAG,QAAiB,CAAC;AAE3D;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,8FAA8F;AAC9F,MAAM,WAAW,oBAAoB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,qBAAqB,CAAC;CAClC;AAED,8FAA8F;AAC9F,MAAM,WAAW,oBAAoB;IACjC,gGAAgG;IAChG,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,2DAA2D;AAC3D,MAAM,WAAW,sBAAsB;IACnC,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,yBAAyB;AACjC,mFAAmF;AACjF,QAAQ;AACV,kDAAkD;GAChD,OAAO;AACT,qGAAqG;GACnG,gBAAgB;AAClB,qCAAqC;GACnC,QAAQ,CAAC;AAEf,MAAM,WAAW,yBAAyB;IACtC,MAAM,EAAE,yBAAyB,CAAC;IAClC,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/C,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7C,qEAAqE;IACrE,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wFAAwF;AACxF,eAAO,MAAM,sBAAsB,EAAG,QAAiB,CAAC;AAExD,eAAO,MAAM,gCAAgC,EAAG,gBAAyB,CAAC;AAE1E,wDAAwD;AACxD,eAAO,MAAM,qCAAqC,yBAA2E,CAAC;AAE9H,sCAAsC;AACtC,eAAO,MAAM,4CAA4C,kBAAmC,CAAC;AAE7F,kEAAkE;AAClE,eAAO,MAAM,kCAAkC,EAAG,gBAAyB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-repo-context.js","sourceRoot":"","sources":["../../src/task/task-repo-context.ts"],"names":[],"mappings":"AAwBA,0EAA0E;AAC1E,MAAM,CAAC,MAAM,yBAAyB,GAAG,QAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"task-repo-context.js","sourceRoot":"","sources":["../../src/task/task-repo-context.ts"],"names":[],"mappings":"AAwBA,0EAA0E;AAC1E,MAAM,CAAC,MAAM,yBAAyB,GAAG,QAAiB,CAAC;AAmE3D,wFAAwF;AACxF,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAiB,CAAC;AAExD,MAAM,CAAC,MAAM,gCAAgC,GAAG,gBAAyB,CAAC;AAE1E,wDAAwD;AACxD,MAAM,CAAC,MAAM,qCAAqC,GAAG,GAAG,sBAAsB,IAAI,gCAAgC,EAAW,CAAC;AAE9H,sCAAsC;AACtC,MAAM,CAAC,MAAM,4CAA4C,GAAG,gCAAgC,CAAC;AAE7F,kEAAkE;AAClE,MAAM,CAAC,MAAM,kCAAkC,GAAG,gBAAyB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type RepoContextFailureReason } from "../repo/repo-manager";
|
|
2
|
+
import { LoggerWithScope } from "../shared/log";
|
|
3
|
+
import { type BootstrapLocalTasksOptions } from "./local-task-registry";
|
|
4
|
+
import { ResultCode } from "./task.interface";
|
|
5
|
+
import type { TaskRepoContext } from "./task-repo-context";
|
|
6
|
+
export type TaskRepoValidationFailureReason = "MISSING_PARAMS" | RepoContextFailureReason | "PARAMS_VALIDATION_FAILED" | "TASK_TYPE_KEY_MISMATCH";
|
|
7
|
+
export type ValidateTaskRepoAndParamsInput = {
|
|
8
|
+
logger: LoggerWithScope;
|
|
9
|
+
taskTypeKey: string;
|
|
10
|
+
params: unknown;
|
|
11
|
+
/**
|
|
12
|
+
* When true, run {@link bootstrapLocalTasks} before resolve (CLI / Trigger / postTask).
|
|
13
|
+
* Worker paths should omit — {@link TaskManager.registerTasks} already bootstrapped.
|
|
14
|
+
*/
|
|
15
|
+
bootstrapLocal?: boolean;
|
|
16
|
+
bootstrapLocalOptions?: BootstrapLocalTasksOptions;
|
|
17
|
+
/**
|
|
18
|
+
* When false, do not fetch Repo from Supabase if the task type is not locally registered.
|
|
19
|
+
* Default `true`. Align with {@link RegisterTasksOptions.includeRemote}.
|
|
20
|
+
*/
|
|
21
|
+
includeRemote?: boolean;
|
|
22
|
+
};
|
|
23
|
+
export type ValidateTaskRepoAndParamsFailure = {
|
|
24
|
+
isValid: false;
|
|
25
|
+
code: ResultCode;
|
|
26
|
+
message: string;
|
|
27
|
+
reason: TaskRepoValidationFailureReason;
|
|
28
|
+
step: string;
|
|
29
|
+
};
|
|
30
|
+
export type ValidateTaskRepoAndParamsSuccess = {
|
|
31
|
+
isValid: true;
|
|
32
|
+
repoContext: TaskRepoContext;
|
|
33
|
+
};
|
|
34
|
+
export type ValidateTaskRepoAndParamsResult = ValidateTaskRepoAndParamsFailure | ValidateTaskRepoAndParamsSuccess;
|
|
35
|
+
/**
|
|
36
|
+
* Resolve task Repo context and validate `params` via `taskParamsValidator`.
|
|
37
|
+
*
|
|
38
|
+
* Repo resolution uses {@link RepoManager.getRepoContext}:
|
|
39
|
+
* local registry first; when no local entry and `includeRemote`, loads from Supabase.
|
|
40
|
+
*/
|
|
41
|
+
declare function validateTaskRepoAndParams({ logger, taskTypeKey, params, bootstrapLocal, bootstrapLocalOptions, includeRemote, }: ValidateTaskRepoAndParamsInput): Promise<ValidateTaskRepoAndParamsResult>;
|
|
42
|
+
declare const TaskRepoValidation: {
|
|
43
|
+
validate: typeof validateTaskRepoAndParams;
|
|
44
|
+
};
|
|
45
|
+
export { TaskRepoValidation, validateTaskRepoAndParams };
|
|
46
|
+
//# sourceMappingURL=task-repo-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-repo-validation.d.ts","sourceRoot":"","sources":["../../src/task/task-repo-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAuB,KAAK,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,MAAM,+BAA+B,GACrC,gBAAgB,GAChB,wBAAwB,GACxB,0BAA0B,GAC1B,wBAAwB,CAAC;AAE/B,MAAM,MAAM,8BAA8B,GAAG;IACzC,MAAM,EAAE,eAAe,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qBAAqB,CAAC,EAAE,0BAA0B,CAAC;IACnD;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC3C,OAAO,EAAE,KAAK,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,+BAA+B,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC3C,OAAO,EAAE,IAAI,CAAC;IACd,WAAW,EAAE,eAAe,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,+BAA+B,GACrC,gCAAgC,GAChC,gCAAgC,CAAC;AA2BvC;;;;;GAKG;AACH,iBAAe,yBAAyB,CAAC,EACrC,MAAM,EACN,WAAW,EACX,MAAM,EACN,cAAsB,EACtB,qBAAqB,EACrB,aAAoB,GACvB,EAAE,8BAA8B,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAgF3E;AAED,QAAA,MAAM,kBAAkB;;CAEvB,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,CAAC"}
|