@agntk/core 0.2.0 → 0.3.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.
- package/dist/agent-v2.d.ts +48 -0
- package/dist/agent-v2.d.ts.map +1 -0
- package/dist/agent-v2.js +365 -0
- package/dist/agent-v2.js.map +1 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +61 -43
- package/dist/agent.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +16 -4
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/loader.d.ts +14 -6
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +38 -16
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +14 -14
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +1 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/guardrails/runner.d.ts.map +1 -1
- package/dist/guardrails/runner.js +4 -0
- package/dist/guardrails/runner.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/memory/engine.d.ts +130 -0
- package/dist/memory/engine.d.ts.map +1 -0
- package/dist/memory/engine.js +227 -0
- package/dist/memory/engine.js.map +1 -0
- package/dist/memory/vectra-store.d.ts +31 -0
- package/dist/memory/vectra-store.d.ts.map +1 -0
- package/dist/memory/vectra-store.js +122 -0
- package/dist/memory/vectra-store.js.map +1 -0
- package/dist/models.d.ts +24 -1
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +50 -4
- package/dist/models.js.map +1 -1
- package/dist/pool/index.d.ts +7 -0
- package/dist/pool/index.d.ts.map +1 -0
- package/dist/pool/index.js +6 -0
- package/dist/pool/index.js.map +1 -0
- package/dist/pool/specialist-pool.d.ts +59 -0
- package/dist/pool/specialist-pool.d.ts.map +1 -0
- package/dist/pool/specialist-pool.js +224 -0
- package/dist/pool/specialist-pool.js.map +1 -0
- package/dist/pool/tools.d.ts +63 -0
- package/dist/pool/tools.d.ts.map +1 -0
- package/dist/pool/tools.js +83 -0
- package/dist/pool/tools.js.map +1 -0
- package/dist/pool/types.d.ts +79 -0
- package/dist/pool/types.d.ts.map +1 -0
- package/dist/pool/types.js +5 -0
- package/dist/pool/types.js.map +1 -0
- package/dist/presets/index.d.ts +5 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +5 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/presets/role-registry.d.ts +41 -0
- package/dist/presets/role-registry.d.ts.map +1 -0
- package/dist/presets/role-registry.js +213 -0
- package/dist/presets/role-registry.js.map +1 -0
- package/dist/presets/roles.d.ts +105 -0
- package/dist/presets/roles.d.ts.map +1 -0
- package/dist/presets/roles.js +207 -0
- package/dist/presets/roles.js.map +1 -0
- package/dist/presets/tools.d.ts +2 -2
- package/dist/prompts/templates.d.ts +11 -0
- package/dist/prompts/templates.d.ts.map +1 -0
- package/dist/prompts/templates.js +115 -0
- package/dist/prompts/templates.js.map +1 -0
- package/dist/provider-resolver.d.ts +38 -0
- package/dist/provider-resolver.d.ts.map +1 -0
- package/dist/provider-resolver.js +142 -0
- package/dist/provider-resolver.js.map +1 -0
- package/dist/reflection.d.ts +5 -2
- package/dist/reflection.d.ts.map +1 -1
- package/dist/reflection.js +8 -3
- package/dist/reflection.js.map +1 -1
- package/dist/skills/loader.d.ts +18 -0
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +58 -2
- package/dist/skills/loader.js.map +1 -1
- package/dist/streaming/data-parts.d.ts +163 -0
- package/dist/streaming/data-parts.d.ts.map +1 -0
- package/dist/streaming/data-parts.js +14 -0
- package/dist/streaming/data-parts.js.map +1 -0
- package/dist/streaming/index.d.ts +8 -0
- package/dist/streaming/index.d.ts.map +1 -0
- package/dist/streaming/index.js +10 -0
- package/dist/streaming/index.js.map +1 -0
- package/dist/streaming/transient.d.ts +136 -0
- package/dist/streaming/transient.d.ts.map +1 -0
- package/dist/streaming/transient.js +201 -0
- package/dist/streaming/transient.js.map +1 -0
- package/dist/system-detect.d.ts +59 -0
- package/dist/system-detect.d.ts.map +1 -0
- package/dist/system-detect.js +193 -0
- package/dist/system-detect.js.map +1 -0
- package/dist/tools/browser/tool.d.ts +2 -2
- package/dist/tools/browser/types.d.ts +2 -2
- package/dist/tools/file/tools.d.ts.map +1 -1
- package/dist/tools/file/tools.js +30 -1
- package/dist/tools/file/tools.js.map +1 -1
- package/dist/tools/index.d.ts +0 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +0 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/progress/index.d.ts +1 -1
- package/dist/tools/provider.d.ts +97 -0
- package/dist/tools/provider.d.ts.map +1 -0
- package/dist/tools/provider.js +178 -0
- package/dist/tools/provider.js.map +1 -0
- package/dist/tools/shell/background.d.ts.map +1 -1
- package/dist/tools/shell/background.js +45 -3
- package/dist/tools/shell/background.js.map +1 -1
- package/dist/tools/shell/tools.d.ts.map +1 -1
- package/dist/tools/shell/tools.js +9 -2
- package/dist/tools/shell/tools.js.map +1 -1
- package/dist/tools/utils/shell.d.ts +14 -0
- package/dist/tools/utils/shell.d.ts.map +1 -1
- package/dist/tools/utils/shell.js +171 -12
- package/dist/tools/utils/shell.js.map +1 -1
- package/dist/types/agent-v2.d.ts +83 -0
- package/dist/types/agent-v2.d.ts.map +1 -0
- package/dist/types/agent-v2.js +8 -0
- package/dist/types/agent-v2.js.map +1 -0
- package/dist/types/agent.d.ts +10 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/utils/logger.d.ts +35 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +149 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/workflow/builders/adapt.d.ts +20 -0
- package/dist/workflow/builders/adapt.d.ts.map +1 -0
- package/dist/workflow/builders/adapt.js +33 -0
- package/dist/workflow/builders/adapt.js.map +1 -0
- package/dist/workflow/builders/index.d.ts +8 -0
- package/dist/workflow/builders/index.d.ts.map +1 -0
- package/dist/workflow/builders/index.js +7 -0
- package/dist/workflow/builders/index.js.map +1 -0
- package/dist/workflow/builders/parallel.d.ts +25 -0
- package/dist/workflow/builders/parallel.d.ts.map +1 -0
- package/dist/workflow/builders/parallel.js +60 -0
- package/dist/workflow/builders/parallel.js.map +1 -0
- package/dist/workflow/builders/pipeline.d.ts +22 -0
- package/dist/workflow/builders/pipeline.d.ts.map +1 -0
- package/dist/workflow/builders/pipeline.js +48 -0
- package/dist/workflow/builders/pipeline.js.map +1 -0
- package/dist/workflow/builders/types.d.ts +54 -0
- package/dist/workflow/builders/types.d.ts.map +1 -0
- package/dist/workflow/builders/types.js +5 -0
- package/dist/workflow/builders/types.js.map +1 -0
- package/dist/workflow/durable-agent.d.ts +128 -0
- package/dist/workflow/durable-agent.d.ts.map +1 -0
- package/dist/workflow/durable-agent.js +323 -0
- package/dist/workflow/durable-agent.js.map +1 -0
- package/dist/workflow/schedulers.d.ts +231 -0
- package/dist/workflow/schedulers.d.ts.map +1 -0
- package/dist/workflow/schedulers.js +250 -0
- package/dist/workflow/schedulers.js.map +1 -0
- package/dist/workflow/team/create-team.d.ts +34 -0
- package/dist/workflow/team/create-team.d.ts.map +1 -0
- package/dist/workflow/team/create-team.js +242 -0
- package/dist/workflow/team/create-team.js.map +1 -0
- package/dist/workflow/team/index.d.ts +9 -0
- package/dist/workflow/team/index.d.ts.map +1 -0
- package/dist/workflow/team/index.js +8 -0
- package/dist/workflow/team/index.js.map +1 -0
- package/dist/workflow/team/machines.d.ts +152 -0
- package/dist/workflow/team/machines.d.ts.map +1 -0
- package/dist/workflow/team/machines.js +197 -0
- package/dist/workflow/team/machines.js.map +1 -0
- package/dist/workflow/team/task-board.d.ts +47 -0
- package/dist/workflow/team/task-board.d.ts.map +1 -0
- package/dist/workflow/team/task-board.js +111 -0
- package/dist/workflow/team/task-board.js.map +1 -0
- package/dist/workflow/team/tools.d.ts +66 -0
- package/dist/workflow/team/tools.d.ts.map +1 -0
- package/dist/workflow/team/tools.js +100 -0
- package/dist/workflow/team/tools.js.map +1 -0
- package/dist/workflow/team/types.d.ts +109 -0
- package/dist/workflow/team/types.d.ts.map +1 -0
- package/dist/workflow/team/types.js +5 -0
- package/dist/workflow/team/types.js.map +1 -0
- package/dist/workflow/templates.d.ts +71 -0
- package/dist/workflow/templates.d.ts.map +1 -0
- package/dist/workflow/templates.js +132 -0
- package/dist/workflow/templates.js.map +1 -0
- package/package.json +13 -13
- package/LICENSE +0 -22
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @agntk/core - Durable Agent Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates agents with workflow durability features.
|
|
5
|
+
* Uses the Workflow DevKit ("use workflow" / "use step" directives)
|
|
6
|
+
* for crash recovery, auto-retry, and step-level observability.
|
|
7
|
+
*
|
|
8
|
+
* When the `workflow` package is installed and the app runs under the
|
|
9
|
+
* Workflow runtime, every LLM call and tool execution becomes a
|
|
10
|
+
* discrete, checkpointed step. Without the runtime, the directives
|
|
11
|
+
* are inert string literals and the agent operates normally.
|
|
12
|
+
*
|
|
13
|
+
* @see https://useworkflow.dev
|
|
14
|
+
*/
|
|
15
|
+
import { createLogger } from '@agntk/logger';
|
|
16
|
+
const log = createLogger('@agntk/core:workflow:durable');
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Workflow Runtime Detection
|
|
19
|
+
// ============================================================================
|
|
20
|
+
/** Cached availability result */
|
|
21
|
+
let _workflowAvailable = null;
|
|
22
|
+
let _workflowModule = null;
|
|
23
|
+
/**
|
|
24
|
+
* Check if the Workflow DevKit runtime is available.
|
|
25
|
+
* Result is cached after first check.
|
|
26
|
+
*/
|
|
27
|
+
export async function checkWorkflowAvailability() {
|
|
28
|
+
if (_workflowAvailable !== null)
|
|
29
|
+
return _workflowAvailable;
|
|
30
|
+
try {
|
|
31
|
+
_workflowModule = await import('workflow');
|
|
32
|
+
_workflowAvailable = true;
|
|
33
|
+
log.info('Workflow runtime detected');
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch (_e) {
|
|
37
|
+
_workflowAvailable = false;
|
|
38
|
+
log.debug('Workflow runtime not available — durable features disabled');
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get the workflow module (throws if not available).
|
|
44
|
+
*/
|
|
45
|
+
function getWorkflowModule() {
|
|
46
|
+
if (!_workflowModule) {
|
|
47
|
+
throw new Error('Workflow package is not installed. Install it with: npm install workflow\n' +
|
|
48
|
+
'See https://useworkflow.dev for documentation.');
|
|
49
|
+
}
|
|
50
|
+
return _workflowModule;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Reset workflow availability cache (for testing).
|
|
54
|
+
* @internal
|
|
55
|
+
*/
|
|
56
|
+
export function _resetWorkflowCache() {
|
|
57
|
+
_workflowAvailable = null;
|
|
58
|
+
_workflowModule = null;
|
|
59
|
+
}
|
|
60
|
+
// ============================================================================
|
|
61
|
+
// Durable Execution Wrappers
|
|
62
|
+
// ============================================================================
|
|
63
|
+
/**
|
|
64
|
+
* Wrap an agent's generate call as a workflow.
|
|
65
|
+
* The "use workflow" directive marks the entire function as a durable workflow.
|
|
66
|
+
* Named step functions give the workflow inspector descriptive labels.
|
|
67
|
+
*
|
|
68
|
+
* Inspector view: durableGenerateWorkflow → llmGenerate
|
|
69
|
+
*/
|
|
70
|
+
async function durableGenerateWorkflow(agent, prompt) {
|
|
71
|
+
"use workflow";
|
|
72
|
+
log.info('durableGenerateWorkflow started', { promptLength: prompt.length });
|
|
73
|
+
// Named step function — inspector displays "llmGenerate"
|
|
74
|
+
async function llmGenerate() {
|
|
75
|
+
"use step";
|
|
76
|
+
log.debug('step:llmGenerate — executing LLM call');
|
|
77
|
+
return agent.generate({ prompt });
|
|
78
|
+
}
|
|
79
|
+
const result = await llmGenerate();
|
|
80
|
+
const text = await result.text;
|
|
81
|
+
const totalUsage = result.totalUsage;
|
|
82
|
+
log.info('durableGenerateWorkflow completed', { textLength: text?.length ?? 0 });
|
|
83
|
+
return {
|
|
84
|
+
text: text ?? '',
|
|
85
|
+
steps: [{
|
|
86
|
+
name: 'llm-generate',
|
|
87
|
+
status: 'completed',
|
|
88
|
+
}],
|
|
89
|
+
usage: totalUsage ? {
|
|
90
|
+
promptTokens: totalUsage.inputTokens ?? 0,
|
|
91
|
+
completionTokens: totalUsage.outputTokens ?? 0,
|
|
92
|
+
totalTokens: totalUsage.totalTokens ?? 0,
|
|
93
|
+
} : undefined,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Wrap an agent's generate call with approval workflow.
|
|
98
|
+
* The function suspends (zero compute) while waiting for webhook approval.
|
|
99
|
+
*
|
|
100
|
+
* Inspector view: durableWithApprovalWorkflow → llmDraft → webhookApproval → llmFinalize
|
|
101
|
+
*/
|
|
102
|
+
async function durableWithApprovalWorkflow(agent, prompt, _webhookPath) {
|
|
103
|
+
"use workflow";
|
|
104
|
+
log.info('durableWithApprovalWorkflow started', { prompt: prompt.slice(0, 100) });
|
|
105
|
+
// Step 1: Generate draft — inspector displays "llmDraft"
|
|
106
|
+
async function llmDraft() {
|
|
107
|
+
"use step";
|
|
108
|
+
log.debug('step:llmDraft — generating draft');
|
|
109
|
+
return agent.generate({ prompt });
|
|
110
|
+
}
|
|
111
|
+
const draftResult = await llmDraft();
|
|
112
|
+
const draftText = await draftResult.text;
|
|
113
|
+
// Step 2: Wait for approval — inspector displays "webhookApproval"
|
|
114
|
+
log.info('Waiting for approval webhook');
|
|
115
|
+
async function webhookApproval() {
|
|
116
|
+
"use step";
|
|
117
|
+
log.debug('step:webhookApproval — suspending for webhook');
|
|
118
|
+
// The workflow runtime handles webhook suspension here.
|
|
119
|
+
// This stub returns approved=true when not running under the runtime.
|
|
120
|
+
return { approved: true };
|
|
121
|
+
}
|
|
122
|
+
const approval = await webhookApproval();
|
|
123
|
+
if (!approval.approved) {
|
|
124
|
+
log.warn('Approval rejected', { feedback: approval.feedback });
|
|
125
|
+
throw new Error(`Approval rejected: ${approval.feedback || 'No reason provided'}`);
|
|
126
|
+
}
|
|
127
|
+
// Step 3: Finalize — inspector displays "llmFinalize"
|
|
128
|
+
const finalPrompt = approval.modifiedContent
|
|
129
|
+
? `Finalize with modifications: ${approval.modifiedContent}. Original: ${draftText}`
|
|
130
|
+
: prompt;
|
|
131
|
+
async function llmFinalize() {
|
|
132
|
+
"use step";
|
|
133
|
+
log.debug('step:llmFinalize — finalizing after approval');
|
|
134
|
+
return agent.generate({ prompt: finalPrompt });
|
|
135
|
+
}
|
|
136
|
+
const finalResult = await llmFinalize();
|
|
137
|
+
const finalText = await finalResult.text;
|
|
138
|
+
return {
|
|
139
|
+
text: finalText ?? '',
|
|
140
|
+
steps: [
|
|
141
|
+
{ name: 'llm-draft', status: 'completed' },
|
|
142
|
+
{ name: 'webhook-approval', status: 'completed' },
|
|
143
|
+
{ name: 'llm-finalize', status: 'completed' },
|
|
144
|
+
],
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Wrap an agent's generate call with a durable delay.
|
|
149
|
+
* Uses workflow sleep() — doesn't hold compute during the delay.
|
|
150
|
+
*
|
|
151
|
+
* Inspector view: durableScheduledWorkflow → durableSleep → llmGenerate
|
|
152
|
+
*/
|
|
153
|
+
async function durableScheduledWorkflow(agent, prompt, delay) {
|
|
154
|
+
"use workflow";
|
|
155
|
+
log.info('durableScheduledWorkflow started', { delay });
|
|
156
|
+
// Step 1: Sleep (zero compute) — inspector displays "durableSleep"
|
|
157
|
+
async function durableSleep() {
|
|
158
|
+
"use step";
|
|
159
|
+
log.debug('step:durableSleep — sleeping', { delay });
|
|
160
|
+
try {
|
|
161
|
+
const wf = getWorkflowModule();
|
|
162
|
+
await wf.sleep(delay);
|
|
163
|
+
}
|
|
164
|
+
catch (_e) {
|
|
165
|
+
// If workflow not available, use regular setTimeout as fallback
|
|
166
|
+
const ms = parseDuration(delay);
|
|
167
|
+
log.warn('Workflow sleep unavailable, using setTimeout fallback', { ms });
|
|
168
|
+
await new Promise(resolve => setTimeout(resolve, ms));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
await durableSleep();
|
|
172
|
+
log.info('Sleep completed, executing prompt');
|
|
173
|
+
// Step 2: Generate — inspector displays "llmGenerate"
|
|
174
|
+
async function llmGenerate() {
|
|
175
|
+
"use step";
|
|
176
|
+
log.debug('step:llmGenerate — executing LLM call after sleep');
|
|
177
|
+
return agent.generate({ prompt });
|
|
178
|
+
}
|
|
179
|
+
const result = await llmGenerate();
|
|
180
|
+
const text = await result.text;
|
|
181
|
+
return {
|
|
182
|
+
text: text ?? '',
|
|
183
|
+
steps: [
|
|
184
|
+
{ name: 'sleep', status: 'completed' },
|
|
185
|
+
{ name: 'llm-generate', status: 'completed' },
|
|
186
|
+
],
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
// ============================================================================
|
|
190
|
+
// Durable Agent Factory
|
|
191
|
+
// ============================================================================
|
|
192
|
+
/**
|
|
193
|
+
* Create a durable agent with workflow integration.
|
|
194
|
+
*
|
|
195
|
+
* The durable agent wraps a standard Agent with workflow directives
|
|
196
|
+
* that make every LLM call and tool execution a recoverable step.
|
|
197
|
+
*
|
|
198
|
+
* @param baseAgent - The base agent to wrap with durability
|
|
199
|
+
* @param options - Durable agent options
|
|
200
|
+
* @returns DurableAgent instance with both standard and durable methods
|
|
201
|
+
*
|
|
202
|
+
* @example
|
|
203
|
+
* ```typescript
|
|
204
|
+
* import { createAgent } from '@agntk/core';
|
|
205
|
+
* import { createDurableAgent } from '@agntk/core/workflow';
|
|
206
|
+
*
|
|
207
|
+
* const base = createAgent({ role: 'coder', toolPreset: 'standard' });
|
|
208
|
+
* const agent = createDurableAgent(base);
|
|
209
|
+
*
|
|
210
|
+
* // Standard generation (no durability)
|
|
211
|
+
* const result = await agent.generate({ prompt: 'Hello' });
|
|
212
|
+
*
|
|
213
|
+
* // Durable generation (survives crashes)
|
|
214
|
+
* const durable = await agent.durableGenerate('Create a component');
|
|
215
|
+
*
|
|
216
|
+
* // With approval workflow
|
|
217
|
+
* const approved = await agent.withApproval('Draft email', '/api/approve');
|
|
218
|
+
*
|
|
219
|
+
* // Scheduled generation
|
|
220
|
+
* const delayed = await agent.scheduled('Send reminder', '1h');
|
|
221
|
+
* ```
|
|
222
|
+
*/
|
|
223
|
+
export function createDurableAgent(baseAgent, options = {}) {
|
|
224
|
+
log.info('Creating durable agent', {
|
|
225
|
+
agentId: baseAgent.agentId,
|
|
226
|
+
role: baseAgent.role,
|
|
227
|
+
workflowOptions: options.workflowOptions,
|
|
228
|
+
});
|
|
229
|
+
let workflowRunId = options.workflowOptions?.workflowRunId;
|
|
230
|
+
/**
|
|
231
|
+
* Guard: ensure workflow is available before executing a durable method.
|
|
232
|
+
* Throws a clear, actionable error if the workflow package isn't installed.
|
|
233
|
+
* Standard Agent methods (generate, stream) still work without workflow.
|
|
234
|
+
*/
|
|
235
|
+
async function ensureWorkflowAvailable() {
|
|
236
|
+
const available = await checkWorkflowAvailability();
|
|
237
|
+
if (!available) {
|
|
238
|
+
throw new Error('Workflow package is not installed. Durable agent features require the workflow package.\n' +
|
|
239
|
+
'Install with: npm install workflow\n' +
|
|
240
|
+
'See https://useworkflow.dev for documentation.');
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const durableAgent = {
|
|
244
|
+
// Delegate standard Agent interface to the base agent
|
|
245
|
+
agentId: baseAgent.agentId,
|
|
246
|
+
role: baseAgent.role,
|
|
247
|
+
init: () => baseAgent.init(),
|
|
248
|
+
getToolLoopAgent: () => baseAgent.getToolLoopAgent(),
|
|
249
|
+
getSystemPrompt: () => baseAgent.getSystemPrompt(),
|
|
250
|
+
// Standard methods — pass through to base agent (work without workflow)
|
|
251
|
+
stream: (input) => baseAgent.stream(input),
|
|
252
|
+
generate: (input) => baseAgent.generate(input),
|
|
253
|
+
// Durable methods — require workflow package
|
|
254
|
+
durableGenerate: async (prompt) => {
|
|
255
|
+
await ensureWorkflowAvailable();
|
|
256
|
+
log.info('durableGenerate() called', { promptLength: prompt.length });
|
|
257
|
+
const result = await durableGenerateWorkflow(baseAgent, prompt);
|
|
258
|
+
if (result.workflowRunId)
|
|
259
|
+
workflowRunId = result.workflowRunId;
|
|
260
|
+
return result;
|
|
261
|
+
},
|
|
262
|
+
withApproval: async (prompt, webhookPath) => {
|
|
263
|
+
await ensureWorkflowAvailable();
|
|
264
|
+
log.info('withApproval() called', { promptLength: prompt.length, webhookPath });
|
|
265
|
+
return durableWithApprovalWorkflow(baseAgent, prompt, webhookPath);
|
|
266
|
+
},
|
|
267
|
+
scheduled: async (prompt, delay) => {
|
|
268
|
+
await ensureWorkflowAvailable();
|
|
269
|
+
log.info('scheduled() called', { promptLength: prompt.length, delay });
|
|
270
|
+
return durableScheduledWorkflow(baseAgent, prompt, delay);
|
|
271
|
+
},
|
|
272
|
+
get isWorkflowActive() {
|
|
273
|
+
return _workflowAvailable === true;
|
|
274
|
+
},
|
|
275
|
+
get workflowRunId() {
|
|
276
|
+
return workflowRunId;
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
log.info('Durable agent created', { agentId: baseAgent.agentId });
|
|
280
|
+
return durableAgent;
|
|
281
|
+
}
|
|
282
|
+
// ============================================================================
|
|
283
|
+
// Workflow Helpers
|
|
284
|
+
// ============================================================================
|
|
285
|
+
/**
|
|
286
|
+
* Parse a duration string into milliseconds.
|
|
287
|
+
* Supports: 30s, 5m, 1h, 1d
|
|
288
|
+
*/
|
|
289
|
+
export function parseDuration(duration) {
|
|
290
|
+
const match = duration.match(/^(\d+)(s|m|h|d)$/);
|
|
291
|
+
if (!match) {
|
|
292
|
+
throw new Error(`Invalid duration format: ${duration}. Use format like '30s', '5m', '1h', '1d'`);
|
|
293
|
+
}
|
|
294
|
+
const value = parseInt(match[1], 10);
|
|
295
|
+
const unit = match[2];
|
|
296
|
+
switch (unit) {
|
|
297
|
+
case 's':
|
|
298
|
+
return value * 1000;
|
|
299
|
+
case 'm':
|
|
300
|
+
return value * 60 * 1000;
|
|
301
|
+
case 'h':
|
|
302
|
+
return value * 60 * 60 * 1000;
|
|
303
|
+
case 'd':
|
|
304
|
+
return value * 24 * 60 * 60 * 1000;
|
|
305
|
+
default:
|
|
306
|
+
throw new Error(`Unknown duration unit: ${unit}`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Format milliseconds as a human-readable duration.
|
|
311
|
+
*/
|
|
312
|
+
export function formatDuration(ms) {
|
|
313
|
+
if (ms < 1000)
|
|
314
|
+
return `${ms}ms`;
|
|
315
|
+
if (ms < 60000)
|
|
316
|
+
return `${Math.round(ms / 1000)}s`;
|
|
317
|
+
if (ms < 3600000)
|
|
318
|
+
return `${Math.round(ms / 60000)}m`;
|
|
319
|
+
if (ms < 86400000)
|
|
320
|
+
return `${Math.round(ms / 3600000)}h`;
|
|
321
|
+
return `${Math.round(ms / 86400000)}d`;
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=durable-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-agent.js","sourceRoot":"","sources":["../../src/workflow/durable-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @agntk/core - Scheduled Workflows
|
|
3
|
+
*
|
|
4
|
+
* Implements recurring task execution using Workflow DevKit's `sleep()`.
|
|
5
|
+
* Each scheduled workflow is a durable loop: execute → sleep → repeat.
|
|
6
|
+
* Zero compute cost during sleep — the workflow runtime suspends the process.
|
|
7
|
+
*
|
|
8
|
+
* @see ADV-SCHEDULER-018
|
|
9
|
+
* @see https://useworkflow.dev
|
|
10
|
+
*/
|
|
11
|
+
import { parseDuration, formatDuration } from './utils.js';
|
|
12
|
+
/**
|
|
13
|
+
* Configuration for a scheduled workflow.
|
|
14
|
+
*
|
|
15
|
+
* @typeParam T - The return type of the task function
|
|
16
|
+
*/
|
|
17
|
+
export interface ScheduledWorkflowConfig<T = void> {
|
|
18
|
+
/** Human-readable name for this schedule. */
|
|
19
|
+
name: string;
|
|
20
|
+
/** Description of what the scheduled task does. */
|
|
21
|
+
description?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Interval between executions.
|
|
24
|
+
* Duration string (e.g., "1h", "1d", "7d").
|
|
25
|
+
*/
|
|
26
|
+
interval: string;
|
|
27
|
+
/**
|
|
28
|
+
* The task to execute on each tick.
|
|
29
|
+
* Receives the current iteration number (0-indexed) and returns a result.
|
|
30
|
+
*/
|
|
31
|
+
task: (iteration: number) => Promise<T> | T;
|
|
32
|
+
/**
|
|
33
|
+
* Maximum number of iterations before the workflow stops.
|
|
34
|
+
* Omit or set to `Infinity` for an infinite loop.
|
|
35
|
+
* @default Infinity
|
|
36
|
+
*/
|
|
37
|
+
maxIterations?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Whether to run the task immediately on start, or wait for the first interval.
|
|
40
|
+
* @default true
|
|
41
|
+
*/
|
|
42
|
+
immediate?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Called after each successful task execution.
|
|
45
|
+
*/
|
|
46
|
+
onTick?: (result: T, iteration: number) => void | Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Called when a task execution throws an error.
|
|
49
|
+
* Return `true` to continue the schedule despite the error (default).
|
|
50
|
+
* Return `false` to stop the schedule.
|
|
51
|
+
* @default continue
|
|
52
|
+
*/
|
|
53
|
+
onError?: (error: Error, iteration: number) => boolean | Promise<boolean>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A running scheduled workflow instance.
|
|
57
|
+
*
|
|
58
|
+
* @typeParam T - The return type of the task function
|
|
59
|
+
*/
|
|
60
|
+
export interface ScheduledWorkflow<T = void> {
|
|
61
|
+
/** The schedule configuration name. */
|
|
62
|
+
readonly name: string;
|
|
63
|
+
/** The schedule configuration description. */
|
|
64
|
+
readonly description?: string;
|
|
65
|
+
/** The interval between executions. */
|
|
66
|
+
readonly interval: string;
|
|
67
|
+
/**
|
|
68
|
+
* Start the schedule loop. Returns a promise that resolves
|
|
69
|
+
* when the schedule completes (hits maxIterations or is cancelled).
|
|
70
|
+
*/
|
|
71
|
+
start: () => Promise<ScheduleResult<T>>;
|
|
72
|
+
/**
|
|
73
|
+
* Cancel the schedule. The current sleep will be interrupted,
|
|
74
|
+
* and the loop will exit after the current tick completes.
|
|
75
|
+
*/
|
|
76
|
+
cancel: () => void;
|
|
77
|
+
/** Whether the schedule is currently running. */
|
|
78
|
+
readonly isRunning: boolean;
|
|
79
|
+
/** Number of completed iterations. */
|
|
80
|
+
readonly completedIterations: number;
|
|
81
|
+
/** Results from completed iterations. */
|
|
82
|
+
readonly results: ScheduleTickResult<T>[];
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Result from a single scheduled tick.
|
|
86
|
+
*/
|
|
87
|
+
export interface ScheduleTickResult<T = void> {
|
|
88
|
+
/** 0-indexed iteration number. */
|
|
89
|
+
iteration: number;
|
|
90
|
+
/** Whether the tick succeeded. */
|
|
91
|
+
success: boolean;
|
|
92
|
+
/** The result value (if success). */
|
|
93
|
+
result?: T;
|
|
94
|
+
/** The error message (if failed). */
|
|
95
|
+
error?: string;
|
|
96
|
+
/** Timestamp when the tick completed. */
|
|
97
|
+
completedAt: Date;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Final result from a completed schedule.
|
|
101
|
+
*/
|
|
102
|
+
export interface ScheduleResult<T = void> {
|
|
103
|
+
/** Schedule name. */
|
|
104
|
+
name: string;
|
|
105
|
+
/** Total completed iterations. */
|
|
106
|
+
totalIterations: number;
|
|
107
|
+
/** Whether the schedule was cancelled. */
|
|
108
|
+
cancelled: boolean;
|
|
109
|
+
/** All tick results. */
|
|
110
|
+
ticks: ScheduleTickResult<T>[];
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Create a scheduled workflow that loops with durable sleep.
|
|
114
|
+
*
|
|
115
|
+
* The workflow executes a task, sleeps for the configured interval,
|
|
116
|
+
* and repeats. Under the Workflow runtime, sleep is zero-compute.
|
|
117
|
+
*
|
|
118
|
+
* @param config - Schedule configuration
|
|
119
|
+
* @returns A `ScheduledWorkflow` instance (call `.start()` to begin)
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* const daily = createScheduledWorkflow({
|
|
124
|
+
* name: 'daily-briefing',
|
|
125
|
+
* interval: '1d',
|
|
126
|
+
* task: async (iteration) => {
|
|
127
|
+
* const agent = createAgent({ role: 'analyst' });
|
|
128
|
+
* const result = await agent.generate({
|
|
129
|
+
* prompt: 'Generate a daily briefing summary.',
|
|
130
|
+
* });
|
|
131
|
+
* return result.text;
|
|
132
|
+
* },
|
|
133
|
+
* onTick: (text, i) => console.log(`Briefing #${i}:`, text),
|
|
134
|
+
* });
|
|
135
|
+
*
|
|
136
|
+
* await daily.start(); // Loops forever with 1d sleep between ticks
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
export declare function createScheduledWorkflow<T = void>(config: ScheduledWorkflowConfig<T>): ScheduledWorkflow<T>;
|
|
140
|
+
/**
|
|
141
|
+
* Options for the daily briefing schedule preset.
|
|
142
|
+
*/
|
|
143
|
+
export interface DailyBriefingOptions {
|
|
144
|
+
/**
|
|
145
|
+
* The task that generates the briefing content.
|
|
146
|
+
* Receives the iteration number.
|
|
147
|
+
*/
|
|
148
|
+
generateBriefing: (iteration: number) => Promise<string>;
|
|
149
|
+
/**
|
|
150
|
+
* Called with each briefing (e.g., send email, post to Slack).
|
|
151
|
+
*/
|
|
152
|
+
deliver: (briefing: string, iteration: number) => void | Promise<void>;
|
|
153
|
+
/**
|
|
154
|
+
* Override the default interval. Default: "1d"
|
|
155
|
+
*/
|
|
156
|
+
interval?: string;
|
|
157
|
+
/**
|
|
158
|
+
* Maximum number of briefings. Default: Infinity
|
|
159
|
+
*/
|
|
160
|
+
maxIterations?: number;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Create a daily briefing scheduled workflow.
|
|
164
|
+
*
|
|
165
|
+
* Runs a briefing generation task once per day (configurable),
|
|
166
|
+
* delivering the result via a callback.
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* ```typescript
|
|
170
|
+
* const briefing = createDailyBriefing({
|
|
171
|
+
* generateBriefing: async () => {
|
|
172
|
+
* const agent = createAgent({ role: 'analyst' });
|
|
173
|
+
* const result = await agent.generate({
|
|
174
|
+
* prompt: 'Summarize today\'s calendar, emails, and tasks.',
|
|
175
|
+
* });
|
|
176
|
+
* return result.text;
|
|
177
|
+
* },
|
|
178
|
+
* deliver: (text) => sendSlackMessage('#daily', text),
|
|
179
|
+
* });
|
|
180
|
+
*
|
|
181
|
+
* await briefing.start();
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
export declare function createDailyBriefing(options: DailyBriefingOptions): ScheduledWorkflow<string>;
|
|
185
|
+
/**
|
|
186
|
+
* Options for the weekly report schedule preset.
|
|
187
|
+
*/
|
|
188
|
+
export interface WeeklyReportOptions {
|
|
189
|
+
/**
|
|
190
|
+
* The task that generates the weekly report.
|
|
191
|
+
* Receives the iteration (week) number.
|
|
192
|
+
*/
|
|
193
|
+
generateReport: (week: number) => Promise<string>;
|
|
194
|
+
/**
|
|
195
|
+
* Called with each report (e.g., send email, save to file).
|
|
196
|
+
*/
|
|
197
|
+
deliver: (report: string, week: number) => void | Promise<void>;
|
|
198
|
+
/**
|
|
199
|
+
* Override the default interval. Default: "7d"
|
|
200
|
+
*/
|
|
201
|
+
interval?: string;
|
|
202
|
+
/**
|
|
203
|
+
* Maximum number of reports. Default: Infinity
|
|
204
|
+
*/
|
|
205
|
+
maxIterations?: number;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Create a weekly report scheduled workflow.
|
|
209
|
+
*
|
|
210
|
+
* Runs a report generation task once per week (configurable),
|
|
211
|
+
* delivering the result via a callback.
|
|
212
|
+
*
|
|
213
|
+
* @example
|
|
214
|
+
* ```typescript
|
|
215
|
+
* const report = createWeeklyReport({
|
|
216
|
+
* generateReport: async (week) => {
|
|
217
|
+
* const agent = createAgent({ role: 'analyst' });
|
|
218
|
+
* const result = await agent.generate({
|
|
219
|
+
* prompt: `Generate weekly report #${week + 1}.`,
|
|
220
|
+
* });
|
|
221
|
+
* return result.text;
|
|
222
|
+
* },
|
|
223
|
+
* deliver: (text) => sendEmail('team@company.com', 'Weekly Report', text),
|
|
224
|
+
* });
|
|
225
|
+
*
|
|
226
|
+
* await report.start();
|
|
227
|
+
* ```
|
|
228
|
+
*/
|
|
229
|
+
export declare function createWeeklyReport(options: WeeklyReportOptions): ScheduledWorkflow<string>;
|
|
230
|
+
export { parseDuration, formatDuration };
|
|
231
|
+
//# sourceMappingURL=schedulers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedulers.d.ts","sourceRoot":"","sources":["../../src/workflow/schedulers.ts"],"names":[],"mappings":"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"}
|