target-supabase-sdk 0.1.7 → 0.1.9

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.
Files changed (171) hide show
  1. package/README.md +8 -6
  2. package/dist/auth/auth.api.d.ts.map +1 -1
  3. package/dist/auth/auth.api.js +8 -7
  4. package/dist/auth/auth.api.js.map +1 -1
  5. package/dist/command/command.api.d.ts +43 -0
  6. package/dist/command/command.api.d.ts.map +1 -0
  7. package/dist/command/command.api.js +58 -0
  8. package/dist/command/command.api.js.map +1 -0
  9. package/dist/command/command.interface.d.ts +14 -0
  10. package/dist/command/command.interface.d.ts.map +1 -0
  11. package/dist/command/command.interface.js +9 -0
  12. package/dist/command/command.interface.js.map +1 -0
  13. package/dist/core.api.d.ts +116 -12
  14. package/dist/core.api.d.ts.map +1 -1
  15. package/dist/core.api.js +289 -103
  16. package/dist/core.api.js.map +1 -1
  17. package/dist/core.interface.d.ts +2 -1
  18. package/dist/core.interface.d.ts.map +1 -1
  19. package/dist/core.interface.js +1 -1
  20. package/dist/core.interface.js.map +1 -1
  21. package/dist/core.utils.d.ts +0 -2
  22. package/dist/core.utils.d.ts.map +1 -1
  23. package/dist/core.utils.js +0 -5
  24. package/dist/core.utils.js.map +1 -1
  25. package/dist/file/file-manager.d.ts +1 -1
  26. package/dist/file/file-manager.d.ts.map +1 -1
  27. package/dist/file/file-manager.js +1 -1
  28. package/dist/file/file-manager.js.map +1 -1
  29. package/dist/file-list/file-list.api.js +1 -1
  30. package/dist/file-list/file-list.api.js.map +1 -1
  31. package/dist/index.d.ts +12 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +11 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/list/list.interface.d.ts +2 -2
  36. package/dist/list/list.interface.d.ts.map +1 -1
  37. package/dist/node/node-manager.d.ts +48 -0
  38. package/dist/node/node-manager.d.ts.map +1 -0
  39. package/dist/node/node-manager.js +619 -0
  40. package/dist/node/node-manager.js.map +1 -0
  41. package/dist/node/node-task.preset.d.ts +1 -0
  42. package/dist/node/node-task.preset.d.ts.map +1 -0
  43. package/dist/node/node-task.preset.js +14 -0
  44. package/dist/node/node-task.preset.js.map +1 -0
  45. package/dist/node/node.api.d.ts +68 -0
  46. package/dist/node/node.api.d.ts.map +1 -0
  47. package/dist/node/node.api.js +100 -0
  48. package/dist/node/node.api.js.map +1 -0
  49. package/dist/node/node.interface.d.ts +35 -0
  50. package/dist/node/node.interface.d.ts.map +1 -0
  51. package/dist/node/node.interface.js +19 -0
  52. package/dist/node/node.interface.js.map +1 -0
  53. package/dist/node/node.utils.d.ts +5 -0
  54. package/dist/node/node.utils.d.ts.map +1 -0
  55. package/dist/node/node.utils.js +36 -0
  56. package/dist/node/node.utils.js.map +1 -0
  57. package/dist/parcel/parcel-manager.d.ts +1 -1
  58. package/dist/parcel/parcel-manager.d.ts.map +1 -1
  59. package/dist/parcel/parcel-manager.js +1 -1
  60. package/dist/parcel/parcel-manager.js.map +1 -1
  61. package/dist/question-list/question-list.api.js +1 -1
  62. package/dist/question-list/question-list.api.js.map +1 -1
  63. package/dist/repo/repo-context.utils.d.ts +24 -0
  64. package/dist/repo/repo-context.utils.d.ts.map +1 -0
  65. package/dist/repo/repo-context.utils.js +81 -0
  66. package/dist/repo/repo-context.utils.js.map +1 -0
  67. package/dist/repo/repo-manager.d.ts +31 -0
  68. package/dist/repo/repo-manager.d.ts.map +1 -0
  69. package/dist/repo/repo-manager.js +156 -0
  70. package/dist/repo/repo-manager.js.map +1 -0
  71. package/dist/repo/repo.api.d.ts +16 -0
  72. package/dist/repo/repo.api.d.ts.map +1 -0
  73. package/dist/repo/repo.api.js +40 -0
  74. package/dist/repo/repo.api.js.map +1 -0
  75. package/dist/repo/repo.interface.d.ts +27 -0
  76. package/dist/repo/repo.interface.d.ts.map +1 -0
  77. package/dist/repo/repo.interface.js +8 -0
  78. package/dist/repo/repo.interface.js.map +1 -0
  79. package/dist/repo/repo.script-loader.d.ts +19 -0
  80. package/dist/repo/repo.script-loader.d.ts.map +1 -0
  81. package/dist/repo/repo.script-loader.js +108 -0
  82. package/dist/repo/repo.script-loader.js.map +1 -0
  83. package/dist/review/review.api.js +5 -5
  84. package/dist/review/review.api.js.map +1 -1
  85. package/dist/shared/log/create-api-logger.d.ts +17 -0
  86. package/dist/shared/log/create-api-logger.d.ts.map +1 -0
  87. package/dist/shared/log/create-api-logger.js +15 -0
  88. package/dist/shared/log/create-api-logger.js.map +1 -0
  89. package/dist/shared/log/log-manager.d.ts +114 -0
  90. package/dist/shared/log/log-manager.d.ts.map +1 -0
  91. package/dist/shared/log/log-manager.js +218 -0
  92. package/dist/shared/log/log-manager.js.map +1 -0
  93. package/dist/shared/utils/config-path.utils.d.ts +38 -0
  94. package/dist/shared/utils/config-path.utils.d.ts.map +1 -0
  95. package/dist/shared/utils/config-path.utils.js +85 -0
  96. package/dist/shared/utils/config-path.utils.js.map +1 -0
  97. package/dist/shared/utils/error.utils.d.ts +11 -0
  98. package/dist/shared/utils/error.utils.d.ts.map +1 -0
  99. package/dist/shared/utils/error.utils.js +15 -0
  100. package/dist/shared/utils/error.utils.js.map +1 -0
  101. package/dist/shared/utils/id.utils.d.ts +3 -0
  102. package/dist/shared/utils/id.utils.d.ts.map +1 -0
  103. package/dist/shared/utils/id.utils.js +5 -0
  104. package/dist/shared/utils/id.utils.js.map +1 -0
  105. package/dist/supabase.js +1 -1
  106. package/dist/supabase.js.map +1 -1
  107. package/dist/task/local-task-registry.d.ts +27 -0
  108. package/dist/task/local-task-registry.d.ts.map +1 -0
  109. package/dist/task/local-task-registry.js +153 -0
  110. package/dist/task/local-task-registry.js.map +1 -0
  111. package/dist/task/task-manager.d.ts +52 -0
  112. package/dist/task/task-manager.d.ts.map +1 -0
  113. package/dist/task/task-manager.js +217 -0
  114. package/dist/task/task-manager.js.map +1 -0
  115. package/dist/task/task-repo-context.d.ts +95 -0
  116. package/dist/task/task-repo-context.d.ts.map +1 -0
  117. package/dist/task/task-repo-context.js +12 -0
  118. package/dist/task/task-repo-context.js.map +1 -0
  119. package/dist/task/task.api.d.ts +241 -0
  120. package/dist/task/task.api.d.ts.map +1 -0
  121. package/dist/task/task.api.js +351 -0
  122. package/dist/task/task.api.js.map +1 -0
  123. package/dist/task/task.interface.d.ts +56 -0
  124. package/dist/task/task.interface.d.ts.map +1 -0
  125. package/dist/task/task.interface.js +36 -0
  126. package/dist/task/task.interface.js.map +1 -0
  127. package/dist/task/task.utils.d.ts +1 -0
  128. package/dist/task/task.utils.d.ts.map +1 -0
  129. package/dist/task/task.utils.js +2 -0
  130. package/dist/task/task.utils.js.map +1 -0
  131. package/dist/word/word.api.d.ts +5 -5
  132. package/dist/word/word.api.d.ts.map +1 -1
  133. package/dist/word/word.api.js +1 -1
  134. package/dist/word/word.api.js.map +1 -1
  135. package/package.json +10 -3
  136. package/src/auth/auth.api.ts +9 -7
  137. package/src/command/command.api.ts +88 -0
  138. package/src/command/command.interface.ts +17 -0
  139. package/src/core.api.ts +489 -133
  140. package/src/core.interface.ts +3 -1
  141. package/src/core.utils.ts +0 -6
  142. package/src/file/file-manager.ts +1 -1
  143. package/src/file-list/file-list.api.ts +1 -1
  144. package/src/index.ts +22 -1
  145. package/src/list/list.interface.ts +2 -2
  146. package/src/node/node-manager.ts +673 -0
  147. package/src/node/node-task.preset.ts +13 -0
  148. package/src/node/node.api.ts +139 -0
  149. package/src/node/node.interface.ts +40 -0
  150. package/src/node/node.utils.ts +36 -0
  151. package/src/parcel/parcel-manager.ts +1 -1
  152. package/src/question-list/question-list.api.ts +1 -1
  153. package/src/repo/repo-context.utils.ts +111 -0
  154. package/src/repo/repo-manager.ts +217 -0
  155. package/src/repo/repo.api.ts +50 -0
  156. package/src/repo/repo.interface.ts +31 -0
  157. package/src/repo/repo.script-loader.ts +140 -0
  158. package/src/review/review.api.ts +5 -5
  159. package/src/shared/log/create-api-logger.ts +25 -0
  160. package/src/shared/log/log-manager.ts +340 -0
  161. package/src/shared/utils/config-path.utils.ts +104 -0
  162. package/src/shared/utils/error.utils.ts +15 -0
  163. package/src/shared/utils/id.utils.ts +4 -0
  164. package/src/supabase.ts +1 -1
  165. package/src/task/local-task-registry.ts +195 -0
  166. package/src/task/task-manager.ts +312 -0
  167. package/src/task/task-repo-context.ts +103 -0
  168. package/src/task/task.api.ts +429 -0
  169. package/src/task/task.interface.ts +68 -0
  170. package/src/task/task.utils.ts +0 -0
  171. package/src/word/word.api.ts +6 -6
@@ -0,0 +1,351 @@
1
+ import { createTarget, getPossibleTarget, updateTargetDetails, validateWithSchema, isOptimisticLockError, OPTIMISTIC_LOCK_FAILED_MESSAGE } from "../core.api";
2
+ import { generateResponse } from "../core.interface";
3
+ import { createApiLogger } from "../shared/log/log-manager";
4
+ import { z } from "zod";
5
+ import { CategoryTask, ResultCode, TaskStatus, TaskStatusAction } from "./task.interface";
6
+ const TASK_STATUS_FIELD = "details->>status";
7
+ const TASK_NODE_ID_FIELD = "details->>nodeId";
8
+ // ─── State machine ───────────────────────────────────────────────────────────
9
+ /**
10
+ * Task state machine (field: `details.status`)
11
+ *
12
+ * ```text
13
+ * publish claim (CLAIM / patchClaimTask) finish
14
+ * OPEN ──────► TODO ──────────────────► DOING ─────────────► DONE
15
+ * │ │ reset │ cancel │ close
16
+ * │ │ └──────► TODO │
17
+ * └──────── reset ─┴──────────────────────── reset ────────────┘
18
+ * | │
19
+ * └──────────────────── close ─────────────────────────────────┘
20
+ * ▼
21
+ * CLOSED
22
+ * ```
23
+ *
24
+ * | TaskStatusAction | from | to | lock filters | caller |
25
+ * |------------------|-------------------|--------|--------------------------------|---------------|
26
+ * | PUBLISH | OPEN | TODO | status = OPEN | scheduler |
27
+ * | CLAIM | TODO | DOING | status = TODO | worker |
28
+ * | RESET | TODO | OPEN | status = TODO (no nodeId) | admin |
29
+ * | RESET | DOING, DONE | OPEN | status ∈ {DOING,DONE} + nodeId | worker |
30
+ * | CANCEL | DOING | TODO | DOING + nodeId | worker |
31
+ * | FINISH | DOING | DONE | DOING + nodeId | worker |
32
+ * | CLOSE | OPEN, DONE | CLOSED | status ∈ {OPEN, DONE} | scheduler |
33
+ *
34
+ * RESET: omit `nodeId` to reset from **TODO**; pass `nodeId` to reset from **DOING** or **DONE**.
35
+ *
36
+ * All public APIs validate input with Zod (`validateWithSchema`). Optimistic locks live in
37
+ * `optimisticLockFilterList` on UPDATE — see `.cursor/skills/optimistic-lock-update/SKILL.md`.
38
+ */
39
+ // ─── Zod schemas ─────────────────────────────────────────────────────────────
40
+ const taskIdSchema = z.string().trim().min(1);
41
+ const nodeIdSchema = z.string().trim().min(1);
42
+ /** Optional — orchestrator (e.g. NodeManager loop) passes its trace to correlate logs. */
43
+ const traceIdSchema = z.string().trim().min(1).optional();
44
+ const patchChangeTaskStatusBaseSchema = {
45
+ id: taskIdSchema,
46
+ extra: z.string().optional(),
47
+ traceId: traceIdSchema,
48
+ };
49
+ /** Shared by CLAIM / CANCEL / FINISH — worker-side actions that require nodeId */
50
+ const patchChangeTaskStatusNodeOwnedSchema = {
51
+ ...patchChangeTaskStatusBaseSchema,
52
+ nodeId: nodeIdSchema,
53
+ };
54
+ export const patchChangeTaskStatusSchema = z.discriminatedUnion("action", [
55
+ z.object({
56
+ ...patchChangeTaskStatusBaseSchema,
57
+ action: z.literal(TaskStatusAction.PUBLISH),
58
+ }),
59
+ z.object({
60
+ ...patchChangeTaskStatusBaseSchema,
61
+ action: z.literal(TaskStatusAction.CLOSE),
62
+ }),
63
+ z.object({
64
+ ...patchChangeTaskStatusNodeOwnedSchema,
65
+ action: z.literal(TaskStatusAction.CLAIM),
66
+ }),
67
+ z.object({
68
+ ...patchChangeTaskStatusBaseSchema,
69
+ action: z.literal(TaskStatusAction.RESET),
70
+ nodeId: nodeIdSchema.optional(),
71
+ }),
72
+ z.object({
73
+ ...patchChangeTaskStatusNodeOwnedSchema,
74
+ action: z.literal(TaskStatusAction.CANCEL),
75
+ }),
76
+ z.object({
77
+ ...patchChangeTaskStatusNodeOwnedSchema,
78
+ action: z.literal(TaskStatusAction.FINISH),
79
+ cost: z.number().min(0),
80
+ }),
81
+ ]);
82
+ export const patchTaskProgressSchema = z.object({
83
+ id: taskIdSchema,
84
+ progress: z.number().min(0).max(100),
85
+ nodeId: nodeIdSchema,
86
+ traceId: traceIdSchema,
87
+ });
88
+ export const patchClaimTaskSchema = z.object({
89
+ nodeId: nodeIdSchema,
90
+ availableTaskList: z.array(z.string()).min(1),
91
+ traceId: traceIdSchema,
92
+ });
93
+ /** Initial status for a new task — OPEN (draft) or TODO (claimable by workers). */
94
+ const postTaskInitialStatusSchema = z
95
+ .union([z.literal(TaskStatus.OPEN), z.literal(TaskStatus.TODO)])
96
+ .optional()
97
+ .default(TaskStatus.TODO);
98
+ export const postTaskSchema = z.object({
99
+ name: z.string().trim().min(1),
100
+ /** Task type key — matches `task.value`, {@link patchClaimTask}, {@link Repo.value}, and local Repo registry. */
101
+ value: z.string().trim().min(1),
102
+ params: z.unknown(),
103
+ taskStatus: postTaskInitialStatusSchema,
104
+ tagList: z.array(z.string()).optional().default([]),
105
+ extra: z.string().optional(),
106
+ traceId: traceIdSchema,
107
+ });
108
+ // ─── Optimistic lock helpers ─────────────────────────────────────────────────
109
+ function lockOnStatus(...allowed) {
110
+ if (allowed.length === 1) {
111
+ return [{ field: TASK_STATUS_FIELD, operator: "eq", value: allowed[0] }];
112
+ }
113
+ return [{ field: TASK_STATUS_FIELD, operator: "in", value: allowed }];
114
+ }
115
+ function lockOnOwnerNode(nodeId) {
116
+ return { field: TASK_NODE_ID_FIELD, operator: "eq", value: nodeId };
117
+ }
118
+ /** DOING row owned by `nodeId` — used by FINISH, CANCEL, patchTaskProgress */
119
+ function lockOnDoingOwner(nodeId) {
120
+ return [...lockOnStatus(TaskStatus.DOING), lockOnOwnerNode(nodeId)];
121
+ }
122
+ /** TODO without nodeId; DOING/DONE with owner when nodeId is provided */
123
+ function lockOnReset(nodeId) {
124
+ if (nodeId != null) {
125
+ return [...lockOnStatus(TaskStatus.DOING, TaskStatus.DONE), lockOnOwnerNode(nodeId)];
126
+ }
127
+ return lockOnStatus(TaskStatus.TODO);
128
+ }
129
+ function clearExecutionState() {
130
+ return { progress: 0, nodeId: null, result: undefined };
131
+ }
132
+ // ─── Internal transitions ────────────────────────────────────────────────────
133
+ async function transitionTask({ id, optimisticLockFilterList, updateFn, updateExtraFn, }) {
134
+ return updateTargetDetails({
135
+ id,
136
+ optimisticLockFilterList,
137
+ updateFn,
138
+ updateExtraFn,
139
+ });
140
+ }
141
+ function logTaskTransition(logger, action, task, context) {
142
+ logger.info("任务状态迁移成功", {
143
+ topic: "task",
144
+ context: {
145
+ action,
146
+ taskId: task.id,
147
+ taskValue: task.value,
148
+ status: task.details.status,
149
+ nodeId: task.details.nodeId,
150
+ ...context,
151
+ },
152
+ });
153
+ }
154
+ /** TODO → DOING — lock status only (no owner yet); used by CLAIM and {@link patchClaimTask} */
155
+ async function claimTaskById({ taskId, nodeId, updateExtraFn, }) {
156
+ return transitionTask({
157
+ id: taskId,
158
+ optimisticLockFilterList: lockOnStatus(TaskStatus.TODO),
159
+ updateFn: (details) => ({
160
+ ...details,
161
+ status: TaskStatus.DOING,
162
+ nodeId,
163
+ }),
164
+ updateExtraFn,
165
+ });
166
+ }
167
+ // ─── patchChangeTaskStatus ───────────────────────────────────────────────────
168
+ export const patchChangeTaskStatus = validateWithSchema(patchChangeTaskStatusSchema, "patchChangeTaskStatusSchema")(async (params) => {
169
+ const logger = createApiLogger("patchChangeTaskStatus", { traceId: params.traceId });
170
+ const { id, action, extra } = params;
171
+ const updateExtraFn = extra == null ? undefined : () => extra;
172
+ switch (action) {
173
+ case TaskStatusAction.PUBLISH: {
174
+ const data = await transitionTask({
175
+ id,
176
+ optimisticLockFilterList: lockOnStatus(TaskStatus.OPEN),
177
+ updateFn: (details) => ({
178
+ ...details,
179
+ ...clearExecutionState(),
180
+ status: TaskStatus.TODO,
181
+ }),
182
+ updateExtraFn,
183
+ });
184
+ logTaskTransition(logger, action, data);
185
+ return generateResponse.success(data);
186
+ }
187
+ case TaskStatusAction.CLAIM: {
188
+ const { nodeId } = params;
189
+ const data = await claimTaskById({ taskId: id, nodeId, updateExtraFn });
190
+ logTaskTransition(logger, action, data);
191
+ return generateResponse.success(data);
192
+ }
193
+ case TaskStatusAction.RESET: {
194
+ const { nodeId } = params;
195
+ const data = await transitionTask({
196
+ id,
197
+ optimisticLockFilterList: lockOnReset(nodeId),
198
+ updateFn: (details) => ({
199
+ ...details,
200
+ ...clearExecutionState(),
201
+ status: TaskStatus.OPEN,
202
+ }),
203
+ updateExtraFn,
204
+ });
205
+ logTaskTransition(logger, action, data, nodeId != null ? undefined : { resetFrom: "TODO" });
206
+ return generateResponse.success(data);
207
+ }
208
+ case TaskStatusAction.CANCEL: {
209
+ const { nodeId } = params;
210
+ const data = await transitionTask({
211
+ id,
212
+ optimisticLockFilterList: lockOnDoingOwner(nodeId),
213
+ updateFn: (details) => ({
214
+ ...details,
215
+ ...clearExecutionState(),
216
+ status: TaskStatus.TODO,
217
+ }),
218
+ updateExtraFn,
219
+ });
220
+ logTaskTransition(logger, action, data);
221
+ return generateResponse.success(data);
222
+ }
223
+ case TaskStatusAction.CLOSE: {
224
+ const data = await transitionTask({
225
+ id,
226
+ optimisticLockFilterList: lockOnStatus(TaskStatus.OPEN, TaskStatus.DONE),
227
+ updateFn: (details) => ({
228
+ ...details,
229
+ status: TaskStatus.CLOSED,
230
+ }),
231
+ updateExtraFn,
232
+ });
233
+ logTaskTransition(logger, action, data);
234
+ return generateResponse.success(data);
235
+ }
236
+ case TaskStatusAction.FINISH: {
237
+ const { cost, nodeId } = params;
238
+ const data = await transitionTask({
239
+ id,
240
+ optimisticLockFilterList: lockOnDoingOwner(nodeId),
241
+ updateFn: (details) => ({
242
+ ...details,
243
+ progress: 100,
244
+ status: TaskStatus.DONE,
245
+ nodeId,
246
+ result: {
247
+ cost,
248
+ code: ResultCode.SUCCESS,
249
+ },
250
+ }),
251
+ updateExtraFn,
252
+ });
253
+ logTaskTransition(logger, action, data, { cost });
254
+ return generateResponse.success(data);
255
+ }
256
+ default: {
257
+ const _exhaustive = action;
258
+ throw new Error(`[patchChangeTaskStatus] Unknown action: ${_exhaustive}`);
259
+ }
260
+ }
261
+ });
262
+ // ─── patchTaskProgress ───────────────────────────────────────────────────────
263
+ /** Update progress on a DOING task; only the owning node may write (see `lockOnDoingOwner`). */
264
+ export const patchTaskProgress = validateWithSchema(patchTaskProgressSchema, "patchTaskProgressSchema")(async ({ id, progress, nodeId, traceId }) => {
265
+ const logger = createApiLogger("patchTaskProgress", { traceId, nodeId });
266
+ const data = await transitionTask({
267
+ id,
268
+ optimisticLockFilterList: lockOnDoingOwner(nodeId),
269
+ updateFn: (details) => ({
270
+ ...details,
271
+ progress,
272
+ }),
273
+ });
274
+ logTaskTransition(logger, "patchTaskProgress", data, { progress });
275
+ return generateResponse.success(data);
276
+ });
277
+ // ─── patchClaimTask ──────────────────────────────────────────────────────────
278
+ /**
279
+ * Discover and claim one TODO task for this node.
280
+ *
281
+ * Flow: filter by `availableTaskList` → {@link claimTaskById} (same as `action: CLAIM`).
282
+ * Equivalent to `patchChangeTaskStatus({ id, action: CLAIM, nodeId })` when `id` is already known.
283
+ *
284
+ * Returns `data: null` when no TODO task matches.
285
+ * Optimistic lock conflicts return `{ error }` with `code: "OPTIMISTIC_LOCK"` (not thrown).
286
+ */
287
+ export const patchClaimTask = validateWithSchema(patchClaimTaskSchema, "patchClaimTaskSchema")(async ({ nodeId, availableTaskList, traceId }) => {
288
+ const logger = createApiLogger("patchClaimTask", { traceId, nodeId });
289
+ try {
290
+ const { data: possibleTask } = await getPossibleTarget({
291
+ filterList: [
292
+ { field: "category", operator: "eq", value: CategoryTask.TASK },
293
+ { field: TASK_STATUS_FIELD, operator: "eq", value: TaskStatus.TODO },
294
+ { field: "value", operator: "in", value: availableTaskList },
295
+ ],
296
+ });
297
+ if (possibleTask == null) {
298
+ return generateResponse.success(null);
299
+ }
300
+ const todoTask = possibleTask;
301
+ const data = await claimTaskById({ taskId: todoTask.id, nodeId });
302
+ logTaskTransition(logger, "patchClaimTask", data);
303
+ return generateResponse.success(data);
304
+ }
305
+ catch (error) {
306
+ if (isOptimisticLockError(error)) {
307
+ logger.debug("認領競爭失敗,本輪無可認領任務", { topic: "task" });
308
+ return generateResponse.error(OPTIMISTIC_LOCK_FAILED_MESSAGE, undefined, "OPTIMISTIC_LOCK");
309
+ }
310
+ const message = error instanceof Error ? error.message : String(error);
311
+ logger.error("認領任務失敗", { topic: "task", context: { error: message } });
312
+ return generateResponse.error(message);
313
+ }
314
+ });
315
+ // ─── postTask ────────────────────────────────────────────────────────────────
316
+ /**
317
+ * Create a task row (scheduler / admin).
318
+ *
319
+ * `taskStatus` defaults to **TODO** (worker-claimable). Pass **OPEN** for draft tasks
320
+ * that require {@link patchChangeTaskStatus} `publish` before workers can claim.
321
+ */
322
+ export const postTask = validateWithSchema(postTaskSchema, "postTaskSchema")(async ({ name, value, params, taskStatus, tagList, extra, traceId }) => {
323
+ const logger = createApiLogger("postTask", { traceId });
324
+ const result = await createTarget({
325
+ payload: { name, value, params, taskStatus, tagList, extra, traceId },
326
+ createFn: () => ({
327
+ name,
328
+ value,
329
+ category: CategoryTask.TASK,
330
+ tagList,
331
+ extra,
332
+ details: {
333
+ manifestVersion: 0,
334
+ status: taskStatus,
335
+ params,
336
+ progress: 0,
337
+ nodeId: null,
338
+ },
339
+ }),
340
+ });
341
+ logger.info("任務已創建", {
342
+ topic: "task",
343
+ context: {
344
+ taskId: result.data?.id,
345
+ taskTypeKey: value,
346
+ status: taskStatus,
347
+ },
348
+ });
349
+ return result;
350
+ });
351
+ //# sourceMappingURL=task.api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.api.js","sourceRoot":"","sources":["../../src/task/task.api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { Target } from "../core.interface";
2
+ export declare enum CategoryTask {
3
+ TASK = "task"
4
+ }
5
+ export declare enum TaskStatus {
6
+ OPEN = "OPEN",
7
+ TODO = "TODO",
8
+ DOING = "DOING",
9
+ DONE = "DONE",
10
+ CLOSED = "CLOSED"
11
+ }
12
+ /** Named transitions for {@link patchChangeTaskStatus} — verb aligned with state machine edges */
13
+ export declare enum TaskStatusAction {
14
+ PUBLISH = "publish",
15
+ CLAIM = "claim",
16
+ RESET = "reset",
17
+ CANCEL = "cancel",
18
+ CLOSE = "close",
19
+ FINISH = "finish"
20
+ }
21
+ export declare enum ResultCode {
22
+ SUCCESS = 1000,
23
+ /** 3xxx 依赖 / 外部 */
24
+ PARAMS_NOT_VALID = 3001,
25
+ REPO_NOT_VALID = 3002,
26
+ /** 4xxx — 运行环境 */
27
+ TIMEOUT = 4001,
28
+ CANCELLED = 4002,
29
+ NODE_UNAVAILABLE = 4003,
30
+ UNKNOWN_ERROR = 9999
31
+ }
32
+ export interface Task extends Target {
33
+ /** Readable */
34
+ name: string;
35
+ /** Unique key, as TaskType */
36
+ value: string;
37
+ details: TaskDetails;
38
+ category: CategoryTask;
39
+ }
40
+ export interface TaskDetails {
41
+ manifestVersion: number;
42
+ status: TaskStatus;
43
+ params: unknown;
44
+ /** [0,100] */
45
+ progress: number;
46
+ nodeId: null | string;
47
+ result?: {
48
+ cost: number;
49
+ code: ResultCode;
50
+ errorMessage?: string;
51
+ data?: unknown;
52
+ };
53
+ }
54
+ export interface TaskFlow extends Target {
55
+ }
56
+ //# sourceMappingURL=task.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.interface.d.ts","sourceRoot":"","sources":["../../src/task/task.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,oBAAY,YAAY;IACpB,IAAI,SAAS;CAChB;AAED,oBAAY,UAAU;IAClB,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;IACf,IAAI,SAAS;IACb,MAAM,WAAW;CACpB;AAED,kGAAkG;AAClG,oBAAY,gBAAgB;IACxB,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,MAAM,WAAW;CACpB;AAED,oBAAY,UAAU;IAClB,OAAO,OAAO;IAEd,mBAAmB;IACnB,gBAAgB,OAAO;IACvB,cAAc,OAAO;IAErB,kBAAkB;IAClB,OAAO,OAAO;IACd,SAAS,OAAO;IAChB,gBAAgB,OAAO;IAEvB,aAAa,OAAO;CACvB;AAED,MAAM,WAAW,IAAK,SAAQ,MAAM;IAChC,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,YAAY,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,UAAU,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,OAAO,CAAC;KAClB,CAAA;CACJ;AAGD,MAAM,WAAW,QAAS,SAAQ,MAAM;CAEvC"}
@@ -0,0 +1,36 @@
1
+ export var CategoryTask;
2
+ (function (CategoryTask) {
3
+ CategoryTask["TASK"] = "task";
4
+ })(CategoryTask || (CategoryTask = {}));
5
+ export var TaskStatus;
6
+ (function (TaskStatus) {
7
+ TaskStatus["OPEN"] = "OPEN";
8
+ TaskStatus["TODO"] = "TODO";
9
+ TaskStatus["DOING"] = "DOING";
10
+ TaskStatus["DONE"] = "DONE";
11
+ TaskStatus["CLOSED"] = "CLOSED";
12
+ })(TaskStatus || (TaskStatus = {}));
13
+ /** Named transitions for {@link patchChangeTaskStatus} — verb aligned with state machine edges */
14
+ export var TaskStatusAction;
15
+ (function (TaskStatusAction) {
16
+ TaskStatusAction["PUBLISH"] = "publish";
17
+ TaskStatusAction["CLAIM"] = "claim";
18
+ TaskStatusAction["RESET"] = "reset";
19
+ TaskStatusAction["CANCEL"] = "cancel";
20
+ TaskStatusAction["CLOSE"] = "close";
21
+ TaskStatusAction["FINISH"] = "finish";
22
+ })(TaskStatusAction || (TaskStatusAction = {}));
23
+ export var ResultCode;
24
+ (function (ResultCode) {
25
+ ResultCode[ResultCode["SUCCESS"] = 1000] = "SUCCESS";
26
+ /** 3xxx 依赖 / 外部 */
27
+ ResultCode[ResultCode["PARAMS_NOT_VALID"] = 3001] = "PARAMS_NOT_VALID";
28
+ ResultCode[ResultCode["REPO_NOT_VALID"] = 3002] = "REPO_NOT_VALID";
29
+ /** 4xxx — 运行环境 */
30
+ ResultCode[ResultCode["TIMEOUT"] = 4001] = "TIMEOUT";
31
+ ResultCode[ResultCode["CANCELLED"] = 4002] = "CANCELLED";
32
+ ResultCode[ResultCode["NODE_UNAVAILABLE"] = 4003] = "NODE_UNAVAILABLE";
33
+ ResultCode[ResultCode["UNKNOWN_ERROR"] = 9999] = "UNKNOWN_ERROR";
34
+ })(ResultCode || (ResultCode = {}));
35
+ ;
36
+ //# sourceMappingURL=task.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.interface.js","sourceRoot":"","sources":["../../src/task/task.interface.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,YAEX;AAFD,WAAY,YAAY;IACpB,6BAAa,CAAA;AACjB,CAAC,EAFW,YAAY,KAAZ,YAAY,QAEvB;AAED,MAAM,CAAN,IAAY,UAMX;AAND,WAAY,UAAU;IAClB,2BAAa,CAAA;IACb,2BAAa,CAAA;IACb,6BAAe,CAAA;IACf,2BAAa,CAAA;IACb,+BAAiB,CAAA;AACrB,CAAC,EANW,UAAU,KAAV,UAAU,QAMrB;AAED,kGAAkG;AAClG,MAAM,CAAN,IAAY,gBAOX;AAPD,WAAY,gBAAgB;IACxB,uCAAmB,CAAA;IACnB,mCAAe,CAAA;IACf,mCAAe,CAAA;IACf,qCAAiB,CAAA;IACjB,mCAAe,CAAA;IACf,qCAAiB,CAAA;AACrB,CAAC,EAPW,gBAAgB,KAAhB,gBAAgB,QAO3B;AAED,MAAM,CAAN,IAAY,UAaX;AAbD,WAAY,UAAU;IAClB,oDAAc,CAAA;IAEd,mBAAmB;IACnB,sEAAuB,CAAA;IACvB,kEAAqB,CAAA;IAErB,kBAAkB;IAClB,oDAAc,CAAA;IACd,wDAAgB,CAAA;IAChB,sEAAuB,CAAA;IAEvB,gEAAoB,CAAA;AACxB,CAAC,EAbW,UAAU,KAAV,UAAU,QAarB;AAwBA,CAAC"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=task.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.utils.d.ts","sourceRoot":"","sources":["../../src/task/task.utils.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=task.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.utils.js","sourceRoot":"","sources":["../../src/task/task.utils.ts"],"names":[],"mappings":""}
@@ -1,15 +1,15 @@
1
1
  import { BaseValidator } from "../core.utils";
2
2
  import { Word, WordDetails } from "./word.interface";
3
- export interface PostWordCreatePayload {
3
+ export interface PostWordPayload {
4
4
  name: Word["name"];
5
5
  value: Word["value"];
6
6
  category: Word["category"];
7
7
  details: WordDetails;
8
8
  }
9
- export declare class PostWordValidator extends BaseValidator<PostWordCreatePayload> {
10
- protected requiredFields: (keyof PostWordCreatePayload)[];
11
- protected optionalFields: (keyof PostWordCreatePayload)[];
9
+ export declare class PostWordValidator extends BaseValidator<PostWordPayload> {
10
+ protected requiredFields: (keyof PostWordPayload)[];
11
+ protected optionalFields: (keyof PostWordPayload)[];
12
12
  constructor();
13
13
  }
14
- export declare const postWordCreate: (payload: PostWordCreatePayload) => Promise<import("..").SupabaseResponse<Word>>;
14
+ export declare const postWord: (payload: PostWordPayload) => Promise<import("..").SupabaseResponse<Word>>;
15
15
  //# sourceMappingURL=word.api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"word.api.d.ts","sourceRoot":"","sources":["../../src/word/word.api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3B,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,qBAAa,iBAAkB,SAAQ,aAAa,CAAC,qBAAqB,CAAC;IACzE,SAAS,CAAC,cAAc,EAAE,CAAC,MAAM,qBAAqB,CAAC,EAAE,CAA4C;IACrG,SAAS,CAAC,cAAc,EAAE,CAAC,MAAM,qBAAqB,CAAC,EAAE,CAAM;;CAShE;AAID,eAAO,MAAM,cAAc,YAAmB,qBAAqB,iDAgBlE,CAAC"}
1
+ {"version":3,"file":"word.api.d.ts","sourceRoot":"","sources":["../../src/word/word.api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3B,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,qBAAa,iBAAkB,SAAQ,aAAa,CAAC,eAAe,CAAC;IACnE,SAAS,CAAC,cAAc,EAAE,CAAC,MAAM,eAAe,CAAC,EAAE,CAA4C;IAC/F,SAAS,CAAC,cAAc,EAAE,CAAC,MAAM,eAAe,CAAC,EAAE,CAAM;;CAS1D;AAID,eAAO,MAAM,QAAQ,YAAmB,eAAe,iDAgBtD,CAAC"}
@@ -11,7 +11,7 @@ export class PostWordValidator extends BaseValidator {
11
11
  });
12
12
  }
13
13
  }
14
- export const postWordCreate = async (payload) => {
14
+ export const postWord = async (payload) => {
15
15
  return createTarget({
16
16
  payload: payload,
17
17
  validator: PostWordValidator,
@@ -1 +1 @@
1
- {"version":3,"file":"word.api.js","sourceRoot":"","sources":["../../src/word/word.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAU9C,MAAM,OAAO,iBAAkB,SAAQ,aAAoC;IAC/D,cAAc,GAAoC,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC3F,cAAc,GAAoC,EAAE,CAAC;IAE/D;QACE,KAAK,EAAE,CAAC;QACR,aAAa;QACb,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAID,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,OAA8B,EAAE,EAAE;IACrE,OAAO,YAAY,CAA8B;QAC/C,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,iBAAiB;QAC5B,QAAQ,EAAE,CAAC,YAAY,EAAE,EAAE;YACzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC;YAExD,OAAO;gBACL,IAAI;gBACJ,QAAQ;gBACR,KAAK;gBACL,OAAO,EAAE,EAAE;gBACX,OAAO;aACR,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"word.api.js","sourceRoot":"","sources":["../../src/word/word.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAU9C,MAAM,OAAO,iBAAkB,SAAQ,aAA8B;IACzD,cAAc,GAA8B,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IACrF,cAAc,GAA8B,EAAE,CAAC;IAEzD;QACE,KAAK,EAAE,CAAC;QACR,aAAa;QACb,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAID,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,OAAwB,EAAE,EAAE;IACzD,OAAO,YAAY,CAAwB;QACzC,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,iBAAiB;QAC5B,QAAQ,EAAE,CAAC,YAAY,EAAE,EAAE;YACzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC;YAExD,OAAO;gBACL,IAAI;gBACJ,QAAQ;gBACR,KAAK;gBACL,OAAO,EAAE,EAAE;gBACX,OAAO;aACR,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "target-supabase-sdk",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "Supabase client initializer and data access APIs",
5
5
  "license": "MIT",
6
6
  "author": "KyLoc20",
@@ -34,6 +34,10 @@
34
34
  "clean": "node --input-type=module -e \"import fs from 'node:fs'; fs.rmSync('dist', { recursive: true, force: true })\"",
35
35
  "build": "pnpm clean && tsc -p tsconfig.build.json",
36
36
  "typecheck": "tsc -p tsconfig.json --noEmit",
37
+ "typecheck:scripts": "tsc -p tsconfig.scripts.json",
38
+ "worker": "tsx scripts/run-node-worker.ts",
39
+ "post-task": "tsx scripts/post-task.ts",
40
+ "post-command": "tsx scripts/post-command.ts",
37
41
  "dev": "tsc -p tsconfig.build.json --watch",
38
42
  "pack:check": "npm pack --dry-run",
39
43
  "prepack": "pnpm build"
@@ -41,7 +45,8 @@
41
45
  "peerDependencies": {
42
46
  "@supabase/postgrest-js": "^1.19.0",
43
47
  "@supabase/supabase-js": "^2.50.0",
44
- "lodash-es": "^4.17.21"
48
+ "lodash-es": "^4.17.21",
49
+ "zod": "^3.23.0"
45
50
  },
46
51
  "devDependencies": {
47
52
  "@supabase/postgrest-js": "1.19.4",
@@ -49,7 +54,9 @@
49
54
  "@types/lodash-es": "^4.17.12",
50
55
  "@types/wicg-file-system-access": "^2023.10.7",
51
56
  "lodash-es": "^4.17.21",
52
- "typescript": "~5.7.2"
57
+ "typescript": "~5.7.2",
58
+ "tsx": "^4.19.4",
59
+ "zod": "^3.24.0"
53
60
  },
54
61
  "publishConfig": {
55
62
  "access": "public"
@@ -1,7 +1,9 @@
1
- import { supabase } from "..";
2
- import { createResponse } from "../core.interface";
1
+ import { SupabaseInitializer } from "../supabase";
2
+ import { generateResponse } from "../core.interface";
3
3
  import { handleSupabaseError } from "../core.utils";
4
4
 
5
+ const supabase = SupabaseInitializer.getInstance();
6
+
5
7
  export interface LoginPayload {
6
8
  email: string;
7
9
  password: string;
@@ -31,7 +33,7 @@ export const registerUser = async ({ email, password }: RegisterPayload) => {
31
33
  handleSupabaseError("registerUser", error, "Registration failed. Please try again.");
32
34
  }
33
35
 
34
- return createResponse.success(data);
36
+ return generateResponse.success(data);
35
37
  };
36
38
 
37
39
  // 用户登录
@@ -45,7 +47,7 @@ export const loginUser = async ({ email, password }: LoginPayload) => {
45
47
  handleSupabaseError("loginUser", error, "Login failed. Please check your credentials.");
46
48
  }
47
49
 
48
- return createResponse.success(data);
50
+ return generateResponse.success(data);
49
51
  };
50
52
 
51
53
  // 用户登出
@@ -56,7 +58,7 @@ export const logoutUser = async () => {
56
58
  handleSupabaseError("logoutUser", error, "Logout failed.");
57
59
  }
58
60
 
59
- return createResponse.success();
61
+ return generateResponse.success();
60
62
  };
61
63
 
62
64
  // 获取当前用户
@@ -70,7 +72,7 @@ export const getCurrentUser = async () => {
70
72
  handleSupabaseError("getCurrentUser", error, "Failed to get current user.");
71
73
  }
72
74
 
73
- return createResponse.success<User | null>(user as User | null);
75
+ return generateResponse.success<User | null>(user as User | null);
74
76
  };
75
77
 
76
78
  // 重置密码
@@ -81,5 +83,5 @@ export const resetPassword = async (email: string) => {
81
83
  handleSupabaseError("resetPassword", error, "Password reset request failed.");
82
84
  }
83
85
 
84
- return createResponse.success();
86
+ return generateResponse.success();
85
87
  };