@ugm/desiagent 0.1.21

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.
Files changed (202) hide show
  1. package/README.md +251 -0
  2. package/dist/__tests__/test-utils.d.ts +24 -0
  3. package/dist/__tests__/test-utils.d.ts.map +1 -0
  4. package/dist/__tests__/test-utils.js +32 -0
  5. package/dist/__tests__/test-utils.js.map +1 -0
  6. package/dist/core/execution/agents.d.ts +60 -0
  7. package/dist/core/execution/agents.d.ts.map +1 -0
  8. package/dist/core/execution/agents.js +249 -0
  9. package/dist/core/execution/agents.js.map +1 -0
  10. package/dist/core/execution/artifacts.d.ts +27 -0
  11. package/dist/core/execution/artifacts.d.ts.map +1 -0
  12. package/dist/core/execution/artifacts.js +93 -0
  13. package/dist/core/execution/artifacts.js.map +1 -0
  14. package/dist/core/execution/costs.d.ts +160 -0
  15. package/dist/core/execution/costs.d.ts.map +1 -0
  16. package/dist/core/execution/costs.js +196 -0
  17. package/dist/core/execution/costs.js.map +1 -0
  18. package/dist/core/execution/dagExecutor.d.ts +112 -0
  19. package/dist/core/execution/dagExecutor.d.ts.map +1 -0
  20. package/dist/core/execution/dagExecutor.js +647 -0
  21. package/dist/core/execution/dagExecutor.js.map +1 -0
  22. package/dist/core/execution/dags.d.ts +167 -0
  23. package/dist/core/execution/dags.d.ts.map +1 -0
  24. package/dist/core/execution/dags.js +713 -0
  25. package/dist/core/execution/dags.js.map +1 -0
  26. package/dist/core/execution/executions.d.ts +158 -0
  27. package/dist/core/execution/executions.d.ts.map +1 -0
  28. package/dist/core/execution/executions.js +258 -0
  29. package/dist/core/execution/executions.js.map +1 -0
  30. package/dist/core/execution/goals.d.ts +62 -0
  31. package/dist/core/execution/goals.d.ts.map +1 -0
  32. package/dist/core/execution/goals.js +245 -0
  33. package/dist/core/execution/goals.js.map +1 -0
  34. package/dist/core/execution/runs.d.ts +65 -0
  35. package/dist/core/execution/runs.d.ts.map +1 -0
  36. package/dist/core/execution/runs.js +219 -0
  37. package/dist/core/execution/runs.js.map +1 -0
  38. package/dist/core/execution/tools.d.ts +24 -0
  39. package/dist/core/execution/tools.d.ts.map +1 -0
  40. package/dist/core/execution/tools.js +33 -0
  41. package/dist/core/execution/tools.js.map +1 -0
  42. package/dist/core/orchestration/index.d.ts +7 -0
  43. package/dist/core/orchestration/index.d.ts.map +1 -0
  44. package/dist/core/orchestration/index.js +7 -0
  45. package/dist/core/orchestration/index.js.map +1 -0
  46. package/dist/core/orchestration/orchestrator.d.ts +39 -0
  47. package/dist/core/orchestration/orchestrator.d.ts.map +1 -0
  48. package/dist/core/orchestration/orchestrator.js +141 -0
  49. package/dist/core/orchestration/orchestrator.js.map +1 -0
  50. package/dist/core/orchestration/planner.d.ts +63 -0
  51. package/dist/core/orchestration/planner.d.ts.map +1 -0
  52. package/dist/core/orchestration/planner.js +99 -0
  53. package/dist/core/orchestration/planner.js.map +1 -0
  54. package/dist/core/providers/factory.d.ts +25 -0
  55. package/dist/core/providers/factory.d.ts.map +1 -0
  56. package/dist/core/providers/factory.js +86 -0
  57. package/dist/core/providers/factory.js.map +1 -0
  58. package/dist/core/providers/index.d.ts +11 -0
  59. package/dist/core/providers/index.d.ts.map +1 -0
  60. package/dist/core/providers/index.js +10 -0
  61. package/dist/core/providers/index.js.map +1 -0
  62. package/dist/core/providers/ollama.d.ts +36 -0
  63. package/dist/core/providers/ollama.d.ts.map +1 -0
  64. package/dist/core/providers/ollama.js +123 -0
  65. package/dist/core/providers/ollama.js.map +1 -0
  66. package/dist/core/providers/openai.d.ts +33 -0
  67. package/dist/core/providers/openai.d.ts.map +1 -0
  68. package/dist/core/providers/openai.js +114 -0
  69. package/dist/core/providers/openai.js.map +1 -0
  70. package/dist/core/providers/openrouter.d.ts +38 -0
  71. package/dist/core/providers/openrouter.d.ts.map +1 -0
  72. package/dist/core/providers/openrouter.js +269 -0
  73. package/dist/core/providers/openrouter.js.map +1 -0
  74. package/dist/core/providers/types.d.ts +101 -0
  75. package/dist/core/providers/types.d.ts.map +1 -0
  76. package/dist/core/providers/types.js +7 -0
  77. package/dist/core/providers/types.js.map +1 -0
  78. package/dist/core/tools/base.d.ts +56 -0
  79. package/dist/core/tools/base.d.ts.map +1 -0
  80. package/dist/core/tools/base.js +60 -0
  81. package/dist/core/tools/base.js.map +1 -0
  82. package/dist/core/tools/bash.d.ts +50 -0
  83. package/dist/core/tools/bash.d.ts.map +1 -0
  84. package/dist/core/tools/bash.js +179 -0
  85. package/dist/core/tools/bash.js.map +1 -0
  86. package/dist/core/tools/edit.d.ts +39 -0
  87. package/dist/core/tools/edit.d.ts.map +1 -0
  88. package/dist/core/tools/edit.js +67 -0
  89. package/dist/core/tools/edit.js.map +1 -0
  90. package/dist/core/tools/executor.d.ts +33 -0
  91. package/dist/core/tools/executor.d.ts.map +1 -0
  92. package/dist/core/tools/executor.js +105 -0
  93. package/dist/core/tools/executor.js.map +1 -0
  94. package/dist/core/tools/fetchPage.d.ts +46 -0
  95. package/dist/core/tools/fetchPage.d.ts.map +1 -0
  96. package/dist/core/tools/fetchPage.js +87 -0
  97. package/dist/core/tools/fetchPage.js.map +1 -0
  98. package/dist/core/tools/fetchURLs.d.ts +39 -0
  99. package/dist/core/tools/fetchURLs.d.ts.map +1 -0
  100. package/dist/core/tools/fetchURLs.js +67 -0
  101. package/dist/core/tools/fetchURLs.js.map +1 -0
  102. package/dist/core/tools/glob.d.ts +36 -0
  103. package/dist/core/tools/glob.d.ts.map +1 -0
  104. package/dist/core/tools/glob.js +78 -0
  105. package/dist/core/tools/glob.js.map +1 -0
  106. package/dist/core/tools/grep.d.ts +51 -0
  107. package/dist/core/tools/grep.d.ts.map +1 -0
  108. package/dist/core/tools/grep.js +152 -0
  109. package/dist/core/tools/grep.js.map +1 -0
  110. package/dist/core/tools/index.d.ts +22 -0
  111. package/dist/core/tools/index.d.ts.map +1 -0
  112. package/dist/core/tools/index.js +22 -0
  113. package/dist/core/tools/index.js.map +1 -0
  114. package/dist/core/tools/llmExecute.d.ts +153 -0
  115. package/dist/core/tools/llmExecute.d.ts.map +1 -0
  116. package/dist/core/tools/llmExecute.js +105 -0
  117. package/dist/core/tools/llmExecute.js.map +1 -0
  118. package/dist/core/tools/readEmail.d.ts +68 -0
  119. package/dist/core/tools/readEmail.d.ts.map +1 -0
  120. package/dist/core/tools/readEmail.js +182 -0
  121. package/dist/core/tools/readEmail.js.map +1 -0
  122. package/dist/core/tools/readFile.d.ts +42 -0
  123. package/dist/core/tools/readFile.d.ts.map +1 -0
  124. package/dist/core/tools/readFile.js +79 -0
  125. package/dist/core/tools/readFile.js.map +1 -0
  126. package/dist/core/tools/registry.d.ts +53 -0
  127. package/dist/core/tools/registry.d.ts.map +1 -0
  128. package/dist/core/tools/registry.js +112 -0
  129. package/dist/core/tools/registry.js.map +1 -0
  130. package/dist/core/tools/sendEmail.d.ts +83 -0
  131. package/dist/core/tools/sendEmail.d.ts.map +1 -0
  132. package/dist/core/tools/sendEmail.js +132 -0
  133. package/dist/core/tools/sendEmail.js.map +1 -0
  134. package/dist/core/tools/sendWebhook.d.ts +48 -0
  135. package/dist/core/tools/sendWebhook.d.ts.map +1 -0
  136. package/dist/core/tools/sendWebhook.js +61 -0
  137. package/dist/core/tools/sendWebhook.js.map +1 -0
  138. package/dist/core/tools/webSearch.d.ts +34 -0
  139. package/dist/core/tools/webSearch.d.ts.map +1 -0
  140. package/dist/core/tools/webSearch.js +104 -0
  141. package/dist/core/tools/webSearch.js.map +1 -0
  142. package/dist/core/tools/writeFile.d.ts +49 -0
  143. package/dist/core/tools/writeFile.d.ts.map +1 -0
  144. package/dist/core/tools/writeFile.js +120 -0
  145. package/dist/core/tools/writeFile.js.map +1 -0
  146. package/dist/db/client.d.ts +22 -0
  147. package/dist/db/client.d.ts.map +1 -0
  148. package/dist/db/client.js +178 -0
  149. package/dist/db/client.js.map +1 -0
  150. package/dist/db/schema.d.ts +1846 -0
  151. package/dist/db/schema.d.ts.map +1 -0
  152. package/dist/db/schema.js +175 -0
  153. package/dist/db/schema.js.map +1 -0
  154. package/dist/errors/index.d.ts +80 -0
  155. package/dist/errors/index.d.ts.map +1 -0
  156. package/dist/errors/index.js +135 -0
  157. package/dist/errors/index.js.map +1 -0
  158. package/dist/index.d.ts +52 -0
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +172 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/services/initDB.d.ts +17 -0
  163. package/dist/services/initDB.d.ts.map +1 -0
  164. package/dist/services/initDB.js +212 -0
  165. package/dist/services/initDB.js.map +1 -0
  166. package/dist/types/agent.d.ts +354 -0
  167. package/dist/types/agent.d.ts.map +1 -0
  168. package/dist/types/agent.js +63 -0
  169. package/dist/types/agent.js.map +1 -0
  170. package/dist/types/client.d.ts +309 -0
  171. package/dist/types/client.d.ts.map +1 -0
  172. package/dist/types/client.js +2 -0
  173. package/dist/types/client.js.map +1 -0
  174. package/dist/types/config.d.ts +96 -0
  175. package/dist/types/config.d.ts.map +1 -0
  176. package/dist/types/config.js +33 -0
  177. package/dist/types/config.js.map +1 -0
  178. package/dist/types/dag.d.ts +253 -0
  179. package/dist/types/dag.d.ts.map +1 -0
  180. package/dist/types/dag.js +46 -0
  181. package/dist/types/dag.js.map +1 -0
  182. package/dist/types/execution.d.ts +171 -0
  183. package/dist/types/execution.d.ts.map +1 -0
  184. package/dist/types/execution.js +41 -0
  185. package/dist/types/execution.js.map +1 -0
  186. package/dist/types/index.d.ts +12 -0
  187. package/dist/types/index.d.ts.map +1 -0
  188. package/dist/types/index.js +11 -0
  189. package/dist/types/index.js.map +1 -0
  190. package/dist/util/cron-validator.d.ts +16 -0
  191. package/dist/util/cron-validator.d.ts.map +1 -0
  192. package/dist/util/cron-validator.js +31 -0
  193. package/dist/util/cron-validator.js.map +1 -0
  194. package/dist/util/dag-utils.d.ts +54 -0
  195. package/dist/util/dag-utils.d.ts.map +1 -0
  196. package/dist/util/dag-utils.js +167 -0
  197. package/dist/util/dag-utils.js.map +1 -0
  198. package/dist/util/logger.d.ts +21 -0
  199. package/dist/util/logger.d.ts.map +1 -0
  200. package/dist/util/logger.js +87 -0
  201. package/dist/util/logger.js.map +1 -0
  202. package/package.json +82 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Artifacts Service
3
+ *
4
+ * Manages artifact files generated during execution.
5
+ * Artifacts are output files created by agents and stored for later retrieval.
6
+ */
7
+ import { resolve, basename } from 'path';
8
+ import { existsSync } from 'fs';
9
+ import { readFile, readdir } from 'fs/promises';
10
+ import { getLogger } from '../../util/logger.js';
11
+ import { NotFoundError } from '../../errors/index.js';
12
+ /**
13
+ * ArtifactsService handles artifact listing and retrieval
14
+ */
15
+ export class ArtifactsService {
16
+ artifactsDir;
17
+ logger = getLogger();
18
+ constructor(artifactsDir) {
19
+ this.artifactsDir = artifactsDir || resolve('./artifacts');
20
+ }
21
+ /**
22
+ * List all artifacts
23
+ */
24
+ async list() {
25
+ try {
26
+ if (!existsSync(this.artifactsDir)) {
27
+ return [];
28
+ }
29
+ const files = await readdir(this.artifactsDir, { withFileTypes: true });
30
+ const filenames = files
31
+ .filter((file) => file.isFile())
32
+ .map((file) => file.name)
33
+ .sort();
34
+ return filenames;
35
+ }
36
+ catch (error) {
37
+ this.logger.error('Failed to list artifacts');
38
+ return [];
39
+ }
40
+ }
41
+ /**
42
+ * Get an artifact by filename
43
+ */
44
+ async get(filename) {
45
+ // Security: prevent path traversal
46
+ const safeFilename = basename(filename);
47
+ const fullPath = resolve(this.artifactsDir, safeFilename);
48
+ // Ensure the resolved path is within artifacts directory
49
+ if (!fullPath.startsWith(this.artifactsDir)) {
50
+ throw new NotFoundError('Artifact', filename);
51
+ }
52
+ if (!existsSync(fullPath)) {
53
+ throw new NotFoundError('Artifact', filename);
54
+ }
55
+ try {
56
+ const content = await readFile(fullPath);
57
+ return content;
58
+ }
59
+ catch (error) {
60
+ this.logger.error(`Failed to read artifact: ${filename}`);
61
+ throw new NotFoundError('Artifact', filename);
62
+ }
63
+ }
64
+ /**
65
+ * Internal: Save an artifact
66
+ */
67
+ async _save(filename, content) {
68
+ try {
69
+ // Ensure artifacts directory exists
70
+ if (!existsSync(this.artifactsDir)) {
71
+ // In Phase 2, we don't use mkdir to avoid dependencies
72
+ // This will be handled in Phase 3+
73
+ this.logger.warn(`Artifacts directory does not exist: ${this.artifactsDir}`);
74
+ return;
75
+ }
76
+ const safeFilename = basename(filename);
77
+ const fullPath = resolve(this.artifactsDir, safeFilename);
78
+ // Prevent path traversal
79
+ if (!fullPath.startsWith(this.artifactsDir)) {
80
+ throw new Error('Invalid artifact path');
81
+ }
82
+ // TODO: Implement file writing in Phase 3
83
+ // For now, just log (content is intentionally unused)
84
+ void content; // Suppress unused variable warning
85
+ this.logger.debug(`Would save artifact: ${safeFilename}`);
86
+ }
87
+ catch (error) {
88
+ this.logger.error(`Failed to save artifact: ${filename}`);
89
+ throw error;
90
+ }
91
+ }
92
+ }
93
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../src/core/execution/artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Costs Service
3
+ *
4
+ * Provides cost tracking functionality for DAG planning and execution.
5
+ * Tracks usage and costs at planning, execution, and sub-step levels.
6
+ */
7
+ import type { DrizzleDB } from '../../db/client.js';
8
+ /**
9
+ * Usage information for token tracking
10
+ */
11
+ export interface UsageInfo {
12
+ promptTokens?: number;
13
+ completionTokens?: number;
14
+ totalTokens?: number;
15
+ }
16
+ /**
17
+ * Planning usage total (aggregate over all attempts)
18
+ */
19
+ export interface PlanningUsageTotal {
20
+ promptTokens: number;
21
+ completionTokens: number;
22
+ totalTokens: number;
23
+ }
24
+ /**
25
+ * Individual planning attempt details
26
+ */
27
+ export interface PlanningAttempt {
28
+ attempt: number;
29
+ reason: 'initial' | 'retry_gaps' | 'retry_parse_error' | 'retry_validation' | 'title_master';
30
+ usage?: {
31
+ promptTokens?: number;
32
+ completionTokens?: number;
33
+ totalTokens?: number;
34
+ };
35
+ costUsd?: number | null;
36
+ errorMessage?: string;
37
+ generationStats?: Record<string, any>;
38
+ }
39
+ /**
40
+ * Sub-step cost information
41
+ */
42
+ export interface SubStepCost {
43
+ id: string;
44
+ taskId: string;
45
+ actionType: string;
46
+ toolOrPromptName: string;
47
+ usage: UsageInfo | null;
48
+ costUsd: string | null;
49
+ }
50
+ /**
51
+ * Synthesis cost information
52
+ */
53
+ export interface SynthesisCost {
54
+ usage: UsageInfo | null;
55
+ costUsd: string | null;
56
+ }
57
+ /**
58
+ * Execution cost breakdown
59
+ */
60
+ export interface ExecutionCostBreakdown {
61
+ dagId: string | null;
62
+ executionId: string;
63
+ planning: {
64
+ totalUsage: PlanningUsageTotal | null;
65
+ totalCostUsd: string | null;
66
+ attempts: PlanningAttempt[] | null;
67
+ } | null;
68
+ execution: {
69
+ totalUsage: UsageInfo | null;
70
+ totalCostUsd: string | null;
71
+ subSteps: SubStepCost[];
72
+ synthesis: SynthesisCost | null;
73
+ };
74
+ totals: {
75
+ planningCostUsd: string;
76
+ executionCostUsd: string;
77
+ grandTotalCostUsd: string;
78
+ };
79
+ }
80
+ /**
81
+ * Execution summary for DAG costs
82
+ */
83
+ export interface ExecutionSummary {
84
+ executionId: string;
85
+ status: string;
86
+ totalCostUsd: string | null;
87
+ startedAt: Date | null;
88
+ completedAt: Date | null;
89
+ }
90
+ /**
91
+ * DAG cost breakdown
92
+ */
93
+ export interface DagCostBreakdown {
94
+ dagId: string;
95
+ planning: {
96
+ totalUsage: PlanningUsageTotal | null;
97
+ totalCostUsd: string | null;
98
+ attempts: PlanningAttempt[] | null;
99
+ };
100
+ executions: ExecutionSummary[];
101
+ totals: {
102
+ planningCostUsd: string;
103
+ executionsCostUsd: string;
104
+ grandTotalCostUsd: string;
105
+ };
106
+ }
107
+ /**
108
+ * Cost summary by date
109
+ */
110
+ export interface CostSummaryEntry {
111
+ date: string;
112
+ planningCostUsd: string;
113
+ executionCostUsd: string;
114
+ totalCostUsd: string;
115
+ }
116
+ /**
117
+ * Aggregated cost summary result
118
+ */
119
+ export interface CostSummaryResult {
120
+ dateRange: {
121
+ from: string;
122
+ to: string;
123
+ groupBy: string;
124
+ };
125
+ summary: CostSummaryEntry[];
126
+ totals: {
127
+ planningCostUsd: string;
128
+ executionCostUsd: string;
129
+ totalCostUsd: string;
130
+ };
131
+ }
132
+ /**
133
+ * Options for cost summary aggregation
134
+ */
135
+ export interface CostSummaryOptions {
136
+ from?: Date;
137
+ to?: Date;
138
+ groupBy?: 'day' | 'week' | 'month';
139
+ }
140
+ /**
141
+ * CostsService handles cost tracking and aggregation
142
+ */
143
+ export declare class CostsService {
144
+ private db;
145
+ private logger;
146
+ constructor(db: DrizzleDB);
147
+ /**
148
+ * Get cost breakdown for a specific execution
149
+ */
150
+ getExecutionCosts(executionId: string): Promise<ExecutionCostBreakdown>;
151
+ /**
152
+ * Get total costs for a DAG (planning + all executions)
153
+ */
154
+ getDagCosts(dagId: string): Promise<DagCostBreakdown>;
155
+ /**
156
+ * Get cost summary aggregated by date
157
+ */
158
+ getCostSummary(opts?: CostSummaryOptions): Promise<CostSummaryResult>;
159
+ }
160
+ //# sourceMappingURL=costs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"costs.d.ts","sourceRoot":"","sources":["../../../src/core/execution/costs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Costs Service
3
+ *
4
+ * Provides cost tracking functionality for DAG planning and execution.
5
+ * Tracks usage and costs at planning, execution, and sub-step levels.
6
+ */
7
+ import { eq } from 'drizzle-orm';
8
+ import { dags, dagExecutions, dagSubSteps } from '../../db/schema.js';
9
+ import { NotFoundError } from '../../errors/index.js';
10
+ import { getLogger } from '../../util/logger.js';
11
+ /**
12
+ * Parses a date string or returns default date
13
+ */
14
+ function parseDate(dateStr, defaultDate) {
15
+ if (!dateStr)
16
+ return defaultDate;
17
+ if (dateStr instanceof Date)
18
+ return dateStr;
19
+ return new Date(dateStr);
20
+ }
21
+ /**
22
+ * Formats a date according to the specified grouping
23
+ */
24
+ function formatDateByGroup(date, groupBy) {
25
+ switch (groupBy) {
26
+ case 'week': {
27
+ const d = new Date(date);
28
+ d.setDate(d.getDate() - d.getDay());
29
+ return d.toISOString().split('T')[0];
30
+ }
31
+ case 'month':
32
+ return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;
33
+ default:
34
+ return date.toISOString().split('T')[0];
35
+ }
36
+ }
37
+ /**
38
+ * CostsService handles cost tracking and aggregation
39
+ */
40
+ export class CostsService {
41
+ db;
42
+ logger = getLogger();
43
+ constructor(db) {
44
+ this.db = db;
45
+ }
46
+ /**
47
+ * Get cost breakdown for a specific execution
48
+ */
49
+ async getExecutionCosts(executionId) {
50
+ const execution = await this.db.query.dagExecutions.findFirst({
51
+ where: eq(dagExecutions.id, executionId),
52
+ });
53
+ if (!execution) {
54
+ throw new NotFoundError('Execution', executionId);
55
+ }
56
+ const dag = execution.dagId
57
+ ? await this.db.query.dags.findFirst({ where: eq(dags.id, execution.dagId) })
58
+ : null;
59
+ const allSubSteps = await this.db.query.dagSubSteps.findMany({
60
+ where: eq(dagSubSteps.executionId, executionId),
61
+ });
62
+ const synthesisStep = allSubSteps.find(s => s.toolOrPromptName === '__synthesis__');
63
+ const taskSteps = allSubSteps.filter(s => s.toolOrPromptName !== '__synthesis__');
64
+ const planningCost = parseFloat(dag?.planningTotalCostUsd ?? '0');
65
+ const executionCost = parseFloat(execution.totalCostUsd ?? '0');
66
+ this.logger.debug({ executionId, planningCost, executionCost }, 'Retrieved execution costs');
67
+ return {
68
+ dagId: execution.dagId,
69
+ executionId,
70
+ planning: dag ? {
71
+ totalUsage: dag.planningTotalUsage,
72
+ totalCostUsd: dag.planningTotalCostUsd ?? null,
73
+ attempts: dag.planningAttempts,
74
+ } : null,
75
+ execution: {
76
+ totalUsage: execution.totalUsage,
77
+ totalCostUsd: execution.totalCostUsd ?? null,
78
+ subSteps: taskSteps.map(s => ({
79
+ id: s.id,
80
+ taskId: s.taskId,
81
+ actionType: s.actionType,
82
+ toolOrPromptName: s.toolOrPromptName,
83
+ usage: s.usage,
84
+ costUsd: s.costUsd ?? null,
85
+ })),
86
+ synthesis: synthesisStep ? {
87
+ usage: synthesisStep.usage,
88
+ costUsd: synthesisStep.costUsd ?? null,
89
+ } : null,
90
+ },
91
+ totals: {
92
+ planningCostUsd: dag?.planningTotalCostUsd ?? '0',
93
+ executionCostUsd: execution.totalCostUsd ?? '0',
94
+ grandTotalCostUsd: (planningCost + executionCost).toString(),
95
+ },
96
+ };
97
+ }
98
+ /**
99
+ * Get total costs for a DAG (planning + all executions)
100
+ */
101
+ async getDagCosts(dagId) {
102
+ const dag = await this.db.query.dags.findFirst({
103
+ where: eq(dags.id, dagId),
104
+ });
105
+ if (!dag) {
106
+ throw new NotFoundError('DAG', dagId);
107
+ }
108
+ const allExecutions = await this.db.query.dagExecutions.findMany({
109
+ where: eq(dagExecutions.dagId, dagId),
110
+ });
111
+ const executionTotalCost = allExecutions.reduce((sum, e) => sum + parseFloat(e.totalCostUsd ?? '0'), 0);
112
+ const planningCost = parseFloat(dag.planningTotalCostUsd ?? '0');
113
+ this.logger.debug({ dagId, planningCost, executionTotalCost }, 'Retrieved DAG costs');
114
+ return {
115
+ dagId,
116
+ planning: {
117
+ totalUsage: dag.planningTotalUsage,
118
+ totalCostUsd: dag.planningTotalCostUsd ?? null,
119
+ attempts: dag.planningAttempts,
120
+ },
121
+ executions: allExecutions.map(e => ({
122
+ executionId: e.id,
123
+ status: e.status,
124
+ totalCostUsd: e.totalCostUsd ?? null,
125
+ startedAt: e.startedAt ?? null,
126
+ completedAt: e.completedAt ?? null,
127
+ })),
128
+ totals: {
129
+ planningCostUsd: dag.planningTotalCostUsd ?? '0',
130
+ executionsCostUsd: executionTotalCost.toString(),
131
+ grandTotalCostUsd: (planningCost + executionTotalCost).toString(),
132
+ },
133
+ };
134
+ }
135
+ /**
136
+ * Get cost summary aggregated by date
137
+ */
138
+ async getCostSummary(opts = {}) {
139
+ const groupBy = opts.groupBy ?? 'day';
140
+ const fromDate = parseDate(opts.from, new Date(Date.now() - 30 * 24 * 60 * 60 * 1000));
141
+ const toDate = parseDate(opts.to, new Date());
142
+ const allDags = await this.db.query.dags.findMany();
143
+ const allExecutions = await this.db.query.dagExecutions.findMany();
144
+ const costsByDate = new Map();
145
+ for (const dag of allDags) {
146
+ if (!dag.createdAt)
147
+ continue;
148
+ const dagDate = dag.createdAt instanceof Date ? dag.createdAt : new Date(dag.createdAt);
149
+ if (dagDate < fromDate || dagDate > toDate)
150
+ continue;
151
+ const dateKey = formatDateByGroup(dagDate, groupBy);
152
+ const existing = costsByDate.get(dateKey) ?? { planningCostUsd: 0, executionCostUsd: 0 };
153
+ existing.planningCostUsd += parseFloat(dag.planningTotalCostUsd ?? '0');
154
+ costsByDate.set(dateKey, existing);
155
+ }
156
+ for (const exec of allExecutions) {
157
+ if (!exec.completedAt)
158
+ continue;
159
+ const execDate = exec.completedAt instanceof Date ? exec.completedAt : new Date(exec.completedAt);
160
+ if (execDate < fromDate || execDate > toDate)
161
+ continue;
162
+ const dateKey = formatDateByGroup(execDate, groupBy);
163
+ const existing = costsByDate.get(dateKey) ?? { planningCostUsd: 0, executionCostUsd: 0 };
164
+ existing.executionCostUsd += parseFloat(exec.totalCostUsd ?? '0');
165
+ costsByDate.set(dateKey, existing);
166
+ }
167
+ const summary = Array.from(costsByDate.entries())
168
+ .map(([date, costs]) => ({
169
+ date,
170
+ planningCostUsd: costs.planningCostUsd.toString(),
171
+ executionCostUsd: costs.executionCostUsd.toString(),
172
+ totalCostUsd: (costs.planningCostUsd + costs.executionCostUsd).toString(),
173
+ }))
174
+ .sort((a, b) => a.date.localeCompare(b.date));
175
+ const totals = summary.reduce((acc, day) => ({
176
+ planningCostUsd: acc.planningCostUsd + parseFloat(day.planningCostUsd),
177
+ executionCostUsd: acc.executionCostUsd + parseFloat(day.executionCostUsd),
178
+ totalCostUsd: acc.totalCostUsd + parseFloat(day.totalCostUsd),
179
+ }), { planningCostUsd: 0, executionCostUsd: 0, totalCostUsd: 0 });
180
+ this.logger.debug({ from: fromDate, to: toDate, groupBy, entries: summary.length }, 'Retrieved cost summary');
181
+ return {
182
+ dateRange: {
183
+ from: fromDate.toISOString(),
184
+ to: toDate.toISOString(),
185
+ groupBy,
186
+ },
187
+ summary,
188
+ totals: {
189
+ planningCostUsd: totals.planningCostUsd.toString(),
190
+ executionCostUsd: totals.executionCostUsd.toString(),
191
+ totalCostUsd: totals.totalCostUsd.toString(),
192
+ },
193
+ };
194
+ }
195
+ }
196
+ //# sourceMappingURL=costs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"costs.js","sourceRoot":"","sources":["../../../src/core/execution/costs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * DAG Executor
3
+ *
4
+ * Executes DAG (Directed Acyclic Graph) workflows by running tasks
5
+ * in dependency order with parallel execution where possible.
6
+ */
7
+ import type { DrizzleDB } from '../../db/client.js';
8
+ import type { LLMProvider } from '../providers/types.js';
9
+ import type { ToolRegistry } from '../tools/registry.js';
10
+ export interface SubTask {
11
+ id: string;
12
+ description: string;
13
+ thought: string;
14
+ action_type: 'tool' | 'inference';
15
+ tool_or_prompt: {
16
+ name: string;
17
+ params?: Record<string, any>;
18
+ };
19
+ expected_output: string;
20
+ dependencies: string[];
21
+ }
22
+ export interface DecomposerJob {
23
+ original_request: string;
24
+ title?: string;
25
+ intent: {
26
+ primary: string;
27
+ sub_intents: string[];
28
+ };
29
+ entities: Array<{
30
+ entity: string;
31
+ type: string;
32
+ grounded_value: string;
33
+ }>;
34
+ sub_tasks: SubTask[];
35
+ synthesis_plan: string;
36
+ validation: {
37
+ coverage: string;
38
+ gaps: string[];
39
+ iteration_triggers: string[];
40
+ };
41
+ clarification_needed: boolean;
42
+ clarification_query?: string;
43
+ }
44
+ export interface DAGExecutorConfig {
45
+ db: DrizzleDB;
46
+ llmProvider: LLMProvider;
47
+ toolRegistry: ToolRegistry;
48
+ artifactsDir?: string;
49
+ }
50
+ /**
51
+ * Execution configuration for performance tuning
52
+ */
53
+ export interface ExecutionConfig {
54
+ /**
55
+ * Skip event emission for maximum speed when streaming not needed.
56
+ * Default: false (events enabled)
57
+ */
58
+ skipEvents?: boolean;
59
+ /**
60
+ * Batch DB updates per wave instead of per-task.
61
+ * Default: true
62
+ */
63
+ batchDbUpdates?: boolean;
64
+ }
65
+ export interface GlobalContext {
66
+ formatted: string;
67
+ totalTasks: number;
68
+ }
69
+ export interface TaskExecutionResult {
70
+ content: any;
71
+ usage?: {
72
+ promptTokens?: number;
73
+ completionTokens?: number;
74
+ totalTokens?: number;
75
+ };
76
+ costUsd?: number;
77
+ generationStats?: Record<string, any>;
78
+ }
79
+ export declare class DAGExecutor {
80
+ private db;
81
+ private llmProvider;
82
+ private toolRegistry;
83
+ private artifactsDir;
84
+ private logger;
85
+ constructor(config: DAGExecutorConfig);
86
+ private extractUrls;
87
+ private buildGlobalContext;
88
+ private buildInferencePrompt;
89
+ private resolveDependencies;
90
+ private handleMultipleMatches;
91
+ private resolveEmailContent;
92
+ private resolveWriteFileContent;
93
+ private resolveFetchURLs;
94
+ private resolveStringReplacements;
95
+ /**
96
+ * Pre-fetch all agents needed for inference tasks
97
+ * Reduces DB queries during execution from O(n) to O(1) per agent
98
+ */
99
+ private prefetchAgents;
100
+ /**
101
+ * Conditionally emit event based on config
102
+ */
103
+ private emitEventIfEnabled;
104
+ execute(job: DecomposerJob, executionId: string, dagId?: string, originalRequest?: string, config?: ExecutionConfig): Promise<string>;
105
+ private suspendExecution;
106
+ private deriveExecutionStatus;
107
+ private synthesize;
108
+ private validate;
109
+ private aggregateUsage;
110
+ private aggregateCost;
111
+ }
112
+ //# sourceMappingURL=dagExecutor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dagExecutor.d.ts","sourceRoot":"","sources":["../../../src/core/execution/dagExecutor.ts"],"names":[],"mappings":"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"}