agentlang 0.8.2 → 0.8.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/runtime/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmHvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,eAAO,IAAI,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;AAEzC,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGnD;AAID,wBAAgB,wBAAwB,SAEvC;AAED,wBAAgB,yBAAyB,SAExC;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAOD,qBAAa,QAAQ,CAAC,CAAC;IACrB,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,MAAM;IAKzB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,CAAC;IAiBvD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAW/B,MAAM,CAAC,GAAG,EAAE,MAAM;CAGnB"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/runtime/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiIvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,eAAO,IAAI,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;AAEzC,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGnD;AAID,wBAAgB,wBAAwB,SAEvC;AAED,wBAAgB,yBAAyB,SAExC;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAOD,qBAAa,QAAQ,CAAC,CAAC;IACrB,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,MAAM;IAKzB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,CAAC;IAiBvD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAW/B,MAAM,CAAC,GAAG,EAAE,MAAM;CAGnB"}
@@ -113,6 +113,18 @@ export const ConfigSchema = z.object({
113
113
  level: z.enum(['error', 'warn', 'info', 'debug']).default('info'),
114
114
  })
115
115
  .optional(),
116
+ retry: z
117
+ .array(z.object({
118
+ name: z.string(),
119
+ attempts: z.number(),
120
+ backoff: z.object({
121
+ strategy: z.enum(['linear', 'exponential', 'constant']),
122
+ delay: z.number(),
123
+ magnitude: z.enum(['seconds', 'milliSeconds', 'minutes']),
124
+ factor: z.number(),
125
+ }),
126
+ }))
127
+ .optional(),
116
128
  });
117
129
  export let AppConfig;
118
130
  export function setAppConfig(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/runtime/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/runtime/state.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agentlang",
3
3
  "description": "The easiest way to build the most reliable AI agents - enterprise-grade teams of AI agents that collaborate with each other and humans",
4
- "version": "0.8.2",
4
+ "version": "0.8.4",
5
5
  "license": "Sustainable Use License",
6
6
  "author": "agentlang-ai",
7
7
  "homepage": "https://github.com/agentlang-ai/agentlang#readme",
package/src/cli/main.ts CHANGED
@@ -17,7 +17,7 @@ import * as url from 'node:url';
17
17
  import * as fs from 'node:fs/promises';
18
18
  import * as path from 'node:path';
19
19
  import { logger, updateLoggerFromConfig } from '../runtime/logger.js';
20
- import { Module } from '../runtime/module.js';
20
+ import { Instance, Module } from '../runtime/module.js';
21
21
  import { ModuleDefinition } from '../language/generated/ast.js';
22
22
  import { Config } from '../runtime/state.js';
23
23
  import { prepareIntegrations } from '../runtime/integrations.js';
@@ -32,6 +32,7 @@ import { importModule } from '../runtime/jsmodules.js';
32
32
  import {
33
33
  isRuntimeMode_dev,
34
34
  isRuntimeMode_prod,
35
+ isRuntimeMode_test,
35
36
  setInternDynamicModuleFn,
36
37
  setRuntimeMode_generate_migration,
37
38
  setRuntimeMode_init_schema,
@@ -41,7 +42,11 @@ import {
41
42
  updateEndpoints,
42
43
  } from '../runtime/defs.js';
43
44
  import { initGlobalApi } from '../runtime/api.js';
44
- import { initCoreModuleManager } from '../runtime/modules/core.js';
45
+ import {
46
+ initCoreModuleManager,
47
+ lookupTimersWithRunningStatus,
48
+ triggerTimer,
49
+ } from '../runtime/modules/core.js';
45
50
 
46
51
  const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
47
52
 
@@ -134,6 +139,7 @@ export async function runPostInitTasks(appSpec?: ApplicationSpec, config?: Confi
134
139
  await runInitFunctions();
135
140
  await runStandaloneStatements();
136
141
  initCoreModuleManager();
142
+ await runPersistedTimers();
137
143
  logger.info(
138
144
  `Running application ${appSpec?.name || 'unknown'} version ${appSpec?.version || 'unknown'} on port ${config?.service?.port || 8080}`
139
145
  );
@@ -169,6 +175,36 @@ export async function runPreInitTasks(): Promise<boolean> {
169
175
  return result;
170
176
  }
171
177
 
178
+ async function runPersistedTimers() {
179
+ if (!isRuntimeMode_test()) {
180
+ const insts: Instance[] = await lookupTimersWithRunningStatus();
181
+ if (insts) {
182
+ for (let i = 0; i < insts.length; ++i) {
183
+ const inst: Instance = insts[i];
184
+ if (await restartTimer(inst)) {
185
+ logger.info(`Timer ${inst.lookup('name')} setup to restart`);
186
+ }
187
+ }
188
+ }
189
+ }
190
+ }
191
+
192
+ async function restartTimer(timerInst: Instance): Promise<boolean> {
193
+ const n = timerInst.lookup('name');
194
+ try {
195
+ if (isRuntimeMode_prod()) {
196
+ // TODO: create and configure an independent timer-managerment service.
197
+ logger.warn(`Cannot restart timer ${n}, timer management service is not configured`);
198
+ } else {
199
+ triggerTimer(timerInst);
200
+ return true;
201
+ }
202
+ } catch (reason: any) {
203
+ logger.warn(`Error while restarting timer ${n} - ${reason}`);
204
+ }
205
+ return false;
206
+ }
207
+
172
208
  async function internDynamicModule(name: string, definition: string): Promise<string> {
173
209
  await refreshModuleDefinition(name, definition);
174
210
  await resetDefaultDatabase();
@@ -98,8 +98,7 @@ import {
98
98
  addUpdateAudit,
99
99
  createSuspension,
100
100
  flushMonitoringData,
101
- maybeCancelTimer,
102
- setTimerRunning,
101
+ triggerTimer,
103
102
  } from './modules/core.js';
104
103
  import { invokeModuleFn } from './jsmodules.js';
105
104
  import { invokeOpenApiEvent, isOpenApiEventInstance } from './openapi.js';
@@ -1698,51 +1697,6 @@ async function handleDocEvent(inst: Instance, env: Environment): Promise<void> {
1698
1697
  }
1699
1698
  }
1700
1699
 
1701
- function triggerTimer(timerInst: Instance): Instance {
1702
- const dur = timerInst.lookup('duration');
1703
- const unit = timerInst.lookup('unit');
1704
- let millisecs = 0;
1705
- switch (unit) {
1706
- case 'millisecond': {
1707
- millisecs = dur;
1708
- break;
1709
- }
1710
- case 'second': {
1711
- millisecs = dur * 1000;
1712
- break;
1713
- }
1714
- case 'minute': {
1715
- millisecs = dur * 60 * 1000;
1716
- break;
1717
- }
1718
- case 'hour': {
1719
- millisecs = dur * 60 * 60 * 1000;
1720
- break;
1721
- }
1722
- }
1723
- const eventName = nameToPath(timerInst.lookup('trigger'));
1724
- const m = eventName.hasModule() ? eventName.getModuleName() : timerInst.moduleName;
1725
- const n = eventName.getEntryName();
1726
- const inst = makeInstance(m, n, newInstanceAttributes());
1727
- const name = timerInst.lookup('name');
1728
- const timer = setInterval(async () => {
1729
- const env = new Environment();
1730
- try {
1731
- await evaluate(
1732
- inst,
1733
- (result: Result) => logger.debug(`Timer ${name} ran with result ${result}`),
1734
- env
1735
- );
1736
- await env.commitAllTransactions();
1737
- await maybeCancelTimer(name, timer, env);
1738
- } catch (reason: any) {
1739
- logger.error(`Timer ${name} raised error: ${reason}`);
1740
- }
1741
- }, millisecs);
1742
- setTimerRunning(timerInst);
1743
- return timerInst;
1744
- }
1745
-
1746
1700
  async function computeExprAttributes(
1747
1701
  inst: Instance,
1748
1702
  origAttrs: SetAttribute[] | undefined,
@@ -69,6 +69,7 @@ import {
69
69
  addAgent,
70
70
  fetchModule,
71
71
  Retry,
72
+ addGlobalRetry,
72
73
  } from './module.js';
73
74
  import {
74
75
  asStringLiteralsMap,
@@ -81,6 +82,7 @@ import {
81
82
  preprocessRawConfig,
82
83
  registerInitFunction,
83
84
  rootRef,
85
+ ScratchModuleName,
84
86
  } from './util.js';
85
87
  import { getFileSystem, toFsPath, readFile, readdir, exists } from '../utils/fs-utils.js';
86
88
  import { URI } from 'vscode-uri';
@@ -395,7 +397,7 @@ export async function loadAppConfig(configDir: string): Promise<Config> {
395
397
  let cfg = cfgObj
396
398
  ? await configFromObject(cfgObj)
397
399
  : await loadRawConfig(`${configDir}${path.sep}app.config.json`);
398
- const envAppConfig = process.env.APP_CONFIG;
400
+ const envAppConfig = typeof process !== 'undefined' ? process.env.APP_CONFIG : undefined;
399
401
  if (envAppConfig) {
400
402
  const envConfig = JSON.parse(envAppConfig);
401
403
  cfg = { ...cfg, ...envConfig };
@@ -1170,6 +1172,7 @@ export async function internModule(
1170
1172
  // Process imports sequentially to ensure all JS modules are loaded before definitions
1171
1173
  for (const imp of module.imports as Import[]) {
1172
1174
  await importModule(imp.path, imp.name, moduleFileName);
1175
+ r.addImport({ name: imp.name, path: imp.path });
1173
1176
  }
1174
1177
  for (let i = 0; i < module.defs.length; ++i) {
1175
1178
  const def = module.defs[i];
@@ -1234,7 +1237,16 @@ async function configFromObject(cfgObj: any, validate: boolean = true): Promise<
1234
1237
  if (pats.length > 0) {
1235
1238
  await evaluateConfigPatterns(pats.join('\n'));
1236
1239
  }
1237
- return ConfigSchema.parse(cfg);
1240
+ const result = ConfigSchema.parse(cfg);
1241
+ cfg.retry?.forEach((r: any) => {
1242
+ const retry: Retry = new Retry(r.name, ScratchModuleName, r.attempts)
1243
+ .setBackoffDelay(r.backoff.delay)
1244
+ .setBackoffFactor(r.backoff.factor)
1245
+ .setBackoffStrategy(r.backoff.strategy[0])
1246
+ .setBackoffMagnitude(r.backoff.magnitude);
1247
+ addGlobalRetry(retry);
1248
+ });
1249
+ return result;
1238
1250
  }
1239
1251
  return rawConfig;
1240
1252
  }
@@ -1801,6 +1801,11 @@ export class Retry extends ModuleEntry {
1801
1801
  };
1802
1802
  }
1803
1803
 
1804
+ setBackoffStrategy(s: BackoffStrategy): Retry {
1805
+ this.backoff.strategy = s;
1806
+ return this;
1807
+ }
1808
+
1804
1809
  setExponentialBackoff(): Retry {
1805
1810
  this.backoff.strategy = 'e';
1806
1811
  return this;
@@ -1835,6 +1840,17 @@ export class Retry extends ModuleEntry {
1835
1840
  return this;
1836
1841
  }
1837
1842
 
1843
+ setBackoffMagnitude(m: string): Retry {
1844
+ if (m[0] === 's') {
1845
+ this.backoff.magnitude = 's';
1846
+ } else if (m.startsWith('milli')) {
1847
+ this.backoff.magnitude = 'ms';
1848
+ } else {
1849
+ this.backoff.magnitude = 'm';
1850
+ }
1851
+ return this;
1852
+ }
1853
+
1838
1854
  setBackoffMagnitudeAsMilliseconds(): Retry {
1839
1855
  this.backoff.magnitude = 'ms';
1840
1856
  return this;
@@ -1995,9 +2011,15 @@ export function isEmptyWorkflow(wf: Workflow): boolean {
1995
2011
  return wf == EmptyWorkflow;
1996
2012
  }
1997
2013
 
2014
+ export type ModuleImportEntry = {
2015
+ path: string;
2016
+ name: string;
2017
+ };
2018
+
1998
2019
  export class Module {
1999
2020
  name: string;
2000
2021
  entries: ModuleEntry[];
2022
+ imports: ModuleImportEntry[] | undefined;
2001
2023
 
2002
2024
  constructor(name: string) {
2003
2025
  this.name = name;
@@ -2009,6 +2031,21 @@ export class Module {
2009
2031
  return entry;
2010
2032
  }
2011
2033
 
2034
+ addImport(entry: ModuleImportEntry): Module {
2035
+ if (this.imports === undefined) {
2036
+ this.imports = new Array<ModuleImportEntry>();
2037
+ }
2038
+ this.imports?.push(entry);
2039
+ return this;
2040
+ }
2041
+
2042
+ removeImportAt(index: number): Module {
2043
+ if (index >= 0) {
2044
+ this.imports?.splice(index, 1);
2045
+ }
2046
+ return this;
2047
+ }
2048
+
2012
2049
  getConfigEntity(): Entity | undefined {
2013
2050
  return this.getEntityEntries().find((e: Entity) => {
2014
2051
  return e.isConfigEntity();
@@ -2450,6 +2487,17 @@ export class Module {
2450
2487
  return false;
2451
2488
  }
2452
2489
 
2490
+ private importsAsString(): string {
2491
+ if (this.imports !== undefined) {
2492
+ const ss = new Array<string>();
2493
+ this.imports.forEach((me: ModuleImportEntry) => {
2494
+ ss.push(`import "${me.path}" @as ${me.name}`);
2495
+ });
2496
+ return `\n${ss.join('\n')}\n`;
2497
+ }
2498
+ return '';
2499
+ }
2500
+
2453
2501
  toString(): string {
2454
2502
  const ss: Array<string> = [];
2455
2503
  this.entries.forEach((me: ModuleEntry) => {
@@ -2458,8 +2506,27 @@ export class Module {
2458
2506
  }
2459
2507
  ss.push(me.toString());
2460
2508
  });
2461
- return `module ${this.name}\n\n${ss.join('\n')}`;
2509
+ return `module ${this.name}\n${this.importsAsString()}\n${ss.join('\n')}`;
2510
+ }
2511
+ }
2512
+
2513
+ let GlobalRetries: Array<Retry> | undefined = undefined;
2514
+
2515
+ export function addGlobalRetry(r: Retry): Retry {
2516
+ if (GlobalRetries === undefined) {
2517
+ GlobalRetries = new Array<Retry>();
2518
+ }
2519
+ GlobalRetries?.push(r);
2520
+ return r;
2521
+ }
2522
+
2523
+ export function getGlobalRetry(name: string): Retry | undefined {
2524
+ if (GlobalRetries !== undefined) {
2525
+ return GlobalRetries.find((r: Retry) => {
2526
+ return r.name === name;
2527
+ });
2462
2528
  }
2529
+ return undefined;
2463
2530
  }
2464
2531
 
2465
2532
  declare global {
@@ -3777,7 +3844,11 @@ function maybeSetDefaultAttributeValues(
3777
3844
  if (cv === undefined || cv === null) {
3778
3845
  if (isString(v)) {
3779
3846
  if (defaultValueIsFunctionCall(v)) {
3780
- v = eval(v);
3847
+ try {
3848
+ v = eval(v);
3849
+ } catch {
3850
+ v = (0, eval)(`globalThis.${v}`);
3851
+ }
3781
3852
  }
3782
3853
  }
3783
3854
  attributes.set(k, v);
@@ -20,6 +20,7 @@ import {
20
20
  Decision,
21
21
  fetchModule,
22
22
  getDecision,
23
+ getGlobalRetry,
23
24
  Instance,
24
25
  instanceToObject,
25
26
  isAgent,
@@ -198,11 +199,16 @@ export class AgentInstance {
198
199
  if (agent.retry) {
199
200
  let n = agent.retry;
200
201
  if (!isFqName(n)) {
201
- n = `${agent.moduleName}/${n}`;
202
+ agent.retryObj = getGlobalRetry(n);
203
+ if (agent.retryObj === undefined) {
204
+ n = `${agent.moduleName}/${n}`;
205
+ }
206
+ }
207
+ if (agent.retryObj === undefined) {
208
+ const parts = splitFqName(n);
209
+ const m = fetchModule(parts[0]);
210
+ agent.retryObj = m.getRetry(parts[1]);
202
211
  }
203
- const parts = splitFqName(n);
204
- const m = fetchModule(parts[0]);
205
- agent.retryObj = m.getRetry(parts[1]);
206
212
  }
207
213
  return agent;
208
214
  }
@@ -36,6 +36,7 @@ entity User {
36
36
  email Email @unique @indexed,
37
37
  firstName String,
38
38
  lastName String,
39
+ profilePicture String @optional,
39
40
  lastLoginTime DateTime @default(now()),
40
41
  status @enum("Active", "Invited", "Inactive") @default("Active"),
41
42
  @rbac [(allow: [read, delete, update, create], where: auth.user = this.id)],
@@ -8,6 +8,7 @@ import {
8
8
  isString,
9
9
  restoreSpecialChars,
10
10
  makeCoreModuleName,
11
+ nameToPath,
11
12
  } from '../util.js';
12
13
  import {
13
14
  fetchModule,
@@ -48,7 +49,8 @@ entity timer {
48
49
  duration Int,
49
50
  unit @enum("millisecond", "second", "minute", "hour") @default("second"),
50
51
  trigger String,
51
- status @enum("I", "C", "R") @default("I") // Inited, Cancelled, Running
52
+ repeat Boolean @default(true),
53
+ status @enum("I", "C", "R") @default("I") @indexed // Inited, Cancelled, Running
52
54
  }
53
55
 
54
56
  entity auditlog {
@@ -183,20 +185,89 @@ export function registerCoreModules() {
183
185
  });
184
186
  }
185
187
 
186
- export function setTimerRunning(timerInst: Instance) {
187
- timerInst.attributes.set('status', 'R');
188
+ function isTimerCancelled(inst: Instance): boolean {
189
+ return inst.lookup('status') === 'C';
188
190
  }
189
191
 
190
- export async function maybeCancelTimer(name: string, timer: NodeJS.Timeout, env: Environment) {
192
+ // If the timer is deleted or its status is set to 'C' (cancelled), then clear the associated timer.
193
+ async function maybeClearTimer(name: string, timer: NodeJS.Timeout, env: Environment) {
191
194
  await parseAndEvaluateStatement(`{agentlang/timer {name? "${name}"}}`, undefined, env).then(
192
195
  (result: any) => {
193
- if (result === null || (result instanceof Array && result.length == 0)) {
196
+ if (
197
+ result === null ||
198
+ (result instanceof Array && (result.length == 0 || isTimerCancelled(result[0])))
199
+ ) {
194
200
  clearInterval(timer);
195
201
  }
196
202
  }
197
203
  );
198
204
  }
199
205
 
206
+ export function triggerTimer(timerInst: Instance): Instance {
207
+ const dur = timerInst.lookup('duration');
208
+ const unit = timerInst.lookup('unit');
209
+ let millisecs = 0;
210
+ switch (unit) {
211
+ case 'millisecond': {
212
+ millisecs = dur;
213
+ break;
214
+ }
215
+ case 'second': {
216
+ millisecs = dur * 1000;
217
+ break;
218
+ }
219
+ case 'minute': {
220
+ millisecs = dur * 60 * 1000;
221
+ break;
222
+ }
223
+ case 'hour': {
224
+ millisecs = dur * 60 * 60 * 1000;
225
+ break;
226
+ }
227
+ }
228
+ const eventName = nameToPath(timerInst.lookup('trigger'));
229
+ const m = eventName.hasModule() ? eventName.getModuleName() : timerInst.moduleName;
230
+ const n = eventName.getEntryName();
231
+ const inst = makeInstance(m, n, newInstanceAttributes());
232
+ const name = timerInst.lookup('name');
233
+ const repeat = timerInst.lookup('repeat');
234
+ const timer = setInterval(async () => {
235
+ const env = new Environment();
236
+ try {
237
+ await evaluate(
238
+ inst,
239
+ (result: any) => logger.debug(`Timer ${name} ran with result ${result}`),
240
+ env
241
+ );
242
+ await env.commitAllTransactions();
243
+ if (!repeat) clearInterval(timer);
244
+ else await maybeClearTimer(name, timer, env);
245
+ } catch (reason: any) {
246
+ logger.error(`Timer ${name} raised error: ${reason}`);
247
+ }
248
+ }, millisecs);
249
+ timerInst.attributes.set('status', 'R');
250
+ return timerInst;
251
+ }
252
+
253
+ export async function saveTimerStatus(timerInst: Instance): Promise<boolean> {
254
+ const name = timerInst.lookup('name');
255
+ const status = timerInst.lookup('status');
256
+ const env = new Environment();
257
+ try {
258
+ await parseAndEvaluateStatement(`{agentlang/timer {name? "${name}", "status": "${status}"}}`);
259
+ await env.commitAllTransactions();
260
+ } catch (reason: any) {
261
+ logger.warn(`Failed to save status of timer ${name} - ${reason}`);
262
+ return false;
263
+ }
264
+ return true;
265
+ }
266
+
267
+ export async function lookupTimersWithRunningStatus(): Promise<Instance[]> {
268
+ return await parseAndEvaluateStatement(`{agentlang/timer {status? "R"}}`);
269
+ }
270
+
200
271
  async function addAudit(
201
272
  env: Environment,
202
273
  action: 'c' | 'd' | 'u',
@@ -116,6 +116,20 @@ export const ConfigSchema = z.object({
116
116
  level: z.enum(['error', 'warn', 'info', 'debug']).default('info'),
117
117
  })
118
118
  .optional(),
119
+ retry: z
120
+ .array(
121
+ z.object({
122
+ name: z.string(),
123
+ attempts: z.number(),
124
+ backoff: z.object({
125
+ strategy: z.enum(['linear', 'exponential', 'constant']),
126
+ delay: z.number(),
127
+ magnitude: z.enum(['seconds', 'milliSeconds', 'minutes']),
128
+ factor: z.number(),
129
+ }),
130
+ })
131
+ )
132
+ .optional(),
119
133
  });
120
134
 
121
135
  export type Config = z.infer<typeof ConfigSchema>;