@agntk/core 0.3.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/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.js +1 -1
- 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/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/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/tools/factory.d.ts +109 -0
- package/dist/tools/factory.d.ts.map +1 -0
- package/dist/tools/factory.js +166 -0
- package/dist/tools/factory.js.map +1 -0
- 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/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/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,128 @@
|
|
|
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 type { Agent } from '../agent.js';
|
|
16
|
+
import type { AgentOptions, WorkflowOptions } from '../types/agent.js';
|
|
17
|
+
/**
|
|
18
|
+
* Extended options for creating a durable agent.
|
|
19
|
+
* Includes all standard AgentOptions plus workflow-specific config.
|
|
20
|
+
*/
|
|
21
|
+
export interface DurableAgentOptions extends AgentOptions {
|
|
22
|
+
/** Force durability even if detection is uncertain. Default: true */
|
|
23
|
+
durable?: boolean;
|
|
24
|
+
/** Workflow-specific configuration. */
|
|
25
|
+
workflowOptions?: WorkflowOptions;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Result from a durable generation.
|
|
29
|
+
*/
|
|
30
|
+
export interface DurableGenerateResult {
|
|
31
|
+
text: string;
|
|
32
|
+
workflowRunId?: string;
|
|
33
|
+
steps?: Array<{
|
|
34
|
+
name: string;
|
|
35
|
+
status: 'completed' | 'failed' | 'skipped';
|
|
36
|
+
durationMs?: number;
|
|
37
|
+
}>;
|
|
38
|
+
usage?: {
|
|
39
|
+
promptTokens: number;
|
|
40
|
+
completionTokens: number;
|
|
41
|
+
totalTokens: number;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Webhook response for approval workflows.
|
|
46
|
+
*/
|
|
47
|
+
export interface WebhookResponse {
|
|
48
|
+
approved: boolean;
|
|
49
|
+
feedback?: string;
|
|
50
|
+
modifiedContent?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Extended agent interface with durable workflow capabilities.
|
|
54
|
+
* Extends the base Agent interface with workflow-specific methods.
|
|
55
|
+
*/
|
|
56
|
+
export interface DurableAgent extends Agent {
|
|
57
|
+
/**
|
|
58
|
+
* Durable generate that wraps the LLM call as a workflow step.
|
|
59
|
+
* Survives crashes — the workflow runtime checkpoints progress.
|
|
60
|
+
*/
|
|
61
|
+
durableGenerate: (prompt: string) => Promise<DurableGenerateResult>;
|
|
62
|
+
/**
|
|
63
|
+
* Generate with approval workflow.
|
|
64
|
+
* Pauses execution (zero compute) until webhook approval is received.
|
|
65
|
+
*/
|
|
66
|
+
withApproval: (prompt: string, webhookPath: string) => Promise<DurableGenerateResult>;
|
|
67
|
+
/**
|
|
68
|
+
* Scheduled generation with durable delay.
|
|
69
|
+
* Uses workflow sleep() — doesn't hold compute during the delay.
|
|
70
|
+
*/
|
|
71
|
+
scheduled: (prompt: string, delay: string) => Promise<DurableGenerateResult>;
|
|
72
|
+
/** Whether workflows are actually active (runtime detected). */
|
|
73
|
+
readonly isWorkflowActive: boolean;
|
|
74
|
+
/** The workflow run ID (set after first workflow execution). */
|
|
75
|
+
readonly workflowRunId: string | undefined;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if the Workflow DevKit runtime is available.
|
|
79
|
+
* Result is cached after first check.
|
|
80
|
+
*/
|
|
81
|
+
export declare function checkWorkflowAvailability(): Promise<boolean>;
|
|
82
|
+
/**
|
|
83
|
+
* Reset workflow availability cache (for testing).
|
|
84
|
+
* @internal
|
|
85
|
+
*/
|
|
86
|
+
export declare function _resetWorkflowCache(): void;
|
|
87
|
+
/**
|
|
88
|
+
* Create a durable agent with workflow integration.
|
|
89
|
+
*
|
|
90
|
+
* The durable agent wraps a standard Agent with workflow directives
|
|
91
|
+
* that make every LLM call and tool execution a recoverable step.
|
|
92
|
+
*
|
|
93
|
+
* @param baseAgent - The base agent to wrap with durability
|
|
94
|
+
* @param options - Durable agent options
|
|
95
|
+
* @returns DurableAgent instance with both standard and durable methods
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```typescript
|
|
99
|
+
* import { createAgent } from '@agntk/core';
|
|
100
|
+
* import { createDurableAgent } from '@agntk/core/workflow';
|
|
101
|
+
*
|
|
102
|
+
* const base = createAgent({ role: 'coder', toolPreset: 'standard' });
|
|
103
|
+
* const agent = createDurableAgent(base);
|
|
104
|
+
*
|
|
105
|
+
* // Standard generation (no durability)
|
|
106
|
+
* const result = await agent.generate({ prompt: 'Hello' });
|
|
107
|
+
*
|
|
108
|
+
* // Durable generation (survives crashes)
|
|
109
|
+
* const durable = await agent.durableGenerate('Create a component');
|
|
110
|
+
*
|
|
111
|
+
* // With approval workflow
|
|
112
|
+
* const approved = await agent.withApproval('Draft email', '/api/approve');
|
|
113
|
+
*
|
|
114
|
+
* // Scheduled generation
|
|
115
|
+
* const delayed = await agent.scheduled('Send reminder', '1h');
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
export declare function createDurableAgent(baseAgent: Agent, options?: DurableAgentOptions): DurableAgent;
|
|
119
|
+
/**
|
|
120
|
+
* Parse a duration string into milliseconds.
|
|
121
|
+
* Supports: 30s, 5m, 1h, 1d
|
|
122
|
+
*/
|
|
123
|
+
export declare function parseDuration(duration: string): number;
|
|
124
|
+
/**
|
|
125
|
+
* Format milliseconds as a human-readable duration.
|
|
126
|
+
*/
|
|
127
|
+
export declare function formatDuration(ms: number): string;
|
|
128
|
+
//# sourceMappingURL=durable-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-agent.d.ts","sourceRoot":"","sources":["../../src/workflow/durable-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAQpE;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACvD,qEAAqE;IACrE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uCAAuC;IACvC,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;QAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,YAAa,SAAQ,KAAK;IACzC;;;OAGG;IACH,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEpE;;;OAGG;IACH,YAAY,EAAE,CACZ,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEpC;;;OAGG;IACH,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAE7E,gEAAgE;IAChE,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IAEnC,gEAAgE;IAChE,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5C;AAgBD;;;GAGG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC,CAalE;AAeD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C;AA4KD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,KAAK,EAChB,OAAO,GAAE,mBAAwB,GAChC,YAAY,CAsEd;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAqBtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMjD"}
|
|
@@ -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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"}
|