@ugm/desiagent 0.1.37 → 0.2.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.
Files changed (115) hide show
  1. package/README.md +298 -156
  2. package/dist/core/execution/agents.d.ts.map +1 -1
  3. package/dist/core/execution/agents.js +18 -4
  4. package/dist/core/execution/agents.js.map +1 -1
  5. package/dist/core/execution/dagExecutor.d.ts +15 -2
  6. package/dist/core/execution/dagExecutor.d.ts.map +1 -1
  7. package/dist/core/execution/dagExecutor.js +164 -30
  8. package/dist/core/execution/dagExecutor.js.map +1 -1
  9. package/dist/core/execution/dags.d.ts +19 -1
  10. package/dist/core/execution/dags.d.ts.map +1 -1
  11. package/dist/core/execution/dags.js +171 -92
  12. package/dist/core/execution/dags.js.map +1 -1
  13. package/dist/core/execution/inference.d.ts +20 -16
  14. package/dist/core/execution/inference.d.ts.map +1 -1
  15. package/dist/core/execution/inference.js +2 -1
  16. package/dist/core/execution/inference.js.map +1 -1
  17. package/dist/core/providers/factory.d.ts +1 -0
  18. package/dist/core/providers/factory.d.ts.map +1 -1
  19. package/dist/core/providers/factory.js +5 -4
  20. package/dist/core/providers/factory.js.map +1 -1
  21. package/dist/core/providers/openrouter.d.ts +9 -2
  22. package/dist/core/providers/openrouter.d.ts.map +1 -1
  23. package/dist/core/providers/openrouter.js +66 -9
  24. package/dist/core/providers/openrouter.js.map +1 -1
  25. package/dist/core/providers/types.d.ts +9 -0
  26. package/dist/core/providers/types.d.ts.map +1 -1
  27. package/dist/core/skills/detector.d.ts +8 -0
  28. package/dist/core/skills/detector.d.ts.map +1 -0
  29. package/dist/core/skills/detector.js +60 -0
  30. package/dist/core/skills/detector.js.map +1 -0
  31. package/dist/core/skills/registry.d.ts +44 -0
  32. package/dist/core/skills/registry.d.ts.map +1 -0
  33. package/dist/core/skills/registry.js +149 -0
  34. package/dist/core/skills/registry.js.map +1 -0
  35. package/dist/core/tools/base.d.ts +14 -1
  36. package/dist/core/tools/base.d.ts.map +1 -1
  37. package/dist/core/tools/base.js.map +1 -1
  38. package/dist/core/tools/bash.js +1 -1
  39. package/dist/core/tools/bash.js.map +1 -1
  40. package/dist/core/tools/edit.js +1 -1
  41. package/dist/core/tools/edit.js.map +1 -1
  42. package/dist/core/tools/executor.d.ts +4 -1
  43. package/dist/core/tools/executor.d.ts.map +1 -1
  44. package/dist/core/tools/executor.js +8 -2
  45. package/dist/core/tools/executor.js.map +1 -1
  46. package/dist/core/tools/fetchPage.d.ts +1 -1
  47. package/dist/core/tools/fetchPage.d.ts.map +1 -1
  48. package/dist/core/tools/fetchPage.js +20 -4
  49. package/dist/core/tools/fetchPage.js.map +1 -1
  50. package/dist/core/tools/glob.js +1 -1
  51. package/dist/core/tools/glob.js.map +1 -1
  52. package/dist/core/tools/grep.js +1 -1
  53. package/dist/core/tools/grep.js.map +1 -1
  54. package/dist/core/tools/llmExecute.d.ts +41 -32
  55. package/dist/core/tools/llmExecute.d.ts.map +1 -1
  56. package/dist/core/tools/llmExecute.js +13 -0
  57. package/dist/core/tools/llmExecute.js.map +1 -1
  58. package/dist/core/tools/readEmail.d.ts +1 -1
  59. package/dist/core/tools/readEmail.d.ts.map +1 -1
  60. package/dist/core/tools/readEmail.js +6 -9
  61. package/dist/core/tools/readEmail.js.map +1 -1
  62. package/dist/core/tools/readFile.js +1 -1
  63. package/dist/core/tools/readFile.js.map +1 -1
  64. package/dist/core/tools/sendEmail.d.ts +7 -7
  65. package/dist/core/tools/sendEmail.d.ts.map +1 -1
  66. package/dist/core/tools/sendEmail.js +12 -17
  67. package/dist/core/tools/sendEmail.js.map +1 -1
  68. package/dist/core/tools/writeFile.d.ts +1 -1
  69. package/dist/core/tools/writeFile.js +1 -1
  70. package/dist/core/tools/writeFile.js.map +1 -1
  71. package/dist/core/workers/statsQueue.d.ts +69 -0
  72. package/dist/core/workers/statsQueue.d.ts.map +1 -0
  73. package/dist/core/workers/statsQueue.js +106 -0
  74. package/dist/core/workers/statsQueue.js.map +1 -0
  75. package/dist/core/workers/statsWorker.d.ts +11 -0
  76. package/dist/core/workers/statsWorker.d.ts.map +1 -0
  77. package/dist/core/workers/statsWorker.js +235 -0
  78. package/dist/core/workers/statsWorker.js.map +1 -0
  79. package/dist/db/client.d.ts +1 -1
  80. package/dist/db/client.d.ts.map +1 -1
  81. package/dist/db/client.js +21 -86
  82. package/dist/db/client.js.map +1 -1
  83. package/dist/index.d.ts +6 -3
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +71 -33
  86. package/dist/index.js.map +1 -1
  87. package/dist/services/agentsSeedData.d.ts.map +1 -1
  88. package/dist/services/agentsSeedData.js +14 -0
  89. package/dist/services/agentsSeedData.js.map +1 -1
  90. package/dist/services/initDB.d.ts +6 -0
  91. package/dist/services/initDB.d.ts.map +1 -1
  92. package/dist/services/initDB.js +2 -2
  93. package/dist/services/initDB.js.map +1 -1
  94. package/dist/test/setup.d.ts +1 -0
  95. package/dist/test/setup.d.ts.map +1 -0
  96. package/dist/test/setup.js +3 -0
  97. package/dist/test/setup.js.map +1 -0
  98. package/dist/types/client.d.ts +1 -0
  99. package/dist/types/client.d.ts.map +1 -1
  100. package/dist/types/config.d.ts +40 -7
  101. package/dist/types/config.d.ts.map +1 -1
  102. package/dist/types/config.js +69 -7
  103. package/dist/types/config.js.map +1 -1
  104. package/dist/types/dag.d.ts +44 -44
  105. package/dist/types/dag.js +7 -7
  106. package/dist/types/dag.js.map +1 -1
  107. package/dist/util/logger.d.ts +1 -8
  108. package/dist/util/logger.d.ts.map +1 -1
  109. package/dist/util/logger.js +11 -60
  110. package/dist/util/logger.js.map +1 -1
  111. package/dist/util/sendEmailTool.d.ts +7 -7
  112. package/dist/util/sendEmailTool.d.ts.map +1 -1
  113. package/dist/util/sendEmailTool.js +8 -0
  114. package/dist/util/sendEmailTool.js.map +1 -1
  115. package/package.json +2 -1
@@ -0,0 +1,69 @@
1
+ /**
2
+ * StatsQueue - Main-thread interface for enqueueing generation stats updates
3
+ *
4
+ * Spawns a Bun Worker thread that fetches OpenRouter generation stats
5
+ * and updates the DB in the background, keeping the hot path fast.
6
+ */
7
+ /**
8
+ * A stats update job to be processed by the worker.
9
+ */
10
+ export interface StatsJob {
11
+ /** Which table to update */
12
+ table: 'sub_steps' | 'dag_executions' | 'dags';
13
+ /** Row ID in that table (dagId for 'dags', executionId for 'dag_executions') */
14
+ id: string;
15
+ /** OpenRouter generation ID for fetching stats */
16
+ generationId: string;
17
+ /**
18
+ * For 'sub_steps': the taskId used with executionId to locate the row.
19
+ */
20
+ taskId?: string;
21
+ /**
22
+ * For 'sub_steps': the executionId the sub-step belongs to.
23
+ */
24
+ executionId?: string;
25
+ /**
26
+ * For 'dags' table: which planning attempt index to annotate with costUsd/generationStats.
27
+ * The worker reads the current planningAttempts JSON, patches the entry, and recalculates totals.
28
+ */
29
+ attemptIndex?: number;
30
+ }
31
+ /**
32
+ * Message sent from main thread → worker
33
+ */
34
+ export interface WorkerInMessage {
35
+ type: 'job' | 'shutdown';
36
+ job?: StatsJob;
37
+ }
38
+ /**
39
+ * Message sent from worker → main thread
40
+ */
41
+ export interface WorkerOutMessage {
42
+ type: 'done' | 'error' | 'drained';
43
+ table?: string;
44
+ id?: string;
45
+ error?: string;
46
+ }
47
+ export declare class StatsQueue {
48
+ private worker;
49
+ private logger;
50
+ private dbPath;
51
+ private apiKey;
52
+ private pendingCount;
53
+ constructor(dbPath: string, apiKey: string);
54
+ /**
55
+ * Start the background worker. Safe to call multiple times (idempotent).
56
+ */
57
+ start(): void;
58
+ /**
59
+ * Enqueue a stats update job for background processing.
60
+ * If the worker isn't started, silently drops the job with a warning.
61
+ */
62
+ enqueue(job: StatsJob): void;
63
+ /**
64
+ * Gracefully terminate the worker after all pending jobs are processed.
65
+ * Waits up to DRAIN_TIMEOUT_MS for the worker to drain, then force-terminates.
66
+ */
67
+ terminate(): Promise<void>;
68
+ }
69
+ //# sourceMappingURL=statsQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statsQueue.d.ts","sourceRoot":"","sources":["../../../src/core/workers/statsQueue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,4BAA4B;IAC5B,KAAK,EAAE,WAAW,GAAG,gBAAgB,GAAG,MAAM,CAAC;IAC/C,gFAAgF;IAChF,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,GAAG,UAAU,CAAC;IACzB,GAAG,CAAC,EAAE,QAAQ,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAK;gBAEb,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAK1C;;OAEG;IACH,KAAK,IAAI,IAAI;IAmCb;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI;IAY5B;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAyCjC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * StatsQueue - Main-thread interface for enqueueing generation stats updates
3
+ *
4
+ * Spawns a Bun Worker thread that fetches OpenRouter generation stats
5
+ * and updates the DB in the background, keeping the hot path fast.
6
+ */
7
+ import { getLogger } from '../../util/logger.js';
8
+ /** Max time (ms) to wait for the worker to drain before force-terminating */
9
+ const DRAIN_TIMEOUT_MS = 30_000;
10
+ export class StatsQueue {
11
+ worker = null;
12
+ logger = getLogger();
13
+ dbPath;
14
+ apiKey;
15
+ pendingCount = 0;
16
+ constructor(dbPath, apiKey) {
17
+ this.dbPath = dbPath;
18
+ this.apiKey = apiKey;
19
+ }
20
+ /**
21
+ * Start the background worker. Safe to call multiple times (idempotent).
22
+ */
23
+ start() {
24
+ if (this.worker)
25
+ return;
26
+ const workerUrl = new URL('./statsWorker.js', import.meta.url).href;
27
+ this.worker = new Worker(workerUrl);
28
+ // Send init config
29
+ this.worker.postMessage({
30
+ type: 'init',
31
+ dbPath: this.dbPath,
32
+ apiKey: this.apiKey,
33
+ });
34
+ this.worker.onmessage = (event) => {
35
+ const msg = event.data;
36
+ if (msg.type === 'done') {
37
+ this.pendingCount--;
38
+ this.logger.debug({ table: msg.table, id: msg.id }, 'StatsWorker: update complete');
39
+ }
40
+ else if (msg.type === 'error') {
41
+ this.pendingCount--;
42
+ this.logger.warn({ table: msg.table, id: msg.id, error: msg.error }, 'StatsWorker: update failed');
43
+ }
44
+ // 'drained' is handled by the terminate() promise listener
45
+ };
46
+ this.worker.onerror = (event) => {
47
+ this.logger.error({ error: event.message }, 'StatsWorker: worker error');
48
+ };
49
+ // Don't let the worker keep the process alive during normal operation
50
+ this.worker.unref();
51
+ this.logger.info('StatsQueue: background worker started');
52
+ }
53
+ /**
54
+ * Enqueue a stats update job for background processing.
55
+ * If the worker isn't started, silently drops the job with a warning.
56
+ */
57
+ enqueue(job) {
58
+ if (!this.worker) {
59
+ this.logger.warn({ job }, 'StatsQueue: worker not started, dropping job');
60
+ return;
61
+ }
62
+ this.pendingCount++;
63
+ const msg = { type: 'job', job };
64
+ this.worker.postMessage(msg);
65
+ this.logger.debug({ table: job.table, id: job.id, generationId: job.generationId }, 'StatsQueue: job enqueued');
66
+ }
67
+ /**
68
+ * Gracefully terminate the worker after all pending jobs are processed.
69
+ * Waits up to DRAIN_TIMEOUT_MS for the worker to drain, then force-terminates.
70
+ */
71
+ async terminate() {
72
+ if (!this.worker)
73
+ return;
74
+ // Fast path: no pending work
75
+ if (this.pendingCount <= 0) {
76
+ this.worker.terminate();
77
+ this.worker = null;
78
+ this.logger.info('StatsQueue: worker terminated (no pending jobs)');
79
+ return;
80
+ }
81
+ this.logger.info({ pendingCount: this.pendingCount }, 'StatsQueue: draining pending jobs before shutdown');
82
+ // Need to ref the worker so the process stays alive while draining
83
+ this.worker.ref();
84
+ const worker = this.worker;
85
+ await new Promise((resolve) => {
86
+ const timeout = setTimeout(() => {
87
+ this.logger.warn({ pendingCount: this.pendingCount }, 'StatsQueue: drain timeout reached, force-terminating');
88
+ worker.terminate();
89
+ resolve();
90
+ }, DRAIN_TIMEOUT_MS);
91
+ const onMessage = (event) => {
92
+ if (event.data.type === 'drained') {
93
+ clearTimeout(timeout);
94
+ worker.terminate();
95
+ this.logger.info('StatsQueue: worker drained and terminated');
96
+ resolve();
97
+ }
98
+ };
99
+ worker.addEventListener('message', onMessage);
100
+ worker.postMessage({ type: 'shutdown' });
101
+ });
102
+ this.worker = null;
103
+ this.pendingCount = 0;
104
+ }
105
+ }
106
+ //# sourceMappingURL=statsQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statsQueue.js","sourceRoot":"","sources":["../../../src/core/workers/statsQueue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * StatsWorker - Background Bun Worker thread
3
+ *
4
+ * Receives stats jobs from the main thread, fetches generation stats
5
+ * from OpenRouter, and updates the appropriate DB tables.
6
+ *
7
+ * Runs on a separate thread with its own DB connection.
8
+ * Supports graceful shutdown: drains all pending jobs before exiting.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=statsWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statsWorker.d.ts","sourceRoot":"","sources":["../../../src/core/workers/statsWorker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,235 @@
1
+ /**
2
+ * StatsWorker - Background Bun Worker thread
3
+ *
4
+ * Receives stats jobs from the main thread, fetches generation stats
5
+ * from OpenRouter, and updates the appropriate DB tables.
6
+ *
7
+ * Runs on a separate thread with its own DB connection.
8
+ * Supports graceful shutdown: drains all pending jobs before exiting.
9
+ */
10
+ import { drizzle } from 'drizzle-orm/bun-sqlite';
11
+ import { Database } from 'bun:sqlite';
12
+ import { eq, and } from 'drizzle-orm';
13
+ import * as schema from '../../db/schema.js';
14
+ import { dags, dagExecutions, dagSubSteps } from '../../db/schema.js';
15
+ const BASE_URL = 'https://openrouter.ai/api/v1';
16
+ const MAX_FETCH_ATTEMPTS = 5;
17
+ const INITIAL_DELAY_MS = 2000;
18
+ let db = null;
19
+ let apiKey = '';
20
+ /** Number of jobs currently being processed */
21
+ let pendingCount = 0;
22
+ /** Whether a shutdown has been requested */
23
+ let shutdownRequested = false;
24
+ /**
25
+ * Check if we can exit after shutdown was requested.
26
+ * Sends 'drained' back to the main thread and exits.
27
+ */
28
+ function checkDrain() {
29
+ if (shutdownRequested && pendingCount === 0) {
30
+ postMessage({ type: 'drained' });
31
+ process.exit(0);
32
+ }
33
+ }
34
+ /**
35
+ * Fetch generation stats from OpenRouter with exponential backoff.
36
+ */
37
+ async function fetchGenerationStats(generationId) {
38
+ let nextDelayMs = INITIAL_DELAY_MS;
39
+ for (let attempt = 1; attempt <= MAX_FETCH_ATTEMPTS; attempt++) {
40
+ try {
41
+ await new Promise(resolve => setTimeout(resolve, nextDelayMs));
42
+ const res = await fetch(`${BASE_URL}/generation?id=${generationId}`, {
43
+ headers: {
44
+ 'Authorization': `Bearer ${apiKey}`,
45
+ 'Content-Type': 'application/json',
46
+ 'Accept': 'application/json',
47
+ },
48
+ });
49
+ if (!res.ok) {
50
+ if (res.status === 429) {
51
+ const retryAfter = res.headers.get('retry-after');
52
+ nextDelayMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : nextDelayMs * 3;
53
+ continue;
54
+ }
55
+ if (attempt === MAX_FETCH_ATTEMPTS) {
56
+ return { error: `HTTP ${res.status} after ${attempt} attempts` };
57
+ }
58
+ nextDelayMs = nextDelayMs * 2;
59
+ continue;
60
+ }
61
+ const details = (await res.json());
62
+ const detailsData = details.data;
63
+ const stats = {};
64
+ const allowedKeys = ['latency', 'model', 'generation_time', 'finish_reason', 'native_finish_reason', 'total_cost', 'id'];
65
+ for (const key of allowedKeys) {
66
+ if (detailsData?.[key] !== undefined) {
67
+ stats[key] = detailsData[key];
68
+ }
69
+ }
70
+ const totalCost = detailsData?.total_cost;
71
+ const costUsd = totalCost !== undefined && totalCost !== null
72
+ ? (typeof totalCost === 'number' ? totalCost : parseFloat(totalCost))
73
+ : undefined;
74
+ return { data: stats, costUsd };
75
+ }
76
+ catch (error) {
77
+ if (attempt === MAX_FETCH_ATTEMPTS) {
78
+ return { error: String(error) };
79
+ }
80
+ nextDelayMs = nextDelayMs * 2;
81
+ }
82
+ }
83
+ return { error: 'Max attempts reached' };
84
+ }
85
+ /**
86
+ * Update sub_steps table with generation stats and cost.
87
+ * Uses taskId + executionId as composite key (matching the pattern in DAGExecutor).
88
+ */
89
+ async function updateSubStep(job) {
90
+ const stats = await fetchGenerationStats(job.generationId);
91
+ if (stats.error || !stats.data)
92
+ return;
93
+ if (!job.taskId || !job.executionId)
94
+ return;
95
+ await db.update(dagSubSteps)
96
+ .set({
97
+ generationStats: stats.data,
98
+ costUsd: stats.costUsd?.toString(),
99
+ updatedAt: new Date(),
100
+ })
101
+ .where(and(eq(dagSubSteps.taskId, job.taskId), eq(dagSubSteps.executionId, job.executionId)));
102
+ }
103
+ /**
104
+ * Update dag_executions table by re-aggregating costs from all sub_steps.
105
+ */
106
+ async function updateDagExecution(job) {
107
+ // Wait a moment for any sub_step stats workers to finish first
108
+ await new Promise(resolve => setTimeout(resolve, 1000));
109
+ const allSubSteps = await db.query.dagSubSteps.findMany({
110
+ where: eq(dagSubSteps.executionId, job.id),
111
+ });
112
+ let promptTokens = 0;
113
+ let completionTokens = 0;
114
+ let totalTokens = 0;
115
+ let totalCost = 0;
116
+ let hasUsage = false;
117
+ let hasCost = false;
118
+ for (const step of allSubSteps) {
119
+ if (step.usage) {
120
+ hasUsage = true;
121
+ const u = step.usage;
122
+ promptTokens += u.promptTokens ?? 0;
123
+ completionTokens += u.completionTokens ?? 0;
124
+ totalTokens += u.totalTokens ?? 0;
125
+ }
126
+ if (step.costUsd) {
127
+ hasCost = true;
128
+ totalCost += parseFloat(step.costUsd);
129
+ }
130
+ }
131
+ await db.update(dagExecutions)
132
+ .set({
133
+ totalUsage: hasUsage ? { promptTokens, completionTokens, totalTokens } : null,
134
+ totalCostUsd: hasCost ? totalCost.toString() : null,
135
+ updatedAt: new Date(),
136
+ })
137
+ .where(eq(dagExecutions.id, job.id));
138
+ }
139
+ /**
140
+ * Update dags table: fetch generation stats for a planning attempt
141
+ * and recalculate planning totals.
142
+ */
143
+ async function updateDag(job) {
144
+ const stats = await fetchGenerationStats(job.generationId);
145
+ if (stats.error || !stats.data)
146
+ return;
147
+ const [dagRow] = await db.select().from(dags).where(eq(dags.id, job.id)).limit(1);
148
+ if (!dagRow)
149
+ return;
150
+ const updateData = {
151
+ generationStats: stats.data,
152
+ updatedAt: new Date(),
153
+ };
154
+ // Patch the specific planning attempt if index is provided
155
+ if (job.attemptIndex !== undefined && dagRow.planningAttempts) {
156
+ const attempts = [...dagRow.planningAttempts];
157
+ if (attempts[job.attemptIndex]) {
158
+ attempts[job.attemptIndex].costUsd = stats.costUsd;
159
+ attempts[job.attemptIndex].generationStats = stats.data;
160
+ updateData.planningAttempts = attempts;
161
+ // Recalculate total planning cost
162
+ let totalCost = 0;
163
+ for (const a of attempts) {
164
+ if (a.costUsd != null) {
165
+ totalCost += typeof a.costUsd === 'number' ? a.costUsd : parseFloat(String(a.costUsd));
166
+ }
167
+ }
168
+ updateData.planningTotalCostUsd = totalCost.toString();
169
+ }
170
+ }
171
+ await db.update(dags).set(updateData).where(eq(dags.id, job.id));
172
+ }
173
+ /**
174
+ * Process a single job.
175
+ */
176
+ async function processJob(job) {
177
+ switch (job.table) {
178
+ case 'sub_steps':
179
+ await updateSubStep(job);
180
+ break;
181
+ case 'dag_executions':
182
+ await updateDagExecution(job);
183
+ break;
184
+ case 'dags':
185
+ await updateDag(job);
186
+ break;
187
+ }
188
+ }
189
+ /**
190
+ * Message handler
191
+ */
192
+ self.onmessage = async (event) => {
193
+ const msg = event.data;
194
+ if (msg.type === 'init') {
195
+ // Initialize DB connection on the worker thread
196
+ const sqlite = new Database(msg.dbPath);
197
+ sqlite.exec('PRAGMA journal_mode = WAL;');
198
+ sqlite.exec('PRAGMA foreign_keys = ON;');
199
+ db = drizzle(sqlite, { schema });
200
+ apiKey = msg.apiKey;
201
+ return;
202
+ }
203
+ if (msg.type === 'shutdown') {
204
+ shutdownRequested = true;
205
+ // If nothing is in-flight, drain immediately
206
+ checkDrain();
207
+ return;
208
+ }
209
+ if (msg.type === 'job') {
210
+ // Reject new jobs after shutdown
211
+ if (shutdownRequested)
212
+ return;
213
+ const job = msg.job;
214
+ pendingCount++;
215
+ try {
216
+ await processJob(job);
217
+ const reply = { type: 'done', table: job.table, id: job.id };
218
+ postMessage(reply);
219
+ }
220
+ catch (error) {
221
+ const reply = {
222
+ type: 'error',
223
+ table: job.table,
224
+ id: job.id,
225
+ error: error instanceof Error ? error.message : String(error),
226
+ };
227
+ postMessage(reply);
228
+ }
229
+ finally {
230
+ pendingCount--;
231
+ checkDrain();
232
+ }
233
+ }
234
+ };
235
+ //# sourceMappingURL=statsWorker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statsWorker.js","sourceRoot":"","sources":["../../../src/core/workers/statsWorker.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ export type DrizzleDB = BunSQLiteDatabase<typeof schema>;
4
4
  /**
5
5
  * Get or create the global database instance
6
6
  */
7
- export declare function getDatabase(dbPath: string): DrizzleDB;
7
+ export declare function getDatabase(dbPath: string, isMemoryDb?: boolean): DrizzleDB;
8
8
  /**
9
9
  * Close database connection
10
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAItC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,MAAM,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,MAAM,CAAC,CAAC;AAqIzD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAKrD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAapC;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAahE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,EAAE,EAAE,SAAS,EACb,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GACvC,OAAO,CAAC,CAAC,CAAC,CAYZ"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAItC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAIhE,MAAM,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,MAAM,CAAC,CAAC;AAgEzD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,OAAe,GAAG,SAAS,CAKlF;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAapC;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAahE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,EAAE,EAAE,SAAS,EACb,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GACvC,OAAO,CAAC,CAAC,CAAC,CAYZ"}
package/dist/db/client.js CHANGED
@@ -5,76 +5,16 @@ import { getLogger } from '../util/logger.js';
5
5
  import { existsSync, mkdirSync } from 'fs';
6
6
  import { dirname } from 'path';
7
7
  import { DatabaseError, InitializationError } from '../errors/index.js';
8
+ import { generateAllSQL } from '../services/initDB.js';
8
9
  let dbInstance = null;
9
- /**
10
- * SQL statements to create all tables based on the schema
11
- */
12
- const CREATE_TABLES_SQL = `
13
- -- Agents table
14
- CREATE TABLE IF NOT EXISTS agents (
15
- id TEXT PRIMARY KEY,
16
- name TEXT NOT NULL,
17
- version TEXT NOT NULL,
18
- prompt_template TEXT NOT NULL,
19
- provider TEXT,
20
- model TEXT,
21
- active INTEGER NOT NULL DEFAULT 0,
22
- metadata TEXT,
23
- created_at INTEGER NOT NULL DEFAULT (unixepoch()),
24
- updated_at INTEGER NOT NULL DEFAULT (unixepoch())
25
- );
26
-
27
- -- Unique index for agent name+version
28
- CREATE UNIQUE INDEX IF NOT EXISTS idx_name_version ON agents(name, version);
29
-
30
- -- Partial unique index for active agent per name
31
- CREATE UNIQUE INDEX IF NOT EXISTS idx_active_agent ON agents(name) WHERE active = 1;
32
-
33
- -- DAGs table
34
- CREATE TABLE IF NOT EXISTS dags (
35
- id TEXT PRIMARY KEY,
36
- status TEXT NOT NULL,
37
- result TEXT,
38
- usage TEXT,
39
- generation_stats TEXT,
40
- attempts INTEGER NOT NULL DEFAULT 0,
41
- params TEXT,
42
- agent_name TEXT,
43
- dag_title TEXT,
44
- cron_schedule TEXT,
45
- schedule_active INTEGER NOT NULL DEFAULT 0,
46
- created_at INTEGER NOT NULL DEFAULT (unixepoch()),
47
- updated_at INTEGER NOT NULL DEFAULT (unixepoch())
48
- );
49
-
50
- -- DAG Executions table
51
- CREATE TABLE IF NOT EXISTS dag_executions (
52
- id TEXT PRIMARY KEY,
53
- dag_id TEXT NOT NULL REFERENCES dags(id) ON DELETE CASCADE,
54
- status TEXT NOT NULL,
55
- execution_results TEXT,
56
- failure_reason TEXT,
57
- created_at INTEGER NOT NULL DEFAULT (unixepoch()),
58
- updated_at INTEGER NOT NULL DEFAULT (unixepoch())
59
- );
60
-
61
- -- DAG Sub-Steps table
62
- CREATE TABLE IF NOT EXISTS dag_sub_steps (
63
- id TEXT PRIMARY KEY,
64
- execution_id TEXT NOT NULL REFERENCES dag_executions(id) ON DELETE CASCADE,
65
- node_id TEXT NOT NULL,
66
- "index" INTEGER NOT NULL,
67
- type TEXT NOT NULL CHECK(type IN ('action', 'result', 'decision')),
68
- content TEXT NOT NULL,
69
- created_at INTEGER NOT NULL DEFAULT (unixepoch())
70
- );
71
- `;
72
10
  /**
73
11
  * Initialize database tables if they don't exist
12
+ * Uses generateAllSQL() from initDB to stay in sync with the Drizzle schema
74
13
  */
75
14
  function initializeTables(sqlite, logger) {
76
15
  try {
77
- sqlite.exec(CREATE_TABLES_SQL);
16
+ const { sql } = generateAllSQL();
17
+ sqlite.exec(sql);
78
18
  logger.info('Database tables initialized');
79
19
  }
80
20
  catch (error) {
@@ -84,31 +24,26 @@ function initializeTables(sqlite, logger) {
84
24
  /**
85
25
  * Create and initialize database connection
86
26
  */
87
- function createDatabase(dbPath) {
27
+ function createDatabase(dbPath, isMemoryDb) {
88
28
  const logger = getLogger();
89
29
  try {
90
- // Ensure data directory exists
91
- const dbDir = dirname(dbPath);
92
- if (!existsSync(dbDir)) {
93
- mkdirSync(dbDir, { recursive: true });
94
- logger.info(`Created database directory: ${dbDir}`);
30
+ // Only create directory for file-based databases
31
+ if (!isMemoryDb) {
32
+ const dbDir = dirname(dbPath);
33
+ if (!existsSync(dbDir)) {
34
+ mkdirSync(dbDir, { recursive: true });
35
+ logger.info(`Created database directory: ${dbDir}`);
36
+ }
95
37
  }
96
- // Check if database file exists (to determine if we need to create tables)
97
- const isNewDatabase = !existsSync(dbPath);
98
- // Open SQLite database using bun:sqlite
38
+ // Open SQLite database
99
39
  const sqlite = new Database(dbPath);
100
- // Enable foreign keys and WAL mode
101
- sqlite.exec('PRAGMA journal_mode = WAL;');
102
- sqlite.exec('PRAGMA foreign_keys = ON;');
103
- // Initialize tables if this is a new database
104
- if (isNewDatabase) {
105
- logger.info('New database detected, creating tables...');
106
- initializeTables(sqlite, logger);
107
- }
108
- else {
109
- // For existing databases, ensure tables exist (handles partial initialization)
110
- initializeTables(sqlite, logger);
40
+ // WAL mode only for file-based databases
41
+ if (!isMemoryDb) {
42
+ sqlite.exec('PRAGMA journal_mode = WAL;');
111
43
  }
44
+ sqlite.exec('PRAGMA foreign_keys = ON;');
45
+ // Always initialize tables
46
+ initializeTables(sqlite, logger);
112
47
  const db = drizzle(sqlite, { schema });
113
48
  logger.info(`Database initialized: ${dbPath}`);
114
49
  return db;
@@ -122,9 +57,9 @@ function createDatabase(dbPath) {
122
57
  /**
123
58
  * Get or create the global database instance
124
59
  */
125
- export function getDatabase(dbPath) {
60
+ export function getDatabase(dbPath, isMemoryDb = false) {
126
61
  if (!dbInstance) {
127
- dbInstance = createDatabase(dbPath);
62
+ dbInstance = createDatabase(dbPath, isMemoryDb);
128
63
  }
129
64
  return dbInstance;
130
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -32,8 +32,8 @@ import type { DesiAgentClient } from './types/index.js';
32
32
  * ```
33
33
  */
34
34
  export declare function setupDesiAgent(config: DesiAgentConfig): Promise<DesiAgentClient>;
35
- export type { DesiAgentConfig, ProcessedDesiAgentConfig } from './types/config.js';
36
- export { DesiAgentConfigSchema } from './types/config.js';
35
+ export type { DesiAgentConfig, ProcessedDesiAgentConfig, ResolvedConfig } from './types/config.js';
36
+ export { DesiAgentConfigSchema, resolveConfig } from './types/config.js';
37
37
  export type { DesiAgentClient } from './types/index.js';
38
38
  export { ExecutionStatus, ExecutionEventType, type DAG, type DAGNode, type DAGEdge, type DAGExecution, type DAGExecutionWithSteps, type DagExecutionListResult, type DAGExecutionStatus, type SubStep, type SubStepStatus, type ExecutionEvent, type DAGFilter, type Agent, type AgentConstraints, type Tool, type ToolParameter, type ToolCall, type ToolResult, type AgentDefinition, } from './types/index.js';
39
39
  export { DecomposerJobSchema, SubTaskSchema, type DecomposerJob, type SubTask, } from './types/dag.js';
@@ -50,5 +50,8 @@ export { validateCronExpression } from './util/cron-validator.js';
50
50
  export { extractCodeBlock, extractJsonCodeBlock, renumberSubTasks, truncate, truncateForLog, parseDate, formatDateByGroup, } from './util/dag-utils.js';
51
51
  export { DesiAgentError, ConfigurationError, NotFoundError, ValidationError, ExecutionError, DatabaseError, LLMProviderError, ToolError, TimeoutError, InitializationError, } from './errors/index.js';
52
52
  export { sendEmailTool, SendEmailInputSchema, type SendEmailInput, type SendEmailOutput, } from './util/sendEmailTool.js';
53
- export { initDB, type InitDBOptions, type InitDBResult } from './services/initDB.js';
53
+ export { SkillRegistry, type SkillMeta } from './core/skills/registry.js';
54
+ export { MinimalSkillDetector, type SkillDetector } from './core/skills/detector.js';
55
+ export { StatsQueue, type StatsJob } from './core/workers/statsQueue.js';
56
+ export { initDB, seedAgents, type InitDBOptions, type InitDBResult } from './services/initDB.js';
54
57
  //# sourceMappingURL=index.d.ts.map