target-supabase-sdk 0.3.0 → 0.3.2
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 +1 -1
- package/dist/browser.js +2 -2
- package/dist/chunks/{config-BNxsVKR4.js → config-t31awPWL.js} +46 -11
- package/dist/chunks/config-t31awPWL.js.map +1 -0
- package/dist/chunks/{enable-CF77OsXr.js → enable-BKsBzEqS.js} +2 -2
- package/dist/chunks/{enable-CF77OsXr.js.map → enable-BKsBzEqS.js.map} +1 -1
- package/dist/chunks/{task-queue-BL-KwAGW.js → task-queue-BpLJ8skY.js} +24 -19
- package/dist/chunks/task-queue-BpLJ8skY.js.map +1 -0
- package/dist/config/config.api.d.ts.map +1 -1
- package/dist/core.api.d.ts +32 -5
- package/dist/core.api.d.ts.map +1 -1
- package/dist/core.interface.d.ts +5 -0
- package/dist/core.interface.d.ts.map +1 -1
- package/dist/core.schema.d.ts +7 -0
- package/dist/core.schema.d.ts.map +1 -1
- package/dist/node/node.interface.d.ts +3 -1
- package/dist/node/node.interface.d.ts.map +1 -1
- package/dist/node.d.ts +0 -3
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +12 -186
- package/dist/node.js.map +1 -1
- package/dist/parcel/parcel.api.d.ts.map +1 -1
- package/dist/preload.js +2 -2
- package/dist/service/service.api.d.ts.map +1 -1
- package/dist/service/service.interface.d.ts +3 -1
- package/dist/service/service.interface.d.ts.map +1 -1
- package/dist/task/task.api.d.ts +1 -1
- package/dist/task/task.api.d.ts.map +1 -1
- package/dist/task/task.interface.d.ts +5 -2
- package/dist/task/task.interface.d.ts.map +1 -1
- package/dist/trigger/trigger-node.d.ts +1 -1
- package/dist/trigger/trigger.interface.d.ts +0 -42
- package/dist/trigger/trigger.interface.d.ts.map +1 -1
- package/package.json +1 -2
- package/src/core.api.ts +85 -12
- package/src/core.interface.ts +5 -0
- package/src/core.schema.ts +2 -0
- package/src/node/node.interface.ts +2 -0
- package/src/node.ts +0 -3
- package/src/service/service.interface.ts +2 -0
- package/src/task/task-node.ts +1 -1
- package/src/task/task-post.api.ts +1 -1
- package/src/task/task-queue.ts +2 -2
- package/src/task/task.api.ts +15 -13
- package/src/task/task.interface.ts +4 -1
- package/src/trigger/trigger-node.ts +1 -1
- package/src/trigger/trigger.interface.ts +0 -52
- package/dist/chunks/config-BNxsVKR4.js.map +0 -1
- package/dist/chunks/task-queue-BL-KwAGW.js.map +0 -1
- package/dist/trigger/trigger.api.d.ts +0 -145
- package/dist/trigger/trigger.api.d.ts.map +0 -1
- package/dist/trigger/trigger.utils.d.ts +0 -6
- package/dist/trigger/trigger.utils.d.ts.map +0 -1
- package/src/trigger/trigger.api.ts +0 -171
- package/src/trigger/trigger.utils.ts +0 -56
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parcel.api.d.ts","sourceRoot":"","sources":["../../src/parcel/parcel.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAkB,KAAK,MAAM,EAAsB,MAAM,oBAAoB,CAAC;AAqBrF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO9B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM3B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEjE,eAAO,MAAM,eAAe;;;;;;EAE1B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE/D,eAAO,MAAM,kBAAkB;;;;;;EAE7B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAQrE,yGAAyG;AACzG,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;4FAerB,CAAC;AAEH,gDAAgD;AAChD,eAAO,MAAM,SAAS;;;UAUO,MAAM;;;;;;
|
|
1
|
+
{"version":3,"file":"parcel.api.d.ts","sourceRoot":"","sources":["../../src/parcel/parcel.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAkB,KAAK,MAAM,EAAsB,MAAM,oBAAoB,CAAC;AAqBrF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO9B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM3B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEjE,eAAO,MAAM,eAAe;;;;;;EAE1B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE/D,eAAO,MAAM,kBAAkB;;;;;;EAE7B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAQrE,yGAAyG;AACzG,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;4FAerB,CAAC;AAEH,gDAAgD;AAChD,eAAO,MAAM,SAAS;;;UAUO,MAAM;;;;;;YA9Df,CAAC;;;UA8DQ,MAAM;;;;;;YA9Df,CAAC;;EAgEnB,CAAC;AAEH,yGAAyG;AACzG,eAAO,MAAM,YAAY;;8FAQvB,CAAC"}
|
package/dist/preload.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { resolve } from 'node:path';
|
|
2
|
-
import { w as logManager, H as resolveLogMinLevel } from './chunks/config-
|
|
3
|
-
import { r as resolveProjectRootByPackageName, p as pinEnvProfileFromArgv, l as loadEnvFiles, v as validateLogSpoolPreloadEnv, a as logSpoolEnabledFromEnv, m as mergeLogSpoolExtraProcessRolesEnv } from './chunks/enable-
|
|
2
|
+
import { w as logManager, H as resolveLogMinLevel } from './chunks/config-t31awPWL.js';
|
|
3
|
+
import { r as resolveProjectRootByPackageName, p as pinEnvProfileFromArgv, l as loadEnvFiles, v as validateLogSpoolPreloadEnv, a as logSpoolEnabledFromEnv, m as mergeLogSpoolExtraProcessRolesEnv } from './chunks/enable-BKsBzEqS.js';
|
|
4
4
|
import 'node:crypto';
|
|
5
5
|
import 'zod';
|
|
6
6
|
import 'lodash-es';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.api.d.ts","sourceRoot":"","sources":["../../src/service/service.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AACvG,OAAO,EACH,KAAK,GAAG,EAER,SAAS,EAGT,KAAK,OAAO,EAEf,MAAM,qBAAqB,CAAC;AAc7B,QAAA,MAAM,sBAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAyCvD,CAAC;AAEF,QAAA,MAAM,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAGrD,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,CAAC;AAEzD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;EAKjC,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY3B,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EAIpC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG/B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM/B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMxB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAE3D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;EAYpB,CAAC;AAEN,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAEzD,eAAO,MAAM,gBAAgB;;;IAIrB,kEAAkE;;;;;;;;;;;;;;;;;;EAUrE,CAAC;AAEN,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEjE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM5B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAoCnE,qDAAqD;AACrD,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;sFAelB,CAAC;AAEH,uEAAuE;AACvE,eAAO,MAAM,MAAM;;;;UAWc,GAAG;;;;;;
|
|
1
|
+
{"version":3,"file":"service.api.d.ts","sourceRoot":"","sources":["../../src/service/service.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AACvG,OAAO,EACH,KAAK,GAAG,EAER,SAAS,EAGT,KAAK,OAAO,EAEf,MAAM,qBAAqB,CAAC;AAc7B,QAAA,MAAM,sBAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAyCvD,CAAC;AAEF,QAAA,MAAM,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAGrD,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,CAAC;AAEzD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;EAKjC,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY3B,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EAIpC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG/B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM/B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMxB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAE3D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;EAYpB,CAAC;AAEN,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAEzD,eAAO,MAAM,gBAAgB;;;IAIrB,kEAAkE;;;;;;;;;;;;;;;;;;EAUrE,CAAC;AAEN,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEjE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM5B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAoCnE,qDAAqD;AACrD,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;sFAelB,CAAC;AAEH,uEAAuE;AACvE,eAAO,MAAM,MAAM;;;;UAWc,GAAG;;;;;;YA3MV,CAAC;;;;;;;;;YAAD,CAAC;;;UA2MM,GAAG;;;;;;YA3MV,CAAC;;;;;;;;;YAAD,CAAC;;EA8NzB,CAAC;AAEH,kFAAkF;AAClF,eAAO,MAAM,UAAU;;;;;UAaU,OAAO;;;;;;YA9Od,CAAC;;;;;;;;;YAAD,CAAC;;;UA8OM,OAAO;;;;;;YA9Od,CAAC;;;;;;;;;YAAD,CAAC;;EAiQzB,CAAC;AAEH,2DAA2D;AAC3D,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;8FAetB,CAAC"}
|
|
@@ -13,7 +13,9 @@ export interface Service extends Target {
|
|
|
13
13
|
details: ServiceDetails;
|
|
14
14
|
}
|
|
15
15
|
export declare enum CategoryService {
|
|
16
|
-
SERVICE = "service"
|
|
16
|
+
SERVICE = "service",
|
|
17
|
+
/** Cold storage — excluded from registry resolution and active service scans. */
|
|
18
|
+
SERVICE_ARCHIVED = "service.archived"
|
|
17
19
|
}
|
|
18
20
|
export interface ServiceDetails {
|
|
19
21
|
manifestVersion: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.interface.d.ts","sourceRoot":"","sources":["../../src/service/service.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE1E,MAAM,WAAW,OAAQ,SAAQ,MAAM;IACnC,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,cAAc,CAAC;CAC3B;AAED,oBAAY,eAAe;IACvB,OAAO,YAAY;
|
|
1
|
+
{"version":3,"file":"service.interface.d.ts","sourceRoot":"","sources":["../../src/service/service.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE1E,MAAM,WAAW,OAAQ,SAAQ,MAAM;IACnC,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,cAAc,CAAC;CAC3B;AAED,oBAAY,eAAe;IACvB,OAAO,YAAY;IACnB,iFAAiF;IACjF,gBAAgB,qBAAqB;CACxC;AAED,MAAM,WAAW,cAAc;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yBAAyB;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,qFAAqF;IACrF,OAAO,CAAC,EAAE,cAAc,CAAC;CAC5B;AAED,8FAA8F;AAC9F,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,GAAI,SAAQ,MAAM;IAC/B,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,WAAW,CAAC;IACtB,OAAO,EAAE,UAAU,CAAC;CACvB;AAED,oBAAY,WAAW;IACnB,GAAG,QAAQ;CACd;AAED,oBAAY,SAAS;IACjB,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,MAAM,WAAW;CACpB;AAED,MAAM,WAAW,UAAU;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE;QACL,KAAK,EAAE,eAAe,EAAE,CAAC;KAC5B,CAAC;IACF,QAAQ,EAAE;QACN,KAAK,EAAE,eAAe,EAAE,CAAC;KAC5B,CAAC;IACF,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,gBAAgB,CAAC;CAG/B"}
|
package/dist/task/task.api.d.ts
CHANGED
|
@@ -193,7 +193,7 @@ export declare const patchTaskProgress: (payload: {
|
|
|
193
193
|
/**
|
|
194
194
|
* Discover and claim one TODO task for this node.
|
|
195
195
|
*
|
|
196
|
-
* Match criteria (all required): `
|
|
196
|
+
* Match criteria (all required): `status = TODO`, `value ∈ availableTaskList`, and when
|
|
197
197
|
* `namePrefixList` is non-empty, `name` matches any listed prefix. Those filters are independent
|
|
198
198
|
* (AND); omitting `namePrefixList` does not relax the `value` constraint.
|
|
199
199
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.api.d.ts","sourceRoot":"","sources":["../../src/task/task.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAM5E,OAAO,EAA4B,KAAK,IAAI,EAAgC,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AA0DvH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA2BtC,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEvF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;EAKlC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE/E,eAAO,MAAM,oBAAoB;;IAE7B,0DAA0D;;;IAG1D;;;OAGG;;;;;;;;;;;;EAEL,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"task.api.d.ts","sourceRoot":"","sources":["../../src/task/task.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAM5E,OAAO,EAA4B,KAAK,IAAI,EAAgC,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AA0DvH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA2BtC,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEvF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;EAKlC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE/E,eAAO,MAAM,oBAAoB;;IAE7B,0DAA0D;;;IAG1D;;;OAGG;;;;;;;;;;;;EAEL,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AA8GzE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oEAiGhC,CAAC;AAIH,gGAAgG;AAChG,eAAO,MAAM,iBAAiB;;;;;8DAe5B,CAAC;AAIH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc;;;;;4EAkFzB,CAAC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { Target } from "../core.interface";
|
|
2
2
|
export declare enum CategoryTask {
|
|
3
|
-
TASK = "task"
|
|
3
|
+
TASK = "task",
|
|
4
|
+
/** Cold storage — excluded from worker claim and `category=task` scans. See task-archive skill. */
|
|
5
|
+
TASK_ARCHIVED = "task.archived"
|
|
4
6
|
}
|
|
5
7
|
export declare enum TaskStatus {
|
|
6
8
|
OPEN = "OPEN",
|
|
@@ -34,12 +36,13 @@ export interface Task extends Target {
|
|
|
34
36
|
name: string;
|
|
35
37
|
/** Unique key, as TaskType */
|
|
36
38
|
value: string;
|
|
39
|
+
/** Task lifecycle — persisted in `target.status` (not in `details`). */
|
|
40
|
+
status: TaskStatus;
|
|
37
41
|
details: TaskDetails;
|
|
38
42
|
category: CategoryTask;
|
|
39
43
|
}
|
|
40
44
|
export interface TaskDetails {
|
|
41
45
|
manifestVersion: number;
|
|
42
|
-
status: TaskStatus;
|
|
43
46
|
params: unknown;
|
|
44
47
|
/** [0,100] */
|
|
45
48
|
progress: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.interface.d.ts","sourceRoot":"","sources":["../../src/task/task.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,oBAAY,YAAY;IACpB,IAAI,SAAS;
|
|
1
|
+
{"version":3,"file":"task.interface.d.ts","sourceRoot":"","sources":["../../src/task/task.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,oBAAY,YAAY;IACpB,IAAI,SAAS;IACb,mGAAmG;IACnG,aAAa,kBAAkB;CAClC;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,wEAAwE;IACxE,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,YAAY,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC;IACtB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,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,CAAC;CACL;AAGD,MAAM,WAAW,QAAS,SAAQ,MAAM;CAAG"}
|
|
@@ -7,7 +7,7 @@ import type { TriggerNodeOptions } from "./trigger.interface";
|
|
|
7
7
|
* Main loop: commands → heartbeat → {@link TriggerManager.tick}.
|
|
8
8
|
*
|
|
9
9
|
* Register runners via {@link TriggerManager.registerRunner} before {@link start}.
|
|
10
|
-
*
|
|
10
|
+
* In-process interval runners only (no `category=trigger` Target rows).
|
|
11
11
|
*
|
|
12
12
|
* Deploy **one** TriggerNode per logical scheduler — multiple processes duplicate runner work.
|
|
13
13
|
*/
|
|
@@ -1,46 +1,4 @@
|
|
|
1
|
-
import type { Target } from "../core.interface";
|
|
2
1
|
import type { LoggerWithScope } from "../shared/log";
|
|
3
|
-
import type { TaskStatus } from "../task/task.interface";
|
|
4
|
-
export declare enum CategoryTrigger {
|
|
5
|
-
TRIGGER = "trigger"
|
|
6
|
-
}
|
|
7
|
-
export declare enum TriggerStatus {
|
|
8
|
-
ENABLED = "ENABLED",
|
|
9
|
-
DISABLED = "DISABLED",
|
|
10
|
-
PAUSED = "PAUSED"
|
|
11
|
-
}
|
|
12
|
-
/** Phase 1: daily fire at `hour`:`minute` UTC. */
|
|
13
|
-
export interface TriggerDailySchedule {
|
|
14
|
-
kind: "daily";
|
|
15
|
-
hour: number;
|
|
16
|
-
minute: number;
|
|
17
|
-
}
|
|
18
|
-
export type TriggerSchedule = TriggerDailySchedule;
|
|
19
|
-
export interface TriggerPostTaskAction {
|
|
20
|
-
kind: "post_task";
|
|
21
|
-
taskTypeKey: string;
|
|
22
|
-
taskParams: unknown;
|
|
23
|
-
taskName?: string;
|
|
24
|
-
taskStatus?: TaskStatus.OPEN | TaskStatus.TODO;
|
|
25
|
-
}
|
|
26
|
-
export type TriggerAction = TriggerPostTaskAction;
|
|
27
|
-
export interface Trigger extends Target {
|
|
28
|
-
/** Human readable */
|
|
29
|
-
name: string;
|
|
30
|
-
/** Unique trigger key */
|
|
31
|
-
value: string;
|
|
32
|
-
details: TriggerDetails;
|
|
33
|
-
category: CategoryTrigger;
|
|
34
|
-
}
|
|
35
|
-
export interface TriggerDetails {
|
|
36
|
-
manifestVersion: number;
|
|
37
|
-
status: TriggerStatus;
|
|
38
|
-
schedule: TriggerSchedule;
|
|
39
|
-
action: TriggerAction;
|
|
40
|
-
lastFiredAt?: number | null;
|
|
41
|
-
/** Idempotency key for the last successful fire, e.g. `daily:2026-06-18` (UTC date). */
|
|
42
|
-
lastFireKey?: string | null;
|
|
43
|
-
}
|
|
44
2
|
/** Context passed to each runner invocation. */
|
|
45
3
|
export interface TriggerRunnerContext {
|
|
46
4
|
loopTraceId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger.interface.d.ts","sourceRoot":"","sources":["../../src/trigger/trigger.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"trigger.interface.d.ts","sourceRoot":"","sources":["../../src/trigger/trigger.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,gDAAgD;AAChD,MAAM,WAAW,oBAAoB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,CAAC;IACxB,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,oBAAoB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAElF,MAAM,WAAW,4BAA4B;IACzC,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,eAAe,CAAC;IACpB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IAC/B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "target-supabase-sdk",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "Supabase client initializer and data access APIs",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "KyLoc20",
|
|
@@ -58,7 +58,6 @@
|
|
|
58
58
|
"prepare": "git config core.hooksPath .githooks",
|
|
59
59
|
"worker:trigger": "tsx scripts/run-trigger-node.ts",
|
|
60
60
|
"post-command": "tsx scripts/post-command.ts",
|
|
61
|
-
"post-trigger": "tsx scripts/post-trigger.ts",
|
|
62
61
|
"parcel:split": "tsx scripts/parcel-split-local.ts",
|
|
63
62
|
"parcel:restore": "tsx scripts/parcel-restore-local.ts",
|
|
64
63
|
"dev": "rollup -c --watch",
|
package/src/core.api.ts
CHANGED
|
@@ -20,7 +20,7 @@ export const MAX_TARGET_LIST_PAGE_SIZE = 100;
|
|
|
20
20
|
/** Alias for {@link pollTargetList} batch size cap. */
|
|
21
21
|
export const MAX_POLL_TARGET_LIST_SIZE = MAX_TARGET_LIST_PAGE_SIZE;
|
|
22
22
|
|
|
23
|
-
const TARGET_LIST_ORDER_FIELDS = new Set<string>(["created_at", "name", "value", "category"]);
|
|
23
|
+
const TARGET_LIST_ORDER_FIELDS = new Set<string>(["created_at", "name", "value", "category", "status"]);
|
|
24
24
|
|
|
25
25
|
// biome-ignore lint/suspicious/noExplicitAny: PostgrestFilterBuilder is generic over schema
|
|
26
26
|
export type TargetFilterBuilder = PostgrestFilterBuilder<any, any, any[], "target", unknown>;
|
|
@@ -456,6 +456,8 @@ export interface UpdateTargetRowSnapshot<D> {
|
|
|
456
456
|
tagList: string[];
|
|
457
457
|
details: D;
|
|
458
458
|
extra?: string;
|
|
459
|
+
/** Present when the row has a top-level status; domain APIs narrow the type. */
|
|
460
|
+
status?: unknown;
|
|
459
461
|
}
|
|
460
462
|
|
|
461
463
|
/**
|
|
@@ -466,13 +468,15 @@ export type UpdateTargetPatch<D> = {
|
|
|
466
468
|
tagList?: string[];
|
|
467
469
|
details?: D;
|
|
468
470
|
extra?: string;
|
|
471
|
+
/** Set or clear top-level status (`null` writes SQL NULL). */
|
|
472
|
+
status?: unknown;
|
|
469
473
|
};
|
|
470
474
|
|
|
471
475
|
/**
|
|
472
|
-
* Read-modify-write mutable Target columns (`tagList` / `details` / `extra`
|
|
473
|
-
* DB-level optimistic locking. Does not write `name` / `value` / `category`.
|
|
476
|
+
* Read-modify-write mutable Target columns (`tagList` / `details` / `extra` / optional `status`)
|
|
477
|
+
* with optional DB-level optimistic locking. Does not write `name` / `value` / `category`.
|
|
474
478
|
*
|
|
475
|
-
* Prefer this when the update may touch `tagList` (and optionally `details`/`extra`) in one UPDATE.
|
|
479
|
+
* Prefer this when the update may touch `tagList` (and optionally `details`/`extra`/`status`) in one UPDATE.
|
|
476
480
|
* For details-only flows, {@link updateTargetDetails} remains the thinner API.
|
|
477
481
|
*/
|
|
478
482
|
export interface UpdateTargetParams<D> {
|
|
@@ -493,7 +497,7 @@ export interface UpdateTargetParams<D> {
|
|
|
493
497
|
export const updateTarget = async <T, D>({ id, updateFn, optimisticLockFilterList = [] }: UpdateTargetParams<D>) => {
|
|
494
498
|
const { data: currentData, error: fetchError } = await supabase.client
|
|
495
499
|
.from("target")
|
|
496
|
-
.select("tagList, details, extra")
|
|
500
|
+
.select("tagList, details, extra, status")
|
|
497
501
|
.eq("id", id)
|
|
498
502
|
.single();
|
|
499
503
|
|
|
@@ -510,6 +514,7 @@ export const updateTarget = async <T, D>({ id, updateFn, optimisticLockFilterLis
|
|
|
510
514
|
tagList: Array.isArray(currentData.tagList) ? (currentData.tagList as string[]) : [],
|
|
511
515
|
details: currentData.details as D,
|
|
512
516
|
extra: typeof currentData.extra === "string" ? currentData.extra : undefined,
|
|
517
|
+
status: currentData.status ?? undefined,
|
|
513
518
|
};
|
|
514
519
|
|
|
515
520
|
const patch = updateFn(existing);
|
|
@@ -517,6 +522,7 @@ export const updateTarget = async <T, D>({ id, updateFn, optimisticLockFilterLis
|
|
|
517
522
|
tagList?: string[];
|
|
518
523
|
details?: D;
|
|
519
524
|
extra?: string;
|
|
525
|
+
status?: unknown;
|
|
520
526
|
} = {};
|
|
521
527
|
|
|
522
528
|
if (patch.tagList !== undefined) {
|
|
@@ -528,6 +534,9 @@ export const updateTarget = async <T, D>({ id, updateFn, optimisticLockFilterLis
|
|
|
528
534
|
if (patch.extra !== undefined) {
|
|
529
535
|
updated.extra = patch.extra;
|
|
530
536
|
}
|
|
537
|
+
if (patch.status !== undefined) {
|
|
538
|
+
updated.status = patch.status;
|
|
539
|
+
}
|
|
531
540
|
|
|
532
541
|
if (Object.keys(updated).length === 0) {
|
|
533
542
|
throw new Error("[updateTarget] updateFn returned an empty patch");
|
|
@@ -566,6 +575,59 @@ export const updateTarget = async <T, D>({ id, updateFn, optimisticLockFilterLis
|
|
|
566
575
|
return data as T;
|
|
567
576
|
};
|
|
568
577
|
|
|
578
|
+
/**
|
|
579
|
+
* Update only `target.category` with optional DB-level optimistic locking on UPDATE.
|
|
580
|
+
*
|
|
581
|
+
* **Restricted use** — not a general-purpose API:
|
|
582
|
+
* - Task archival (`task` → `task.archived`) and similar cold-storage moves
|
|
583
|
+
* - One-off admin / migration tooling with explicit review
|
|
584
|
+
*
|
|
585
|
+
* Do **not** use for normal domain flows (use feature APIs + {@link updateTarget} / {@link updateTargetDetails}).
|
|
586
|
+
* Identity fields (`name`, `value`) are never writable here. Prefer locks that include the **expected
|
|
587
|
+
* current** `category` and any row predicate needed for atomicity (e.g. `details->>status`).
|
|
588
|
+
*/
|
|
589
|
+
export interface UpdateTargetCategoryParams {
|
|
590
|
+
id: string;
|
|
591
|
+
category: Target["category"];
|
|
592
|
+
optimisticLockFilterList?: QueryFilter[];
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
export const updateTargetCategory = async ({
|
|
596
|
+
id,
|
|
597
|
+
category,
|
|
598
|
+
optimisticLockFilterList = [],
|
|
599
|
+
}: UpdateTargetCategoryParams) => {
|
|
600
|
+
const updateQuery = applyQueryFilters(
|
|
601
|
+
supabase.client.from("target").update({ category }).eq("id", id),
|
|
602
|
+
optimisticLockFilterList,
|
|
603
|
+
);
|
|
604
|
+
|
|
605
|
+
const { data, error } = await updateQuery.select("id, category").maybeSingle();
|
|
606
|
+
|
|
607
|
+
if (error) {
|
|
608
|
+
handleSupabaseError("updateTargetCategory", error, "Failed to update target category.");
|
|
609
|
+
}
|
|
610
|
+
if (!data) {
|
|
611
|
+
if (optimisticLockFilterList.length === 0) {
|
|
612
|
+
throw new Error(UPDATE_TARGET_NOT_FOUND_MESSAGE);
|
|
613
|
+
}
|
|
614
|
+
const { data: stillThere, error: recheckError } = await supabase.client
|
|
615
|
+
.from("target")
|
|
616
|
+
.select("id")
|
|
617
|
+
.eq("id", id)
|
|
618
|
+
.maybeSingle();
|
|
619
|
+
if (recheckError) {
|
|
620
|
+
handleSupabaseError("updateTargetCategory", recheckError, "Failed to recheck target after lock miss.");
|
|
621
|
+
}
|
|
622
|
+
if (!stillThere) {
|
|
623
|
+
throw new Error(UPDATE_TARGET_NOT_FOUND_MESSAGE);
|
|
624
|
+
}
|
|
625
|
+
throw new Error(OPTIMISTIC_LOCK_FAILED_MESSAGE);
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
return generateResponse.success(data as Pick<Target, "id" | "category">);
|
|
629
|
+
};
|
|
630
|
+
|
|
569
631
|
/**
|
|
570
632
|
* Read-modify-write `target.details` with optional DB-level optimistic locking on UPDATE.
|
|
571
633
|
*
|
|
@@ -587,12 +649,18 @@ export interface UpdateTargetDetailsParams<D> {
|
|
|
587
649
|
* Optional `target.extra` derived from existing details (written together with details).
|
|
588
650
|
*/
|
|
589
651
|
updateExtraFn?: (existing: D) => string;
|
|
652
|
+
/**
|
|
653
|
+
* Optional top-level `status` patch in the same UPDATE as `details`.
|
|
654
|
+
* Return `undefined` to leave the column unchanged; `null` writes SQL NULL.
|
|
655
|
+
*/
|
|
656
|
+
updateStatusFn?: (snapshot: UpdateTargetRowSnapshot<D>) => unknown;
|
|
590
657
|
/**
|
|
591
658
|
* Optimistic lock conditions applied on UPDATE (not on the prior SELECT).
|
|
592
659
|
*
|
|
593
660
|
* Replaces the removed `beforeUpdateValidator`: validators ran in app code between read and
|
|
594
661
|
* write and could not prevent concurrent overwrites. These filters become part of the UPDATE
|
|
595
|
-
* WHERE clause (via `applyQueryFilters`), e.g. `{ field: "
|
|
662
|
+
* WHERE clause (via `applyQueryFilters`), e.g. `{ field: "status", operator: "eq", value: "TODO" }`
|
|
663
|
+
* (or legacy `{ field: "details->>status", … }` until domain migration completes).
|
|
596
664
|
*
|
|
597
665
|
* If no row matches after UPDATE:
|
|
598
666
|
* - empty locks → not-found (`UPDATE_TARGET_NOT_FOUND_MESSAGE`)
|
|
@@ -606,6 +674,7 @@ export const updateTargetDetails = async <T, D>({
|
|
|
606
674
|
id,
|
|
607
675
|
updateFn,
|
|
608
676
|
updateExtraFn,
|
|
677
|
+
updateStatusFn,
|
|
609
678
|
optimisticLockFilterList = [],
|
|
610
679
|
}: UpdateTargetDetailsParams<D>) => {
|
|
611
680
|
return updateTarget<T, D>({
|
|
@@ -613,13 +682,17 @@ export const updateTargetDetails = async <T, D>({
|
|
|
613
682
|
optimisticLockFilterList,
|
|
614
683
|
updateFn: (existing) => {
|
|
615
684
|
const nextDetails = updateFn(existing.details);
|
|
616
|
-
|
|
617
|
-
|
|
685
|
+
const patch: UpdateTargetPatch<D> = { details: nextDetails };
|
|
686
|
+
if (updateExtraFn != null) {
|
|
687
|
+
patch.extra = updateExtraFn(existing.details);
|
|
688
|
+
}
|
|
689
|
+
if (updateStatusFn != null) {
|
|
690
|
+
const nextStatus = updateStatusFn(existing);
|
|
691
|
+
if (nextStatus !== undefined) {
|
|
692
|
+
patch.status = nextStatus;
|
|
693
|
+
}
|
|
618
694
|
}
|
|
619
|
-
return
|
|
620
|
-
details: nextDetails,
|
|
621
|
-
extra: updateExtraFn(existing.details),
|
|
622
|
-
};
|
|
695
|
+
return patch;
|
|
623
696
|
},
|
|
624
697
|
});
|
|
625
698
|
};
|
package/src/core.interface.ts
CHANGED
|
@@ -9,6 +9,11 @@ export interface Target {
|
|
|
9
9
|
extra?: string;
|
|
10
10
|
details?: unknown;
|
|
11
11
|
created_at: string;
|
|
12
|
+
/**
|
|
13
|
+
* Optional row lifecycle — semantics and TypeScript narrowing are defined per domain
|
|
14
|
+
* (e.g. task / node ). Omitted or null for targets that do not use status.
|
|
15
|
+
*/
|
|
16
|
+
status?: unknown;
|
|
12
17
|
}
|
|
13
18
|
|
|
14
19
|
/** Target row before persistence — no `id` or `created_at`. */
|
package/src/core.schema.ts
CHANGED
|
@@ -24,6 +24,8 @@ export const postTargetPayloadSchema = z.object({
|
|
|
24
24
|
tagList: z.array(z.string()),
|
|
25
25
|
extra: z.string().optional(),
|
|
26
26
|
details: z.unknown().optional(),
|
|
27
|
+
/** Optional; domain-specific. Omit on create when unused (DB NULL). */
|
|
28
|
+
status: z.unknown().optional(),
|
|
27
29
|
});
|
|
28
30
|
|
|
29
31
|
export type PostTargetPayload = z.infer<typeof postTargetPayloadSchema>;
|
package/src/node.ts
CHANGED
|
@@ -282,7 +282,6 @@ export {
|
|
|
282
282
|
TaskRepoValidation,
|
|
283
283
|
validateTaskRepoAndParams,
|
|
284
284
|
} from "./task/task-repo-validation";
|
|
285
|
-
export * from "./trigger/trigger.api";
|
|
286
285
|
export {
|
|
287
286
|
LOG_TOPIC_TRIGGER,
|
|
288
287
|
TRIGGER_LOOP_INTERVAL_MS,
|
|
@@ -295,7 +294,5 @@ export type {
|
|
|
295
294
|
TriggerRunnerContext,
|
|
296
295
|
TriggerRunnerFn,
|
|
297
296
|
} from "./trigger/trigger.interface";
|
|
298
|
-
export * from "./trigger/trigger.interface";
|
|
299
|
-
export { buildDailyFireKey, buildFireKey, isDailyScheduleDue, isTriggerDue } from "./trigger/trigger.utils";
|
|
300
297
|
export { TriggerManager } from "./trigger/trigger-manager";
|
|
301
298
|
export { TriggerNode } from "./trigger/trigger-node";
|
|
@@ -16,6 +16,8 @@ export interface Service extends Target {
|
|
|
16
16
|
|
|
17
17
|
export enum CategoryService {
|
|
18
18
|
SERVICE = "service",
|
|
19
|
+
/** Cold storage — excluded from registry resolution and active service scans. */
|
|
20
|
+
SERVICE_ARCHIVED = "service.archived",
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
export interface ServiceDetails {
|
package/src/task/task-node.ts
CHANGED
package/src/task/task-queue.ts
CHANGED
|
@@ -7,12 +7,12 @@ export function countTasksByType(tasks: Task[], taskType: string, statuses: Task
|
|
|
7
7
|
const filtered = tasks.filter((task) => task.value === taskType);
|
|
8
8
|
const counts: TaskStatusCount = {};
|
|
9
9
|
for (const status of statuses) {
|
|
10
|
-
counts[status] = filtered.filter((task) => task.
|
|
10
|
+
counts[status] = filtered.filter((task) => task.status === status).length;
|
|
11
11
|
}
|
|
12
12
|
return counts;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
/** Total tasks of `taskType` whose status is in `statuses`. */
|
|
16
16
|
export function summarizeTaskQueue(tasks: Task[], taskType: string, statuses: TaskStatus[]): number {
|
|
17
|
-
return tasks.filter((task) => task.value === taskType && statuses.includes(task.
|
|
17
|
+
return tasks.filter((task) => task.value === taskType && statuses.includes(task.status)).length;
|
|
18
18
|
}
|
package/src/task/task.api.ts
CHANGED
|
@@ -17,13 +17,13 @@ import { supabase } from "../supabase";
|
|
|
17
17
|
import { LOG_TOPIC_TASK } from "./task.constant";
|
|
18
18
|
import { CategoryTask, ResultCode, type Task, type TaskDetails, TaskStatus, TaskStatusAction } from "./task.interface";
|
|
19
19
|
|
|
20
|
-
const TASK_STATUS_FIELD = "
|
|
20
|
+
const TASK_STATUS_FIELD = "status" as const;
|
|
21
21
|
const TASK_NODE_ID_FIELD = "details->>nodeId" as const;
|
|
22
22
|
|
|
23
23
|
// ─── State machine ───────────────────────────────────────────────────────────
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
|
-
* Task state machine (field: `
|
|
26
|
+
* Task state machine (field: top-level `target.status`)
|
|
27
27
|
*
|
|
28
28
|
* ```text
|
|
29
29
|
* publish claim (CLAIM / patchClaimTask) finish
|
|
@@ -174,17 +174,21 @@ async function transitionTask({
|
|
|
174
174
|
optimisticLockFilterList,
|
|
175
175
|
updateFn,
|
|
176
176
|
updateExtraFn,
|
|
177
|
+
nextStatus,
|
|
177
178
|
}: {
|
|
178
179
|
id: string;
|
|
179
180
|
optimisticLockFilterList: QueryFilter[];
|
|
180
181
|
updateFn: (details: TaskDetails) => TaskDetails;
|
|
181
182
|
updateExtraFn?: (existing: TaskDetails) => string;
|
|
183
|
+
/** When set, writes `target.status` in the same UPDATE as `details`. */
|
|
184
|
+
nextStatus?: TaskStatus;
|
|
182
185
|
}): Promise<Task> {
|
|
183
186
|
return updateTargetDetails<Task, TaskDetails>({
|
|
184
187
|
id,
|
|
185
188
|
optimisticLockFilterList,
|
|
186
189
|
updateFn,
|
|
187
190
|
updateExtraFn,
|
|
191
|
+
updateStatusFn: nextStatus == null ? undefined : () => nextStatus,
|
|
188
192
|
});
|
|
189
193
|
}
|
|
190
194
|
|
|
@@ -200,7 +204,7 @@ function logTaskTransition(
|
|
|
200
204
|
action,
|
|
201
205
|
taskId: task.id,
|
|
202
206
|
taskValue: task.value,
|
|
203
|
-
status: task.
|
|
207
|
+
status: task.status,
|
|
204
208
|
nodeId: task.details.nodeId,
|
|
205
209
|
...data,
|
|
206
210
|
},
|
|
@@ -220,9 +224,9 @@ async function claimTaskById({
|
|
|
220
224
|
return transitionTask({
|
|
221
225
|
id: taskId,
|
|
222
226
|
optimisticLockFilterList: lockOnStatus(TaskStatus.TODO),
|
|
227
|
+
nextStatus: TaskStatus.DOING,
|
|
223
228
|
updateFn: (details) => ({
|
|
224
229
|
...details,
|
|
225
|
-
status: TaskStatus.DOING,
|
|
226
230
|
nodeId,
|
|
227
231
|
}),
|
|
228
232
|
updateExtraFn,
|
|
@@ -244,10 +248,10 @@ export const patchChangeTaskStatus = validateWithSchema(
|
|
|
244
248
|
const data = await transitionTask({
|
|
245
249
|
id,
|
|
246
250
|
optimisticLockFilterList: lockOnStatus(TaskStatus.OPEN),
|
|
251
|
+
nextStatus: TaskStatus.TODO,
|
|
247
252
|
updateFn: (details) => ({
|
|
248
253
|
...details,
|
|
249
254
|
...clearExecutionState(),
|
|
250
|
-
status: TaskStatus.TODO,
|
|
251
255
|
}),
|
|
252
256
|
updateExtraFn,
|
|
253
257
|
});
|
|
@@ -265,10 +269,10 @@ export const patchChangeTaskStatus = validateWithSchema(
|
|
|
265
269
|
const data = await transitionTask({
|
|
266
270
|
id,
|
|
267
271
|
optimisticLockFilterList: lockOnReset(nodeId),
|
|
272
|
+
nextStatus: TaskStatus.OPEN,
|
|
268
273
|
updateFn: (details) => ({
|
|
269
274
|
...details,
|
|
270
275
|
...clearExecutionState(),
|
|
271
|
-
status: TaskStatus.OPEN,
|
|
272
276
|
}),
|
|
273
277
|
updateExtraFn,
|
|
274
278
|
});
|
|
@@ -280,10 +284,10 @@ export const patchChangeTaskStatus = validateWithSchema(
|
|
|
280
284
|
const data = await transitionTask({
|
|
281
285
|
id,
|
|
282
286
|
optimisticLockFilterList: lockOnDoingOwner(nodeId),
|
|
287
|
+
nextStatus: TaskStatus.TODO,
|
|
283
288
|
updateFn: (details) => ({
|
|
284
289
|
...details,
|
|
285
290
|
...clearExecutionState(),
|
|
286
|
-
status: TaskStatus.TODO,
|
|
287
291
|
}),
|
|
288
292
|
updateExtraFn,
|
|
289
293
|
});
|
|
@@ -294,10 +298,8 @@ export const patchChangeTaskStatus = validateWithSchema(
|
|
|
294
298
|
const data = await transitionTask({
|
|
295
299
|
id,
|
|
296
300
|
optimisticLockFilterList: lockOnStatus(TaskStatus.OPEN, TaskStatus.DONE),
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
status: TaskStatus.CLOSED,
|
|
300
|
-
}),
|
|
301
|
+
nextStatus: TaskStatus.CLOSED,
|
|
302
|
+
updateFn: (details) => details,
|
|
301
303
|
updateExtraFn,
|
|
302
304
|
});
|
|
303
305
|
logTaskTransition(logger, action, data);
|
|
@@ -308,10 +310,10 @@ export const patchChangeTaskStatus = validateWithSchema(
|
|
|
308
310
|
const data = await transitionTask({
|
|
309
311
|
id,
|
|
310
312
|
optimisticLockFilterList: lockOnDoingOwner(nodeId),
|
|
313
|
+
nextStatus: TaskStatus.DONE,
|
|
311
314
|
updateFn: (details) => ({
|
|
312
315
|
...details,
|
|
313
316
|
progress: 100,
|
|
314
|
-
status: TaskStatus.DONE,
|
|
315
317
|
nodeId,
|
|
316
318
|
result: {
|
|
317
319
|
cost,
|
|
@@ -357,7 +359,7 @@ export const patchTaskProgress = validateWithSchema(
|
|
|
357
359
|
/**
|
|
358
360
|
* Discover and claim one TODO task for this node.
|
|
359
361
|
*
|
|
360
|
-
* Match criteria (all required): `
|
|
362
|
+
* Match criteria (all required): `status = TODO`, `value ∈ availableTaskList`, and when
|
|
361
363
|
* `namePrefixList` is non-empty, `name` matches any listed prefix. Those filters are independent
|
|
362
364
|
* (AND); omitting `namePrefixList` does not relax the `value` constraint.
|
|
363
365
|
*
|
|
@@ -2,6 +2,8 @@ import type { Target } from "../core.interface";
|
|
|
2
2
|
|
|
3
3
|
export enum CategoryTask {
|
|
4
4
|
TASK = "task",
|
|
5
|
+
/** Cold storage — excluded from worker claim and `category=task` scans. See task-archive skill. */
|
|
6
|
+
TASK_ARCHIVED = "task.archived",
|
|
5
7
|
}
|
|
6
8
|
|
|
7
9
|
export enum TaskStatus {
|
|
@@ -42,13 +44,14 @@ export interface Task extends Target {
|
|
|
42
44
|
name: string;
|
|
43
45
|
/** Unique key, as TaskType */
|
|
44
46
|
value: string;
|
|
47
|
+
/** Task lifecycle — persisted in `target.status` (not in `details`). */
|
|
48
|
+
status: TaskStatus;
|
|
45
49
|
details: TaskDetails;
|
|
46
50
|
category: CategoryTask;
|
|
47
51
|
}
|
|
48
52
|
|
|
49
53
|
export interface TaskDetails {
|
|
50
54
|
manifestVersion: number;
|
|
51
|
-
status: TaskStatus;
|
|
52
55
|
params: unknown;
|
|
53
56
|
/** [0,100] */
|
|
54
57
|
progress: number;
|
|
@@ -10,7 +10,7 @@ import { TriggerManager } from "./trigger-manager";
|
|
|
10
10
|
* Main loop: commands → heartbeat → {@link TriggerManager.tick}.
|
|
11
11
|
*
|
|
12
12
|
* Register runners via {@link TriggerManager.registerRunner} before {@link start}.
|
|
13
|
-
*
|
|
13
|
+
* In-process interval runners only (no `category=trigger` Target rows).
|
|
14
14
|
*
|
|
15
15
|
* Deploy **one** TriggerNode per logical scheduler — multiple processes duplicate runner work.
|
|
16
16
|
*/
|