digital-tasks 2.0.1

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.
@@ -0,0 +1,5 @@
1
+
2
+ 
3
+ > digital-tasks@2.0.1 build /Users/nathanclevenger/projects/primitives.org.ai/packages/digital-tasks
4
+ > tsc
5
+
package/CHANGELOG.md ADDED
@@ -0,0 +1,10 @@
1
+ # digital-tasks
2
+
3
+ ## 2.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+ - ai-functions@2.0.1
9
+ - digital-tools@2.0.1
10
+ - digital-workers@2.0.1
@@ -0,0 +1,319 @@
1
+ /**
2
+ * Function-Task Integration
3
+ *
4
+ * Connects the task system with ai-functions Function definitions.
5
+ * Every task is essentially a function call with typed inputs/outputs.
6
+ *
7
+ * ## Function Types
8
+ *
9
+ * Tasks can execute different function types:
10
+ * - **Code**: Generates executable code
11
+ * - **Generative**: AI generates text/objects (no tools)
12
+ * - **Agentic**: AI with tools in a loop
13
+ * - **Human**: Requires human input/approval
14
+ *
15
+ * ## Data Flow
16
+ *
17
+ * Tasks form a typed DAG where outputs flow to dependent task inputs:
18
+ *
19
+ * ```ts
20
+ * const workflow = defineWorkflow({
21
+ * name: 'Data Pipeline',
22
+ * tasks: {
23
+ * fetchData: generativeTask({
24
+ * prompt: 'Fetch user data from API',
25
+ * output: z.object({ users: z.array(z.object({ name: z.string() })) }),
26
+ * }),
27
+ * processData: codeTask({
28
+ * input: (ctx) => ctx.outputs.fetchData, // Type-safe reference
29
+ * language: 'typescript',
30
+ * description: 'Filter active users',
31
+ * }),
32
+ * reviewResults: humanTask({
33
+ * input: (ctx) => ctx.outputs.processData,
34
+ * channel: 'slack',
35
+ * instructions: 'Review the processed user list',
36
+ * }),
37
+ * },
38
+ * // Dependencies inferred from input references
39
+ * })
40
+ * ```
41
+ *
42
+ * @packageDocumentation
43
+ */
44
+ import type { FunctionDefinition, AIFunctionDefinition, CodeLanguage, HumanChannel } from 'ai-functions';
45
+ import type { AnyTask, TaskStatus, TaskPriority, WorkerRef } from './types.js';
46
+ /**
47
+ * The type of function that executes this task
48
+ */
49
+ export type FunctionTaskType = 'code' | 'generative' | 'agentic' | 'human';
50
+ /**
51
+ * Base function task - a task that executes a function
52
+ */
53
+ export interface FunctionTask<TInput = unknown, TOutput = unknown> {
54
+ /** Task ID */
55
+ id: string;
56
+ /** Task name */
57
+ name: string;
58
+ /** Task description */
59
+ description?: string;
60
+ /** Function type */
61
+ functionType: FunctionTaskType;
62
+ /** Function definition (if pre-defined) */
63
+ functionRef?: string;
64
+ /** Inline function definition */
65
+ definition?: FunctionDefinition<TInput, TOutput>;
66
+ /** Input value or resolver */
67
+ input?: TInput | InputResolver<TInput>;
68
+ /** Expected output type (for type inference) */
69
+ outputType?: TOutput;
70
+ /** Task priority */
71
+ priority?: TaskPriority;
72
+ /** Assigned worker */
73
+ assignTo?: WorkerRef;
74
+ /** Tags */
75
+ tags?: string[];
76
+ }
77
+ /**
78
+ * Input resolver - gets input from workflow context
79
+ */
80
+ export type InputResolver<T> = (context: WorkflowContext) => T | Promise<T>;
81
+ /**
82
+ * Workflow execution context
83
+ */
84
+ export interface WorkflowContext {
85
+ /** Outputs from completed tasks */
86
+ outputs: Record<string, unknown>;
87
+ /** Get typed output from a specific task */
88
+ getOutput: <T>(taskId: string) => T | undefined;
89
+ /** Workflow metadata */
90
+ metadata: Record<string, unknown>;
91
+ /** Current user/worker */
92
+ worker?: WorkerRef;
93
+ }
94
+ /**
95
+ * Code task - generates executable code
96
+ */
97
+ export interface CodeTask<TInput = unknown, TOutput = string> extends FunctionTask<TInput, TOutput> {
98
+ functionType: 'code';
99
+ /** Target programming language */
100
+ language?: CodeLanguage;
101
+ /** Code generation instructions */
102
+ instructions?: string;
103
+ /** Include tests */
104
+ includeTests?: boolean;
105
+ /** Include examples */
106
+ includeExamples?: boolean;
107
+ }
108
+ /**
109
+ * Generative task - AI generates content (no tools)
110
+ */
111
+ export interface GenerativeTask<TInput = unknown, TOutput = unknown> extends FunctionTask<TInput, TOutput> {
112
+ functionType: 'generative';
113
+ /** Prompt template */
114
+ prompt: string;
115
+ /** System prompt */
116
+ system?: string;
117
+ /** Model to use */
118
+ model?: string;
119
+ /** Temperature */
120
+ temperature?: number;
121
+ /** Output schema (for structured output) */
122
+ outputSchema?: unknown;
123
+ }
124
+ /**
125
+ * Agentic task - AI with tools in a loop
126
+ */
127
+ export interface AgenticTask<TInput = unknown, TOutput = unknown> extends FunctionTask<TInput, TOutput> {
128
+ functionType: 'agentic';
129
+ /** Agent instructions */
130
+ instructions: string;
131
+ /** Available tools */
132
+ tools?: AIFunctionDefinition[];
133
+ /** Tool names (if using registry) */
134
+ toolNames?: string[];
135
+ /** Maximum iterations */
136
+ maxIterations?: number;
137
+ /** Model to use */
138
+ model?: string;
139
+ /** Stream intermediate results */
140
+ stream?: boolean;
141
+ }
142
+ /**
143
+ * Human task - requires human input
144
+ */
145
+ export interface HumanTask<TInput = unknown, TOutput = unknown> extends FunctionTask<TInput, TOutput> {
146
+ functionType: 'human';
147
+ /** Interaction channel */
148
+ channel: HumanChannel;
149
+ /** Instructions for the human */
150
+ instructions: string;
151
+ /** Timeout in ms */
152
+ timeout?: number;
153
+ /** Who should handle this */
154
+ assignee?: string;
155
+ /** Expected response schema */
156
+ responseSchema?: unknown;
157
+ }
158
+ /**
159
+ * Union of all function task types
160
+ */
161
+ export type AnyFunctionTask = CodeTask | GenerativeTask | AgenticTask | HumanTask;
162
+ /**
163
+ * Create a code task
164
+ *
165
+ * @example
166
+ * ```ts
167
+ * const task = codeTask({
168
+ * name: 'Generate API client',
169
+ * language: 'typescript',
170
+ * instructions: 'Generate a type-safe API client from OpenAPI spec',
171
+ * input: { spec: openApiSpec },
172
+ * })
173
+ * ```
174
+ */
175
+ export declare function codeTask<TInput = unknown, TOutput = string>(options: Omit<CodeTask<TInput, TOutput>, 'id' | 'functionType'>): CodeTask<TInput, TOutput>;
176
+ /**
177
+ * Create a generative task
178
+ *
179
+ * @example
180
+ * ```ts
181
+ * const task = generativeTask({
182
+ * name: 'Summarize document',
183
+ * prompt: 'Summarize the following document: {{document}}',
184
+ * outputSchema: { summary: 'string', keyPoints: ['string'] },
185
+ * })
186
+ * ```
187
+ */
188
+ export declare function generativeTask<TInput = unknown, TOutput = unknown>(options: Omit<GenerativeTask<TInput, TOutput>, 'id' | 'functionType'>): GenerativeTask<TInput, TOutput>;
189
+ /**
190
+ * Create an agentic task
191
+ *
192
+ * @example
193
+ * ```ts
194
+ * const task = agenticTask({
195
+ * name: 'Research topic',
196
+ * instructions: 'Research the given topic and compile a report',
197
+ * tools: [searchTool, fetchTool, extractTool],
198
+ * maxIterations: 10,
199
+ * })
200
+ * ```
201
+ */
202
+ export declare function agenticTask<TInput = unknown, TOutput = unknown>(options: Omit<AgenticTask<TInput, TOutput>, 'id' | 'functionType'>): AgenticTask<TInput, TOutput>;
203
+ /**
204
+ * Create a human task
205
+ *
206
+ * @example
207
+ * ```ts
208
+ * const task = humanTask({
209
+ * name: 'Review PR',
210
+ * channel: 'slack',
211
+ * instructions: 'Review the code changes and approve or request changes',
212
+ * responseSchema: { approved: 'boolean', feedback: 'string' },
213
+ * })
214
+ * ```
215
+ */
216
+ export declare function humanTask<TInput = unknown, TOutput = unknown>(options: Omit<HumanTask<TInput, TOutput>, 'id' | 'functionType'>): HumanTask<TInput, TOutput>;
217
+ /**
218
+ * Workflow definition with typed task graph
219
+ */
220
+ export interface TypedWorkflow<TTasks extends Record<string, AnyFunctionTask> = Record<string, AnyFunctionTask>> {
221
+ /** Workflow ID */
222
+ id: string;
223
+ /** Workflow name */
224
+ name: string;
225
+ /** Workflow description */
226
+ description?: string;
227
+ /** Tasks in the workflow */
228
+ tasks: TTasks;
229
+ /** Explicit dependencies (if not using input resolvers) */
230
+ dependencies?: Array<{
231
+ task: keyof TTasks;
232
+ dependsOn: keyof TTasks | Array<keyof TTasks>;
233
+ }>;
234
+ /** Execution mode for tasks without explicit dependencies */
235
+ defaultMode?: 'parallel' | 'sequential';
236
+ /** Workflow metadata */
237
+ metadata?: Record<string, unknown>;
238
+ }
239
+ /**
240
+ * Options for defining a typed workflow
241
+ */
242
+ export interface DefineWorkflowOptions<TTasks extends Record<string, AnyFunctionTask>> {
243
+ name: string;
244
+ description?: string;
245
+ tasks: TTasks;
246
+ dependencies?: TypedWorkflow<TTasks>['dependencies'];
247
+ defaultMode?: 'parallel' | 'sequential';
248
+ metadata?: Record<string, unknown>;
249
+ }
250
+ /**
251
+ * Create a typed workflow with automatic dependency inference
252
+ *
253
+ * @example
254
+ * ```ts
255
+ * const contentPipeline = Workflow({
256
+ * name: 'Content Pipeline',
257
+ * tasks: {
258
+ * research: agenticTask({
259
+ * name: 'Research topic',
260
+ * instructions: 'Research AI trends',
261
+ * tools: [searchTool],
262
+ * }),
263
+ * outline: generativeTask({
264
+ * name: 'Create outline',
265
+ * prompt: 'Create outline from research',
266
+ * input: (ctx) => ctx.getOutput('research'),
267
+ * }),
268
+ * draft: generativeTask({
269
+ * name: 'Write draft',
270
+ * prompt: 'Write article from outline',
271
+ * input: (ctx) => ctx.getOutput('outline'),
272
+ * }),
273
+ * review: humanTask({
274
+ * name: 'Review article',
275
+ * channel: 'web',
276
+ * instructions: 'Review and approve the article',
277
+ * input: (ctx) => ctx.getOutput('draft'),
278
+ * }),
279
+ * },
280
+ * })
281
+ * ```
282
+ */
283
+ export declare function Workflow<TTasks extends Record<string, AnyFunctionTask>>(options: DefineWorkflowOptions<TTasks>): TypedWorkflow<TTasks>;
284
+ /**
285
+ * Workflow execution state
286
+ */
287
+ export interface WorkflowExecutionState {
288
+ /** Workflow ID */
289
+ workflowId: string;
290
+ /** Current status */
291
+ status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
292
+ /** Task statuses */
293
+ taskStatuses: Record<string, TaskStatus>;
294
+ /** Task outputs */
295
+ outputs: Record<string, unknown>;
296
+ /** Execution context */
297
+ context: WorkflowContext;
298
+ /** Start time */
299
+ startedAt?: Date;
300
+ /** End time */
301
+ completedAt?: Date;
302
+ /** Current task being executed */
303
+ currentTask?: string;
304
+ /** Error if failed */
305
+ error?: string;
306
+ }
307
+ /**
308
+ * Convert a function task to a base Task
309
+ */
310
+ export declare function functionTaskToTask(functionTask: AnyFunctionTask): Partial<AnyTask>;
311
+ /**
312
+ * Infer dependencies from input resolvers
313
+ */
314
+ export declare function inferDependencies<TTasks extends Record<string, AnyFunctionTask>>(workflow: TypedWorkflow<TTasks>): Map<string, string[]>;
315
+ /**
316
+ * Get execution order for a workflow (topological sort)
317
+ */
318
+ export declare function getExecutionOrder<TTasks extends Record<string, AnyFunctionTask>>(workflow: TypedWorkflow<TTasks>): string[][];
319
+ //# sourceMappingURL=function-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-task.d.ts","sourceRoot":"","sources":["../src/function-task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,286 @@
1
+ /**
2
+ * Function-Task Integration
3
+ *
4
+ * Connects the task system with ai-functions Function definitions.
5
+ * Every task is essentially a function call with typed inputs/outputs.
6
+ *
7
+ * ## Function Types
8
+ *
9
+ * Tasks can execute different function types:
10
+ * - **Code**: Generates executable code
11
+ * - **Generative**: AI generates text/objects (no tools)
12
+ * - **Agentic**: AI with tools in a loop
13
+ * - **Human**: Requires human input/approval
14
+ *
15
+ * ## Data Flow
16
+ *
17
+ * Tasks form a typed DAG where outputs flow to dependent task inputs:
18
+ *
19
+ * ```ts
20
+ * const workflow = defineWorkflow({
21
+ * name: 'Data Pipeline',
22
+ * tasks: {
23
+ * fetchData: generativeTask({
24
+ * prompt: 'Fetch user data from API',
25
+ * output: z.object({ users: z.array(z.object({ name: z.string() })) }),
26
+ * }),
27
+ * processData: codeTask({
28
+ * input: (ctx) => ctx.outputs.fetchData, // Type-safe reference
29
+ * language: 'typescript',
30
+ * description: 'Filter active users',
31
+ * }),
32
+ * reviewResults: humanTask({
33
+ * input: (ctx) => ctx.outputs.processData,
34
+ * channel: 'slack',
35
+ * instructions: 'Review the processed user list',
36
+ * }),
37
+ * },
38
+ * // Dependencies inferred from input references
39
+ * })
40
+ * ```
41
+ *
42
+ * @packageDocumentation
43
+ */
44
+ // ============================================================================
45
+ // Task Factory Functions
46
+ // ============================================================================
47
+ let taskIdCounter = 0;
48
+ function generateFunctionTaskId() {
49
+ return `ftask_${Date.now()}_${++taskIdCounter}`;
50
+ }
51
+ /**
52
+ * Create a code task
53
+ *
54
+ * @example
55
+ * ```ts
56
+ * const task = codeTask({
57
+ * name: 'Generate API client',
58
+ * language: 'typescript',
59
+ * instructions: 'Generate a type-safe API client from OpenAPI spec',
60
+ * input: { spec: openApiSpec },
61
+ * })
62
+ * ```
63
+ */
64
+ export function codeTask(options) {
65
+ return {
66
+ id: generateFunctionTaskId(),
67
+ functionType: 'code',
68
+ ...options,
69
+ };
70
+ }
71
+ /**
72
+ * Create a generative task
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * const task = generativeTask({
77
+ * name: 'Summarize document',
78
+ * prompt: 'Summarize the following document: {{document}}',
79
+ * outputSchema: { summary: 'string', keyPoints: ['string'] },
80
+ * })
81
+ * ```
82
+ */
83
+ export function generativeTask(options) {
84
+ return {
85
+ id: generateFunctionTaskId(),
86
+ functionType: 'generative',
87
+ ...options,
88
+ };
89
+ }
90
+ /**
91
+ * Create an agentic task
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * const task = agenticTask({
96
+ * name: 'Research topic',
97
+ * instructions: 'Research the given topic and compile a report',
98
+ * tools: [searchTool, fetchTool, extractTool],
99
+ * maxIterations: 10,
100
+ * })
101
+ * ```
102
+ */
103
+ export function agenticTask(options) {
104
+ return {
105
+ id: generateFunctionTaskId(),
106
+ functionType: 'agentic',
107
+ ...options,
108
+ };
109
+ }
110
+ /**
111
+ * Create a human task
112
+ *
113
+ * @example
114
+ * ```ts
115
+ * const task = humanTask({
116
+ * name: 'Review PR',
117
+ * channel: 'slack',
118
+ * instructions: 'Review the code changes and approve or request changes',
119
+ * responseSchema: { approved: 'boolean', feedback: 'string' },
120
+ * })
121
+ * ```
122
+ */
123
+ export function humanTask(options) {
124
+ return {
125
+ id: generateFunctionTaskId(),
126
+ functionType: 'human',
127
+ ...options,
128
+ };
129
+ }
130
+ /**
131
+ * Create a typed workflow with automatic dependency inference
132
+ *
133
+ * @example
134
+ * ```ts
135
+ * const contentPipeline = Workflow({
136
+ * name: 'Content Pipeline',
137
+ * tasks: {
138
+ * research: agenticTask({
139
+ * name: 'Research topic',
140
+ * instructions: 'Research AI trends',
141
+ * tools: [searchTool],
142
+ * }),
143
+ * outline: generativeTask({
144
+ * name: 'Create outline',
145
+ * prompt: 'Create outline from research',
146
+ * input: (ctx) => ctx.getOutput('research'),
147
+ * }),
148
+ * draft: generativeTask({
149
+ * name: 'Write draft',
150
+ * prompt: 'Write article from outline',
151
+ * input: (ctx) => ctx.getOutput('outline'),
152
+ * }),
153
+ * review: humanTask({
154
+ * name: 'Review article',
155
+ * channel: 'web',
156
+ * instructions: 'Review and approve the article',
157
+ * input: (ctx) => ctx.getOutput('draft'),
158
+ * }),
159
+ * },
160
+ * })
161
+ * ```
162
+ */
163
+ export function Workflow(options) {
164
+ return {
165
+ id: `wf_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,
166
+ name: options.name,
167
+ description: options.description,
168
+ tasks: options.tasks,
169
+ dependencies: options.dependencies,
170
+ defaultMode: options.defaultMode || 'sequential',
171
+ metadata: options.metadata,
172
+ };
173
+ }
174
+ /**
175
+ * Convert function task type to base task type
176
+ */
177
+ function functionTypeToTaskType(functionType) {
178
+ switch (functionType) {
179
+ case 'code':
180
+ return 'generation';
181
+ case 'generative':
182
+ return 'generation';
183
+ case 'agentic':
184
+ return 'research';
185
+ case 'human':
186
+ return 'approval';
187
+ default:
188
+ return 'action';
189
+ }
190
+ }
191
+ /**
192
+ * Convert a function task to a base Task
193
+ */
194
+ export function functionTaskToTask(functionTask) {
195
+ return {
196
+ title: functionTask.name,
197
+ description: functionTask.description,
198
+ type: functionTypeToTaskType(functionTask.functionType),
199
+ priority: functionTask.priority || 'normal',
200
+ tags: functionTask.tags,
201
+ allowedWorkers: functionTask.functionType === 'human'
202
+ ? ['human']
203
+ : functionTask.functionType === 'agentic'
204
+ ? ['agent']
205
+ : ['any'],
206
+ metadata: {
207
+ _functionTaskId: functionTask.id,
208
+ _functionType: functionTask.functionType,
209
+ _functionDefinition: functionTask.definition,
210
+ },
211
+ };
212
+ }
213
+ /**
214
+ * Infer dependencies from input resolvers
215
+ */
216
+ export function inferDependencies(workflow) {
217
+ const dependencies = new Map();
218
+ const taskIds = Object.keys(workflow.tasks);
219
+ for (const [taskId, task] of Object.entries(workflow.tasks)) {
220
+ const deps = [];
221
+ // Check if input is a resolver function
222
+ if (typeof task.input === 'function') {
223
+ // Create a mock context to track which outputs are accessed
224
+ const accessedOutputs = [];
225
+ const mockContext = {
226
+ outputs: new Proxy({}, {
227
+ get(_, prop) {
228
+ if (typeof prop === 'string' && taskIds.includes(prop)) {
229
+ accessedOutputs.push(prop);
230
+ }
231
+ return undefined;
232
+ },
233
+ }),
234
+ getOutput: (id) => {
235
+ if (taskIds.includes(id)) {
236
+ accessedOutputs.push(id);
237
+ }
238
+ return undefined;
239
+ },
240
+ metadata: {},
241
+ };
242
+ try {
243
+ // Call the resolver to detect accessed outputs
244
+ ;
245
+ task.input(mockContext);
246
+ }
247
+ catch {
248
+ // Resolver may throw if outputs are not available, that's ok
249
+ }
250
+ deps.push(...accessedOutputs);
251
+ }
252
+ // Add explicit dependencies
253
+ const explicit = workflow.dependencies?.find(d => d.task === taskId);
254
+ if (explicit) {
255
+ const explicitDeps = Array.isArray(explicit.dependsOn)
256
+ ? explicit.dependsOn
257
+ : [explicit.dependsOn];
258
+ deps.push(...explicitDeps);
259
+ }
260
+ dependencies.set(taskId, [...new Set(deps)]);
261
+ }
262
+ return dependencies;
263
+ }
264
+ /**
265
+ * Get execution order for a workflow (topological sort)
266
+ */
267
+ export function getExecutionOrder(workflow) {
268
+ const dependencies = inferDependencies(workflow);
269
+ const taskIds = Object.keys(workflow.tasks);
270
+ const result = [];
271
+ const completed = new Set();
272
+ while (completed.size < taskIds.length) {
273
+ // Find tasks whose dependencies are all completed
274
+ const ready = taskIds.filter(id => !completed.has(id) &&
275
+ (dependencies.get(id) || []).every(dep => completed.has(dep)));
276
+ if (ready.length === 0 && completed.size < taskIds.length) {
277
+ throw new Error('Circular dependency detected in workflow');
278
+ }
279
+ // Group ready tasks (can run in parallel)
280
+ result.push(ready);
281
+ // Mark as completed
282
+ ready.forEach(id => completed.add(id));
283
+ }
284
+ return result;
285
+ }
286
+ //# sourceMappingURL=function-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-task.js","sourceRoot":"","sources":["../src/function-task.ts"],"names":[],"mappings":"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"}