devteam-sdk 0.1.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/dist/client.js ADDED
@@ -0,0 +1,431 @@
1
+ import { DevTeamClientOptionsSchema, TaskInputSchema, PlanOptionsSchema } from './types.js';
2
+ import { topologicalSort, planToTaskInputs, buildDAGResult, parallelLimit, withRetry, } from './workflows.js';
3
+ // ---------------------------------------------------------------------------
4
+ // Errors
5
+ // ---------------------------------------------------------------------------
6
+ export class DevTeamError extends Error {
7
+ code;
8
+ statusCode;
9
+ requestId;
10
+ constructor(message, code, statusCode, requestId) {
11
+ super(message);
12
+ this.code = code;
13
+ this.statusCode = statusCode;
14
+ this.requestId = requestId;
15
+ this.name = 'DevTeamError';
16
+ }
17
+ }
18
+ export class DevTeamValidationError extends DevTeamError {
19
+ constructor(message) {
20
+ super(message, 'VALIDATION_ERROR');
21
+ this.name = 'DevTeamValidationError';
22
+ }
23
+ }
24
+ export class DevTeamTimeoutError extends DevTeamError {
25
+ constructor(message = 'Request timed out') {
26
+ super(message, 'TIMEOUT');
27
+ this.name = 'DevTeamTimeoutError';
28
+ }
29
+ }
30
+ // ---------------------------------------------------------------------------
31
+ // DevTeamClient
32
+ // ---------------------------------------------------------------------------
33
+ export class DevTeamClient {
34
+ serverUrl;
35
+ apiKey;
36
+ namespace;
37
+ timeoutMs;
38
+ debug;
39
+ pollingIntervals = new Set();
40
+ constructor(options) {
41
+ const parsed = DevTeamClientOptionsSchema.safeParse(options);
42
+ if (!parsed.success) {
43
+ throw new DevTeamValidationError(`Invalid client options: ${parsed.error.issues.map((i) => i.message).join(', ')}`);
44
+ }
45
+ // Strip trailing slash
46
+ this.serverUrl = options.serverUrl.replace(/\/+$/, '');
47
+ this.apiKey = options.apiKey;
48
+ this.namespace = options.namespace ?? 'default';
49
+ this.timeoutMs = options.timeoutMs ?? 30_000;
50
+ this.debug = options.debug ?? false;
51
+ }
52
+ // -------------------------------------------------------------------------
53
+ // Core: createTask
54
+ // -------------------------------------------------------------------------
55
+ /**
56
+ * Create and execute a single AI agent task.
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * const result = await client.createTask({
61
+ * prompt: 'Review this contract for risks',
62
+ * model: 'opus',
63
+ * queue: 'general-queue',
64
+ * });
65
+ * console.log(result.output);
66
+ * ```
67
+ */
68
+ async createTask(input) {
69
+ const parsed = TaskInputSchema.safeParse(input);
70
+ if (!parsed.success) {
71
+ throw new DevTeamValidationError(`Invalid task input: ${parsed.error.issues.map((i) => i.message).join(', ')}`);
72
+ }
73
+ return this.request('POST', '/api/v1/tasks', {
74
+ ...input,
75
+ namespace: this.namespace,
76
+ });
77
+ }
78
+ // -------------------------------------------------------------------------
79
+ // Core: createPlan
80
+ // -------------------------------------------------------------------------
81
+ /**
82
+ * Generate an execution plan (DAG of subtasks) for a high-level goal.
83
+ * The planner uses an AI model to decompose the goal into ordered subtasks.
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * const plan = await client.createPlan('Full legal review of Series A docs', {
88
+ * strategy: 'dag',
89
+ * defaultModel: 'sonnet',
90
+ * });
91
+ * console.log(`Plan has ${plan.subtasks.length} steps`);
92
+ * ```
93
+ */
94
+ async createPlan(goal, options) {
95
+ if (!goal || goal.trim().length === 0) {
96
+ throw new DevTeamValidationError('Goal must not be empty');
97
+ }
98
+ if (options) {
99
+ const parsed = PlanOptionsSchema.safeParse(options);
100
+ if (!parsed.success) {
101
+ throw new DevTeamValidationError(`Invalid plan options: ${parsed.error.issues.map((i) => i.message).join(', ')}`);
102
+ }
103
+ }
104
+ return this.request('POST', '/api/v1/plans', {
105
+ goal,
106
+ namespace: this.namespace,
107
+ ...options,
108
+ });
109
+ }
110
+ // -------------------------------------------------------------------------
111
+ // Core: executeDAG
112
+ // -------------------------------------------------------------------------
113
+ /**
114
+ * Execute a plan as a directed acyclic graph. Subtasks are run in
115
+ * topologically-sorted layers, maximizing parallelism while respecting
116
+ * dependencies.
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * const plan = await client.createPlan('Analyze portfolio risk');
121
+ * const dagResult = await client.executeDAG(plan);
122
+ * console.log(`Success: ${dagResult.success}, took ${dagResult.totalDurationMs}ms`);
123
+ * ```
124
+ */
125
+ async executeDAG(plan) {
126
+ const startTime = Date.now();
127
+ const layers = topologicalSort(plan.subtasks);
128
+ const results = new Map();
129
+ for (const layer of layers) {
130
+ const taskInputs = planToTaskInputs(plan, results);
131
+ const layerResults = await Promise.all(layer.map(async (subtask) => {
132
+ const input = taskInputs.get(subtask.id);
133
+ if (!input) {
134
+ throw new DevTeamError(`Missing task input for subtask "${subtask.id}"`, 'DAG_ERROR');
135
+ }
136
+ try {
137
+ const result = await this.createTask(input);
138
+ subtask.status = result.status;
139
+ subtask.result = result;
140
+ return { id: subtask.id, result };
141
+ }
142
+ catch (err) {
143
+ const errorResult = {
144
+ taskId: `error-${subtask.id}`,
145
+ status: 'failed',
146
+ model: subtask.model,
147
+ createdAt: new Date().toISOString(),
148
+ completedAt: new Date().toISOString(),
149
+ error: {
150
+ code: 'EXECUTION_ERROR',
151
+ message: err instanceof Error ? err.message : String(err),
152
+ retryable: false,
153
+ },
154
+ };
155
+ subtask.status = 'failed';
156
+ subtask.result = errorResult;
157
+ return { id: subtask.id, result: errorResult };
158
+ }
159
+ }));
160
+ for (const { id, result } of layerResults) {
161
+ results.set(id, result);
162
+ }
163
+ }
164
+ plan.status = 'completed';
165
+ return buildDAGResult(plan, results, startTime);
166
+ }
167
+ // -------------------------------------------------------------------------
168
+ // Core: executeFanOut
169
+ // -------------------------------------------------------------------------
170
+ /**
171
+ * Execute multiple independent tasks in parallel with a concurrency limit.
172
+ *
173
+ * @example
174
+ * ```typescript
175
+ * const results = await client.executeFanOut([
176
+ * { prompt: 'Analyze liability clauses', model: 'sonnet' },
177
+ * { prompt: 'Check IP provisions', model: 'sonnet' },
178
+ * { prompt: 'Review termination terms', model: 'sonnet' },
179
+ * ], 3);
180
+ * ```
181
+ */
182
+ async executeFanOut(tasks, maxParallel = 5) {
183
+ if (tasks.length === 0) {
184
+ return [];
185
+ }
186
+ for (const task of tasks) {
187
+ const parsed = TaskInputSchema.safeParse(task);
188
+ if (!parsed.success) {
189
+ throw new DevTeamValidationError(`Invalid task input: ${parsed.error.issues.map((i) => i.message).join(', ')}`);
190
+ }
191
+ }
192
+ return parallelLimit(tasks, maxParallel, (task) => this.createTask(task));
193
+ }
194
+ // -------------------------------------------------------------------------
195
+ // HITL: approveTask
196
+ // -------------------------------------------------------------------------
197
+ /**
198
+ * Submit an approval decision for a task awaiting human review.
199
+ *
200
+ * @example
201
+ * ```typescript
202
+ * await client.approveTask('task-abc123', 'approve');
203
+ * await client.approveTask('task-def456', 'reject', 'Too aggressive strategy');
204
+ * await client.approveTask('task-ghi789', 'modify', 'Use conservative approach instead');
205
+ * ```
206
+ */
207
+ async approveTask(taskId, decision, feedback) {
208
+ if (!taskId) {
209
+ throw new DevTeamValidationError('Task ID must not be empty');
210
+ }
211
+ await this.request('POST', `/api/v1/tasks/${taskId}/approve`, {
212
+ decision,
213
+ feedback,
214
+ namespace: this.namespace,
215
+ });
216
+ }
217
+ // -------------------------------------------------------------------------
218
+ // HITL: getPendingApprovals
219
+ // -------------------------------------------------------------------------
220
+ /**
221
+ * Retrieve all tasks currently awaiting human approval.
222
+ *
223
+ * @example
224
+ * ```typescript
225
+ * const approvals = await client.getPendingApprovals();
226
+ * for (const approval of approvals) {
227
+ * console.log(`${approval.taskId}: ${approval.description}`);
228
+ * }
229
+ * ```
230
+ */
231
+ async getPendingApprovals() {
232
+ return this.request('GET', '/api/v1/approvals', {
233
+ namespace: this.namespace,
234
+ });
235
+ }
236
+ // -------------------------------------------------------------------------
237
+ // Templates: deployTemplate
238
+ // -------------------------------------------------------------------------
239
+ /**
240
+ * Deploy a pre-built workflow template with custom inputs.
241
+ * Returns the workflow ID for tracking.
242
+ *
243
+ * @example
244
+ * ```typescript
245
+ * const workflowId = await client.deployTemplate('legal-contract-review-v1', {
246
+ * contract_file: './contract.pdf',
247
+ * jurisdiction: 'US-NY',
248
+ * });
249
+ * ```
250
+ */
251
+ async deployTemplate(templateId, inputs) {
252
+ if (!templateId) {
253
+ throw new DevTeamValidationError('Template ID must not be empty');
254
+ }
255
+ const response = await this.request('POST', `/api/v1/templates/${templateId}/deploy`, {
256
+ inputs,
257
+ namespace: this.namespace,
258
+ });
259
+ return response.workflowId;
260
+ }
261
+ // -------------------------------------------------------------------------
262
+ // Templates: listTemplates
263
+ // -------------------------------------------------------------------------
264
+ /**
265
+ * List available workflow templates with optional filtering.
266
+ *
267
+ * @example
268
+ * ```typescript
269
+ * const templates = await client.listTemplates({ industry: 'legal', category: 'review' });
270
+ * ```
271
+ */
272
+ async listTemplates(filter) {
273
+ const params = new URLSearchParams();
274
+ if (filter?.industry)
275
+ params.set('industry', filter.industry);
276
+ if (filter?.category)
277
+ params.set('category', filter.category);
278
+ const query = params.toString();
279
+ const path = `/api/v1/templates${query ? `?${query}` : ''}`;
280
+ return this.request('GET', path);
281
+ }
282
+ // -------------------------------------------------------------------------
283
+ // Monitoring: getTaskStatus
284
+ // -------------------------------------------------------------------------
285
+ /**
286
+ * Get the current status of a task, including progress and logs.
287
+ *
288
+ * @example
289
+ * ```typescript
290
+ * const status = await client.getTaskStatus('task-abc123');
291
+ * console.log(`${status.status} - ${status.progress}%`);
292
+ * ```
293
+ */
294
+ async getTaskStatus(taskId) {
295
+ if (!taskId) {
296
+ throw new DevTeamValidationError('Task ID must not be empty');
297
+ }
298
+ return this.request('GET', `/api/v1/tasks/${taskId}/status`);
299
+ }
300
+ // -------------------------------------------------------------------------
301
+ // Monitoring: getWorkers
302
+ // -------------------------------------------------------------------------
303
+ /**
304
+ * List all registered worker nodes and their current state.
305
+ *
306
+ * @example
307
+ * ```typescript
308
+ * const workers = await client.getWorkers();
309
+ * const online = workers.filter(w => w.online);
310
+ * console.log(`${online.length}/${workers.length} workers online`);
311
+ * ```
312
+ */
313
+ async getWorkers() {
314
+ return this.request('GET', '/api/v1/workers');
315
+ }
316
+ // -------------------------------------------------------------------------
317
+ // Monitoring: onTaskComplete
318
+ // -------------------------------------------------------------------------
319
+ /**
320
+ * Subscribe to task completion events via polling. Returns an unsubscribe
321
+ * function.
322
+ *
323
+ * @example
324
+ * ```typescript
325
+ * const unsubscribe = client.onTaskComplete((result) => {
326
+ * console.log(`Task ${result.taskId} completed: ${result.status}`);
327
+ * });
328
+ *
329
+ * // Later, stop listening
330
+ * unsubscribe();
331
+ * ```
332
+ */
333
+ onTaskComplete(callback) {
334
+ const seenIds = new Set();
335
+ const pollIntervalMs = 2000;
336
+ const interval = setInterval(async () => {
337
+ try {
338
+ const events = await this.request('GET', '/api/v1/events/completions', { namespace: this.namespace });
339
+ for (const result of events) {
340
+ if (!seenIds.has(result.taskId)) {
341
+ seenIds.add(result.taskId);
342
+ callback(result);
343
+ }
344
+ }
345
+ }
346
+ catch {
347
+ // Silently ignore polling errors; they are transient
348
+ if (this.debug) {
349
+ console.error('[devteam-sdk] Polling error (suppressed)');
350
+ }
351
+ }
352
+ }, pollIntervalMs);
353
+ this.pollingIntervals.add(interval);
354
+ return () => {
355
+ clearInterval(interval);
356
+ this.pollingIntervals.delete(interval);
357
+ };
358
+ }
359
+ // -------------------------------------------------------------------------
360
+ // Cleanup
361
+ // -------------------------------------------------------------------------
362
+ /**
363
+ * Disconnect the client and clean up all background polling.
364
+ */
365
+ disconnect() {
366
+ for (const interval of this.pollingIntervals) {
367
+ clearInterval(interval);
368
+ }
369
+ this.pollingIntervals.clear();
370
+ }
371
+ // -------------------------------------------------------------------------
372
+ // Internal HTTP transport
373
+ // -------------------------------------------------------------------------
374
+ async request(method, path, body) {
375
+ const url = `${this.serverUrl}${path}`;
376
+ const controller = new AbortController();
377
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
378
+ if (this.debug) {
379
+ console.debug(`[devteam-sdk] ${method} ${url}`);
380
+ }
381
+ try {
382
+ const headers = {
383
+ 'Authorization': `Bearer ${this.apiKey}`,
384
+ 'Content-Type': 'application/json',
385
+ 'X-DevTeam-Namespace': this.namespace,
386
+ 'X-DevTeam-SDK': '@devteam/sdk@0.1.0',
387
+ };
388
+ const fetchOptions = {
389
+ method,
390
+ headers,
391
+ signal: controller.signal,
392
+ };
393
+ if (body && method !== 'GET') {
394
+ fetchOptions.body = JSON.stringify(body);
395
+ }
396
+ const response = await fetch(url, fetchOptions);
397
+ if (!response.ok) {
398
+ const errorBody = await response.text().catch(() => '');
399
+ let errorData = {};
400
+ try {
401
+ errorData = JSON.parse(errorBody);
402
+ }
403
+ catch {
404
+ // Not JSON, use raw text
405
+ }
406
+ throw new DevTeamError(errorData.message ?? `HTTP ${response.status}: ${response.statusText}`, errorData.code ?? `HTTP_${response.status}`, response.status, errorData.requestId);
407
+ }
408
+ // Handle 204 No Content
409
+ if (response.status === 204) {
410
+ return undefined;
411
+ }
412
+ const json = (await response.json());
413
+ if (json.error) {
414
+ throw new DevTeamError(json.error.message, json.error.code, response.status, json.requestId);
415
+ }
416
+ return json.data;
417
+ }
418
+ catch (err) {
419
+ if (err instanceof DevTeamError)
420
+ throw err;
421
+ if (err instanceof DOMException && err.name === 'AbortError') {
422
+ throw new DevTeamTimeoutError(`Request to ${method} ${path} timed out after ${this.timeoutMs}ms`);
423
+ }
424
+ throw new DevTeamError(err instanceof Error ? err.message : String(err), 'NETWORK_ERROR');
425
+ }
426
+ finally {
427
+ clearTimeout(timeout);
428
+ }
429
+ }
430
+ }
431
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { DevTeamClient } from './client.js';
2
+ export { DevTeamError, DevTeamValidationError, DevTeamTimeoutError, } from './client.js';
3
+ export type { DevTeamClientOptions, TaskInput, TaskResult, TaskStatus, TaskState, TaskPriority, TaskError, TaskLog, TokenUsage, RetryPolicy, ModelId, Plan, PlanOptions, PlanSubtask, DAGResult, Approval, ApprovalDecision, Template, TemplateFilter, TemplateInputField, Worker, ApiResponse, PaginatedResponse, TaskCompleteCallback, EventSubscription, } from './types.js';
4
+ export { TaskInputSchema, PlanOptionsSchema, DevTeamClientOptionsSchema, } from './types.js';
5
+ export { topologicalSort, planToTaskInputs, aggregateUsage, isPlanComplete, buildDAGResult, chunk, parallelLimit, withRetry, } from './workflows.js';
6
+ export type { RetryConfig } from './workflows.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAGrB,YAAY,EAEV,oBAAoB,EAGpB,SAAS,EACT,UAAU,EACV,UAAU,EACV,SAAS,EACT,YAAY,EACZ,SAAS,EACT,OAAO,EACP,UAAU,EACV,WAAW,EACX,OAAO,EAGP,IAAI,EACJ,WAAW,EACX,WAAW,EACX,SAAS,EAGT,QAAQ,EACR,gBAAgB,EAGhB,QAAQ,EACR,cAAc,EACd,kBAAkB,EAGlB,MAAM,EAGN,WAAW,EACX,iBAAiB,EAGjB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,cAAc,EACd,KAAK,EACL,aAAa,EACb,SAAS,GACV,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ // @devteam/sdk - Orchestrate AI agent swarms with Temporal in 10 lines of code
2
+ //
3
+ // Usage:
4
+ // import { DevTeamClient } from '@devteam/sdk';
5
+ //
6
+ // const client = new DevTeamClient({
7
+ // serverUrl: 'https://devteam.marsala.dev',
8
+ // apiKey: 'dt_...',
9
+ // });
10
+ // Client
11
+ export { DevTeamClient } from './client.js';
12
+ export { DevTeamError, DevTeamValidationError, DevTeamTimeoutError, } from './client.js';
13
+ // Zod schemas (for runtime validation in consumer code)
14
+ export { TaskInputSchema, PlanOptionsSchema, DevTeamClientOptionsSchema, } from './types.js';
15
+ // Workflow utilities (advanced usage)
16
+ export { topologicalSort, planToTaskInputs, aggregateUsage, isPlanComplete, buildDAGResult, chunk, parallelLimit, withRetry, } from './workflows.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,SAAS;AACT,kDAAkD;AAClD,EAAE;AACF,uCAAuC;AACvC,gDAAgD;AAChD,wBAAwB;AACxB,QAAQ;AAER,SAAS;AACT,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AA8CrB,wDAAwD;AACxD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AAEpB,sCAAsC;AACtC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,cAAc,EACd,KAAK,EACL,aAAa,EACb,SAAS,GACV,MAAM,gBAAgB,CAAC"}