@recombine-ai/engine 0.3.1 → 0.4.0

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/build/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { AIEngine } from './lib/ai';
2
2
  export { AIEngine } from './lib/ai';
3
3
  export declare const createAIEngine: typeof AIEngine.createAIEngine;
4
- export { delayFactory, Schedule } from './lib/schedule';
4
+ export { delayFactory, Schedule, createScheduleQuery } from './lib/schedule';
5
5
  export { Scheduler, Logger } from './lib/interfaces';
6
6
  export * from './lib/bosun';
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,eAAO,MAAM,cAAc,gCAA0B,CAAA;AAErD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEpD,cAAc,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,eAAO,MAAM,cAAc,gCAA0B,CAAA;AAErD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAE5E,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEpD,cAAc,aAAa,CAAA"}
package/build/index.js CHANGED
@@ -14,11 +14,12 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.delayFactory = exports.createAIEngine = exports.AIEngine = void 0;
17
+ exports.createScheduleQuery = exports.delayFactory = exports.createAIEngine = exports.AIEngine = void 0;
18
18
  const ai_1 = require("./lib/ai");
19
19
  var ai_2 = require("./lib/ai");
20
20
  Object.defineProperty(exports, "AIEngine", { enumerable: true, get: function () { return ai_2.AIEngine; } });
21
21
  exports.createAIEngine = ai_1.AIEngine.createAIEngine;
22
22
  var schedule_1 = require("./lib/schedule");
23
23
  Object.defineProperty(exports, "delayFactory", { enumerable: true, get: function () { return schedule_1.delayFactory; } });
24
+ Object.defineProperty(exports, "createScheduleQuery", { enumerable: true, get: function () { return schedule_1.createScheduleQuery; } });
24
25
  __exportStar(require("./lib/bosun"), exports);
package/build/lib/ai.d.ts CHANGED
@@ -75,6 +75,14 @@ export declare namespace AIEngine {
75
75
  /** Error handler called if an error occurred during LLM API call or in `execute` function */
76
76
  onError: (error: string) => Promise<unknown>;
77
77
  }
78
+ /**
79
+ * A useful trace of a step execution. It's properties are filled during the execution. There is no guarantee that any of them will be filled.
80
+ */
81
+ type StepTrace = {
82
+ renderedPrompt?: string;
83
+ receivedContext?: Record<string, unknown>;
84
+ receivedPrompt?: string;
85
+ };
78
86
  /**
79
87
  * An AI workflow composed of steps.
80
88
  */
@@ -89,7 +97,12 @@ export declare namespace AIEngine {
89
97
  * @param messages - The conversation context for the workflow
90
98
  * @returns The proposed reply if workflow completes, or null if terminated
91
99
  */
92
- run: (messages: Conversation) => Promise<string | null>;
100
+ run: (messages: Conversation) => Promise<{
101
+ reply: string | null;
102
+ trace: {
103
+ steps: Record<string, StepTrace>;
104
+ };
105
+ }>;
93
106
  /**
94
107
  * Rewinds the workflow execution to a specific step.
95
108
  * @param step - The step to rewind to
@@ -1 +1 @@
1
- {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAc,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAGvD,yBAAiB,QAAQ,CAAC;IACtB;;OAEG;IACH,KAAY,UAAU,GAChB,oBAAoB,GACpB,uBAAuB,GACvB,mBAAmB,GACnB,eAAe,GACf,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IAEnB,UAAiB,gBAAgB;QAC7B,8BAA8B;QAC9B,IAAI,EAAE,MAAM,CAAA;QAEZ,kDAAkD;QAClD,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAE9D,0BAA0B;QAC1B,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;QAE/B,6EAA6E;QAC7E,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;KAC/C;IAED,UAAiB,OAAO;QACpB,8BAA8B;QAC9B,IAAI,EAAE,MAAM,CAAA;QAEZ,kDAAkD;QAClD,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAE9D,qCAAqC;QACrC,KAAK,CAAC,EAAE,UAAU,CAAA;QAElB;;;WAGG;QACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;QAErB;;;WAGG;QACH,MAAM,CAAC,EAAE,SAAS,CAAA;QAElB,8EAA8E;QAC9E,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAE1B;;;;;;;WAOG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAEjC;;;;;;;;;;;;;;WAcG;QACH,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;QAE5C;;;;YAII;QACJ,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAE7D;;;;WAIG;QACH,WAAW,CAAC,EAAE,MAAM,CAAA;QAEpB,6FAA6F;QAC7F,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;KAC/C;IAED;;OAEG;IACH,KAAY,SAAS,GAAG;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAA;IAED;;OAEG;IACH,UAAiB,QAAQ;QACrB;;WAEG;QACH,SAAS,EAAE,MAAM,IAAI,CAAA;QAErB;;;;;WAKG;QACH,GAAG,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,OAAO,CAAC;YAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,KAAK,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;aAAE,CAAA;SAAE,CAAC,CAAA;QAEhH;;;WAGG;QACH,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,KAAK,IAAI,CAAA;QAEpD;;;WAGG;QACH,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;KACzD;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkDG;IACH,UAAiB,QAAQ;QACrB;;;;WAIG;QACH,cAAc,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,OAAO,GAAG,gBAAgB,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEnF;;;;WAIG;QACH,UAAU,EAAE,CAAC,CAAC,SAAS,OAAO,GAAG,gBAAgB,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;QAEjE;;;;WAIG;QACH,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAEjC;;;;WAIG;QACH,kBAAkB,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,YAAY,CAAC;KAC9D;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,UAAiB,YAAY;QACzB;;;WAGG;QACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;QAE/B;;;WAGG;QACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;QAEhC;;;;WAIG;QACH,QAAQ,EAAE,CAAC,gBAAgB,CAAC,EAAE,OAAO,KAAK,MAAM,CAAA;QAEhD;;;;;;;;;;;;WAYG;QACH,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;QAEvC;;;;WAIG;QACH,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;QAE9D;;;WAGG;QACH,qBAAqB,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,KAAK,IAAI,CAAA;QAExE;;;WAGG;QACH,2BAA2B,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,KAAK,IAAI,CAAA;QAE7E;;;WAGG;QACH,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;QAE3C;;;WAGG;QACH,gBAAgB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;QAErC;;;WAGG;QACH,UAAU,EAAE,MAAM,OAAO,EAAE,CAAA;KAC9B;IAED;;;OAGG;IACH,UAAiB,OAAO;QACpB,iGAAiG;QACjG,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;QACnC,sCAAsC;QACtC,IAAI,EAAE,MAAM,CAAA;QACZ,2DAA2D;QAC3D,QAAQ,CAAC,EAAE,MAAM,CAAA;KACpB;IAED,UAAiB,IAAI;QACjB,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;KACjC;IAED;;OAEG;IACH,UAAiB,YAAY;QACzB;;;;WAIG;QACH,YAAY,CAAC,EAAE;YAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;SAAE,CAAA;QACzD;;WAEG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAA;QACf;;WAEG;QACH,UAAU,CAAC,EAAE,UAAU,CAAA;KAC1B;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,SAAgB,cAAc,CAAC,GAAG,GAAE,YAAiB,GAAG,QAAQ,CAmQ/D;CA6BJ"}
package/build/lib/ai.js CHANGED
@@ -102,6 +102,12 @@ var AIEngine;
102
102
  let currentStep = 0;
103
103
  let beforeEachCallback = async () => Promise.resolve(null);
104
104
  const attempts = new Map();
105
+ const trace = {
106
+ steps: steps.reduce((acc, step) => {
107
+ acc[step.name] = {};
108
+ return acc;
109
+ }, {})
110
+ };
105
111
  return {
106
112
  terminate: () => {
107
113
  logger.debug('AI Engine: Terminating conversation...');
@@ -119,7 +125,8 @@ var AIEngine;
119
125
  await action('started');
120
126
  logger.debug(`AI Engine: Step: ${step.name}`);
121
127
  if ('prompt' in step) {
122
- await runStep(step, messages);
128
+ const stepTrace = await runStep(step, messages);
129
+ trace.steps[step.name] = stepTrace;
123
130
  }
124
131
  else {
125
132
  await runDumbStep(step, messages);
@@ -127,7 +134,10 @@ var AIEngine;
127
134
  await action('completed');
128
135
  }
129
136
  }
130
- return shouldRun ? messages.getProposedReply() : null;
137
+ return {
138
+ reply: shouldRun ? messages.getProposedReply() : null,
139
+ trace
140
+ };
131
141
  },
132
142
  rewindTo: (step) => {
133
143
  const index = steps.indexOf(step);
@@ -147,19 +157,21 @@ var AIEngine;
147
157
  if (!apiKey) {
148
158
  throw new Error('OpenAI API key is not set');
149
159
  }
160
+ const stepTrace = {};
150
161
  try {
162
+ stepTrace.receivedContext = step.context;
151
163
  let response = null;
152
164
  let prompt = typeof step.prompt === 'string' ? step.prompt : await step.prompt.content();
165
+ stepTrace.receivedPrompt = prompt;
153
166
  logger.debug('AI Engine: context', step.context);
154
167
  logger.debug('AI Engine: messages', messages.toString(step.ignoreDirectives || false));
155
- if (step.context) {
156
- nunjucks_1.default.configure({
157
- autoescape: true,
158
- trimBlocks: true,
159
- lstripBlocks: true,
160
- });
161
- prompt = nunjucks_1.default.renderString(prompt, step.context);
162
- }
168
+ nunjucks_1.default.configure({
169
+ autoescape: true,
170
+ trimBlocks: true,
171
+ lstripBlocks: true,
172
+ });
173
+ prompt = nunjucks_1.default.renderString(prompt, step.context || {});
174
+ stepTrace.renderedPrompt = prompt;
163
175
  response = await runLLM(apiKey, prompt, messages.toString(step.ignoreDirectives || false), step.schema, step.model);
164
176
  if (!response) {
165
177
  throw new Error('No response from OpenAI');
@@ -180,11 +192,13 @@ var AIEngine;
180
192
  logger.debug(`AI Engine: replying`);
181
193
  await step.execute(response);
182
194
  }
195
+ return stepTrace;
183
196
  }
184
197
  catch (error) {
185
198
  // FIXME: this doesn't terminate the workflow
186
199
  await step.onError(error.message);
187
200
  shouldRun = false;
201
+ return stepTrace;
188
202
  }
189
203
  }
190
204
  async function runDumbStep(step, messages) {
@@ -3,6 +3,29 @@
3
3
  * - note that Delay must not be negative
4
4
  */
5
5
  export declare function delayFactory(schedule: Schedule): (delay: Delay) => Date;
6
+ /**
7
+ * Query over an object that follows {@link Schedule} interface
8
+ */
9
+ export declare class ScheduleQuery {
10
+ private schedule;
11
+ constructor(schedule: Schedule);
12
+ /**
13
+ * Find next closest date after specified delay within the schedule
14
+ */
15
+ nextValidDate(delay: Delay): Date;
16
+ /**
17
+ * Finds next closest date that follows a specified date within the schedule
18
+ */
19
+ nextValidDate(date: Date): Date;
20
+ /** Returns next date the schedule starting from _now_ */
21
+ next(): Date;
22
+ /**
23
+ * Checks if a specified date is within the schedule,
24
+ * if no date provided, checks if _now_ is within the schedule
25
+ */
26
+ isValid(date: Date): boolean;
27
+ }
28
+ export declare function createScheduleQuery(schedule: Schedule): ScheduleQuery;
6
29
  type Delay = [number, 'minutes' | 'hours' | 'days'] | [number, 'hours', number, 'minutes'] | [number, 'days', number, 'hours'] | [number, 'days', number, 'hours', number, 'minutes'];
7
30
  type singleInt = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
8
31
  type hours = `${0 | 1}${singleInt}` | '20' | '21' | '22' | '23';
@@ -1 +1 @@
1
- {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/lib/schedule.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,WACH,KAAK,KAAG,IAAI,CAwCvD;AAkFD,KAAK,KAAK,GACJ,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC,GACtC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,GACpC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GACjC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;AAE1D,KAAK,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AACtD,KAAK,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAC/D,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,CAAA;AAC3D,KAAK,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAA;AAClG,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAC1D,KAAK,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAE9F,KAAK,OAAO,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,CAAA;AAE9D,UAAU,SAAS;IACf,IAAI,EAAE,QAAQ,EAAE,CAAA;IAChB,IAAI,EAAE,IAAI,CAAA;IACV,EAAE,EAAE,IAAI,CAAA;CACX;AAED,MAAM,WAAW,QAAQ;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,SAAS,EAAE,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;CACvB"}
1
+ {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/lib/schedule.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,WACH,KAAK,KAAG,IAAI,CAGvD;AAED;;GAEG;AACH,qBAAa,aAAa;IACV,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,QAAQ;IAEtC;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAEjC;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAuC/B,0DAA0D;IAC1D,IAAI;IAIJ;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI;CAIrB;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,iBAErD;AAiFD,KAAK,KAAK,GACJ,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC,GACtC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,GACpC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GACjC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;AAE1D,KAAK,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AACtD,KAAK,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAC/D,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,CAAA;AAC3D,KAAK,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAA;AAClG,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAC1D,KAAK,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAE9F,KAAK,OAAO,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,CAAA;AAE9D,UAAU,SAAS;IACf,IAAI,EAAE,QAAQ,EAAE,CAAA;IAChB,IAAI,EAAE,IAAI,CAAA;IACV,EAAE,EAAE,IAAI,CAAA;CACX;AAED,MAAM,WAAW,QAAQ;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,SAAS,EAAE,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;CACvB"}
@@ -1,37 +1,65 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScheduleQuery = void 0;
3
4
  exports.delayFactory = delayFactory;
5
+ exports.createScheduleQuery = createScheduleQuery;
4
6
  /**
5
7
  * @returns getNextTimePoint function that makes a date from a given {@link Delay}
6
8
  * - note that Delay must not be negative
7
9
  */
8
10
  function delayFactory(schedule) {
9
11
  return function getNextTimePoint(delay) {
10
- const date = new Date();
11
- const { holidays, timeZone, workingHours } = schedule;
12
- const delayMs = getDelayTimeInMs(delay);
13
- const [_, offsetDiffBefore] = convertToTimeZone(date, timeZone);
12
+ return createScheduleQuery(schedule).nextValidDate(delay);
13
+ };
14
+ }
15
+ /**
16
+ * Query over an object that follows {@link Schedule} interface
17
+ */
18
+ class ScheduleQuery {
19
+ schedule;
20
+ constructor(schedule) {
21
+ this.schedule = schedule;
22
+ }
23
+ nextValidDate(dateOrDelay) {
24
+ const date = dateOrDelay instanceof Date ? dateOrDelay : new Date();
25
+ const [_, offsetDiffBefore] = convertToTimeZone(date, this.schedule.timeZone);
14
26
  const localOffsetBefore = date.getTimezoneOffset() * 60 * 1000;
15
- date.setTime(date.getTime() + delayMs);
16
- let [targetTzDate, offsetDiff] = convertToTimeZone(date, timeZone);
27
+ if (!(dateOrDelay instanceof Date)) {
28
+ const delayMs = getDelayTimeInMs(dateOrDelay);
29
+ date.setTime(date.getTime() + delayMs);
30
+ }
31
+ let [targetTzDate, offsetDiff] = convertToTimeZone(date, this.schedule.timeZone);
17
32
  const localOffsetAfterMs = targetTzDate.getTimezoneOffset() * 60 * 1000;
18
33
  const localOffsetChange = localOffsetAfterMs - localOffsetBefore;
19
34
  const targetTzOffsetChange = offsetDiff - offsetDiffBefore;
20
- if (workingHours && workingHours?.length > 0) {
21
- targetTzDate = getNextWorkingDate(targetTzDate, workingHours);
22
- }
23
- if (holidays && isHoliday(targetTzDate, holidays)) {
24
- targetTzDate = skipHoliday(targetTzDate, holidays);
35
+ if (this.schedule.workingHours && this.schedule.workingHours?.length > 0) {
36
+ targetTzDate = getNextWorkingDate(targetTzDate, this.schedule);
25
37
  }
26
38
  const targetDate = new Date(targetTzDate.getTime() + offsetDiff + targetTzOffsetChange + localOffsetChange);
27
- const [, offsetDiffTz] = convertToTimeZone(targetDate, timeZone);
39
+ const [, offsetDiffTz] = convertToTimeZone(targetDate, this.schedule.timeZone);
28
40
  const targetOffsetTzChange = offsetDiffTz - offsetDiff;
29
41
  return new Date(targetTzDate.getTime() +
30
42
  offsetDiff +
31
43
  targetTzOffsetChange +
32
44
  localOffsetChange +
33
45
  targetOffsetTzChange);
34
- };
46
+ }
47
+ /** Returns next date the schedule starting from _now_ */
48
+ next() {
49
+ return this.nextValidDate(new Date());
50
+ }
51
+ /**
52
+ * Checks if a specified date is within the schedule,
53
+ * if no date provided, checks if _now_ is within the schedule
54
+ */
55
+ isValid(date) {
56
+ const next = this.nextValidDate(date);
57
+ return date.toISOString() === next.toISOString();
58
+ }
59
+ }
60
+ exports.ScheduleQuery = ScheduleQuery;
61
+ function createScheduleQuery(schedule) {
62
+ return new ScheduleQuery(schedule);
35
63
  }
36
64
  function getDelayTimeInMs(time) {
37
65
  const minutesIndex = time.findIndex((el) => el === 'minutes');
@@ -50,12 +78,13 @@ function convertToTimeZone(date, timeZone) {
50
78
  const offsetMS = date.getTime() - convertedDate.getTime();
51
79
  return [convertedDate, offsetMS];
52
80
  }
53
- function getNextWorkingDate(date, workingHours) {
81
+ function getNextWorkingDate(date, schedule) {
54
82
  const currentDate = new Date(date);
55
83
  while (true) {
56
84
  const currentDay = getDayOfWeek(currentDate);
57
- const daySchedule = workingHours.find((interval) => interval.days.includes(currentDay));
58
- if (daySchedule) {
85
+ const daySchedule = schedule.workingHours.find((interval) => interval.days.includes(currentDay));
86
+ const holiday = schedule.holidays && isHoliday(currentDate, schedule);
87
+ if (daySchedule && !holiday) {
59
88
  const [fromHours, fromMinutes] = daySchedule.from.split(':').map(Number);
60
89
  const [toHours, toMinutes] = daySchedule.to.split(':').map(Number);
61
90
  if (fromHours > toHours) {
@@ -88,13 +117,11 @@ function getDayOfWeek(date) {
88
117
  ];
89
118
  return days[date.getDay()];
90
119
  }
91
- function isHoliday(date, holidays) {
92
- const dateString = date.toISOString().split('T')[0];
93
- return holidays.includes(dateString);
94
- }
95
- function skipHoliday(date, holidays) {
96
- while (isHoliday(date, holidays)) {
97
- date.setDate(date.getDate() + 1);
98
- }
99
- return date;
120
+ function isHoliday(date, schedule) {
121
+ if (!schedule.holidays)
122
+ return false;
123
+ const offset = date.getTimezoneOffset();
124
+ const utcDate = new Date(date.getTime() - offset * 60 * 1000);
125
+ const dateString = utcDate.toISOString().split('T')[0];
126
+ return schedule.holidays.includes(dateString);
100
127
  }
package/changelog.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ### 0.3.2 → 0.4.o (unstable)
4
+
5
+ Breaking changes:
6
+
7
+ - `await workflow.run()` now returns an object with `reply: string` and `trace` object
8
+
9
+ ### 0.3.1 → 0.3.2 (unstable)
10
+
11
+ - add `ScheduleQuery` class that provides three additional capabilities compared to `delayFactory`:
12
+ - `query.nextValidDate(date: Date)` – to find next closest date after a specific date (rather than delay)
13
+ - `query.next()` – gets closest date within provided schedule
14
+ - `query.isValid(date)` – checks if provided date is within the schedule
15
+
3
16
  ### 0.3.0 → 0.3.1 (unstable)
4
17
 
5
18
  - Fix: allow other models (as a string)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@recombine-ai/engine",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "Recombine AI engine for creating conversational AI agents",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
package/readme.md CHANGED
@@ -60,7 +60,7 @@ const myCoordinator = engine.createStep({
60
60
 
61
61
  // Create and run workflow
62
62
  const workflow = await engine.createWorkflow(mainStep, myReviewer, myCoordinator)
63
- const response = await workflow.run(messages)
63
+ const { reply, trace } = await workflow.run(messages)
64
64
  ```
65
65
 
66
66
  ## Main concepts