@usestratus/sdk 1.7.0 → 1.9.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 CHANGED
@@ -18,12 +18,13 @@ A TypeScript agent SDK purpose-built for Azure OpenAI.
18
18
  - **One line to start** — `createModel()` reads your env vars. No config objects, no API version guessing.
19
19
  - **One interface, two backends** — Chat Completions and Responses API through the same agent, tool, and session code.
20
20
  - **Agents that compose** — handoffs, subagents, guardrails, and hooks in a single run loop. Deny or modify tool calls at runtime.
21
+ - **Workflow orchestration** — fan out bounded parallel agent tasks, stream progress events, resume completed work from snapshots, and synthesize the final answer.
21
22
  - **Human-in-the-loop** — permission callbacks, per-tool approval, glob-filtered tools, and graceful mid-run interrupts.
22
23
  - **State you own** — save, resume, and fork conversations as JSON. No server-side threads.
23
24
  - **Type-safe end to end** — Zod schemas drive parameters, structured output, and validation. Types flow through agents, hooks, and guardrails at compile time.
24
- - **Zero dep** — only Zod as a peer dep.
25
+ - **Tiny dependency surface** — Zod as a peer dep, with optional Effect integration when you want it.
25
26
 
26
- `agents` `tools` `streaming` `structured output` `handoffs` `subagents` `guardrails` `hooks` `tracing` `sessions` `abort signals` `code mode` `todo tracking` `cost tracking` `human-in-the-loop` `predicted output` `audio` `data sources` `context compaction` `background tasks` `testing utilities` `debug mode`
27
+ `agents` `tools` `streaming` `structured output` `handoffs` `subagents` `workflows` `guardrails` `hooks` `tracing` `sessions` `abort signals` `code mode` `todo tracking` `cost tracking` `human-in-the-loop` `predicted output` `audio` `data sources` `context compaction` `background tasks` `testing utilities` `debug mode`
27
28
 
28
29
  ## Install
29
30
 
@@ -264,6 +265,87 @@ const parentAgent = new Agent({
264
265
  });
265
266
  ```
266
267
 
268
+ ### Workflows
269
+
270
+ Use workflows when the orchestration itself should live in code: audits, migrations, research passes, and verification loops that need many agents without stuffing every intermediate result into one conversation.
271
+
272
+ ```ts
273
+ import { Agent, createModel, runWorkflow, workflow, workflowTask } from "@usestratus/sdk";
274
+
275
+ const model = createModel();
276
+
277
+ const reviewer = new Agent({
278
+ name: "reviewer",
279
+ instructions: "Review the target carefully and report concrete findings only.",
280
+ model,
281
+ });
282
+
283
+ const synthesizer = new Agent({
284
+ name: "synthesizer",
285
+ instructions: "Merge independent findings into a concise final report.",
286
+ model,
287
+ });
288
+
289
+ const auditWorkflow = workflow({
290
+ name: "parallel-audit",
291
+ run: async (ctx, files: string[]) => {
292
+ const findings = await ctx.phase(
293
+ "review files",
294
+ files.map((file) =>
295
+ workflowTask({
296
+ id: file,
297
+ name: `review ${file}`,
298
+ agent: reviewer,
299
+ input: `Audit ${file} for correctness, security, and missing tests.`,
300
+ metadata: { file },
301
+ }),
302
+ ),
303
+ { concurrency: 8, failFast: false },
304
+ );
305
+
306
+ const synthesis = await ctx.synthesize(
307
+ synthesizer,
308
+ findings
309
+ .map((finding) => `## ${finding.name}\n${finding.output || finding.error}`)
310
+ .join("\n\n"),
311
+ );
312
+
313
+ return synthesis.output;
314
+ },
315
+ });
316
+
317
+ const result = await runWorkflow(auditWorkflow, [
318
+ "src/routes/users.ts",
319
+ "src/routes/billing.ts",
320
+ ]);
321
+
322
+ console.log(result.output);
323
+ console.log(result.usage.totalTokens);
324
+ ```
325
+
326
+ Workflows support:
327
+ - Bounded parallel phases (`concurrency`, capped by `maxConcurrency`)
328
+ - Progress streaming with `streamWorkflow()`
329
+ - Anthropic-style helpers: `ctx.fanOutAndSynthesize()`, `ctx.adversarialVerify()`, `ctx.generateAndFilter()`, `ctx.tournament()`, and `ctx.loopUntilDone()`
330
+ - Token, cost, and duration guardrails through `budget`
331
+ - Managed runs with `WorkflowRunManager` for event collection, stop, restart, and snapshot resume
332
+ - Generated workflow drafts with `generateWorkflowDraft()` so users can preview the plan and script before running it
333
+ - Saved workflow discovery/loading from `.stratus/workflows`
334
+ - `AbortSignal` cancellation
335
+ - `failFast: false` phases for tolerant audit-style runs
336
+ - `resumeFrom` snapshots that skip completed task IDs
337
+ - Custom function tasks for non-model work alongside agent tasks
338
+
339
+ ```ts
340
+ const result = await runWorkflow(auditWorkflow, files, {
341
+ concurrency: 8,
342
+ maxTasks: 1000,
343
+ budget: { maxTotalTokens: 50_000, maxDurationMs: 10 * 60_000 },
344
+ });
345
+ ```
346
+
347
+ Budget checks run after tasks or synthesis calls complete, so concurrent phases can overshoot a threshold before the workflow stops. Use conservative concurrency for strict spend control.
348
+
267
349
  ### Guardrails
268
350
 
269
351
  Validate inputs and outputs with guardrails:
@@ -39,4 +39,12 @@ export type { AssistantMessage, AudioConfig, AudioFormat, AudioVoice, ChatMessag
39
39
  export { zodToJsonSchema } from "./utils/zod";
40
40
  export type { ValidationResult } from "./validate-agent";
41
41
  export { validateAgent } from "./validate-agent";
42
+ export type { GenerateWorkflowDraftOptions, WorkflowDraft, WorkflowDraftPhase, } from "./workflow-draft";
43
+ export { generateWorkflowDraft } from "./workflow-draft";
44
+ export type { ManagedWorkflowRunStatus, WorkflowRunHandle } from "./workflow-manager";
45
+ export { WorkflowRunManager } from "./workflow-manager";
46
+ export type { DiscoverSavedWorkflowsOptions, LoadedWorkflowModule, SavedWorkflowInfo, SavedWorkflowScope, } from "./workflow-saved";
47
+ export { discoverSavedWorkflows, loadWorkflowModule } from "./workflow-saved";
48
+ export type { StreamedWorkflowResult, Workflow, WorkflowAdversarialVerificationConfig, WorkflowAdversarialVerificationResult, WorkflowAgentTask, WorkflowBudget, WorkflowConfig, WorkflowEvent, WorkflowFanOutAndSynthesizeConfig, WorkflowFanOutAndSynthesizeResult, WorkflowFunctionTask, WorkflowGenerateAndFilterConfig, WorkflowGenerateAndFilterResult, WorkflowLoopStepResult, WorkflowLoopUntilDoneConfig, WorkflowLoopUntilDoneResult, WorkflowOptions, WorkflowPhaseOptions, WorkflowPhaseResult, WorkflowPhaseStatus, WorkflowRunResult, WorkflowRunSnapshot, WorkflowRunStatus, WorkflowRuntimeContext, WorkflowTournamentConfig, WorkflowTournamentResult, WorkflowTask, WorkflowTaskBase, WorkflowTaskExecuteParams, WorkflowTaskResult, WorkflowTaskStatus, } from "./workflow";
49
+ export { runWorkflow, streamWorkflow, workflow, workflowTask } from "./workflow";
42
50
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
@@ -19,4 +19,8 @@ export { tool, toolToDefinition } from "./tool";
19
19
  export { AzureMonitorTraceExporter, addTraceProcessor, clearTraceProcessors, createAzureMonitorTraceExporter, getCurrentTrace, setTraceProcessors, TraceContext, withTrace, } from "./tracing";
20
20
  export { zodToJsonSchema } from "./utils/zod";
21
21
  export { validateAgent } from "./validate-agent";
22
+ export { generateWorkflowDraft } from "./workflow-draft";
23
+ export { WorkflowRunManager } from "./workflow-manager";
24
+ export { discoverSavedWorkflows, loadWorkflowModule } from "./workflow-saved";
25
+ export { runWorkflow, streamWorkflow, workflow, workflowTask } from "./workflow";
22
26
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAQhC,OAAO,EACN,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,OAAO,EACP,aAAa,GACb,MAAM,iBAAiB,CAAC;AASzB,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,cAAc,GACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAE7C,OAAO,EACN,kBAAkB,EAClB,+BAA+B,EAC/B,sBAAsB,EACtB,qBAAqB,EACrB,UAAU,EACV,gCAAgC,EAChC,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,gBAAgB,GAChB,MAAM,UAAU,CAAC;AASlB,OAAO,EACN,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,GACvB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAczD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAYpD,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAe3D,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAO/C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAQvD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpG,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EACN,yBAAyB,EACzB,iBAAiB,EACjB,oBAAoB,EACpB,+BAA+B,EAC/B,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,SAAS,GACT,MAAM,WAAW,CAAC;AAgCnB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAQhC,OAAO,EACN,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,OAAO,EACP,aAAa,GACb,MAAM,iBAAiB,CAAC;AASzB,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,cAAc,GACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAE7C,OAAO,EACN,kBAAkB,EAClB,+BAA+B,EAC/B,sBAAsB,EACtB,qBAAqB,EACrB,UAAU,EACV,gCAAgC,EAChC,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,gBAAgB,GAChB,MAAM,UAAU,CAAC;AASlB,OAAO,EACN,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,GACvB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAczD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAYpD,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAe3D,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAO/C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAQvD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpG,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EACN,yBAAyB,EACzB,iBAAiB,EACjB,oBAAoB,EACpB,+BAA+B,EAC/B,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,SAAS,GACT,MAAM,WAAW,CAAC;AA8BnB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAOxD,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAkC9E,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { Agent } from "./agent";
2
+ import type { InterruptedRunResult, RunResult } from "./result";
3
+ import { type RunOptions } from "./run";
4
+ import type { ChatMessage } from "./types";
5
+ export interface WorkflowDraftPhase {
6
+ name: string;
7
+ purpose: string;
8
+ agents?: number;
9
+ verification?: string;
10
+ }
11
+ export interface WorkflowDraft {
12
+ name: string;
13
+ description?: string;
14
+ phases: WorkflowDraftPhase[];
15
+ script: string;
16
+ estimatedTasks?: number;
17
+ budget?: {
18
+ maxTotalTokens?: number;
19
+ maxDurationMs?: number;
20
+ };
21
+ warnings: string[];
22
+ rawOutput: string;
23
+ runResult: RunResult | InterruptedRunResult;
24
+ }
25
+ export interface GenerateWorkflowDraftOptions<TContext = unknown> extends Omit<RunOptions<TContext>, "context"> {
26
+ context?: TContext;
27
+ goal?: string;
28
+ constraints?: string[];
29
+ patterns?: string[];
30
+ }
31
+ export declare function generateWorkflowDraft<TContext = unknown>(agent: Agent<TContext>, prompt: string | ChatMessage[], options?: GenerateWorkflowDraftOptions<TContext>): Promise<WorkflowDraft>;
32
+ //# sourceMappingURL=workflow-draft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-draft.d.ts","sourceRoot":"","sources":["../../src/core/workflow-draft.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAE,KAAK,UAAU,EAAO,MAAM,OAAO,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE;QACR,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,GAAG,oBAAoB,CAAC;CAC5C;AAED,MAAM,WAAW,4BAA4B,CAAC,QAAQ,GAAG,OAAO,CAC/D,SAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC7C,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAsB,qBAAqB,CAAC,QAAQ,GAAG,OAAO,EAC7D,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,EACtB,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,EAC9B,OAAO,GAAE,4BAA4B,CAAC,QAAQ,CAAM,GAClD,OAAO,CAAC,aAAa,CAAC,CAiBxB"}
@@ -0,0 +1,84 @@
1
+ import { run } from "./run";
2
+ export async function generateWorkflowDraft(agent, prompt, options = {}) {
3
+ const result = await run(agent, buildDraftPrompt(prompt, options), {
4
+ ...options,
5
+ context: options.context,
6
+ });
7
+ const parsed = parseDraft(result.output);
8
+ return {
9
+ name: parsed.name,
10
+ description: parsed.description,
11
+ phases: parsed.phases,
12
+ script: parsed.script,
13
+ estimatedTasks: parsed.estimatedTasks,
14
+ budget: parsed.budget,
15
+ warnings: parsed.warnings ?? [],
16
+ rawOutput: result.output,
17
+ runResult: result,
18
+ };
19
+ }
20
+ function buildDraftPrompt(prompt, options) {
21
+ const body = typeof prompt === "string" ? prompt : JSON.stringify(prompt);
22
+ const constraints = options.constraints?.map((item) => `- ${item}`).join("\n") ?? "- none";
23
+ const patterns = options.patterns?.map((item) => `- ${item}`).join("\n") ??
24
+ "- fan-out-and-synthesize\n- adversarial-verification\n- loop-until-done";
25
+ return `Create a Stratus dynamic workflow draft for this request.
26
+
27
+ Return only JSON with this exact shape:
28
+ {
29
+ "name": "kebab-case-name",
30
+ "description": "short human summary",
31
+ "phases": [{"name":"phase name","purpose":"why it exists","agents":3,"verification":"how results are checked"}],
32
+ "script": "TypeScript workflow code using @usestratus/sdk workflow APIs",
33
+ "estimatedTasks": 12,
34
+ "budget": {"maxTotalTokens": 50000, "maxDurationMs": 600000},
35
+ "warnings": ["token usage can be high"]
36
+ }
37
+
38
+ Goal:
39
+ ${options.goal ?? body}
40
+
41
+ Requested workflow:
42
+ ${body}
43
+
44
+ Preferred patterns:
45
+ ${patterns}
46
+
47
+ Constraints:
48
+ ${constraints}`;
49
+ }
50
+ function parseDraft(output) {
51
+ const json = extractJsonObject(output);
52
+ const parsed = JSON.parse(json);
53
+ return {
54
+ name: typeof parsed.name === "string" && parsed.name ? parsed.name : "generated-workflow",
55
+ description: typeof parsed.description === "string" ? parsed.description : undefined,
56
+ phases: Array.isArray(parsed.phases)
57
+ ? parsed.phases.map((phase) => ({
58
+ name: String(phase.name ?? "phase"),
59
+ purpose: String(phase.purpose ?? ""),
60
+ agents: typeof phase.agents === "number"
61
+ ? phase.agents
62
+ : undefined,
63
+ verification: typeof phase.verification === "string"
64
+ ? phase.verification
65
+ : undefined,
66
+ }))
67
+ : [],
68
+ script: typeof parsed.script === "string" ? parsed.script : "",
69
+ estimatedTasks: typeof parsed.estimatedTasks === "number" ? parsed.estimatedTasks : undefined,
70
+ budget: parsed.budget,
71
+ warnings: Array.isArray(parsed.warnings) ? parsed.warnings.map(String) : [],
72
+ };
73
+ }
74
+ function extractJsonObject(output) {
75
+ const fenced = output.match(/```(?:json)?\s*([\s\S]*?)```/i);
76
+ if (fenced?.[1])
77
+ return fenced[1].trim();
78
+ const start = output.indexOf("{");
79
+ const end = output.lastIndexOf("}");
80
+ if (start >= 0 && end > start)
81
+ return output.slice(start, end + 1);
82
+ throw new Error("Workflow draft response did not contain a JSON object");
83
+ }
84
+ //# sourceMappingURL=workflow-draft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-draft.js","sourceRoot":"","sources":["../../src/core/workflow-draft.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Workflow, WorkflowEvent, WorkflowOptions, WorkflowRunResult, WorkflowRunSnapshot } from "./workflow";
2
+ export type ManagedWorkflowRunStatus = "running" | "completed" | "failed" | "stopped";
3
+ export interface WorkflowRunHandle<TArgs = unknown, TOutput = string> {
4
+ readonly id: string;
5
+ readonly workflow: Workflow<TArgs, TOutput>;
6
+ readonly args: TArgs;
7
+ readonly events: WorkflowEvent<TOutput>[];
8
+ readonly result: Promise<WorkflowRunResult<TOutput>>;
9
+ readonly status: ManagedWorkflowRunStatus;
10
+ readonly snapshot: WorkflowRunSnapshot<TOutput>;
11
+ onEvent(listener: (event: WorkflowEvent<TOutput>) => void): () => void;
12
+ stop(): void;
13
+ }
14
+ export declare class WorkflowRunManager {
15
+ private readonly runs;
16
+ start<TArgs, TOutput = string>(wf: Workflow<TArgs, TOutput>, args: TArgs, options?: WorkflowOptions): WorkflowRunHandle<TArgs, TOutput>;
17
+ get<TArgs = unknown, TOutput = string>(id: string): WorkflowRunHandle<TArgs, TOutput> | undefined;
18
+ list(): WorkflowRunHandle[];
19
+ stop(id: string): boolean;
20
+ resume<TArgs, TOutput>(run: WorkflowRunHandle<TArgs, TOutput>): WorkflowRunHandle<TArgs, TOutput>;
21
+ resume<TArgs, TOutput = string>(id: string): WorkflowRunHandle<TArgs, TOutput>;
22
+ restart<TArgs, TOutput = string>(id: string): WorkflowRunHandle<TArgs, TOutput>;
23
+ private requireRun;
24
+ }
25
+ //# sourceMappingURL=workflow-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-manager.d.ts","sourceRoot":"","sources":["../../src/core/workflow-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,QAAQ,EACR,aAAa,EACb,eAAe,EAEf,iBAAiB,EACjB,mBAAmB,EACnB,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtF,MAAM,WAAW,iBAAiB,CAAC,KAAK,GAAG,OAAO,EAAE,OAAO,GAAG,MAAM;IACnE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACvE,IAAI,IAAI,IAAI,CAAC;CACb;AAQD,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAyD;IAE9E,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAC5B,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,KAAK,EACX,OAAO,GAAE,eAAoB,GAC3B,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC;IAoFpC,GAAG,CAAC,KAAK,GAAG,OAAO,EAAE,OAAO,GAAG,MAAM,EACpC,EAAE,EAAE,MAAM,GACR,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,SAAS;IAIhD,IAAI,IAAI,iBAAiB,EAAE;IAI3B,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAOzB,MAAM,CAAC,KAAK,EAAE,OAAO,EACpB,GAAG,EAAE,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,GACpC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC;IACpC,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC;IAW9E,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC;IAK/E,OAAO,CAAC,UAAU;CAKlB"}
@@ -0,0 +1,178 @@
1
+ import { RunAbortedError } from "./errors";
2
+ import { streamWorkflow } from "./workflow";
3
+ export class WorkflowRunManager {
4
+ runs = new Map();
5
+ start(wf, args, options = {}) {
6
+ const id = options.id ?? createManagedRunId();
7
+ const controller = new AbortController();
8
+ const signal = mergeAbortSignals(controller.signal, options.signal);
9
+ const listeners = new Set();
10
+ const events = [];
11
+ let phases = [];
12
+ let usage = emptyUsage();
13
+ let numTurns = 0;
14
+ let totalCostUsd = 0;
15
+ const startedAt = new Date();
16
+ let latestSnapshot;
17
+ const streamed = streamWorkflow(wf, args, { ...options, id, signal });
18
+ const handle = {
19
+ id,
20
+ workflow: wf,
21
+ args,
22
+ events,
23
+ status: "running",
24
+ result: streamed.result
25
+ .then((result) => {
26
+ handle.status = "completed";
27
+ latestSnapshot = result;
28
+ return result;
29
+ })
30
+ .catch((error) => {
31
+ handle.status = error instanceof RunAbortedError ? "stopped" : "failed";
32
+ throw error;
33
+ })
34
+ .finally(() => {
35
+ this.runs.set(id, handle);
36
+ }),
37
+ get snapshot() {
38
+ if (latestSnapshot)
39
+ return latestSnapshot;
40
+ return buildManagedSnapshot({
41
+ id,
42
+ name: wf.name,
43
+ status: handle.status,
44
+ output: "",
45
+ phases,
46
+ usage,
47
+ numTurns,
48
+ totalCostUsd,
49
+ startedAt,
50
+ });
51
+ },
52
+ onEvent(listener) {
53
+ listeners.add(listener);
54
+ return () => listeners.delete(listener);
55
+ },
56
+ stop() {
57
+ controller.abort();
58
+ },
59
+ emit(event) {
60
+ events.push(event);
61
+ if (event.type === "workflow_phase_completed") {
62
+ phases = [...phases, event.phase];
63
+ const totals = aggregatePhaseTotals(phases);
64
+ usage = totals.usage;
65
+ numTurns = totals.numTurns;
66
+ totalCostUsd = totals.totalCostUsd;
67
+ latestSnapshot = undefined;
68
+ }
69
+ if (event.type === "workflow_completed") {
70
+ phases = event.result.phases;
71
+ usage = event.result.usage;
72
+ numTurns = event.result.numTurns;
73
+ totalCostUsd = event.result.totalCostUsd;
74
+ latestSnapshot = event.result;
75
+ }
76
+ for (const listener of listeners)
77
+ listener(event);
78
+ },
79
+ };
80
+ this.runs.set(id, handle);
81
+ void (async () => {
82
+ for await (const event of streamed.stream) {
83
+ handle.emit(event);
84
+ }
85
+ })();
86
+ return handle;
87
+ }
88
+ get(id) {
89
+ return this.runs.get(id);
90
+ }
91
+ list() {
92
+ return [...this.runs.values()];
93
+ }
94
+ stop(id) {
95
+ const run = this.runs.get(id);
96
+ if (!run || run.status !== "running")
97
+ return false;
98
+ run.stop();
99
+ return true;
100
+ }
101
+ resume(target) {
102
+ const run = typeof target === "string" ? this.requireRun(target) : target;
103
+ return this.start(run.workflow, run.args, {
104
+ id: createManagedRunId(),
105
+ resumeFrom: run.snapshot,
106
+ });
107
+ }
108
+ restart(id) {
109
+ const run = this.requireRun(id);
110
+ return this.start(run.workflow, run.args, { id: createManagedRunId() });
111
+ }
112
+ requireRun(id) {
113
+ const run = this.runs.get(id);
114
+ if (!run)
115
+ throw new Error(`Unknown workflow run: ${id}`);
116
+ return run;
117
+ }
118
+ }
119
+ function mergeAbortSignals(primary, secondary) {
120
+ if (!secondary)
121
+ return primary;
122
+ if (secondary.aborted) {
123
+ const controller = new AbortController();
124
+ controller.abort();
125
+ return controller.signal;
126
+ }
127
+ const controller = new AbortController();
128
+ const abort = () => controller.abort();
129
+ primary.addEventListener("abort", abort, { once: true });
130
+ secondary.addEventListener("abort", abort, { once: true });
131
+ return controller.signal;
132
+ }
133
+ function buildManagedSnapshot(params) {
134
+ const completedAt = new Date();
135
+ return {
136
+ id: params.id,
137
+ name: params.name,
138
+ status: params.status,
139
+ output: params.output,
140
+ phases: params.phases,
141
+ usage: params.usage,
142
+ numTurns: params.numTurns,
143
+ totalCostUsd: params.totalCostUsd,
144
+ startedAt: params.startedAt.toISOString(),
145
+ completedAt: completedAt.toISOString(),
146
+ durationMs: completedAt.getTime() - params.startedAt.getTime(),
147
+ };
148
+ }
149
+ function aggregatePhaseTotals(phases) {
150
+ const usage = emptyUsage();
151
+ let numTurns = 0;
152
+ let totalCostUsd = 0;
153
+ for (const phase of phases) {
154
+ for (const task of phase.tasks) {
155
+ usage.promptTokens += task.usage.promptTokens;
156
+ usage.completionTokens += task.usage.completionTokens;
157
+ usage.totalTokens += task.usage.totalTokens;
158
+ usage.cacheReadTokens = addOptional(usage.cacheReadTokens, task.usage.cacheReadTokens);
159
+ usage.cacheCreationTokens = addOptional(usage.cacheCreationTokens, task.usage.cacheCreationTokens);
160
+ usage.reasoningTokens = addOptional(usage.reasoningTokens, task.usage.reasoningTokens);
161
+ numTurns += task.numTurns;
162
+ totalCostUsd += task.totalCostUsd;
163
+ }
164
+ }
165
+ return { usage, numTurns, totalCostUsd };
166
+ }
167
+ function emptyUsage() {
168
+ return { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
169
+ }
170
+ function addOptional(current, next) {
171
+ if (next === undefined)
172
+ return current;
173
+ return (current ?? 0) + next;
174
+ }
175
+ function createManagedRunId() {
176
+ return `wf_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
177
+ }
178
+ //# sourceMappingURL=workflow-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-manager.js","sourceRoot":"","sources":["../../src/core/workflow-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Workflow } from "./workflow";
2
+ export type SavedWorkflowScope = "project" | "user";
3
+ export interface SavedWorkflowInfo {
4
+ name: string;
5
+ path: string;
6
+ scope: SavedWorkflowScope;
7
+ }
8
+ export interface DiscoverSavedWorkflowsOptions {
9
+ cwd?: string;
10
+ includeUser?: boolean;
11
+ includeProject?: boolean;
12
+ }
13
+ export interface LoadedWorkflowModule<TArgs = unknown, TOutput = string> {
14
+ workflow?: Workflow<TArgs, TOutput>;
15
+ workflows: Workflow<TArgs, TOutput>[];
16
+ module: Record<string, unknown>;
17
+ path: string;
18
+ }
19
+ export declare function discoverSavedWorkflows(options?: DiscoverSavedWorkflowsOptions): Promise<SavedWorkflowInfo[]>;
20
+ export declare function loadWorkflowModule<TArgs = unknown, TOutput = string>(filePath: string): Promise<LoadedWorkflowModule<TArgs, TOutput>>;
21
+ //# sourceMappingURL=workflow-saved.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-saved.d.ts","sourceRoot":"","sources":["../../src/core/workflow-saved.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,kBAAkB,CAAC;CAC1B;AAED,MAAM,WAAW,6BAA6B;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB,CAAC,KAAK,GAAG,OAAO,EAAE,OAAO,GAAG,MAAM;IACtE,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpC,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,sBAAsB,CAC3C,OAAO,GAAE,6BAAkC,GACzC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAyB9B;AAED,wBAAsB,kBAAkB,CAAC,KAAK,GAAG,OAAO,EAAE,OAAO,GAAG,MAAM,EACzE,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAU/C"}
@@ -0,0 +1,79 @@
1
+ import { readdir, stat } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { basename, extname, join, resolve } from "node:path";
4
+ import { pathToFileURL } from "node:url";
5
+ export async function discoverSavedWorkflows(options = {}) {
6
+ const cwd = options.cwd ?? process.cwd();
7
+ const roots = [];
8
+ if (options.includeProject !== false) {
9
+ roots.push({ scope: "project", path: join(cwd, ".stratus", "workflows") });
10
+ }
11
+ if (options.includeUser !== false) {
12
+ roots.push({ scope: "user", path: join(homedir(), ".stratus", "workflows") });
13
+ }
14
+ const workflows = [];
15
+ for (const root of roots) {
16
+ if (!(await exists(root.path)))
17
+ continue;
18
+ for (const entry of await readdir(root.path)) {
19
+ const filePath = join(root.path, entry);
20
+ const fileStat = await stat(filePath);
21
+ if (!fileStat.isFile() || !isWorkflowModule(entry))
22
+ continue;
23
+ workflows.push({
24
+ name: basename(entry, extname(entry)),
25
+ path: filePath,
26
+ scope: root.scope,
27
+ });
28
+ }
29
+ }
30
+ return workflows.sort((left, right) => left.name.localeCompare(right.name));
31
+ }
32
+ export async function loadWorkflowModule(filePath) {
33
+ const resolved = resolve(filePath);
34
+ const module = (await import(pathToFileURL(resolved).href));
35
+ const workflows = collectWorkflows(module);
36
+ return {
37
+ workflow: workflows[0],
38
+ workflows,
39
+ module,
40
+ path: resolved,
41
+ };
42
+ }
43
+ function collectWorkflows(module) {
44
+ const candidates = [
45
+ module.default,
46
+ module.workflow,
47
+ ...(Array.isArray(module.workflows) ? module.workflows : []),
48
+ ...Object.values(module),
49
+ ];
50
+ const seen = new Set();
51
+ const workflows = [];
52
+ for (const candidate of candidates) {
53
+ if (seen.has(candidate))
54
+ continue;
55
+ seen.add(candidate);
56
+ if (isWorkflow(candidate))
57
+ workflows.push(candidate);
58
+ }
59
+ return workflows;
60
+ }
61
+ function isWorkflow(value) {
62
+ return (typeof value === "object" &&
63
+ value !== null &&
64
+ typeof value.name === "string" &&
65
+ typeof value.run === "function");
66
+ }
67
+ function isWorkflowModule(fileName) {
68
+ return [".js", ".mjs", ".ts"].includes(extname(fileName));
69
+ }
70
+ async function exists(path) {
71
+ try {
72
+ await stat(path);
73
+ return true;
74
+ }
75
+ catch {
76
+ return false;
77
+ }
78
+ }
79
+ //# sourceMappingURL=workflow-saved.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-saved.js","sourceRoot":"","sources":["../../src/core/workflow-saved.ts"],"names":[],"mappings":"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"}