@ekairos/tasks 1.22.83-beta.development.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 ADDED
@@ -0,0 +1,19 @@
1
+ # @ekairos/tasks
2
+
3
+ Durable tasks with typed outcomes.
4
+
5
+ `@ekairos/tasks` is intentionally small. It owns task `state` and typed outcomes. Approval
6
+ policies, approvers, assignments, notifications, and domain-specific links remain app/domain
7
+ concerns layered above it.
8
+
9
+ ```ts
10
+ const task = await Task.open(runtime, {
11
+ kind: "approval",
12
+ key: "requisition:approve:123",
13
+ outcome: approvalOutcomeSchema,
14
+ instructions: "Review this requisition before the step continues.",
15
+ context: { requisitionId: "123" },
16
+ })
17
+
18
+ const outcome = await task.outcome()
19
+ ```
@@ -0,0 +1,26 @@
1
+ import { type ServiceResult, type TaskAwaitOutcomeActionInput, type TaskCancelActionInput, type TaskDecideActionInput, type TaskFailActionInput, type TaskGetActionInput, type TaskOpenActionInput, type TaskRecord, type TasksRuntime } from "./service.js";
2
+ export declare function openTaskExecute({ runtime, input, }: {
3
+ runtime: TasksRuntime;
4
+ input: TaskOpenActionInput;
5
+ }): Promise<ServiceResult<TaskRecord>>;
6
+ export declare function decideTaskExecute({ runtime, input, }: {
7
+ runtime: TasksRuntime;
8
+ input: TaskDecideActionInput;
9
+ }): Promise<ServiceResult<TaskRecord>>;
10
+ export declare function cancelTaskExecute({ runtime, input, }: {
11
+ runtime: TasksRuntime;
12
+ input: TaskCancelActionInput;
13
+ }): Promise<ServiceResult<TaskRecord>>;
14
+ export declare function failTaskExecute({ runtime, input, }: {
15
+ runtime: TasksRuntime;
16
+ input: TaskFailActionInput;
17
+ }): Promise<ServiceResult<TaskRecord>>;
18
+ export declare function getTaskExecute({ runtime, input, }: {
19
+ runtime: TasksRuntime;
20
+ input: TaskGetActionInput;
21
+ }): Promise<ServiceResult<TaskRecord>>;
22
+ export declare function awaitOutcomeExecute({ runtime, input, }: {
23
+ runtime: TasksRuntime;
24
+ input: TaskAwaitOutcomeActionInput;
25
+ }): Promise<ServiceResult<unknown>>;
26
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,cAAc,CAAA;AAErB,wBAAsB,eAAe,CAAC,EACpC,OAAO,EACP,KAAK,GACN,EAAE;IACD,OAAO,EAAE,YAAY,CAAA;IACrB,KAAK,EAAE,mBAAmB,CAAA;CAC3B,GAAG,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAErC;AAED,wBAAsB,iBAAiB,CAAC,EACtC,OAAO,EACP,KAAK,GACN,EAAE;IACD,OAAO,EAAE,YAAY,CAAA;IACrB,KAAK,EAAE,qBAAqB,CAAA;CAC7B,GAAG,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAErC;AAED,wBAAsB,iBAAiB,CAAC,EACtC,OAAO,EACP,KAAK,GACN,EAAE;IACD,OAAO,EAAE,YAAY,CAAA;IACrB,KAAK,EAAE,qBAAqB,CAAA;CAC7B,GAAG,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAErC;AAED,wBAAsB,eAAe,CAAC,EACpC,OAAO,EACP,KAAK,GACN,EAAE;IACD,OAAO,EAAE,YAAY,CAAA;IACrB,KAAK,EAAE,mBAAmB,CAAA;CAC3B,GAAG,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAErC;AAED,wBAAsB,cAAc,CAAC,EACnC,OAAO,EACP,KAAK,GACN,EAAE;IACD,OAAO,EAAE,YAAY,CAAA;IACrB,KAAK,EAAE,kBAAkB,CAAA;CAC1B,GAAG,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAErC;AAED,wBAAsB,mBAAmB,CAAC,EACxC,OAAO,EACP,KAAK,GACN,EAAE;IACD,OAAO,EAAE,YAAY,CAAA;IACrB,KAAK,EAAE,2BAA2B,CAAA;CACnC,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAElC"}
@@ -0,0 +1,20 @@
1
+ import { TaskService, } from "./service.js";
2
+ export async function openTaskExecute({ runtime, input, }) {
3
+ return await new TaskService(runtime).openRaw(input);
4
+ }
5
+ export async function decideTaskExecute({ runtime, input, }) {
6
+ return await new TaskService(runtime).decide(input);
7
+ }
8
+ export async function cancelTaskExecute({ runtime, input, }) {
9
+ return await new TaskService(runtime).cancel(input);
10
+ }
11
+ export async function failTaskExecute({ runtime, input, }) {
12
+ return await new TaskService(runtime).fail(input);
13
+ }
14
+ export async function getTaskExecute({ runtime, input, }) {
15
+ return await new TaskService(runtime).getRaw(input);
16
+ }
17
+ export async function awaitOutcomeExecute({ runtime, input, }) {
18
+ return await new TaskService(runtime).awaitOutcome(input);
19
+ }
20
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,GAUZ,MAAM,cAAc,CAAA;AAErB,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,OAAO,EACP,KAAK,GAIN;IACC,OAAO,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EACtC,OAAO,EACP,KAAK,GAIN;IACC,OAAO,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EACtC,OAAO,EACP,KAAK,GAIN;IACC,OAAO,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,OAAO,EACP,KAAK,GAIN;IACC,OAAO,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EACnC,OAAO,EACP,KAAK,GAIN;IACC,OAAO,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EACxC,OAAO,EACP,KAAK,GAIN;IACC,OAAO,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;AAC3D,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ export declare const approvalOutcomeSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
3
+ outcome: z.ZodLiteral<"approved">;
4
+ approved: z.ZodLiteral<true>;
5
+ decidedBy: z.ZodOptional<z.ZodString>;
6
+ decidedAt: z.ZodOptional<z.ZodString>;
7
+ note: z.ZodOptional<z.ZodString>;
8
+ }, z.core.$strip>, z.ZodObject<{
9
+ outcome: z.ZodLiteral<"rejected">;
10
+ approved: z.ZodLiteral<false>;
11
+ decidedBy: z.ZodOptional<z.ZodString>;
12
+ decidedAt: z.ZodOptional<z.ZodString>;
13
+ reason: z.ZodString;
14
+ }, z.core.$strip>], "outcome">;
15
+ export type ApprovalOutcome = z.output<typeof approvalOutcomeSchema>;
16
+ export type ApprovalCommand = "approve" | "reject";
17
+ export declare function approvalOutcomeForCommand(command: ApprovalCommand): "approved" | "rejected";
18
+ export declare function createApprovalOutcome(outcome: ApprovalOutcome): {
19
+ outcome: "approved";
20
+ approved: true;
21
+ decidedBy?: string | undefined;
22
+ decidedAt?: string | undefined;
23
+ note?: string | undefined;
24
+ } | {
25
+ outcome: "rejected";
26
+ approved: false;
27
+ reason: string;
28
+ decidedBy?: string | undefined;
29
+ decidedAt?: string | undefined;
30
+ };
31
+ //# sourceMappingURL=approval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;8BAehC,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAA;AACpE,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,QAAQ,CAAA;AAElD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,eAAe,2BAEjE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe;;;;;;;;;;;;EAE7D"}
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ export const approvalOutcomeSchema = z.discriminatedUnion("outcome", [
3
+ z.object({
4
+ outcome: z.literal("approved"),
5
+ approved: z.literal(true),
6
+ decidedBy: z.string().optional(),
7
+ decidedAt: z.string().optional(),
8
+ note: z.string().optional(),
9
+ }),
10
+ z.object({
11
+ outcome: z.literal("rejected"),
12
+ approved: z.literal(false),
13
+ decidedBy: z.string().optional(),
14
+ decidedAt: z.string().optional(),
15
+ reason: z.string().min(1),
16
+ }),
17
+ ]);
18
+ export function approvalOutcomeForCommand(command) {
19
+ return command === "approve" ? "approved" : "rejected";
20
+ }
21
+ export function createApprovalOutcome(outcome) {
22
+ return approvalOutcomeSchema.parse(outcome);
23
+ }
24
+ //# sourceMappingURL=approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.js","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE;IACnE,CAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QAC9B,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACzB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC5B,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QAC9B,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QAC1B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC1B,CAAC;CACH,CAAC,CAAA;AAKF,MAAM,UAAU,yBAAyB,CAAC,OAAwB;IAChE,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAwB;IAC5D,OAAO,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AAC7C,CAAC"}
@@ -0,0 +1,218 @@
1
+ import { z } from "zod";
2
+ export declare const tasksSchemaDomain: import("@ekairos/domain").DomainSchemaResult<{
3
+ task_tasks: import("@instantdb/core").EntityDef<{
4
+ kind: import("@instantdb/core").DataAttrDef<string, true, true, false>;
5
+ key: import("@instantdb/core").DataAttrDef<string, true, true, true>;
6
+ state: import("@instantdb/core").DataAttrDef<string, true, true, false>;
7
+ instructions: import("@instantdb/core").DataAttrDef<string, false, false, false>;
8
+ context: import("@instantdb/core").DataAttrDef<any, false, false, false>;
9
+ outcomeKind: import("@instantdb/core").DataAttrDef<string, false, true, false>;
10
+ outcomeSchema: import("@instantdb/core").DataAttrDef<any, false, false, false>;
11
+ outcome: import("@instantdb/core").DataAttrDef<any, false, false, false>;
12
+ errorText: import("@instantdb/core").DataAttrDef<string, false, false, false>;
13
+ createdAt: import("@instantdb/core").DataAttrDef<Date, true, true, false>;
14
+ updatedAt: import("@instantdb/core").DataAttrDef<Date, true, true, false>;
15
+ resolvedAt: import("@instantdb/core").DataAttrDef<Date, false, true, false>;
16
+ }, {}, unknown>;
17
+ }, {}, import("@instantdb/core").RoomsDef, {}, "tasks", "tasks">;
18
+ export declare const tasksDomain: import("@ekairos/domain").DomainSchemaResult<{
19
+ task_tasks: import("@instantdb/core").EntityDef<{
20
+ kind: import("@instantdb/core").DataAttrDef<string, true, true, false>;
21
+ key: import("@instantdb/core").DataAttrDef<string, true, true, true>;
22
+ state: import("@instantdb/core").DataAttrDef<string, true, true, false>;
23
+ instructions: import("@instantdb/core").DataAttrDef<string, false, false, false>;
24
+ context: import("@instantdb/core").DataAttrDef<any, false, false, false>;
25
+ outcomeKind: import("@instantdb/core").DataAttrDef<string, false, true, false>;
26
+ outcomeSchema: import("@instantdb/core").DataAttrDef<any, false, false, false>;
27
+ outcome: import("@instantdb/core").DataAttrDef<any, false, false, false>;
28
+ errorText: import("@instantdb/core").DataAttrDef<string, false, false, false>;
29
+ createdAt: import("@instantdb/core").DataAttrDef<Date, true, true, false>;
30
+ updatedAt: import("@instantdb/core").DataAttrDef<Date, true, true, false>;
31
+ resolvedAt: import("@instantdb/core").DataAttrDef<Date, false, true, false>;
32
+ }, {}, unknown>;
33
+ }, {}, import("@instantdb/core").RoomsDef, {
34
+ openTask: import("@ekairos/domain").DomainActionRegistration<z.ZodObject<{
35
+ id: z.ZodOptional<z.ZodString>;
36
+ kind: z.ZodString;
37
+ key: z.ZodString;
38
+ instructions: z.ZodString;
39
+ context: z.ZodOptional<z.ZodUnknown>;
40
+ outcomeKind: z.ZodOptional<z.ZodString>;
41
+ outcomeSchema: z.ZodObject<{
42
+ type: z.ZodLiteral<"json-schema">;
43
+ schema: z.ZodUnknown;
44
+ }, z.core.$strip>;
45
+ }, z.core.$strip>, z.ZodDiscriminatedUnion<[z.ZodObject<{
46
+ ok: z.ZodLiteral<true>;
47
+ data: z.ZodObject<{
48
+ id: z.ZodString;
49
+ kind: z.ZodString;
50
+ key: z.ZodString;
51
+ state: z.ZodEnum<{
52
+ open: "open";
53
+ completed: "completed";
54
+ cancelled: "cancelled";
55
+ failed: "failed";
56
+ }>;
57
+ instructions: z.ZodString;
58
+ context: z.ZodUnknown;
59
+ outcomeKind: z.ZodOptional<z.ZodString>;
60
+ outcomeSchema: z.ZodOptional<z.ZodObject<{
61
+ type: z.ZodLiteral<"json-schema">;
62
+ schema: z.ZodUnknown;
63
+ }, z.core.$strip>>;
64
+ resolvedOutcome: z.ZodOptional<z.ZodUnknown>;
65
+ errorText: z.ZodOptional<z.ZodString>;
66
+ createdAt: z.ZodOptional<z.ZodUnknown>;
67
+ updatedAt: z.ZodOptional<z.ZodUnknown>;
68
+ resolvedAt: z.ZodOptional<z.ZodUnknown>;
69
+ }, z.core.$strip>;
70
+ }, z.core.$strip>, z.ZodObject<{
71
+ ok: z.ZodLiteral<false>;
72
+ error: z.ZodString;
73
+ issues: z.ZodOptional<z.ZodUnknown>;
74
+ }, z.core.$strip>], "ok">, import("./service.js").TasksRuntime, any>;
75
+ getTask: import("@ekairos/domain").DomainActionRegistration<z.ZodObject<{
76
+ id: z.ZodString;
77
+ }, z.core.$strip>, z.ZodDiscriminatedUnion<[z.ZodObject<{
78
+ ok: z.ZodLiteral<true>;
79
+ data: z.ZodObject<{
80
+ id: z.ZodString;
81
+ kind: z.ZodString;
82
+ key: z.ZodString;
83
+ state: z.ZodEnum<{
84
+ open: "open";
85
+ completed: "completed";
86
+ cancelled: "cancelled";
87
+ failed: "failed";
88
+ }>;
89
+ instructions: z.ZodString;
90
+ context: z.ZodUnknown;
91
+ outcomeKind: z.ZodOptional<z.ZodString>;
92
+ outcomeSchema: z.ZodOptional<z.ZodObject<{
93
+ type: z.ZodLiteral<"json-schema">;
94
+ schema: z.ZodUnknown;
95
+ }, z.core.$strip>>;
96
+ resolvedOutcome: z.ZodOptional<z.ZodUnknown>;
97
+ errorText: z.ZodOptional<z.ZodString>;
98
+ createdAt: z.ZodOptional<z.ZodUnknown>;
99
+ updatedAt: z.ZodOptional<z.ZodUnknown>;
100
+ resolvedAt: z.ZodOptional<z.ZodUnknown>;
101
+ }, z.core.$strip>;
102
+ }, z.core.$strip>, z.ZodObject<{
103
+ ok: z.ZodLiteral<false>;
104
+ error: z.ZodString;
105
+ issues: z.ZodOptional<z.ZodUnknown>;
106
+ }, z.core.$strip>], "ok">, import("./service.js").TasksRuntime, any>;
107
+ awaitOutcome: import("@ekairos/domain").DomainActionRegistration<z.ZodObject<{
108
+ id: z.ZodString;
109
+ }, z.core.$strip>, z.ZodDiscriminatedUnion<[z.ZodObject<{
110
+ ok: z.ZodLiteral<true>;
111
+ data: z.ZodUnknown;
112
+ }, z.core.$strip>, z.ZodObject<{
113
+ ok: z.ZodLiteral<false>;
114
+ error: z.ZodString;
115
+ issues: z.ZodOptional<z.ZodUnknown>;
116
+ }, z.core.$strip>], "ok">, import("./service.js").TasksRuntime, any>;
117
+ decideTask: import("@ekairos/domain").DomainActionRegistration<z.ZodObject<{
118
+ id: z.ZodString;
119
+ outcome: z.ZodUnknown;
120
+ resumeWorkflow: z.ZodOptional<z.ZodBoolean>;
121
+ }, z.core.$strip>, z.ZodDiscriminatedUnion<[z.ZodObject<{
122
+ ok: z.ZodLiteral<true>;
123
+ data: z.ZodObject<{
124
+ id: z.ZodString;
125
+ kind: z.ZodString;
126
+ key: z.ZodString;
127
+ state: z.ZodEnum<{
128
+ open: "open";
129
+ completed: "completed";
130
+ cancelled: "cancelled";
131
+ failed: "failed";
132
+ }>;
133
+ instructions: z.ZodString;
134
+ context: z.ZodUnknown;
135
+ outcomeKind: z.ZodOptional<z.ZodString>;
136
+ outcomeSchema: z.ZodOptional<z.ZodObject<{
137
+ type: z.ZodLiteral<"json-schema">;
138
+ schema: z.ZodUnknown;
139
+ }, z.core.$strip>>;
140
+ resolvedOutcome: z.ZodOptional<z.ZodUnknown>;
141
+ errorText: z.ZodOptional<z.ZodString>;
142
+ createdAt: z.ZodOptional<z.ZodUnknown>;
143
+ updatedAt: z.ZodOptional<z.ZodUnknown>;
144
+ resolvedAt: z.ZodOptional<z.ZodUnknown>;
145
+ }, z.core.$strip>;
146
+ }, z.core.$strip>, z.ZodObject<{
147
+ ok: z.ZodLiteral<false>;
148
+ error: z.ZodString;
149
+ issues: z.ZodOptional<z.ZodUnknown>;
150
+ }, z.core.$strip>], "ok">, import("./service.js").TasksRuntime, any>;
151
+ cancelTask: import("@ekairos/domain").DomainActionRegistration<z.ZodObject<{
152
+ id: z.ZodString;
153
+ reason: z.ZodOptional<z.ZodString>;
154
+ }, z.core.$strip>, z.ZodDiscriminatedUnion<[z.ZodObject<{
155
+ ok: z.ZodLiteral<true>;
156
+ data: z.ZodObject<{
157
+ id: z.ZodString;
158
+ kind: z.ZodString;
159
+ key: z.ZodString;
160
+ state: z.ZodEnum<{
161
+ open: "open";
162
+ completed: "completed";
163
+ cancelled: "cancelled";
164
+ failed: "failed";
165
+ }>;
166
+ instructions: z.ZodString;
167
+ context: z.ZodUnknown;
168
+ outcomeKind: z.ZodOptional<z.ZodString>;
169
+ outcomeSchema: z.ZodOptional<z.ZodObject<{
170
+ type: z.ZodLiteral<"json-schema">;
171
+ schema: z.ZodUnknown;
172
+ }, z.core.$strip>>;
173
+ resolvedOutcome: z.ZodOptional<z.ZodUnknown>;
174
+ errorText: z.ZodOptional<z.ZodString>;
175
+ createdAt: z.ZodOptional<z.ZodUnknown>;
176
+ updatedAt: z.ZodOptional<z.ZodUnknown>;
177
+ resolvedAt: z.ZodOptional<z.ZodUnknown>;
178
+ }, z.core.$strip>;
179
+ }, z.core.$strip>, z.ZodObject<{
180
+ ok: z.ZodLiteral<false>;
181
+ error: z.ZodString;
182
+ issues: z.ZodOptional<z.ZodUnknown>;
183
+ }, z.core.$strip>], "ok">, import("./service.js").TasksRuntime, any>;
184
+ failTask: import("@ekairos/domain").DomainActionRegistration<z.ZodObject<{
185
+ id: z.ZodString;
186
+ errorText: z.ZodString;
187
+ }, z.core.$strip>, z.ZodDiscriminatedUnion<[z.ZodObject<{
188
+ ok: z.ZodLiteral<true>;
189
+ data: z.ZodObject<{
190
+ id: z.ZodString;
191
+ kind: z.ZodString;
192
+ key: z.ZodString;
193
+ state: z.ZodEnum<{
194
+ open: "open";
195
+ completed: "completed";
196
+ cancelled: "cancelled";
197
+ failed: "failed";
198
+ }>;
199
+ instructions: z.ZodString;
200
+ context: z.ZodUnknown;
201
+ outcomeKind: z.ZodOptional<z.ZodString>;
202
+ outcomeSchema: z.ZodOptional<z.ZodObject<{
203
+ type: z.ZodLiteral<"json-schema">;
204
+ schema: z.ZodUnknown;
205
+ }, z.core.$strip>>;
206
+ resolvedOutcome: z.ZodOptional<z.ZodUnknown>;
207
+ errorText: z.ZodOptional<z.ZodString>;
208
+ createdAt: z.ZodOptional<z.ZodUnknown>;
209
+ updatedAt: z.ZodOptional<z.ZodUnknown>;
210
+ resolvedAt: z.ZodOptional<z.ZodUnknown>;
211
+ }, z.core.$strip>;
212
+ }, z.core.$strip>, z.ZodObject<{
213
+ ok: z.ZodLiteral<false>;
214
+ error: z.ZodString;
215
+ issues: z.ZodOptional<z.ZodUnknown>;
216
+ }, z.core.$strip>], "ok">, import("./service.js").TasksRuntime, any>;
217
+ }, "tasks", "tasks">;
218
+ //# sourceMappingURL=domain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../src/domain.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AA0FvB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;gEAoB1B,CAAA;AAEJ,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAsCpB,CAAA"}
package/dist/domain.js ADDED
@@ -0,0 +1,134 @@
1
+ import { i } from "@instantdb/core";
2
+ import { defineAction, domain } from "@ekairos/domain";
3
+ import { z } from "zod";
4
+ import { awaitOutcomeExecute, cancelTaskExecute, decideTaskExecute, failTaskExecute, getTaskExecute, openTaskExecute, } from "./actions.js";
5
+ const storedOutcomeSchema = z.object({
6
+ type: z.literal("json-schema"),
7
+ schema: z.unknown(),
8
+ });
9
+ const taskRecordSchema = z.object({
10
+ id: z.string(),
11
+ kind: z.string(),
12
+ key: z.string(),
13
+ state: z.enum(["open", "completed", "cancelled", "failed"]),
14
+ instructions: z.string(),
15
+ context: z.unknown(),
16
+ outcomeKind: z.string().optional(),
17
+ outcomeSchema: storedOutcomeSchema.optional(),
18
+ resolvedOutcome: z.unknown().optional(),
19
+ errorText: z.string().optional(),
20
+ createdAt: z.unknown().optional(),
21
+ updatedAt: z.unknown().optional(),
22
+ resolvedAt: z.unknown().optional(),
23
+ });
24
+ const taskServiceResultSchema = z.discriminatedUnion("ok", [
25
+ z.object({
26
+ ok: z.literal(true),
27
+ data: taskRecordSchema,
28
+ }),
29
+ z.object({
30
+ ok: z.literal(false),
31
+ error: z.string(),
32
+ issues: z.unknown().optional(),
33
+ }),
34
+ ]);
35
+ const taskOutcomeResultSchema = z.discriminatedUnion("ok", [
36
+ z.object({
37
+ ok: z.literal(true),
38
+ data: z.unknown(),
39
+ }),
40
+ z.object({
41
+ ok: z.literal(false),
42
+ error: z.string(),
43
+ issues: z.unknown().optional(),
44
+ }),
45
+ ]);
46
+ const openTaskInputSchema = z.object({
47
+ id: z.string().optional(),
48
+ kind: z.string(),
49
+ key: z.string(),
50
+ instructions: z.string(),
51
+ context: z.unknown().optional(),
52
+ outcomeKind: z.string().optional(),
53
+ outcomeSchema: storedOutcomeSchema,
54
+ });
55
+ const decideTaskInputSchema = z.object({
56
+ id: z.string(),
57
+ outcome: z.unknown(),
58
+ resumeWorkflow: z.boolean().optional(),
59
+ });
60
+ const cancelTaskInputSchema = z.object({
61
+ id: z.string(),
62
+ reason: z.string().optional(),
63
+ });
64
+ const failTaskInputSchema = z.object({
65
+ id: z.string(),
66
+ errorText: z.string(),
67
+ });
68
+ const getTaskInputSchema = z.object({
69
+ id: z.string(),
70
+ });
71
+ const awaitOutcomeInputSchema = z.object({
72
+ id: z.string(),
73
+ });
74
+ export const tasksSchemaDomain = domain("tasks")
75
+ .withSchema({
76
+ entities: {
77
+ task_tasks: i.entity({
78
+ kind: i.string().indexed(),
79
+ key: i.string().unique().indexed(),
80
+ state: i.string().indexed(),
81
+ instructions: i.string().optional(),
82
+ context: i.json().optional(),
83
+ outcomeKind: i.string().optional().indexed(),
84
+ outcomeSchema: i.json().optional(),
85
+ outcome: i.json().optional(),
86
+ errorText: i.string().optional(),
87
+ createdAt: i.date().indexed(),
88
+ updatedAt: i.date().indexed(),
89
+ resolvedAt: i.date().optional().indexed(),
90
+ }),
91
+ },
92
+ links: {},
93
+ rooms: {},
94
+ });
95
+ export const tasksDomain = tasksSchemaDomain
96
+ .withActions({
97
+ openTask: defineAction({
98
+ name: "tasks.openTask",
99
+ input: openTaskInputSchema,
100
+ output: taskServiceResultSchema,
101
+ execute: openTaskExecute,
102
+ }),
103
+ getTask: defineAction({
104
+ name: "tasks.getTask",
105
+ input: getTaskInputSchema,
106
+ output: taskServiceResultSchema,
107
+ execute: getTaskExecute,
108
+ }),
109
+ awaitOutcome: defineAction({
110
+ name: "tasks.awaitOutcome",
111
+ input: awaitOutcomeInputSchema,
112
+ output: taskOutcomeResultSchema,
113
+ execute: awaitOutcomeExecute,
114
+ }),
115
+ decideTask: defineAction({
116
+ name: "tasks.decideTask",
117
+ input: decideTaskInputSchema,
118
+ output: taskServiceResultSchema,
119
+ execute: decideTaskExecute,
120
+ }),
121
+ cancelTask: defineAction({
122
+ name: "tasks.cancelTask",
123
+ input: cancelTaskInputSchema,
124
+ output: taskServiceResultSchema,
125
+ execute: cancelTaskExecute,
126
+ }),
127
+ failTask: defineAction({
128
+ name: "tasks.failTask",
129
+ input: failTaskInputSchema,
130
+ output: taskServiceResultSchema,
131
+ execute: failTaskExecute,
132
+ }),
133
+ });
134
+ //# sourceMappingURL=domain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.js","sourceRoot":"","sources":["../src/domain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { tasksDomain } from "./domain.js";
2
+ export { createApprovalOutcome, approvalOutcomeForCommand, approvalOutcomeSchema, type ApprovalCommand, type ApprovalOutcome, } from "./approval.js";
3
+ export { parseTaskOutcome, taskOutcomeToken, toStoredOutcomeSchema, type TaskData, type TaskHandle, type TaskOutcomeSchema, type TaskState, type TaskStoredOutcomeSchema, } from "./task.js";
4
+ export { Task, type TaskApprovalInput, type TaskOpenInput, type TaskOpenOptions, type TaskRecord, type TasksClientRuntime, type TasksRuntime, } from "./service.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,uBAAuB,GAC7B,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,IAAI,EACJ,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,YAAY,GAClB,MAAM,cAAc,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { tasksDomain } from "./domain.js";
2
+ export { createApprovalOutcome, approvalOutcomeForCommand, approvalOutcomeSchema, } from "./approval.js";
3
+ export { parseTaskOutcome, taskOutcomeToken, toStoredOutcomeSchema, } from "./task.js";
4
+ export { Task, } from "./service.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,GAGtB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,GAMtB,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,IAAI,GAOL,MAAM,cAAc,CAAA"}
@@ -0,0 +1,95 @@
1
+ import { type TaskData, type TaskHandle, type TaskOutcomeSchema, type TaskStoredOutcomeSchema } from "./task.js";
2
+ export type ServiceResult<T = unknown> = {
3
+ ok: true;
4
+ data: T;
5
+ } | {
6
+ ok: false;
7
+ error: string;
8
+ issues?: unknown;
9
+ };
10
+ export type TasksRuntime = {
11
+ db: any;
12
+ };
13
+ export type TasksClientRuntime = {
14
+ use(domain: unknown): Promise<any>;
15
+ };
16
+ export type TaskRecord<TContext = unknown, TOutcome = unknown> = TaskData<TContext, TOutcome> & {
17
+ errorText?: string;
18
+ };
19
+ export type TaskOpenActionInput = {
20
+ id?: string;
21
+ kind: string;
22
+ key: string;
23
+ instructions: string;
24
+ context?: unknown;
25
+ outcomeKind?: string;
26
+ outcomeSchema: TaskStoredOutcomeSchema;
27
+ };
28
+ export type TaskDecideActionInput = {
29
+ id: string;
30
+ outcome: unknown;
31
+ resumeWorkflow?: boolean;
32
+ };
33
+ export type TaskCancelActionInput = {
34
+ id: string;
35
+ reason?: string;
36
+ };
37
+ export type TaskFailActionInput = {
38
+ id: string;
39
+ errorText: string;
40
+ };
41
+ export type TaskGetActionInput = {
42
+ id: string;
43
+ };
44
+ export type TaskAwaitOutcomeActionInput = {
45
+ id: string;
46
+ };
47
+ export type TaskOpenOptions = {
48
+ id?: string;
49
+ outcomeKind?: string;
50
+ };
51
+ export type TaskOpenInput<TOutcome, TContext = unknown> = {
52
+ id?: string;
53
+ kind: string;
54
+ key: string;
55
+ outcome: TaskOutcomeSchema<TOutcome>;
56
+ instructions: string;
57
+ context: TContext;
58
+ outcomeKind?: string;
59
+ };
60
+ export type TaskApprovalInput<TContext = unknown> = {
61
+ id?: string;
62
+ key: string;
63
+ instructions: string;
64
+ context: TContext;
65
+ };
66
+ export declare class TaskService {
67
+ private readonly runtime;
68
+ constructor(runtime: TasksRuntime);
69
+ private db;
70
+ private getTaskRecord;
71
+ openRaw(input: TaskOpenActionInput): Promise<ServiceResult<TaskRecord>>;
72
+ decide(input: TaskDecideActionInput): Promise<ServiceResult<TaskRecord>>;
73
+ cancel(input: TaskCancelActionInput): Promise<ServiceResult<TaskRecord>>;
74
+ fail(input: TaskFailActionInput): Promise<ServiceResult<TaskRecord>>;
75
+ getRaw(input: TaskGetActionInput): Promise<ServiceResult<TaskRecord>>;
76
+ awaitOutcome(input: TaskAwaitOutcomeActionInput): Promise<ServiceResult<unknown>>;
77
+ }
78
+ export declare class Task {
79
+ static open<TOutcome, TContext = unknown>(runtime: TasksClientRuntime, input: TaskOpenInput<TOutcome, TContext>): Promise<TaskHandle<TOutcome, TContext>>;
80
+ static approval<TContext = unknown>(runtime: TasksClientRuntime, input: TaskApprovalInput<TContext>): Promise<TaskHandle<{
81
+ outcome: "approved";
82
+ approved: true;
83
+ decidedBy?: string | undefined;
84
+ decidedAt?: string | undefined;
85
+ note?: string | undefined;
86
+ } | {
87
+ outcome: "rejected";
88
+ approved: false;
89
+ reason: string;
90
+ decidedBy?: string | undefined;
91
+ decidedAt?: string | undefined;
92
+ }, TContext>>;
93
+ static get<TOutcome, TContext = unknown>(runtime: TasksClientRuntime, id: string, outcomeSchema: TaskOutcomeSchema<TOutcome>): Promise<TaskHandle<TOutcome, TContext>>;
94
+ }
95
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,305 @@
1
+ import Ajv from "ajv";
2
+ import { id as instantId } from "@instantdb/core";
3
+ import { createHook } from "workflow";
4
+ import { approvalOutcomeSchema } from "./approval.js";
5
+ import { tasksDomain } from "./domain.js";
6
+ import { assertStoredOutcomeSchemaMatches, createTaskHandle, storedOutcomeSchemasEqual, taskOutcomeToken, toStoredOutcomeSchema, } from "./task.js";
7
+ async function runTaskDomainAction(runtime, action, input) {
8
+ const tasks = await tasksDomain(runtime);
9
+ const actions = tasks.actions;
10
+ return await actions[action](input);
11
+ }
12
+ function unwrapTaskResult(result) {
13
+ if (!result.ok)
14
+ throw new Error(result.error);
15
+ return result.data;
16
+ }
17
+ async function getTaskRecordThroughDomain(runtime, id) {
18
+ return unwrapTaskResult(await runTaskDomainAction(runtime, "getTask", { id }));
19
+ }
20
+ function unwrapOutcomeResult(result) {
21
+ if (!result.ok)
22
+ throw new Error(result.error);
23
+ return result.data;
24
+ }
25
+ function createDomainTaskHandle(runtime, record, outcomeSchema) {
26
+ assertStoredOutcomeSchemaMatches(outcomeSchema, record.outcomeSchema);
27
+ return createTaskHandle(record, outcomeSchema, {
28
+ async awaitOutcome() {
29
+ return unwrapOutcomeResult(await runTaskDomainAction(runtime, "awaitOutcome", { id: record.id }));
30
+ },
31
+ });
32
+ }
33
+ let ajvInstance = null;
34
+ function getAjv() {
35
+ if (!ajvInstance) {
36
+ ajvInstance = new Ajv({ allErrors: true, strict: false });
37
+ }
38
+ return ajvInstance;
39
+ }
40
+ function newEntityId() {
41
+ return instantId();
42
+ }
43
+ function normalizeTaskState(state) {
44
+ if (state === "open" ||
45
+ state === "completed" ||
46
+ state === "cancelled" ||
47
+ state === "failed") {
48
+ return state;
49
+ }
50
+ return "open";
51
+ }
52
+ function rowToTaskRecord(row) {
53
+ return {
54
+ id: String(row.id),
55
+ kind: String(row.kind),
56
+ key: String(row.key),
57
+ state: normalizeTaskState(row.state),
58
+ instructions: String(row.instructions ?? ""),
59
+ context: row.context,
60
+ outcomeKind: typeof row.outcomeKind === "string" ? row.outcomeKind : undefined,
61
+ outcomeSchema: row.outcomeSchema,
62
+ resolvedOutcome: row.outcome,
63
+ errorText: typeof row.errorText === "string" ? row.errorText : undefined,
64
+ createdAt: row.createdAt,
65
+ updatedAt: row.updatedAt,
66
+ resolvedAt: row.resolvedAt,
67
+ };
68
+ }
69
+ function validateStoredOutcome(storedSchema, outcome) {
70
+ if (!storedSchema || storedSchema.type !== "json-schema") {
71
+ return { ok: false, error: "task_outcome_schema_missing" };
72
+ }
73
+ try {
74
+ const validate = getAjv().compile(storedSchema.schema);
75
+ if (!validate(outcome)) {
76
+ return {
77
+ ok: false,
78
+ error: "task_outcome_invalid",
79
+ issues: validate.errors ?? [],
80
+ };
81
+ }
82
+ }
83
+ catch (error) {
84
+ return {
85
+ ok: false,
86
+ error: "task_outcome_schema_invalid",
87
+ issues: error instanceof Error ? error.message : String(error),
88
+ };
89
+ }
90
+ return { ok: true, data: outcome };
91
+ }
92
+ async function resumeTaskOutcome(id, outcome) {
93
+ const { resumeHook } = await import("workflow/api");
94
+ try {
95
+ await resumeHook(taskOutcomeToken(id), outcome);
96
+ }
97
+ catch (error) {
98
+ if (error instanceof Error && error.name === "HookNotFoundError") {
99
+ return;
100
+ }
101
+ throw error;
102
+ }
103
+ }
104
+ function createTaskOutcomeHook(id) {
105
+ return createHook({
106
+ token: taskOutcomeToken(id),
107
+ });
108
+ }
109
+ export class TaskService {
110
+ constructor(runtime) {
111
+ this.runtime = runtime;
112
+ }
113
+ db() {
114
+ return this.runtime.db;
115
+ }
116
+ async getTaskRecord(id) {
117
+ const db = this.db();
118
+ const result = await db.query({
119
+ task_tasks: {
120
+ $: { where: { id }, limit: 1 },
121
+ },
122
+ });
123
+ const row = result?.task_tasks?.[0];
124
+ return row?.id ? rowToTaskRecord(row) : null;
125
+ }
126
+ async openRaw(input) {
127
+ if (!input.kind.trim())
128
+ return { ok: false, error: "task_kind_required" };
129
+ if (!input.key.trim())
130
+ return { ok: false, error: "task_key_required" };
131
+ if (!input.outcomeSchema)
132
+ return { ok: false, error: "task_outcome_schema_required" };
133
+ const db = this.db();
134
+ const existing = await db.query({
135
+ task_tasks: {
136
+ $: { where: { key: input.key }, limit: 1 },
137
+ },
138
+ });
139
+ const existingTask = existing?.task_tasks?.[0];
140
+ if (existingTask?.id) {
141
+ const existingSchema = existingTask.outcomeSchema;
142
+ if (!storedOutcomeSchemasEqual(existingSchema, input.outcomeSchema)) {
143
+ return { ok: false, error: "task_outcome_schema_mismatch" };
144
+ }
145
+ return { ok: true, data: rowToTaskRecord(existingTask) };
146
+ }
147
+ const now = new Date();
148
+ const id = input.id ?? newEntityId();
149
+ await db.transact([
150
+ db.tx.task_tasks[id].update({
151
+ kind: input.kind,
152
+ key: input.key,
153
+ state: "open",
154
+ instructions: input.instructions,
155
+ context: input.context,
156
+ outcomeKind: input.outcomeKind,
157
+ outcomeSchema: input.outcomeSchema,
158
+ createdAt: now,
159
+ updatedAt: now,
160
+ }),
161
+ ]);
162
+ const created = await this.getTaskRecord(id);
163
+ if (!created)
164
+ return { ok: false, error: "task_open_failed" };
165
+ return { ok: true, data: created };
166
+ }
167
+ async decide(input) {
168
+ if (!input.id.trim())
169
+ return { ok: false, error: "task_id_required" };
170
+ const task = await this.getTaskRecord(input.id);
171
+ if (!task)
172
+ return { ok: false, error: "task_not_found" };
173
+ if (task.state !== "open") {
174
+ return { ok: false, error: `task_not_open:${task.state}` };
175
+ }
176
+ const validation = validateStoredOutcome(task.outcomeSchema, input.outcome);
177
+ if (!validation.ok)
178
+ return validation;
179
+ const db = this.db();
180
+ const now = new Date();
181
+ await db.transact([
182
+ db.tx.task_tasks[input.id].update({
183
+ state: "completed",
184
+ outcome: validation.data,
185
+ resolvedAt: now,
186
+ updatedAt: now,
187
+ }),
188
+ ]);
189
+ if (input.resumeWorkflow !== false) {
190
+ await resumeTaskOutcome(input.id, validation.data);
191
+ }
192
+ const completed = await this.getTaskRecord(input.id);
193
+ if (!completed)
194
+ return { ok: false, error: "task_not_found_after_decide" };
195
+ return { ok: true, data: completed };
196
+ }
197
+ async cancel(input) {
198
+ if (!input.id.trim())
199
+ return { ok: false, error: "task_id_required" };
200
+ const task = await this.getTaskRecord(input.id);
201
+ if (!task)
202
+ return { ok: false, error: "task_not_found" };
203
+ if (task.state !== "open") {
204
+ return { ok: false, error: `task_not_open:${task.state}` };
205
+ }
206
+ const db = this.db();
207
+ const now = new Date();
208
+ await db.transact([
209
+ db.tx.task_tasks[input.id].update({
210
+ state: "cancelled",
211
+ errorText: input.reason,
212
+ resolvedAt: now,
213
+ updatedAt: now,
214
+ }),
215
+ ]);
216
+ const cancelled = await this.getTaskRecord(input.id);
217
+ if (!cancelled)
218
+ return { ok: false, error: "task_not_found_after_cancel" };
219
+ return { ok: true, data: cancelled };
220
+ }
221
+ async fail(input) {
222
+ if (!input.id.trim())
223
+ return { ok: false, error: "task_id_required" };
224
+ if (!input.errorText.trim())
225
+ return { ok: false, error: "task_error_text_required" };
226
+ const task = await this.getTaskRecord(input.id);
227
+ if (!task)
228
+ return { ok: false, error: "task_not_found" };
229
+ if (task.state !== "open") {
230
+ return { ok: false, error: `task_not_open:${task.state}` };
231
+ }
232
+ const db = this.db();
233
+ const now = new Date();
234
+ await db.transact([
235
+ db.tx.task_tasks[input.id].update({
236
+ state: "failed",
237
+ errorText: input.errorText,
238
+ resolvedAt: now,
239
+ updatedAt: now,
240
+ }),
241
+ ]);
242
+ const failed = await this.getTaskRecord(input.id);
243
+ if (!failed)
244
+ return { ok: false, error: "task_not_found_after_fail" };
245
+ return { ok: true, data: failed };
246
+ }
247
+ async getRaw(input) {
248
+ if (!input.id.trim())
249
+ return { ok: false, error: "task_id_required" };
250
+ const task = await this.getTaskRecord(input.id);
251
+ if (!task)
252
+ return { ok: false, error: "task_not_found" };
253
+ return { ok: true, data: task };
254
+ }
255
+ async awaitOutcome(input) {
256
+ if (!input.id.trim())
257
+ return { ok: false, error: "task_id_required" };
258
+ const task = await this.getTaskRecord(input.id);
259
+ if (!task)
260
+ return { ok: false, error: "task_not_found" };
261
+ if (task.state === "completed") {
262
+ return validateStoredOutcome(task.outcomeSchema, task.resolvedOutcome);
263
+ }
264
+ if (task.state !== "open") {
265
+ return { ok: false, error: `task_not_open:${task.state}` };
266
+ }
267
+ const hook = createTaskOutcomeHook(input.id);
268
+ try {
269
+ return validateStoredOutcome(task.outcomeSchema, await hook);
270
+ }
271
+ finally {
272
+ hook.dispose();
273
+ }
274
+ }
275
+ }
276
+ export class Task {
277
+ static async open(runtime, input) {
278
+ const opened = unwrapTaskResult(await runTaskDomainAction(runtime, "openTask", {
279
+ id: input.id,
280
+ kind: input.kind,
281
+ key: input.key,
282
+ instructions: input.instructions,
283
+ context: input.context,
284
+ outcomeKind: input.outcomeKind,
285
+ outcomeSchema: toStoredOutcomeSchema(input.outcome),
286
+ }));
287
+ return createDomainTaskHandle(runtime, opened, input.outcome);
288
+ }
289
+ static async approval(runtime, input) {
290
+ return await Task.open(runtime, {
291
+ id: input.id,
292
+ kind: "approval",
293
+ key: input.key,
294
+ outcome: approvalOutcomeSchema,
295
+ instructions: input.instructions,
296
+ context: input.context,
297
+ outcomeKind: "approval",
298
+ });
299
+ }
300
+ static async get(runtime, id, outcomeSchema) {
301
+ const task = await getTaskRecordThroughDomain(runtime, id);
302
+ return createDomainTaskHandle(runtime, task, outcomeSchema);
303
+ }
304
+ }
305
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
package/dist/task.d.ts ADDED
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ export type TaskState = "open" | "completed" | "cancelled" | "failed";
3
+ export type TaskStoredOutcomeSchema = {
4
+ type: "json-schema";
5
+ schema: unknown;
6
+ };
7
+ export type TaskData<TContext = unknown, TOutcome = unknown> = {
8
+ id: string;
9
+ kind: string;
10
+ key: string;
11
+ state: TaskState;
12
+ instructions: string;
13
+ context: TContext;
14
+ outcomeKind?: string;
15
+ outcomeSchema?: TaskStoredOutcomeSchema;
16
+ resolvedOutcome?: TOutcome;
17
+ createdAt?: Date | string;
18
+ updatedAt?: Date | string;
19
+ resolvedAt?: Date | string;
20
+ };
21
+ export type TaskHandle<TOutcome, TContext = unknown> = TaskData<TContext, TOutcome> & {
22
+ outcome(): Promise<TOutcome>;
23
+ };
24
+ export type TaskOutcomeSchema<TOutcome> = z.ZodType<TOutcome>;
25
+ export declare function taskOutcomeToken(id: string): string;
26
+ export declare function parseTaskOutcome<TOutcome>(outcomeSchema: TaskOutcomeSchema<TOutcome>, outcome: unknown): TOutcome;
27
+ export declare function toStoredOutcomeSchema<TOutcome>(outcomeSchema: TaskOutcomeSchema<TOutcome>): TaskStoredOutcomeSchema;
28
+ export declare function storedOutcomeSchemaMatches<TOutcome>(outcomeSchema: TaskOutcomeSchema<TOutcome>, storedSchema: TaskStoredOutcomeSchema | undefined): boolean;
29
+ export declare function storedOutcomeSchemasEqual(left: TaskStoredOutcomeSchema | undefined, right: TaskStoredOutcomeSchema | undefined): boolean;
30
+ export declare function assertStoredOutcomeSchemaMatches<TOutcome>(outcomeSchema: TaskOutcomeSchema<TOutcome>, storedSchema: TaskStoredOutcomeSchema | undefined): void;
31
+ type TaskHandleOptions<TOutcome, TContext> = {
32
+ awaitOutcome?: () => Promise<unknown>;
33
+ };
34
+ export declare function createTaskHandle<TOutcome, TContext = unknown>(data: TaskData<TContext, TOutcome>, outcomeSchema: TaskOutcomeSchema<TOutcome>, options?: TaskHandleOptions<TOutcome, TContext>): TaskHandle<TOutcome, TContext>;
35
+ export {};
36
+ //# sourceMappingURL=task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAA;AAErE,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,aAAa,CAAA;IACnB,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,QAAQ,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,IAAI;IAC7D,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,SAAS,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,QAAQ,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,uBAAuB,CAAA;IACvC,eAAe,CAAC,EAAE,QAAQ,CAAA;IAC1B,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IACzB,UAAU,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,IAC/C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAC5B;IACA,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAA;CAC7B,CAAA;AAEH,MAAM,MAAM,iBAAiB,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;AAQ7D,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,UAG1C;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EACvC,aAAa,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAC1C,OAAO,EAAE,OAAO,GACf,QAAQ,CAEV;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAC5C,aAAa,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GACzC,uBAAuB,CAKzB;AAiBD,wBAAgB,0BAA0B,CAAC,QAAQ,EACjD,aAAa,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAC1C,YAAY,EAAE,uBAAuB,GAAG,SAAS,GAChD,OAAO,CAET;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,uBAAuB,GAAG,SAAS,EACzC,KAAK,EAAE,uBAAuB,GAAG,SAAS,GACzC,OAAO,CAMT;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EACvD,aAAa,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAC1C,YAAY,EAAE,uBAAuB,GAAG,SAAS,QAKlD;AAED,KAAK,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,IAAI;IAC3C,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;CACtC,CAAA;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,EAC3D,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAClC,aAAa,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAC1C,OAAO,GAAE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAM,GAClD,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAmBhC"}
package/dist/task.js ADDED
@@ -0,0 +1,63 @@
1
+ import { z } from "zod";
2
+ function assertNonEmpty(value, name) {
3
+ if (!value.trim()) {
4
+ throw new Error(`${name} is required.`);
5
+ }
6
+ }
7
+ export function taskOutcomeToken(id) {
8
+ assertNonEmpty(id, "Task id");
9
+ return `ekairos_task:outcome:${id}`;
10
+ }
11
+ export function parseTaskOutcome(outcomeSchema, outcome) {
12
+ return outcomeSchema.parse(outcome);
13
+ }
14
+ export function toStoredOutcomeSchema(outcomeSchema) {
15
+ return {
16
+ type: "json-schema",
17
+ schema: z.toJSONSchema(outcomeSchema, { target: "draft-7" }),
18
+ };
19
+ }
20
+ function sortJson(value) {
21
+ if (Array.isArray(value))
22
+ return value.map(sortJson);
23
+ if (!value || typeof value !== "object")
24
+ return value;
25
+ return Object.fromEntries(Object.entries(value)
26
+ .sort(([left], [right]) => left.localeCompare(right))
27
+ .map(([key, entry]) => [key, sortJson(entry)]));
28
+ }
29
+ function schemaFingerprint(schema) {
30
+ return JSON.stringify(sortJson(schema));
31
+ }
32
+ export function storedOutcomeSchemaMatches(outcomeSchema, storedSchema) {
33
+ return storedOutcomeSchemasEqual(toStoredOutcomeSchema(outcomeSchema), storedSchema);
34
+ }
35
+ export function storedOutcomeSchemasEqual(left, right) {
36
+ if (!left || !right || left.type !== "json-schema" || right.type !== "json-schema") {
37
+ return false;
38
+ }
39
+ return schemaFingerprint(left.schema) === schemaFingerprint(right.schema);
40
+ }
41
+ export function assertStoredOutcomeSchemaMatches(outcomeSchema, storedSchema) {
42
+ if (!storedOutcomeSchemaMatches(outcomeSchema, storedSchema)) {
43
+ throw new Error("Task outcome schema does not match the stored task outcome schema.");
44
+ }
45
+ }
46
+ export function createTaskHandle(data, outcomeSchema, options = {}) {
47
+ assertNonEmpty(data.id, "Task id");
48
+ assertNonEmpty(data.kind, "Task kind");
49
+ assertNonEmpty(data.key, "Task key");
50
+ return {
51
+ ...data,
52
+ async outcome() {
53
+ if (options.awaitOutcome) {
54
+ return parseTaskOutcome(outcomeSchema, await options.awaitOutcome());
55
+ }
56
+ if (data.state === "completed") {
57
+ return parseTaskOutcome(outcomeSchema, data.resolvedOutcome);
58
+ }
59
+ throw new Error(`Task ${data.id} cannot resolve an outcome without an awaitOutcome action.`);
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@ekairos/tasks",
3
+ "version": "1.22.83-beta.development.0",
4
+ "description": "Ekairos Tasks - durable tasks with typed outcomes",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "README.md"
11
+ ],
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "license": "MIT",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/e-kairos/ekairos.git",
19
+ "directory": "packages/tasks"
20
+ },
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js",
25
+ "default": "./dist/index.js"
26
+ },
27
+ "./domain": {
28
+ "types": "./dist/domain.d.ts",
29
+ "import": "./dist/domain.js",
30
+ "default": "./dist/domain.js"
31
+ }
32
+ },
33
+ "scripts": {
34
+ "build": "tsc -p tsconfig.json",
35
+ "dev": "tsc -p tsconfig.json --watch",
36
+ "clean": "node -e \"require('fs').rmSync('dist', {recursive:true, force:true})\"",
37
+ "typecheck": "tsc --noEmit",
38
+ "typecheck:tests": "tsc --noEmit -p tsconfig.typecheck.json",
39
+ "test": "vitest run -c vitest.config.mts",
40
+ "test:workflow": "vitest run -c vitest.workflow.config.mts"
41
+ },
42
+ "dependencies": {
43
+ "@ekairos/domain": "^1.22.83-beta.development.0",
44
+ "@instantdb/core": "0.22.142",
45
+ "ajv": "^8.17.1",
46
+ "workflow": "5.0.0-beta.5",
47
+ "zod": "^4.3.6"
48
+ },
49
+ "devDependencies": {
50
+ "@ekairos/tsconfig": "workspace:*",
51
+ "@types/node": "^24.5.0",
52
+ "@workflow/serde": "5.0.0-beta.1",
53
+ "@workflow/vitest": "5.0.0-beta.5",
54
+ "typescript": "^5.9.2",
55
+ "vitest": "^4.0.8"
56
+ }
57
+ }